Как настроить фильтр одного реквизита по значению другого без использования программного кода?

Программист 1С v8.3 (Управляемые формы)
← На главную

В процессе разработки или настройки конфигураций на платформе 1С часто возникает задача: ограничить список выбора одного поля в зависимости от значения, установленного в другом поле. Классический пример — выбор договора в документе только после того, как указан контрагент. Мы хотим, чтобы при нажатии на кнопку выбора договора система показывала не все существующие в базе договоры, а только те, которые принадлежат выбранному контрагенту. Рассмотрим, как реализовать этот механизм, используя только стандартные свойства объектов, не прибегая к написанию программного кода в модулях формы.

Постановка задачи и базовые понятия

Проанализируем стандартную ситуацию: в документе присутствуют два реквизита — Контрагент и Договор. Наша цель заключается в том, чтобы при заполнении поля Договор платформа автоматически применяла фильтр. Для этого в 1С предусмотрены два ключевых свойства в палитре свойств реквизитов:

Разбор ситуации: справочники с иерархией владения

Выясним, как действовать, если справочник Договоры является подчиненным справочнику Контрагенты. В архитектуре 1С это означает, что у договора есть стандартный реквизит Владелец. В этом случае настройка максимально упрощается. Разберем по шагам действия в конфигураторе:

  1. Откроем свойства реквизита Договор в нашем документе.
  2. Найдем пункт Связи параметров выбора и нажмем кнопку открытия (три точки).
  3. В появившемся окне добавим новую связь.
  4. В колонке «Параметр выбора» укажем Отбор.Владелец.
  5. В колонке «Путь к данным» выберем реквизит нашего документа — Контрагент.

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

Связь через произвольный реквизит (неподчиненные справочники)

Рассмотрим более сложную, но часто встречающуюся ситуацию: справочник договоров не является подчиненным контрагентам, однако в нем есть обычный реквизит Контрагент (тип СправочникСсылка.Контрагенты). Проанализируем, как настроить фильтр в этом случае. Логика остается схожей, но меняется параметр отбора:

В окне настройки Связей параметров выбора для реквизита Договор нам нужно указать в качестве параметра выбора не владельца, а конкретное имя реквизита в справочнике договоров, по которому будет идти фильтрация. Это будет выглядеть как Отбор.Контрагент. В качестве пути к данным мы снова указываем Объект.Контрагент (значение из текущего документа).

Таким образом, даже если справочники логически не связаны иерархией «начальник-подчиненный», мы можем устанавливать фильтры по любым совпадающим типам данных. Главное условие — в целевом справочнике (откуда выбираем) должен быть реквизит, по которому мы хотим фильтровать.

Проблема очистки поля и механизм «Связанного изменения»

Посмотрим на ситуацию, которая часто пугает начинающих разработчиков: при изменении контрагента уже выбранный договор внезапно исчезает (поле очищается). Разберем причину этого поведения. Платформа 1С строго следит за целостностью данных. Если мы изменили контрагента, то старый договор перестал соответствовать установленному фильтру (связи параметров выбора). Чтобы в документе не возникло логической ошибки (Контрагент А, а договор от Контрагента Б), система очищает зависимое поле.

Управлять этим поведением можно через свойство Связанное изменение. Если мы хотим, чтобы система не очищала поле автоматически (хотя это не рекомендуется с точки зрения корректности данных), настройки этого свойства позволяют переопределить стандартную реакцию платформы. Однако в большинстве случаев автоматическая очистка — это именно то, что обеспечивает правильную работу бизнес-логики.

Настройка на уровне метаданных или на уровне формы

Важно понимать, где именно устанавливать эти настройки. Проанализируем два подхода:

  1. В объекте метаданных (в справочнике или документе): Если мы настроим связи параметров выбора прямо в свойствах реквизита объекта в дереве конфигурации, этот фильтр будет работать «глобально». В любом месте программы, где вы добавите этот реквизит на форму, фильтр подтянется автоматически.
  2. В свойствах элемента формы: Если нам нужно, чтобы фильтр работал только в одном конкретном документе или даже в одной конкретной форме, настройку следует выполнять в свойствах элемента формы (поля ввода). Настройки на уровне формы имеют приоритет над настройками метаданных объекта.

Фильтрация по нескольким критериям

Система 1С позволяет создавать сложные цепочки зависимостей. Рассмотрим пример, когда договор должен фильтроваться одновременно по двум полям: Контрагент и Организация. Если в справочнике договоров есть оба этих реквизита, мы можем добавить в окне Связи параметров выбора две строки:

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

Влияние на автоподбор и производительность

Заметим, что использование Связей параметров выбора — это самый производительный и правильный способ фильтрации с точки зрения клиент-серверного взаимодействия. Платформа самостоятельно оптимизирует запросы к базе данных. Кроме того, эти настройки автоматически влияют на механизм автоподбора. Когда пользователь начинает вводить название договора с клавиатуры, система сразу ограничивает список подсказок, учитывая установленного контрагента. Это работает одинаково эффективно как в тонком клиенте, так и в веб-клиенте, обеспечивая единообразие интерфейса.

Итоги настройки

Мы выяснили, что для создания динамических фильтров в 1С совершенно не обязательно писать код в обработчиках ПриИзменении или НачалоВыбора. Использование встроенного механизма связей позволяет:

Таким образом, перед тем как приступать к программированию сложных фильтров, всегда стоит проверить возможности палитры свойств реквизитов, так как большинство типовых задач выбора «по владельцу» или «по значению реквизита» решаются стандартными средствами платформы 1С.

← На главную