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