fix(web-test): fillTableRow — ранний выход после заполнения всех полей строки

Tab-цикл не выходил сразу после заполнения последнего поля: ветки заполнения по
составному типу и по примитиву делали continue без проверки «все поля закрыты», и
цикл протабывал остаток строки до wrap-around. На широких строках с объединёнными
колонками (составной субконто) это заметно «бежало» табами до конца строки — холостые
итерации + риск ухода фокуса/создания лишней строки.

- row-fill v1.24: единая проверка в начале итерации `if (every filled) break`.
  Значение последнего поля к этому моменту уже зафиксировано (commit-Tab примитива,
  выбор из формы, либо end-of-row commit для choice-ячейки).
- 05-table: guard на количество строк после составного фила.

Проверено: полный регресс web-test 22/22; вживую на широкой ТЧ с составным субконто —
лишний хвост табов устранён.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-06-24 13:22:31 +03:00
parent a633520c66
commit 9eb9571e95
2 changed files with 11 additions and 2 deletions
@@ -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());
+4 -1
View File
@@ -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 });
});