В процессе разработки или настройки конфигураций на платформе 1С часто возникает задача: ограничить список выбора одного поля в зависимости от значения, установленного в другом поле. Классический пример — выбор договора в документе только после того, как указан контрагент. Мы хотим, чтобы при нажатии на кнопку выбора договора система показывала не все существующие в базе договоры, а только те, которые принадлежат выбранному контрагенту. Рассмотрим, как реализовать этот механизм, используя только стандартные свойства объектов, не прибегая к написанию программного кода в модулях формы.
Проанализируем стандартную ситуацию: в документе присутствуют два реквизита — Контрагент и Договор. Наша цель заключается в том, чтобы при заполнении поля Договор платформа автоматически применяла фильтр. Для этого в 1С предусмотрены два ключевых свойства в палитре свойств реквизитов:
ChoiceParameters) — используются для установки статических, неизменных фильтров. Например, если нам нужно всегда видеть только те договоры, у которых статус установлен в значение «Действующий».ChoiceParameterLinks) — это инструмент для создания динамических фильтров. Именно он позволяет связать список выбора одного реквизита с текущим значением другого реквизита на форме.Выясним, как действовать, если справочник Договоры является подчиненным справочнику Контрагенты. В архитектуре 1С это означает, что у договора есть стандартный реквизит Владелец. В этом случае настройка максимально упрощается. Разберем по шагам действия в конфигураторе:
Договор в нашем документе.Отбор.Владелец.Контрагент.После такой настройки платформа поймет, что при открытии формы выбора договоров нужно автоматически передать параметр отбора по владельцу, равному текущему значению контрагента в документе.
Рассмотрим более сложную, но часто встречающуюся ситуацию: справочник договоров не является подчиненным контрагентам, однако в нем есть обычный реквизит Контрагент (тип СправочникСсылка.Контрагенты). Проанализируем, как настроить фильтр в этом случае. Логика остается схожей, но меняется параметр отбора:
В окне настройки Связей параметров выбора для реквизита Договор нам нужно указать в качестве параметра выбора не владельца, а конкретное имя реквизита в справочнике договоров, по которому будет идти фильтрация. Это будет выглядеть как Отбор.Контрагент. В качестве пути к данным мы снова указываем Объект.Контрагент (значение из текущего документа).
Таким образом, даже если справочники логически не связаны иерархией «начальник-подчиненный», мы можем устанавливать фильтры по любым совпадающим типам данных. Главное условие — в целевом справочнике (откуда выбираем) должен быть реквизит, по которому мы хотим фильтровать.
Посмотрим на ситуацию, которая часто пугает начинающих разработчиков: при изменении контрагента уже выбранный договор внезапно исчезает (поле очищается). Разберем причину этого поведения. Платформа 1С строго следит за целостностью данных. Если мы изменили контрагента, то старый договор перестал соответствовать установленному фильтру (связи параметров выбора). Чтобы в документе не возникло логической ошибки (Контрагент А, а договор от Контрагента Б), система очищает зависимое поле.
Управлять этим поведением можно через свойство Связанное изменение. Если мы хотим, чтобы система не очищала поле автоматически (хотя это не рекомендуется с точки зрения корректности данных), настройки этого свойства позволяют переопределить стандартную реакцию платформы. Однако в большинстве случаев автоматическая очистка — это именно то, что обеспечивает правильную работу бизнес-логики.
Важно понимать, где именно устанавливать эти настройки. Проанализируем два подхода:
Система 1С позволяет создавать сложные цепочки зависимостей. Рассмотрим пример, когда договор должен фильтроваться одновременно по двум полям: Контрагент и Организация. Если в справочнике договоров есть оба этих реквизита, мы можем добавить в окне Связи параметров выбора две строки:
Отбор.Владелец — Объект.КонтрагентОтбор.Организация — Объект.ОрганизацияВ таком случае при выборе договора пользователь увидит только те записи, которые одновременно принадлежат и указанному контрагенту, и указанной организации предприятия.
Заметим, что использование Связей параметров выбора — это самый производительный и правильный способ фильтрации с точки зрения клиент-серверного взаимодействия. Платформа самостоятельно оптимизирует запросы к базе данных. Кроме того, эти настройки автоматически влияют на механизм автоподбора. Когда пользователь начинает вводить название договора с клавиатуры, система сразу ограничивает список подсказок, учитывая установленного контрагента. Это работает одинаково эффективно как в тонком клиенте, так и в веб-клиенте, обеспечивая единообразие интерфейса.
Мы выяснили, что для создания динамических фильтров в 1С совершенно не обязательно писать код в обработчиках ПриИзменении или НачалоВыбора. Использование встроенного механизма связей позволяет:
Таким образом, перед тем как приступать к программированию сложных фильтров, всегда стоит проверить возможности палитры свойств реквизитов, так как большинство типовых задач выбора «по владельцу» или «по значению реквизита» решаются стандартными средствами платформы 1С.