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