Откуда берутся значения в реквизитах управляемой формы до выполнения ПриСозданииНаСервере?

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

Каждый разработчик на платформе «1С:Предприятие 8.3» рано или поздно сталкивается с загадочной на первый взгляд ситуацией. Мы открываем форму нового документа (например, программно вызывая ОткрытьФорму), передаем пустую структуру параметров, ставим точку останова в самое начало процедуры ПриСозданииНаСервере в модуле формы, но обнаруживаем, что ключевые реквизиты (такие как «Автор», «Организация», «Ответственный» или «Отправитель») уже заполнены конкретными значениями.

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

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


Жизненный цикл инициализации формы и данных

Когда мы вызываем метод ОткрытьФорму, платформа выполняет целый комплекс серверных операций еще до того, как управление передается в процедуру модуля формы ПриСозданииНаСервере. Давайте по шагам разберем эту цепочку событий:

  1. Вызов ОбработкаПолученияФормы: Событие срабатывает в модуле менеджера объекта. Здесь система решает, какую именно форму нужно открыть (например, в зависимости от прав или настроек пользователя).
  2. Инициализация модуля объекта: Создается экземпляр прикладного объекта в оперативной памяти (например, ДокументОбъект). Происходит компиляция его модуля.
  3. Событие ОбработкаЗаполнения в модуле объекта: Это ключевой этап для новых объектов. Именно здесь платформа или код конфигурации (например, БСП) заполняет реквизиты значениями по умолчанию. Реквизит формы Объект связывается с этим заполненным экземпляром.
  4. Выполнение подписок на событие ОбработкаЗаполнения: Если в системе зарегистрированы общие подписки для данного типа объектов, они выполняются сразу после отработки модуля объекта.
  5. Чтение сохраненных настроек формы: Платформа проверяет наличие сохраненных пользователем данных (автосохранение реквизитов). Срабатывают системные события ПередЗагрузкойДанныхИзНастроекНаСервере и ПриЗагрузкеДанныхИзНастроекНаСервере.
  6. Событие ПриСозданииНаСервере модуля формы: И только теперь управление передается в форму. Наш реквизит Объект (и связанные с ним элементы управления) уже содержит всё, что было подготовлено на шагах 3, 4 и 5.

Разбираем шаг 1: Событие ОбработкаЗаполнения в модуле объекта

Если вы обнаружили, что в форме нового документа уже заполнены реквизиты, первым делом проверьте модуль самого объекта. Для этого откройте конфигуратор, найдите нужный документ (например, Документ.ЭлектронноеПисьмоИсходящее), перейдите в его модуль объекта и найдите процедуру ОбработкаЗаполнения.

Рассмотрим пример того, как в типовых конфигурациях (КА 2, ERP, УТ 11), использующих Библиотеку стандартных подсистем (БСП), происходит автозаполнение реквизитов:


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

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

Совет по отладке: Чтобы перехватить этот момент, точку останова нужно ставить не в модуле формы, а именно в модуле объекта внутри процедуры ОбработкаЗаполнения. На этом этапе вы сможете пошагово увидеть, откуда берутся значения реквизитов.

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


Разбираем шаг 2: Автосохранение настроек формы

Второй частый источник «внезапного» появления данных в полях формы — встроенный механизм сохранения настроек платформы «1С:Предприятие».

У реквизитов формы в конфигураторе есть свойство Сохраняемые данные, а у самой формы — свойство Автосохранение данных в настройках (значение «Использовать» или «Не использовать»). Если эти опции включены, платформа автоматически записывает последние введенные пользователем значения в системное хранилище и восстанавливает их при следующем открытии формы.

Этот процесс происходит на стыке вызова обработчиков:

Если данные восстанавливаются через этот механизм, то в процедуре ПриСозданииНаСервере они уже будут заполнены.


Как сбросить или обнулить автосохраненные настройки?

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

Способ 1. Интерактивный (в режиме предприятия)

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

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

Способ 2. Программный (через встроенный язык)

Если вам нужно программно очистить настройки для конкретного пользователя или формы, используйте объект ХранилищеСистемныхНастроек. Посмотрим на пример кода, который удаляет настройки формы:


// Ключ объекта формируется как путь к форме документа
КлючОбъекта = "Документ.ЭлектронноеПисьмоИсходящее.Форма.ФормаОбъекта";
КлючНастроек = ""; // Пустая строка для удаления всех настроек этой формы
ИмяПользователя = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;

// Удаляем сохраненные данные формы из системного хранилища
ХранилищеСистемныхНастроек.Удалить(КлючОбъекта, КлючНастроек, ИмяПользователя);

Этот код можно поместить во внешнюю обработку или выполнить в контексте административных процедур для сброса «залипших» настроек пользователей.


Резюме

Если вы хотите точно знать, откуда берутся значения в вашей управляемой форме до вызова ПриСозданииНаСервере, придерживайтесь следующего алгоритма проверки:

  1. Поставьте точку останова в процедуре ОбработкаЗаполнения модуля объекта.
  2. Проверьте наличие общих подписок на событие ОбработкаЗаполнения для вашего типа документа.
  3. Убедитесь, не включено ли у формы или ее реквизитов свойство автосохранения настроек, и проверьте процедуры ПередЗагрузкойДанныхИзНастроекНаСервере / ПриЗагрузкеДанныхИзНастроекНаСервере в модуле формы.

Понимание этих базовых механизмов работы платформы сэкономит вам множество часов при отладке и разработке сложных интерфейсных решений.

← На главную