Справка

Справочники

Облачный Pyrus
Безоблачный Pyrus

Скрипты позволяют с помощью метода getCatalog получать значения справочников и использовать их в форме: например, вычислять табличные значения или фильтровать строки одного справочника по значению из другого справочника. Метод возвращает Promise («обещание») с элементами справочника, поэтому важно использовать его с асинхронными методами изменения полей формы (setValueAsync, setValuesAsync, setFilterAsync, validateAsync).

Допустим, есть задача: когда оператор выбирает в форме регион, в поле Город должны быть доступны только города из этого региона, а не общий список городов.

В этом примере полю Регион соответствует справочник Регионы, а полю Город — справочник Города. Города и регионы связаны между собой в отдельном справочнике Города по регионам.

Чтобы фильтровать список городов по выбранному региону, добавим в скрипты формы следующий блок кода:

const catalogPromise = form.getCatalog("Города по регионам");

form.onChange(["Регион"])
  .setFilterAsync("Город", async state => {
    const [region] = state.changes;

    const catalogItems = await catalogPromise;

    if (!catalogItems || !region || !region.columns)
      return null;

    const regionCol = region.columns["Регион"];
    const filtered = catalogItems
        .filter(item => item.columns["Регион"] === regionCol)
        .map(item => item.columns["Город"]);
    return filtered.length > 0
        ? {
            values: filtered
        }
        : null
});

Получить справочник можно не только по названию, но еще и числовому ID. В этом случае соответствующий фрагмент кода в скрипте будет выглядеть так:

const catalogPromise = form.getCatalog(123);

Подсказка: при создании скрипта следует учитывать, что он должен обращаться к названию собственно справочника, а не одноименного поля в форме. Например, в форме может использоваться поле типа Справочник под названием Страны и регионы, к которому привязан сам справочник Страны. В этом случает скрипт должен обращаться к объекту под названием Страны.

Была ли эта статья полезной?