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