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
@@ -349,6 +349,17 @@ export const steps = [
\t\tЭлемент.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Товар;
\t\tЭлемент.Записать();
\tКонецЦикла;
\t// Элемент С ПОМЕТКОЙ УДАЛЕНИЯ — для теста ведущей иконки состояния строки (22-row-state).
\t// Внутри группы Товары, а не на верхнем уровне: 08-hierarchy проверяет ровно 3 группы сверху.
\tПомеченный = Справочники.Номенклатура.СоздатьЭлемент();
\tПомеченный.Родитель = ГруппаТовары;
\tПомеченный.Наименование = "Товар помеченный";
\tПомеченный.Артикул = "TDEL1";
\tПомеченный.Цена = 999;
\tПомеченный.Активен = Истина;
\tПомеченный.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Товар;
\tПомеченный.Записать();
\tПомеченный.Ссылка.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
\tДля Сч = 1 По 10 Цикл
\t\tЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
\t\tЭлемент.Родитель = ГруппаУслуги;
@@ -427,6 +438,37 @@ export const steps = [
\t\tСтрока.Сумма = Строка.Количество * Строка.Цена;
\tКонецЦикла;
\tДокДлинный.Записать(РежимЗаписиДокумента.Запись);
\tЗаполнитьДокументыСостояний(Организация, Контрагенты, Номенклатура);
КонецПроцедуры
// Документы в ЗАДАННЫХ состояниях — для теста ведущей иконки состояния строки (22-row-state).
// Ищутся по Комментарий, не по позиции: список сортируется по дате, порядок не гарантирован.
Процедура ЗаполнитьДокументыСостояний(Организация, Контрагенты, Номенклатура)
\tСостояния = Новый Массив;
\tСостояния.Добавить("StatePosted");
\tСостояния.Добавить("StateDeleted");
\tСостояния.Добавить("StateWritten");
\tДля Каждого Состояние Из Состояния Цикл
\t\tДок = Документы.ПриходнаяНакладная.СоздатьДокумент();
\t\tДок.Дата = ТекущаяДата();
\t\tДок.Организация = Организация;
\t\tДок.Контрагент = Контрагенты[0];
\t\tДок.Склад = "Основной";
\t\tДок.Комментарий = Состояние;
\t\tСтрока = Док.Товары.Добавить();
\t\tСтрока.Номенклатура = Номенклатура[0];
\t\tСтрока.Количество = 1;
\t\tСтрока.Цена = 100;
\t\tСтрока.Сумма = 100;
\t\tЕсли Состояние = "StatePosted" Тогда
\t\t\tДок.Записать(РежимЗаписиДокумента.Проведение);
\t\tИначе
\t\t\tДок.Записать(РежимЗаписиДокумента.Запись);
\t\t\tЕсли Состояние = "StateDeleted" Тогда
\t\t\t\tДок.Ссылка.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
\t\t\tКонецЕсли;
\t\tКонецЕсли;
\tКонецЦикла;
КонецПроцедуры
`,
},
@@ -848,6 +890,14 @@ export const steps = [
],
elements: [
{ table: 'Список', path: 'Список', columns: [
// Произвольная картинка в ВЕДУЩЕЙ позиции — рядом с платформенным значком состояния
// строки. Даёт строку с двумя значками: pictureCollection (эта колонка) и
// convertPicture (состояние). Тест 22-row-state ловит на ней экстрактор, который
// берёт первый .gridBoxImg вместо нужного.
// titleLocation none — колонка БЕЗ шапки: попадает в ветку именования безымянных
// колонок readTable (по тултипу заголовка → '(picture)'), а не в обычную.
{ picField: 'Метка', path: 'Список.Posted', title: 'Метка', titleLocation: 'none',
valuesPicture: 'StdPicture.Favorites' },
{ input: 'Date', path: 'Список.Date', title: 'Дата' },
{ input: 'Number', path: 'Список.Number', title: 'Номер' },
{ input: 'Контрагент', path: 'Список.Контрагент', title: 'Контрагент' },