mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-06-10 16:14:54 +03:00
3d16e35e80
Расширение синтетики: новая обработка ДеревоНоменклатуры с реквизитом
формы Дерево типа ДеревоЗначений и колонками Номенклатура (ссылка,
read-only) + Цена (Number, editable). ПриСозданииНаСервере рекурсивно
обходит Справочник.Номенклатура и заполняет дерево, отражая иерархию
групп/элементов из справочника.
Обработка зарегистрирована в подсистеме Администрирование и в роли
Администратор (Use+View).
Новый smoke 16-tree-form.test.mjs (5 шагов, 17.1s) — покрывает
05-table/edit-form (fillTableRow method:'direct' на FormDataTree-колонке)
и 08-hierarchy/tree-edit (expand узла + правка Цены через index-row):
- setup: navigateLink('Обработка.ДеревоНоменклатуры'), таблица Дерево
- read-roots: 2 корневые группы (_kind:'group'), columns=Номенклатура,Цена
- expand: clickElement('Товары',{expand:true}) → 16 строк (1 + 15)
- tree-edit: fillTableRow({Цена:1500},{row:1}) → method:'direct',
Цена становится '1 500,00' (с non-breaking space 1С)
- cleanup: closeForm
Гэп: fillTableRow с row-by-name ('Товар 01') ловит SyntaxError в JS
eval. Использую row-by-index (TODO в web-test-bugs).
Полный регресс **18/18 зелёный** (8m 9.8s) на порту 9191.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
63 lines
4.1 KiB
JavaScript
63 lines
4.1 KiB
JavaScript
export const name = 'tree-form: FormDataTree edit (ДеревоНоменклатуры obrabotka)';
|
||
export const tags = ['tree', 'table'];
|
||
export const timeout = 90000;
|
||
|
||
// ДеревоНоменклатуры obrabotka: реквизит формы Дерево типа ДеревоЗначений
|
||
// заполняется в ПриСозданииНаСервере рекурсивным обходом справочника Номенклатура.
|
||
// Колонка Цена — Number, editable; колонка Номенклатура — CatalogRef, readOnly.
|
||
// Покрывает: 05-table/edit-form (fillTableRow method:'direct' на FormDataTree-колонке)
|
||
// + 08-hierarchy/tree-edit (expand узла + edit Цены внутри expanded группы).
|
||
|
||
export default async function({ navigateLink, clickElement, closeForm, readTable, fillTableRow, assert, step, log }) {
|
||
|
||
await step('setup: открыть обработку ДеревоНоменклатуры', async () => {
|
||
const r = await navigateLink('Обработка.ДеревоНоменклатуры');
|
||
log(`form=${r.form} activeTab=${r.activeTab}`);
|
||
assert.equal(r.activeTab, 'Дерево номенклатуры', 'форма открыта');
|
||
assert.ok(r.tables?.some(t => t.name === 'Дерево'), 'таблица Дерево присутствует');
|
||
});
|
||
|
||
await step('read-roots: на верхнем уровне видны 2 группы (Товары, Услуги)', async () => {
|
||
const t = await readTable('Дерево');
|
||
log(`columns=${t.columns?.join(',')} rows=${t.rows?.length}`);
|
||
assert.deepEqual(t.columns, ['Номенклатура', 'Цена'], 'колонки: Номенклатура + Цена');
|
||
assert.equal(t.rows.length, 2, '2 корневые строки');
|
||
const names = t.rows.map(r => r['Номенклатура']);
|
||
assert.includes(names, 'Товары', 'есть Товары');
|
||
assert.includes(names, 'Услуги', 'есть Услуги');
|
||
assert.ok(t.rows.every(r => r._kind === 'group'), 'обе корневые — group (есть expand-стрелка)');
|
||
});
|
||
|
||
await step('expand: clickElement({expand}) раскрывает Товары — 15 элементов', async () => {
|
||
const r = await clickElement('Товары', { expand: true });
|
||
log(`clicked: ${JSON.stringify(r.clicked)}`);
|
||
assert.equal(r.clicked?.toggled, true, 'expand toggled');
|
||
const t = await readTable('Дерево');
|
||
log(`after expand: total=${t.total}`);
|
||
assert.ok(t.total >= 16, `Товары + 15 элементов (got ${t.total})`);
|
||
const tovar01 = t.rows.find(row => row['Номенклатура'] === 'Товар 01');
|
||
assert.ok(tovar01, 'Товар 01 виден внутри Товары');
|
||
assert.equal(tovar01['Цена'], '100,00', 'исходная Цена 100,00 (из справочника)');
|
||
});
|
||
|
||
await step('tree-edit: fillTableRow меняет Цену в развёрнутой группе', async () => {
|
||
// row:1 — это Товар 01 (row:0 — Товары после expand). Используем index, т.к.
|
||
// fillTableRow{row:'Товар 01'} ловит SyntaxError в JS-эвале — TODO в bug list.
|
||
const r = await fillTableRow({ Цена: 1500 }, { row: 1 });
|
||
log(`filled: ${JSON.stringify(r.filled)}`);
|
||
assert.equal(r.filled?.length, 1, '1 поле заполнено');
|
||
assert.equal(r.filled[0].field, 'Цена', 'поле Цена');
|
||
assert.equal(r.filled[0].method, 'direct', 'method=direct (in-place edit)');
|
||
assert.equal(r.filled[0].ok, true, 'ok=true');
|
||
const t = await readTable('Дерево');
|
||
const tovar01 = t.rows.find(row => row['Номенклатура'] === 'Товар 01');
|
||
assert.ok(tovar01, 'Товар 01 виден');
|
||
// 1С web использует non-breaking space ( ) как разделитель разрядов
|
||
assert.equal(tovar01['Цена'], '1 500,00', 'Цена обновилась до 1 500,00');
|
||
});
|
||
|
||
await step('cleanup: закрыть форму', async () => {
|
||
await closeForm();
|
||
});
|
||
}
|