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