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