Каждый разработчик на платформе «1С:Предприятие 8.3» рано или поздно сталкивается с загадочной на первый взгляд ситуацией. Мы открываем форму нового документа (например, программно вызывая ОткрытьФорму), передаем пустую структуру параметров, ставим точку останова в самое начало процедуры ПриСозданииНаСервере в модуле формы, но обнаруживаем, что ключевые реквизиты (такие как «Автор», «Организация», «Ответственный» или «Отправитель») уже заполнены конкретными значениями.
В этой статье мы подробно разберем, по какому алгоритму инициализируются данные при создании новой формы, в каких модулях и обработчиках это происходит и как правильно отлаживать подобные процессы.
Выясним причину этого поведения, проанализировав жизненный цикл создания управляемой формы и объекта, а также рассмотрим практические способы управления автосохранением данных.
Когда мы вызываем метод ОткрытьФорму, платформа выполняет целый комплекс серверных операций еще до того, как управление передается в процедуру модуля формы ПриСозданииНаСервере. Давайте по шагам разберем эту цепочку событий:
ДокументОбъект). Происходит компиляция его модуля.Объект связывается с этим заполненным экземпляром.ПередЗагрузкойДанныхИзНастроекНаСервере и ПриЗагрузкеДанныхИзНастроекНаСервере.Объект (и связанные с ним элементы управления) уже содержит всё, что было подготовлено на шагах 3, 4 и 5.Если вы обнаружили, что в форме нового документа уже заполнены реквизиты, первым делом проверьте модуль самого объекта. Для этого откройте конфигуратор, найдите нужный документ (например, Документ.ЭлектронноеПисьмоИсходящее), перейдите в его модуль объекта и найдите процедуру ОбработкаЗаполнения.
Рассмотрим пример того, как в типовых конфигурациях (КА 2, ERP, УТ 11), использующих Библиотеку стандартных подсистем (БСП), происходит автозаполнение реквизитов:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
// Заполнение автора по умолчанию
Если НЕ ЗначениеЗаполнено(Автор) Тогда
Автор = Пользователи.ТекущийПользователь();
КонецЕсли;
// Поиск учетной записи электронной почты для отправки письма
Если НЕ ЗначениеЗаполнено(УчетнаяЗапись) Тогда
УчетнаяЗапись = Взаимодействия.ПолучитьУчетнуюЗаписьПоУмолчанию();
Если ЗначениеЗаполнено(УчетнаяЗапись) Тогда
ОтправительПредставление = Строка(УчетнаяЗапись);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Совет по отладке: Чтобы перехватить этот момент, точку останова нужно ставить не в модуле формы, а именно в модуле объекта внутри процедуры ОбработкаЗаполнения. На этом этапе вы сможете пошагово увидеть, откуда берутся значения реквизитов.
Иногда запрос внутри этой процедуры может возвращать пустое значение (например, когда учетная запись настроена, но реквизит остается пустым). Проанализируем возможные причины:
Второй частый источник «внезапного» появления данных в полях формы — встроенный механизм сохранения настроек платформы «1С:Предприятие».
У реквизитов формы в конфигураторе есть свойство Сохраняемые данные, а у самой формы — свойство Автосохранение данных в настройках (значение «Использовать» или «Не использовать»). Если эти опции включены, платформа автоматически записывает последние введенные пользователем значения в системное хранилище и восстанавливает их при следующем открытии формы.
Этот процесс происходит на стыке вызова обработчиков:
ПередЗагрузкойДанныхИзНастроекНаСервереПриЗагрузкеДанныхИзНастроекНаСервереЕсли данные восстанавливаются через этот механизм, то в процедуре ПриСозданииНаСервере они уже будут заполнены.
Если вам необходимо очистить данные автосохранения для тестирования или по требованию пользователя, это можно сделать двумя путями: интерактивно и программно.
Пользователь может самостоятельно сбросить сохраненные настройки формы к первоначальному состоянию. Разберем по шагам, как это сделать:
Если вам нужно программно очистить настройки для конкретного пользователя или формы, используйте объект ХранилищеСистемныхНастроек. Посмотрим на пример кода, который удаляет настройки формы:
// Ключ объекта формируется как путь к форме документа
КлючОбъекта = "Документ.ЭлектронноеПисьмоИсходящее.Форма.ФормаОбъекта";
КлючНастроек = ""; // Пустая строка для удаления всех настроек этой формы
ИмяПользователя = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
// Удаляем сохраненные данные формы из системного хранилища
ХранилищеСистемныхНастроек.Удалить(КлючОбъекта, КлючНастроек, ИмяПользователя);
Этот код можно поместить во внешнюю обработку или выполнить в контексте административных процедур для сброса «залипших» настроек пользователей.
Если вы хотите точно знать, откуда берутся значения в вашей управляемой форме до вызова ПриСозданииНаСервере, придерживайтесь следующего алгоритма проверки:
ОбработкаЗаполнения модуля объекта.ОбработкаЗаполнения для вашего типа документа.ПередЗагрузкойДанныхИзНастроекНаСервере / ПриЗагрузкеДанныхИзНастроекНаСервере в модуле формы.Понимание этих базовых механизмов работы платформы сэкономит вам множество часов при отладке и разработке сложных интерфейсных решений.