Как программно установить связи параметров выбора в документе 1С?

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

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

Особенности свойства «СвязиПараметровВыбора»

Прежде чем перейти к написанию программного кода, разберем ключевые архитектурные особенности данного свойства:

  1. Где настраивать программно: Свойство реквизита в дереве метаданных доступно для изменения только в конфигураторе. В режиме «1С:Предприятие» программно можно управлять только свойством элемента управляемой формы (поля ввода).
  2. Контекст выполнения: Свойство СвязиПараметровВыбора у элементов формы доступно на запись исключительно на сервере. Попытка изменить его на клиенте вызовет ошибку времени выполнения. Поэтому правильное место для первичной установки — серверные обработчики формы, такие как ПриСозданииНаСервере.
  3. Тип данных: Свойство принимает не обычный массив, а ФиксированныйМассив, содержащий объекты типа СвязьПараметраВыбора.

Установка связей для полей шапки документа

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

Разберем по шагам создание структуры связи:

  1. Создаем объект СвязьПараметраВыбора, передавая в конструктор имя отбора в форме выбора (например, "Отбор.Владелец") и путь к реквизиту-источнику данных (например, "Объект.Контрагент").
  2. Помещаем созданную связь во временный массив.
  3. Оборачиваем массив в неизменяемый ФиксированныйМассив.
  4. Присваиваем полученный массив свойству элемента формы.

Посмотрим на пример реализации в процедуре ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    // Проверяем роль пользователя
    Если РольДоступна("МенеджерПоПродажам") Тогда
        
        // Создаем связь: параметр отбора в форме выбора -> путь к данным источника
        НоваяСвязь = Новый СвязьПараметраВыбора("Отбор.Владелец", "Объект.Контрагент");
        
        // Формируем массив связей
        МассивСвязей = Новый Массив;
        МассивСвязей.Добавить(НоваяСвязь);
        
        // Устанавливаем фиксированный массив в свойство элемента формы
        Элементы.Договор.СвязиПараметровВыбора = Новый ФиксированныйМассив(МассивСвязей);
        
    КонецЕсли;

КонецПроцедуры

Установка связей для колонок табличной части

Часто возникает вопрос: как правильно настроить связь параметров выбора, если поле ввода расположено в строке табличной части? Например, когда выбор характеристики должен зависеть от номенклатуры в той же самой строке.

Выясним причину возможных сложностей: главное отличие заключается в корректном указании пути к данным источника:

  1. Если источник находится в шапке документа: Путь к данным указывается стандартно — "Объект.Склад".
  2. Если источник находится в той же строке табличной части: Путь к данным указывается полностью через имя табличной части — например, "Объект.Товары.Номенклатура". Платформа 1С автоматически определяет контекст строки и при открытии выбора в текущей строке считывает номенклатуру именно из нее.

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

КонецПроцедуры

Очистка и сброс связей параметров выбора

Если в процессе работы формы требуется полностью отключить ограничения выбора для поля, достаточно присвоить свойству пустой ФиксированныйМассив на сервере:


&НаСервере
Процедура СброситьСвязиПараметровВыбора(ИмяЭлемента)

    Элементы[ИмяЭлемента].СвязиПараметровВыбора = Новый ФиксированныйМассив(Новый Массив);

КонецПроцедуры

Также обратим внимание на свойство элемента формы РежимОчисткиСвязей (принимает значения РежимОчисткиСвязей.Очищать или РежимОчисткиСвязей.НеОчищать). Если установлено значение Очищать, то при изменении значения в поле-источнике (например, при смене контрагента) связанное значение (договор) будет автоматически очищено платформой.

Реализация связей и ограничений в форме «Подбор номенклатуры»

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

Разберем, как передать параметры контекста документа в форму подбора и применить отборы:

Шаг 1: Передача параметров из формы документа при открытии подбора


&НаКлиенте
Процедура ОбработкаКомандыПодбор(Команда)

    ПараметрыПодбора = Новый Структура;
    ПараметрыПодбора.Вставить("Контрагент", Объект.Контрагент);
    ПараметрыПодбора.Вставить("Склад", Объект.Склад);
    ПараметрыПодбора.Вставить("ТолькоВНаличии", Истина);
    
    // Открываем форму подбора с передачей параметров
    ОткрытьФорму("Обработка.ПодборНоменклатуры.Форма", ПараметрыПодбора, ЭтотОбъект, УникальныйИдентификатор);

КонецПроцедуры

Шаг 2: Установка отборов в динамическом списке формы подбора


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

КонецПроцедуры

Альтернативный вариант: Обработчик события «НачалоВыбора»

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

Посмотрим на пример переопределения стандартного выбора:


&НаКлиенте
Процедура ТоварыНоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

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

КонецПроцедуры

Таким образом, для простых связей между полями шапки или строк таблицы оптимально использовать свойство СвязиПараметровВыбора, заполняемое на сервере через СвязьПараметраВыбора и ФиксированныйМассив, а для комплексных внешних форм (например, подбора) — передачу параметров и отборы динамических списков.

← На главную