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