feat(web-test): fillFields/одиночный selectValue на полях-списках значений + фиксы

Модель может заполнять поля-списки одним значением или массивом через fillFields/
selectValue — раньше это виснет (DLB→форма «Выбор значений», safeClick по surface)
или throw «type dialog» (CB→«Список значений», ложный isTypeDialog). Статически
поле-список не отличить от обычного рефа → детекция поведенческая.

- Рефактор-шов: selectValuesMulti = открытие + dispatchMultiSurface(field,values,
  {formNum,isCloudDD,baseForm}); детекторы detectMultiSurface/isValueListSurface.
- Делегация на УЖЕ открытой форме (без переоткрытия/мигания), асимметрично по пути:
  DLB (fillReferenceField) — по «DLB открыл форму»; CB (одиночный selectValue, до
  isTypeDialog) — по Подбор/СнятьФлажки. Обычный реф (DLB→инлайн / форма «Выбрать»
  без этих кнопок) НЕ делегируется.
- fillFields: массив → selectValue(array); одиночное течёт в существующие
  hasSelect/hasPick ветки (фикс внутри них).
- Фикс clearPool для платформенного пула: Ctrl+A не выделяет все строки → цикл
  построчного удаления (кастомный пул с чекбоксами — через СнятьФлажки).

Регресс 25/25 (обычный реф Контрагент НЕ делегирован). Доп. кейсы в
22-multiselect-listfield. select-value v1.33, fill v1.20.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-06-29 11:51:36 +03:00
parent 7b53f28644
commit 842e1d0de9
4 changed files with 140 additions and 33 deletions
@@ -1,4 +1,4 @@
// web-test forms/fill v1.19 — Fill form fields by name (text/checkbox/date/number/dropdown/reference). Delegates references to selectValue / fillReferenceField.
// web-test forms/fill v1.20 — Fill form fields by name (text/checkbox/date/number/dropdown/reference; array → multi-select via selectValue). Delegates references to selectValue / fillReferenceField.
// Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import {
@@ -33,6 +33,20 @@ export async function fillFields(fields) {
results.push(r);
continue;
}
// Array value → multi-select. Delegate to selectValue's array branch (auto-detects
// the surface) so fillFields({field:[...]}) works the same as selectValue(field,[...]).
if (Array.isArray(fields[r.field])) {
const sv = await selectValue(r.field, fields[r.field]);
const sel = sv.selected || {};
if (sel.error) {
results.push({ field: r.field, error: sel.error });
} else {
const res = { field: r.field, ok: true, values: sel.values || [], method: 'multi-select' };
if (sel.notSelected?.length) res.notSelected = sel.notSelected;
results.push(res);
}
continue;
}
// Auto-highlight the field input before filling
if (highlightMode && r.inputId) {
try {