feat(web-test): readTable отдаёт состояние строки по ведущей иконке

readTable матчил только спрайты pictureCollection (именованные pic-колонки), а
ведущая иконка состояния приходит из convertPicture?url=e1csys/<dir>/<file>.zip&gx=N
и молча дропалась. Проверить «помечен на удаление» можно было только выводом
колонки через «Настроить список» в каждом тесте.

Строка списка объектов теперь отдаёт плоские булевы _deleted / _posted /
_predefined / _completed / _started / _finished и сырьё _rowPic для диагностики.

Ключ словаря — ПОЛНЫЙ путь спрайта, не имя файла: basic/folder.zip и
accnt/folder.zip — разные файлы с одинаковым именем и разной раскладкой gx
(в basic gx=1 элемент, в accnt gx=1 предопределённый).

Отсутствие булева значит «не знаю», а не false: ось неприменима либо кадр не
расшифрован. Дефолт false отвергнут — врал бы молча в зелёную сторону.

Пути и раскладки сняты живьём на ERP; у Task/BusinessProcess раскладка сверена с
данными списка. Кадры 4/5 basic/folder.zip (второе измерение — иерархия
элементов) расшифрованы по байтовому равенству кадров: gx4 ≡ gx1, gx5 ≡ gx3.

Стенд: документы в заданных состояниях + помеченный элемент справочника +
безымянная picture-колонка ПЕРЕД значком состояния — воспроизводит ловушку
«первый .gridBoxImg не тот» (проверено подменой на наивный экстрактор).

Тест 22-row-state; полный регресс 27/27.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-07-16 20:59:17 +03:00
parent 115a966f0f
commit ad8a2e5cab
7 changed files with 312 additions and 3 deletions
+17
View File
@@ -260,6 +260,23 @@ console.log('Расшифровка:', JSON.stringify(drilldown.rows));
- `_selected: true` — строка выделена (подсвечена). Используйте с `clickElement({ modifier: 'ctrl'|'shift' })` для проверки мультиселекции
- На объекте результата: `hierarchical: true`, `viewMode: 'tree'`
Состояние строки — в списках объектов, расшифровывается по иконке состояния (выводить колонку в список не нужно):
- `_deleted: true|false` — помечен на удаление (справочники, документы, задачи, бизнес-процессы, планы счетов и видов расчёта)
- `_posted: true|false` — документы
- `_predefined: true|false` — справочники, планы счетов и видов расчёта
- `_completed: true|false` — задачи
- `_started`, `_finished` — бизнес-процессы
- `_rowPic: '<иконка>:<N>'` — сырой идентификатор иконки, для диагностики
```js
const t = await readTable();
const doc = t.rows.find(r => r['Номер'] === 'ТД00-000005');
if (doc._deleted === true) { /* помечен на удаление */ }
```
**Отсутствие поля состояния значит «не знаю», а не `false`** — свойство может быть неприменимо (у документов нет `_predefined`) либо иконка не распознана. Поэтому `if (!row._deleted)` небезопасно: «не знаю» читается как «не помечен». Сравнивайте явно (`=== true` / `=== false`), а `undefined` считайте третьим исходом. У строк вне списков объектов (табличные части форм, списки значений) полей состояния нет вовсе. Если `_rowPic` есть, а булевых нет — пришлите его значение, для этой иконки нужна поддержка расшифровки.
**Виртуализация и `hasMore`.** 1С виртуализирует и динамические списки, и табличные части — в DOM лежит только окно видимых строк. Поля `total` / `shown` — это размер DOM-окна, а **не** размер коллекции. Чтобы понять, есть ли строки за пределами окна, используйте `hasMore`:
```js