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