Как настроить связи параметров выбора для реквизитов формы в 1С 8.3

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

При разработке на управляемых формах 1С часто возникает задача ограничить список выбора в одном поле в зависимости от значения другого. Классический пример — выбор Договора, принадлежащего конкретному Контрагенту. Если реквизиты являются частью объекта (например, документа), платформа позволяет настроить это в метаданных. Однако, если реквизиты созданы непосредственно на форме (вкладка «Реквизиты» редактора формы), задача требует иного подхода. В этой статье мы подробно разберем, как реализовать механизм связей параметров выбора для реквизитов формы, используя как визуальные средства конфигуратора, так и программный код.

Метод 1. Настройка через свойства элемента формы (визуальный способ)

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

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

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

Метод 2. Программная установка параметров выбора (ChoiceParameters)

Иногда требуется установить фильтр, который не зависит от другого поля на форме, а определяется логикой приложения (например, фильтр по виду документа или статусу). В этом случае мы используем свойство ПараметрыВыбора. Рассмотрим пример, когда при открытии формы нам нужно жестко ограничить список выбора договоров только определенным видом.

Проанализируем программный код, который можно разместить в процедуре ПриСозданииНаСервере:


// Создаем массив для хранения параметров
ПараметрыВыбора = Новый Массив;

// Формируем параметр: имя отбора и значение
НовыйПараметр = Новый ПараметрВыбора("Отбор.ВидДоговора", Перечисления.ВидыДоговоров.СПокупателем);
ПараметрыВыбора.Добавить(НовыйПараметр);

// Устанавливаем фиксированный массив в свойство элемента формы
Элементы.Договор.ПараметрыВыбора = Новый ФиксированныйМассив(ПараметрыВыбора);

Обратите внимание на использование объекта ФиксированныйМассив. Это обязательное требование платформы для свойств элементов формы. Обычный Массив вызвать ошибку при попытке присваивания.

Метод 3. Динамическая программная настройка связей (ChoiceParameterLinks)

Бывают ситуации, когда связи между полями нужно устанавливать или изменять динамически в процессе работы формы. Для этого используется свойство СвязиПараметровВыбора программно. Это более гибкий аналог первого метода.

Рассмотрим, как это выглядит в коде:


// Создаем объект связи
// Первый параметр — путь к данным для отбора в форме выбора (Отбор.Владелец)
// Второй параметр — имя реквизита формы, который выступает источником данных
НоваяСвязь = Новый СвязьПараметраВыбора("Отбор.Владелец", "РеквизитФормыКонтрагент");

МассивСвязей = Новый Массив;
МассивСвязей.Добавить(НоваяСвязь);

// Применяем настройки к элементу формы
Элементы.Договор.СвязиПараметровВыбора = Новый ФиксированныйМассив(МассивСвязей);

Преимущество этого метода перед простым ПараметрыВыбора в том, что поле Договор начнет автоматически «слушать» изменения в поле Контрагент. Нам не нужно писать дополнительный код для обновления фильтра при каждом изменении контрагента.

Метод 4. Обработка события «НачалоВыбора» для сложной логики

Если стандартных отборов через Владелец недостаточно (например, нужно отфильтровать договоры по сложному условию, зависящему от даты, суммы или остатков на складе), мы используем событие НачалоВыбора. Рассмотрим ситуацию, когда нам нужно передать в форму выбора сложную структуру параметров.

Разберем алгоритм действий в обработчике события:


&НаКлиенте
Процедура ДоговорНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    // Отключаем стандартное открытие формы выбора
    СтандартнаяОбработка = Ложь;
    
    // Формируем параметры открытия формы выбора
    ПараметрыОткрытия = Новый Структура;
    
    // Создаем структуру отбора
    Отбор = Новый Структура;
    Отбор.Вставить("Владелец", Объект.Контрагент);
    Отбор.Вставить("СтатусДоговора", ПредопределенноеЗначение("Перечисление.СтатусыДоговоров.Действует"));
    
    // Передаем отбор в параметры
    ПараметрыОткрытия.Вставить("Отбор", Отбор);
    
    // Открываем форму выбора справочника Договоры
    ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаВыбора", ПараметрыОткрытия, Элемент);
    
КонецПроцедуры

В данном примере мы полностью берем управление на себя. Это позволяет накладывать любые фильтры, поддерживаемые механизмом Отбор в 1С.

Важные дополнения: очистка данных и история выбора

При реализации зависимости между полями (Контрагент -> Договор) важно не забывать о «подводных камнях», которые могут привести к логическим ошибкам в данных:

1. Очистка зависимого поля. Если пользователь уже выбрал договор, а затем решил изменить контрагента, в поле «Договор» может остаться старое значение, которое теперь не соответствует новому контрагенту. Чтобы этого избежать, проанализируем событие ПриИзменении для поля Контрагент:


&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
    // Очищаем зависимый реквизит при смене владельца
    Объект.Договор = ПредопределенноеЗначение("Справочник.ДоговорыКонтрагентов.ПустаяСсылка");
КонецПроцедуры

2. История выбора. В современных версиях платформы 8.3 у элементов формы включена «История выбора». Пользователь может увидеть в списке быстрого выбора старые договоры, которые не подпадают под текущий фильтр. Если вы хотите добиться максимальной строгости, можно отключить историю выбора для конкретного элемента, установив свойство ОбновлениеТекстаРедактирования в значение ПриИзменении или программно ограничив АвтоВыборИзТекста.

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

← На главную