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