Как правильно подставить значение по умолчанию из константы в управляемой форме 1С

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

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

Анализ основных ошибок при подстановке значений

Разберем, почему простой вызов вида Склад = Константы.СкладПоУмолчанию; в событии формы не работает:

  1. Обращение к реквизиту формы вместо реквизита объекта. На управляемой форме реквизиты редактируемого документа находятся внутри основного реквизита формы Объект. Обращаясь напрямую по имени Склад, разработчик обращается к локальной переменной или несвязанному реквизиту формы, а не к значению шапки документа.
  2. Отсутствие метода чтения константы. Выражение Константы.СкладПоУмолчанию возвращает менеджер константы, а не само значение, сохраненное в базе данных. Для получения значения обязательно нужно вызывать метод Получить().

Решение в коде управляемой формы

Чтобы корректно заполнить реквизит документа на сервере при открытии формы нового документа, необходимо обращаться к реквизиту через Объект.Склад и получать значение константы с помощью метода Получить().

Посмотрим на пример правильной реализации в модуле формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем, что открывается форма именно нового (не записанного) документа
    Если Параметры.Ключ.Пустая() Тогда
        Объект.Склад = Константы.СкладПоУмолчанию.Получить();
    КонецЕсли;

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

Важное замечание: проверку Параметры.Ключ.Пустая() необходимо выполнять обязательно. Обработчик ПриСозданииНаСервере вызывается как при создании нового документа, так и при открытии существующего. Без проверки ключевого параметра ранее сохраненное в документе значение реквизита будет перезаписываться значением из константы каждый раз при открытии формы.

Архитектурно правильный подход: заполнение в модуле объекта

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

Заполнение в событии формы имеет существенное ограничение: если документ будет создаваться программно (например, при загрузке данных, из другого документа или через регламентное задание без открытия формы), код формы не выполнится, и реквизит останется пустым.

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


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

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

При таком подходе значение будет подставляться автоматически независимо от способа создания документа.

Альтернативные способы хранения и подстановки значений по умолчанию

Использование единой константы подходит только в простых системах, где у всех пользователей единый склад. На практике применяются более гибкие механизмы:

  1. Настройки пользователя в регистре сведений: Значения по умолчанию (склад, организация, касса) хранятся в разрезе пользователей. При создании документа система считывает настройку текущего пользователя из регистра.
  2. Хранилище настроек пользователя: Платформа 1С позволяет сохранять персональные предпочтения пользователей с помощью ХранилищеНастроекПользователя без добавления новых объектов метаданных.
  3. Свойство «Значение заполнения» в конфигураторе: Если значение является статическим или предопределенным элементом, его можно указать непосредственно в палитре свойств реквизита объекта в конфигураторе.
← На главную