В процессе разработки конфигураций и адаптации типовых решений на платформе 1С:Предприятие 8.3 часто возникает задача динамической настройки отборов при выборе значений в полях ввода. Стандартно связь параметров выбора задается интерактивно в свойствах реквизита метаданных или элемента формы в конфигураторе. Однако бывают ситуации, когда эту связь требуется накладывать выборочно — например, только для определенных ролей пользователей (например, менеджеров) или в зависимости от конкретных условий текущего документа. Рассмотрим подробно, как реализовать программную установку свойства СвязиПараметровВыбора для элементов шапки, табличных частей и обработок подбора.
Прежде чем перейти к написанию программного кода, разберем ключевые архитектурные особенности данного свойства:
СвязиПараметровВыбора у элементов формы доступно на запись исключительно на сервере. Попытка изменить его на клиенте вызовет ошибку времени выполнения. Поэтому правильное место для первичной установки — серверные обработчики формы, такие как ПриСозданииНаСервере.ФиксированныйМассив, содержащий объекты типа СвязьПараметраВыбора.Проанализируем базовый сценарий: требуется связать поле выбора договора с контрагентом, указанным в шапке документа, причем сделать это условием только для пользователей с определенной ролью.
Разберем по шагам создание структуры связи:
СвязьПараметраВыбора, передавая в конструктор имя отбора в форме выбора (например, "Отбор.Владелец") и путь к реквизиту-источнику данных (например, "Объект.Контрагент").ФиксированныйМассив.Посмотрим на пример реализации в процедуре ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем роль пользователя
Если РольДоступна("МенеджерПоПродажам") Тогда
// Создаем связь: параметр отбора в форме выбора -> путь к данным источника
НоваяСвязь = Новый СвязьПараметраВыбора("Отбор.Владелец", "Объект.Контрагент");
// Формируем массив связей
МассивСвязей = Новый Массив;
МассивСвязей.Добавить(НоваяСвязь);
// Устанавливаем фиксированный массив в свойство элемента формы
Элементы.Договор.СвязиПараметровВыбора = Новый ФиксированныйМассив(МассивСвязей);
КонецЕсли;
КонецПроцедуры
Часто возникает вопрос: как правильно настроить связь параметров выбора, если поле ввода расположено в строке табличной части? Например, когда выбор характеристики должен зависеть от номенклатуры в той же самой строке.
Выясним причину возможных сложностей: главное отличие заключается в корректном указании пути к данным источника:
"Объект.Склад"."Объект.Товары.Номенклатура". Платформа 1С автоматически определяет контекст строки и при открытии выбора в текущей строке считывает номенклатуру именно из нее.Рассмотрим пример кода для настройки связи характеристики и номенклатуры в табличной части Товары:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если РольДоступна("МенеджерПоПродажам") Тогда
// Создаем связь с колонкой той же табличной части
СвязьХарактеристики = Новый СвязьПараметраВыбора("Отбор.Владелец", "Объект.Товары.Номенклатура");
МассивСвязей = Новый Массив;
МассивСвязей.Добавить(СвязьХарактеристики);
// Применяем к элементу формы колонки табличной части
Элементы.ТоварыХарактеристика.СвязиПараметровВыбора = Новый ФиксированныйМассив(МассивСвязей);
КонецЕсли;
КонецПроцедуры
Если в процессе работы формы требуется полностью отключить ограничения выбора для поля, достаточно присвоить свойству пустой ФиксированныйМассив на сервере:
&НаСервере
Процедура СброситьСвязиПараметровВыбора(ИмяЭлемента)
Элементы[ИмяЭлемента].СвязиПараметровВыбора = Новый ФиксированныйМассив(Новый Массив);
КонецПроцедуры
Также обратим внимание на свойство элемента формы РежимОчисткиСвязей (принимает значения РежимОчисткиСвязей.Очищать или РежимОчисткиСвязей.НеОчищать). Если установлено значение Очищать, то при изменении значения в поле-источнике (например, при смене контрагента) связанное значение (договор) будет автоматически очищено платформой.
Форма подбора номенклатуры представляет собой отдельную обработку или отдельную форму списка, поэтому применить свойство СвязиПараметровВыбора напрямую из документа к форме подбора невозможно. Взаимодействие между документом и подбором организуется через передачу параметров формы.
Разберем, как передать параметры контекста документа в форму подбора и применить отборы:
Шаг 1: Передача параметров из формы документа при открытии подбора
&НаКлиенте
Процедура ОбработкаКомандыПодбор(Команда)
ПараметрыПодбора = Новый Структура;
ПараметрыПодбора.Вставить("Контрагент", Объект.Контрагент);
ПараметрыПодбора.Вставить("Склад", Объект.Склад);
ПараметрыПодбора.Вставить("ТолькоВНаличии", Истина);
// Открываем форму подбора с передачей параметров
ОткрытьФорму("Обработка.ПодборНоменклатуры.Форма", ПараметрыПодбора, ЭтотОбъект, УникальныйИдентификатор);
КонецПроцедуры
Шаг 2: Установка отборов в динамическом списке формы подбора
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Применяем переданный отбор по владельцу или типу номенклатуры
Если Параметры.Свойство("Контрагент") И ЗначениеЗаполнено(Параметры.Контрагент) Тогда
ЭлементОтбора = СписокНоменклатуры.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Владелец");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Параметры.Контрагент;
ЭлементОтбора.Использование = Истина;
КонецЕсли;
КонецПроцедуры
Если условие фильтрации является сложным, содержит составные условия или не укладывается в стандартное равенство полей, удобнее использовать клиентский обработчик события НачалоВыбора у поля ввода вместо настройки свойства СвязиПараметровВыбора.
Посмотрим на пример переопределения стандартного выбора:
&НаКлиенте
Процедура ТоварыНоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
Если ЭтоОсобыйРежимВыбора Тогда
// Отключаем стандартный диалог выбора
СтандартнаяОбработка = Ложь;
// Формируем структуру отбора для формы выбора
СтруктураОтбора = Новый Структура;
СтруктураОтбора.Вставить("Услуга", Ложь);
СтруктураОтбора.Вставить("ПометкаУдаления", Ложь);
ПараметрыФормы = Новый Структура("Отбор", СтруктураОтбора);
// Открываем форму выбора справочника с наложенным отбором
ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыФормы, Элемент);
КонецЕсли;
КонецПроцедуры
Таким образом, для простых связей между полями шапки или строк таблицы оптимально использовать свойство СвязиПараметровВыбора, заполняемое на сервере через СвязьПараметраВыбора и ФиксированныйМассив, а для комплексных внешних форм (например, подбора) — передачу параметров и отборы динамических списков.