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