Фильтрация элементов
Скрипты позволяют ограничивать список доступных вариантов значений для полей типа Справочник или Форма. Для этого необходимо подписаться на изменение необходимых полей формы через onChange и вызвать одну из функций установки фильтра: setFilter или setFilterAsync.
Фильтрация элементов справочника
При работе с полем Справочник функция фильтрации должна вернуть объект с полем values, содержащим список значений первой колонки справочника.
interface form { onChange( fieldNames: string[], executeOnLoad: boolean = false ): ChangeHandler } interface ChangeHandler { setFilter( fieldName: string, calcFilter: (state: FormState) => { values: string[] } | null ) setFilterAsync( fieldName: string, calcFilterAsync: (state: FormState) => Promise<{ values: string[] } | null> ) }
Рассмотрим пример: когда оператор выбирает в форме регион, в поле Город должны быть доступны только города из этого региона, а не общий список городов.
В этом примере полю Регион соответствует справочник Регионы, а полю Город — справочник Города. Города и регионы связаны между собой в отдельном справочнике Города по регионам.
Чтобы фильтровать список городов по выбранному региону, добавим в скрипты формы следующий блок кода:
const catalogPromise = form.getCatalog("Города по регионам"); // ↓ Название поля со справочником «Регионы» form.onChange(["Регион"]) // ↓ Название поля со справочником «Города» .setFilterAsync("Город", async state => { const [region] = state.changes; const catalogItems = await catalogPromise; if (!catalogItems || !region?.columns) return null; // Получаем значение колонки «Регион» из выбранного // элемента справочника «Регионы» const regionCol = region.columns["Регион"]; const filtered = catalogItems // Фильтруем элементы справочника «Города по регионам», // оставляя только относящиеся к выбранному региону .filter(item => item.columns["Регион"] === regionCol) // Создаем массив названий городов .map(item => item.columns["Город"]); /* * В переменной filtered сохранится список городов выбранного региона. * Например, для региона «Тульская область»: * ["Алексин", "Богородицк", "Тула", ...] * * Это ключи для фильтрации справочника «Города» (поле «Город»), * соответствующие первой (ключевой) колонке данного справочника. */ return filtered.length > 0 ? { values: filtered } : null });
Фильтрация в поле типа Форма
Для ограничения списка вариантов значений в поле типа Форма функция фильтрации должна вернуть объект с полем filters
, содержащим список условий фильтрации по значениям полей связанной формы.
interface form { onChange( fieldNames: string[], executeOnLoad: boolean = false ): ChangeHandler } interface ChangeHandler { setFilter( fieldName: string, calcFilter: (state: FormState) => { filters?: FormLinkFilter[] } | null ) setFilterAsync( fieldName: string, calcFilterAsync: (state: FormState) => Promise<{ filters?: FormLinkFilter[] } | null> ) } interface FormLinkFilter { fieldId?: number; fieldName?: string; fieldCode?: string; value: FieldValue; }
Каждое условие фильтрации FormLinkFilter включает идентификатор поля связанной формы (fieldId или fieldName или fieldCode) и значение поля.
Рассмотрим пример: при изменении поля «manager» будем фильтровать список задач в поле «contragent», показывая только те задачи связанной формы, в которых в поле «Менеджер» указан тот же пользователь, что и в поле «manager» исходной формы.
form.onChange(["manager"], true) .setFilter("contragent", state => { const [manager] = state.changes; if (!manager?.person_id) return null; return { filters: [{ fieldName: "Менеджер", value: manager.person_id }] } });