Как передать параметр между формами и установить автоматический отбор в списке 1С 8.3

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

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

В этой статье мы подробно разберем несколько профессиональных способов реализации такой механики, проанализируем их преимущества и выясним, какой метод лучше подходит для разных сценариев разработки.

Способ 1. Использование структуры «Отбор» (Filter) в параметрах открытия

Начнем с самого простого и штатного способа, который предоставляет платформа. Если нам нужно просто открыть форму списка и отфильтровать данные по определенному полю динамического списка, мы можем использовать специальный ключ Отбор в структуре параметров функции ОткрытьФорму.

Разберем по шагам, как это реализовать программно. Допустим, мы находимся в форме, где у нас есть ссылка на объект, по которому нужно выполнить фильтрацию (например, НужныйКонтрагент).


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

ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);

// Открываем форму списка справочника ДоговорыКонтрагентов с фильтром
ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаСписка", ПараметрыФормы);

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

Способ 2. Связи параметров выбора (ChoiceParameterLinks)

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

Рассмотрим алгоритм реализации этого метода:

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

Выясним, почему это удобно: при такой настройке платформа сама «прокинет» нужный фильтр при нажатии кнопки выбора или открытии списка из этого поля. Это избавляет от необходимости писать сложный программный код в обработчиках событий.

Способ 3. Программная установка фиксированных настроек

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

Сначала в коде вызова передадим произвольный параметр:


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

Теперь проанализируем код внутри открываемой формы списка (Форма 3):


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

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

Способ 4. Использование механизма оповещений (Notify)

Когда формы сильно разнесены в логике приложения (например, они не связаны отношениями «владелец-подчиненный»), на помощь приходит механизм глобальных оповещений. Рассмотрим ситуацию, когда Форма 3 должна сообщить Форме 1 о том, что выбор сделан, или получить от неё актуальные данные.

Для отправки данных используем метод Оповестить():


// В Форме 3 после выбора объекта
ПараметрыОповещения = Новый Структура("ВыбранныйДоговор", Элементы.Список.ТекущаяСтрока);
Оповестить("СобытиеВыбораДоговора", ПараметрыОповещения, ЭтаФорма);

Для приема данных в Форме 1 или Форме 2 необходимо создать обработчик события ОбработкаОповещения:


&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    
    Если ИмяСобытия = "СобытиеВыбораДоговора" Тогда
        // Обрабатываем полученные данные
        ТекущийДоговор = Параметр.ВыбранныйДоговор;
        // Дальнейшая логика обновления интерфейса
    КонецЕсли;
    
КонецПроцедуры

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

Резюме и рекомендации

Подведем итог нашему анализу:

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

← На главную