mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-07-06 11:18:56 +03:00
842e1d0de9
Модель может заполнять поля-списки одним значением или массивом через 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>
116 lines
8.1 KiB
JavaScript
116 lines
8.1 KiB
JavaScript
export const name = 'multi-select: selectValue(field, [v1,v2]) across 5 value-list surfaces';
|
|
export const tags = ['multiselect', 'selectvalue', 'smoke'];
|
|
export const timeout = 420000;
|
|
|
|
// selectValue с массивом значений → мультивыбор в полях типа «список значений».
|
|
// Стенд: обработка МножественныйВыбор, 5 поверхностей:
|
|
// ЧерезФлажки → checkbox-form, ЧерезПодбор → pool+Подбор, ОрганизацииСписок → cloudDD,
|
|
// КонтрагентыСписок → catalog multi-row (Ctrl), СписокПлатформенный → platform pool+Подбор.
|
|
|
|
const sortq = a => [...a].sort();
|
|
|
|
export default async function({ navigateLink, selectValue, fillFields, getFormState, wait, assert, step, log }) {
|
|
|
|
const fieldValue = async (name) => {
|
|
const fs = await getFormState();
|
|
return (fs.fields || []).find(f => f.name === name)?.value || '';
|
|
};
|
|
|
|
await step('setup: открыть обработку МножественныйВыбор', async () => {
|
|
await navigateLink('Обработка.МножественныйВыбор');
|
|
await wait(1);
|
|
});
|
|
|
|
// ── A: custom checkbox form (all candidates) ────────────────────────────────
|
|
await step('A (checkbox-form): выбрать [Альфа, Бета]', async () => {
|
|
const r = await selectValue('Через флажки', ['Альфа', 'Бета']);
|
|
log(`A selected: ${JSON.stringify(r.selected)}`);
|
|
assert.deepEqual(sortq(r.selected.values), sortq(['Альфа', 'Бета']), 'оба значения выбраны');
|
|
assert.ok(!r.selected.notSelected, 'notSelected отсутствует');
|
|
assert.equal(await fieldValue('ЧерезФлажки'), 'Альфа, Бета', 'значение поля = набор');
|
|
});
|
|
|
|
await step('A: replace на подмножество + несуществующее [Бета, Гамма]', async () => {
|
|
const r = await selectValue('Через флажки', ['Бета', 'Гамма']);
|
|
log(`A2 selected: ${JSON.stringify(r.selected)}`);
|
|
assert.deepEqual(r.selected.values, ['Бета'], 'осталась только Бета (Альфа снята)');
|
|
assert.ok(r.selected.notSelected?.some(n => n.value === 'Гамма'), 'Гамма → notSelected');
|
|
assert.equal(await fieldValue('ЧерезФлажки'), 'Бета', 'replace: поле = Бета');
|
|
});
|
|
|
|
// ── B: custom pool + Подбор (catalog Номенклатура) ──────────────────────────
|
|
await step('B (pool+Подбор): выбрать [Товар 01, Товар 02]', async () => {
|
|
const r = await selectValue('Через подбор', ['Товар 01', 'Товар 02']);
|
|
log(`B selected: ${JSON.stringify(r.selected)}`);
|
|
assert.deepEqual(sortq(r.selected.values), sortq(['Товар 01', 'Товар 02']), 'оба товара подобраны');
|
|
assert.ok(!r.selected.notSelected, 'notSelected отсутствует');
|
|
});
|
|
|
|
await step('B: replace на [Товар 02] (очистка пула Ctrl+A+Delete)', async () => {
|
|
const r = await selectValue('Через подбор', ['Товар 02']);
|
|
log(`B2 selected: ${JSON.stringify(r.selected)}`);
|
|
assert.deepEqual(r.selected.values, ['Товар 02'], 'остался только Товар 02');
|
|
assert.equal(await fieldValue('ЧерезПодбор'), 'Товар 02', 'replace: поле = Товар 02');
|
|
});
|
|
|
|
// ── C: platform cloudDD checkbox dropdown ───────────────────────────────────
|
|
await step('C (cloudDD): выбрать [Альфа, Бета]', async () => {
|
|
const r = await selectValue('Организации (список)', ['Альфа', 'Бета']);
|
|
log(`C selected: ${JSON.stringify(r.selected)}`);
|
|
assert.deepEqual(sortq(r.selected.values), sortq(['Альфа', 'Бета']), 'оба выбраны в дропдауне');
|
|
assert.equal(await fieldValue('ОрганизацииСписок'), 'Альфа, Бета', 'значение поля = набор');
|
|
});
|
|
|
|
await step('C: replace на [Бета] (снятие + клик-вне)', async () => {
|
|
const r = await selectValue('Организации (список)', ['Бета']);
|
|
log(`C2 selected: ${JSON.stringify(r.selected)}`);
|
|
assert.deepEqual(r.selected.values, ['Бета'], 'осталась только Бета');
|
|
assert.equal(await fieldValue('ОрганизацииСписок'), 'Бета', 'replace в cloudDD');
|
|
});
|
|
|
|
// ── D: platform catalog multi-row select (Ctrl) ─────────────────────────────
|
|
await step('D (catalog multi-row): выбрать [АО Запад, ООО Восток]', async () => {
|
|
const r = await selectValue('Контрагенты (список)', ['АО Запад', 'ООО Восток']);
|
|
log(`D selected: ${JSON.stringify(r.selected)}`);
|
|
assert.deepEqual(sortq(r.selected.values), sortq(['АО Запад', 'ООО Восток']), 'обе строки выбраны Ctrl-кликом');
|
|
assert.equal(await fieldValue('КонтрагентыСписок'), 'АО Запад, ООО Восток', 'значение поля = набор');
|
|
});
|
|
|
|
// ── E: platform pool + Подбор (catalog Контрагенты) ─────────────────────────
|
|
await step('E (platform pool+Подбор): выбрать [ООО Север, ООО Юг]', async () => {
|
|
const r = await selectValue('Без расширенного', ['ООО Север', 'ООО Юг']);
|
|
log(`E selected: ${JSON.stringify(r.selected)}`);
|
|
assert.deepEqual(sortq(r.selected.values), sortq(['ООО Север', 'ООО Юг']), 'оба контрагента подобраны');
|
|
assert.ok(!r.selected.notSelected, 'notSelected отсутствует');
|
|
});
|
|
|
|
// ── Делегирование через fillFields / одиночный selectValue (поведенческая детекция) ──
|
|
await step('fillFields одиночное на поле-списке (DLB) → делегирует, не виснет', async () => {
|
|
const f = await fillFields({ 'Через флажки': 'Альфа' });
|
|
log(`fillFields single: ${JSON.stringify(f.filled)}`);
|
|
assert.ok(f.filled?.[0]?.ok, 'значение проставлено без зависания');
|
|
assert.equal(await fieldValue('ЧерезФлажки'), 'Альфа', 'поле = Альфа');
|
|
});
|
|
|
|
await step('fillFields массивом на поле-списке → делегирует в мультивыбор', async () => {
|
|
const f = await fillFields({ 'Через флажки': ['Альфа', 'Бета'] });
|
|
log(`fillFields array: ${JSON.stringify(f.filled)}`);
|
|
assert.deepEqual(sortq(f.filled?.[0]?.values || []), sortq(['Альфа', 'Бета']), 'оба выбраны');
|
|
assert.equal(await fieldValue('ЧерезФлажки'), 'Альфа, Бета', 'поле = набор');
|
|
});
|
|
|
|
await step('fillFields одиночное на платформенном (CB) → не throw type-dialog (replace непустого пула)', async () => {
|
|
const f = await fillFields({ 'Без расширенного': 'АО Запад' });
|
|
log(`fillFields CB single: ${JSON.stringify(f.filled)}`);
|
|
assert.ok(f.filled?.[0]?.ok, 'значение проставлено (без ошибки type dialog)');
|
|
assert.equal(await fieldValue('СписокПлатформенный'), 'АО Запад', 'поле = АО Запад');
|
|
});
|
|
|
|
await step('одиночный selectValue на поле-списке → делегирует', async () => {
|
|
const r = await selectValue('Через флажки', 'Бета');
|
|
log(`selectValue single: ${JSON.stringify(r.selected)}`);
|
|
assert.deepEqual(r.selected.values, ['Бета'], 'одно значение выбрано');
|
|
assert.equal(await fieldValue('ЧерезФлажки'), 'Бета', 'поле = Бета');
|
|
});
|
|
}
|