Почему не отображаются передаваемые реквизиты в форме нового объекта 1С и как это исправить

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

Анализ проблемы и распространенные ошибки

При вызове формы нового объекта (например, справочника или документа) из другого документа разработчики часто сталкиваются с ситуацией: параметры передаются, в процедуре ПриСозданииНаСервере значения реквизитам объекта присваиваются, но на самой форме поля остаются пустыми.

Рассмотрим, почему возникают такие проблемы и какие ошибки в коде приводят к некорректному отображению данных:

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

Способ 1. Использование системного параметра ЗначенияЗаполнения

Проанализируем рекомендуемый платформой 1С способ передавать данные для нового объекта. Вместо ручного разбора параметров в форме применяется системный параметр ЗначенияЗаполнения.

Передадим структуру со значениями реквизитов в метод ОткрытьФорму(). Имена ключей структуры должны строго совпадать с именами реквизитов объекта.

Посмотрим на пример кода на клиенте при открытии формы создания нового контрагента из документа:


&НаКлиенте
Процедура СоздатьНовогоКлиента()
    
    ЗначенияЗаполнения = Новый Структура;
    ЗначенияЗаполнения.Вставить("Наименование", ИмяКлиента);
    ЗначенияЗаполнения.Вставить("Телефон", ТелефонКлиента);
    ЗначенияЗаполнения.Вставить("Родитель", ГруппаКлиентов);
    
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("ЗначенияЗаполнения", ЗначенияЗаполнения);
    
    ОткрытьФорму("Справочник.Контрагенты.Форма.ФормаЭлементаКлиентБыстрыйВвод", ПараметрыФормы, ЭтаФорма);

КонецПроцедуры

При таком подходе платформа 1С автоматически заполняет реквизиты объекта и отображает их в связанных элементах формы без необходимости писать ручной код в событии ПриСозданииНаСервере.

Способ 2. Заполнение данных через модуль объекта (ОбработкаЗаполнения)

Разберем вариант, когда перед выводом на форму требуется дополнительная обработка данных. Логику инициализации реквизитов объекта правильно размещать в модуле объекта в событии ОбработкаЗаполнения.

Посмотрим, как выглядит код в модуле справочника:


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

КонецПроцедуры

Событие ОбработкаЗаполнения вызывается платформой до создания формы. В результате форма открывается уже с полностью подготовленными данными.

Способ 3. Проверка привязки элементов и прямое заполнение реквизитов формы

Выясним, что делать, если поле на форме не привязано к Объект.Телефон, а является локальным реквизитом формы (например, при сложной обработке контактной информации в типовых конфигурациях).

В этом случае в событии ПриСозданииНаСервере модуля формы необходимо присваивать значение напрямую реквизиту формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Если Параметры.Свойство("Телефон") Тогда
        // Заполняем реквизит формы, если элемент связан не с Объект.Телефон
        РеквизитФормыТелефон = Параметры.Телефон;
    КонецЕсли;

КонецПроцедуры

Обязательно проверьте в конфигураторе у элемента формы свойство ПутьКДанным (DataPath). Оно должно точно указывать на реквизит, значение которого меняется в программе.

← На главную