Как установить значение реквизита по умолчанию при первом открытии формы с автоматическим сохранением настроек

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

В разработке на платформе 1С:Предприятие 8.3 часто возникает задача: необходимо, чтобы при самом первом открытии формы пользователем определенный реквизит (например, флаг типа Булево) принимал значение Истина. При этом для формы включена стандартная опция "Автоматическое сохранение данных в настройках". Сложность заключается в том, что если пользователь уже открывал форму и сохранил свои настройки (например, снял этот флаг), система должна подтянуть именно его выбор, а не сбрасывать его в значение по умолчанию — для настройки правил автозаполнения без программирования подойдёт обработка автоподстановки и контроля заполнения реквизитов по условиям.

Многие разработчики ошибочно полагают, что задачу можно решить в обработчиках ПередЗагрузкойДанныхИзНастроекНаСервере или ПриЗагрузкеДанныхИзНастроекНаСервере. Однако, как показывает практика, эти события не вызываются вообще, если в хранилище настроек еще нет записи для текущего пользователя и данной формы. Разберем детально, как работает этот механизм и какие существуют способы решения задачи.

Анализ последовательности событий при инициализации формы

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

  1. ПриСозданииНаСервере: здесь форма инициализируется, реквизиты имеют свои значения по умолчанию, заданные в метаданных (для Булево — это Ложь).
  2. Загрузка данных из хранилища: на этом этапе платформа автоматически обращается к системному хранилищу и считывает сохраненные настройки пользователя.
  3. ПриЗагрузкеДанныхИзНастроекНаСервере: событие срабатывает только в том случае, если данные в хранилище были найдены.
  4. ПриОткрытии (на клиенте): форма отображается пользователю.

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

Способ 1. Использование порядка выполнения серверных событий (Рекомендуемый)

Самый простой и эффективный метод основан на том, что событие ПриСозданииНаСервере происходит до того, как платформа "накатывает" сохраненные настройки. Рассмотрим логику действий:

В процедуре ПриСозданииНаСервере мы принудительно устанавливаем нашему реквизиту значение Истина. Далее возможны два сценария:

Посмотрим на пример кода:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Устанавливаем значение для первого запуска
    Объект.ИспользоватьРасширеннуюПроверку = Истина;
    
    // Если настройки существуют, платформа сама изменит это значение 
    // сразу после выхода из этой процедуры.
    
КонецПроцедуры

Способ 2. Использование вспомогательного флага "ПервыйВызов"

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

  1. Создадим на форме реквизит ПервыйЗапуск с типом Булево (не включайте его в список сохраняемых настроек).
  2. В процедуре ПриСозданииНаСервере установим его в Истина.
  3. В процедуре ПриЗагрузкеДанныхИзНастроекНаСервере установим его в Ложь.
  4. В процедуре ПриОткрытии проанализируем этот флаг.

Проанализируем этот подход в коде:


&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
    // Если мы попали сюда, значит настройки в базе есть
    ЭтаФорма.ПервыйЗапуск = Ложь;
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    Если ЭтаФорма.ПервыйЗапуск Тогда
        // Отработает только если настройки не загружались
        Объект.НужныйРеквизит = Истина;
    КонецЕсли;
КонецПроцедуры

Технические нюансы работы Хранилища системных настроек

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

Выясним причину, почему настройки могут не сохраняться. Для того чтобы механизм заработал, недостаточно включить свойство "Автоматическое сохранение данных в настройках" у самой формы. Необходимо убедиться, что у конкретного реквизита в списке реквизитов формы в колонке "Сохранение" стоит флажок (использовать).

Программная проверка наличия настроек

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    КлючНастроек = "ОбщаяФорма.МояФорма/НастройкиФормы"; // Пример ключа
    Настройки = ХранилищеСистемныхНастроек.Загрузить(КлючНастроек, "");
    
    Если Настройки = Неопределено Тогда
        // Это действительно первый запуск или настройки были сброшены
        Объект.МойФлаг = Истина;
    КонецЕсли;
    
КонецПроцедуры

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

Как протестировать поведение "первого запуска"

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

  1. Запустите информационную базу в режиме 1С:Предприятие.
  2. Перейдите в меню Сервис — Настройки — Очистка настроек (в разных интерфейсах путь может отличаться, но суть одна — управление настройками пользователя).
  3. Найдите в списке нужную форму и удалите для неё сохраненные данные.
  4. После этого следующее открытие формы будет считаться системой как "первое", и вы сможете проверить работу ваших инициализаторов.

Подводя итог, отметим: наиболее предпочтительным является Способ 1. Он использует штатную логику платформы 1С v8.3 и не требует создания лишних переменных или сложной программной проверки хранилищ. Просто помните, что ПриСозданииНаСервере — это "чистый лист", на котором вы задаете значения по умолчанию, а автоматическая загрузка настроек — это "слой поверх", который накладывается системой мгновенно после завершения процедуры создания формы — для автоматизации этих процессов есть обработка управления заполнением реквизитов и поведением форм.

← На главную