diff --git a/.claude/skills/web-test/scripts/engine/table/row-fill.mjs b/.claude/skills/web-test/scripts/engine/table/row-fill.mjs index 26387d50..226438f7 100644 --- a/.claude/skills/web-test/scripts/engine/table/row-fill.mjs +++ b/.claude/skills/web-test/scripts/engine/table/row-fill.mjs @@ -1,4 +1,4 @@ -// web-test table/row-fill v1.23 — fillTableRow — заполнение строки табличной части/списка через Tab-навигацию и попутный выбор значений. +// web-test table/row-fill v1.24 — fillTableRow — заполнение строки табличной части/списка через Tab-навигацию и попутный выбор значений. // Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import { @@ -515,6 +515,12 @@ export async function fillTableRow(fields, { tab, add, row, table, scroll } = {} let firstCellId = null; for (let iter = 0; iter < MAX_ITER; iter++) { + // All requested fields filled → stop. Без этого цикл табает дальше до wrap-around + // (обходит остаток строки впустую): ветки заполнения по составному типу/примитиву + // не выходили сами, что особенно заметно на широких строках (субконто/проводки). + // Значение последнего поля к этому моменту уже зафиксировано (commit-Tab примитива, + // выбор из формы, либо end-of-row commit для choice-ячейки). + if ([...pending.values()].every(p => p.filled)) break; // Read focused element (INPUT or TEXTAREA inside grid = editable cell) const cell = await page.evaluate(readActiveGridCellScript()); diff --git a/tests/web-test/05-table.test.mjs b/tests/web-test/05-table.test.mjs index 59688c69..3f669a7e 100644 --- a/tests/web-test/05-table.test.mjs +++ b/tests/web-test/05-table.test.mjs @@ -140,9 +140,12 @@ export default async function({ navigateSection, openCommand, clickElement, fill assert.ok(item?.ok, `ячейка Источник заполнена без ошибки: ${item?.error || ''} ${item?.message || ''}`); const t = await readTable({ table: 'Товары' }); - log(`Источник cell='${t.rows[0]?.['Источник']}'`); + log(`Источник cell='${t.rows[0]?.['Источник']}' rows=${t.rows.length}`); assert.equal(t.rows[0]?.['Источник'], 'Север', 'exact-preference + клик в видимую ячейку: выбран точный «Север», не «ООО Север»'); + // Guard: после составного фила цикл не должен табать дальше до создания лишней + // строки (раньше ветка type→форма не выходила по «всё заполнено»). + assert.equal(t.rows.length, 1, 'ровно одна строка — лишние табы не создали пустую'); await closeForm({ save: false }); });