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

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

Нередко при разработке функционала в обычных формах 1С разработчики сталкиваются с ситуацией: в обработчике открытия формы выполняется запрос, отладчик показывает успешное присвоение данных переменным, однако в режиме «1С:Предприятие» соответствующие поля на форме остаются пустыми. Разберем детально, почему это происходит и как правильно заполнять реквизиты формы.

Анализ исходного кода и причин ошибки

Рассмотрим типовой пример, в котором возникает данная проблема. В событии ПриОткрытии выполняется следующий код:


Процедура ПриОткрытии()
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ПЛ_ОбъектыИнвестицийОбъекты.Ссылка.Код КАК Код,
        |   ПЛ_ОбъектыИнвестицийОбъекты.Ссылка.Наименование КАК Наименование,
        |   ПЛ_ОбъектыИнвестицийОбъекты.Ссылка КАК Ссылка
        |ИЗ
        |   Справочник.ПЛ_ОбъектыИнвестиций.Объекты КАК ПЛ_ОбъектыИнвестицийОбъекты
        |ГДЕ
        |   ПЛ_ОбъектыИнвестицийОбъекты.Объект = &Объект";
    
    Запрос.УстановитьПараметр("Объект", Ссылка);
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        ПЛ_ОбъектыИнвестиций = Выборка.Наименование;
        ПЛ_Код = Выборка.Код;
    КонецЦикла;
КонецПроцедуры

Выясним главную причину такого поведения. Она заключается в несоответствии типов данных между реквизитами формы и присваиваемыми значениями:

  1. Несоответствие типов: Если на форме создан реквизит ПЛ_ОбъектыИнвестиций с типом СправочникСсылка.ПЛ_ОбъектыИнвестиций, а в коде ему присваивается строка Выборка.Наименование, платформа не может преобразовать строку в ссылку и сбрасывает значение элемента управления.
  2. Перекрытие области видимости: Если тип реквизита не совпадает с присваиваемым типом, платформа может трактовать операцию как создание временной локальной переменной внутри процедуры, не изменяя значение реального реквизита формы.
  3. Привязка элемента управления (Данные): Поле ввода (ПолеВвода) отображает информацию только тогда, когда в его свойстве «Данные» явно указан реквизит формы.

Вариант 1. Исправление типа реквизита формы

Если на форме требуется отображать именно строковое наименование объекта, разберем по шагам, что нужно сделать:

  1. Перейдем в конфигураторе на вкладку «Реквизиты» формы.
  2. Найдем реквизит ПЛ_ОбъектыИнвестиций и откроем его свойства.
  3. Изменим тип реквизита с ссылочного типа на Строка достаточной длины (или оставим неограниченную длину).
  4. Убедимся, что у поля ввода на самой форме в свойстве «Данные» выбран этот реквизит.

Вариант 2. Присвоение ссылочного типа

Если поле ввода на форме должно оставаться ссылочным (для возможности перехода в связанный элемент), изменим логику присвоения значения в модуле формы. Присвоим реквизиту саму ссылку, а не строковое наименование:


Процедура ПриОткрытии()
    Если ЭтоНовый() Тогда
        Возврат;
    КонецЕсли;

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

Рекомендации по оптимизации кода

Проанализируем дополнительные важные нюансы при инициализации обычных форм:

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