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

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

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

Анализ жизненного цикла открытия управляемой формы

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

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

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

Основная причина: автосохранение данных формы

Главным виновником неожиданной подмены данных выступает стандартный механизм сохранения настроек формы. Посмотрим на свойства формы и ее реквизитов:

  1. В свойствах самой формы свойство «Автоматическое сохранение данных в настройках» установлено в значение Использовать.
  2. В дереве реквизитов формы у проблемного реквизита установлен флаг «Сохраняемые данные».

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

Способ 1. Отключение сохранения данных на уровне метаданных

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

  1. Точечное отключение для реквизита: откроем форму в конфигураторе, перейдем на вкладку «Реквизиты», найдем проблемный реквизит, откроем его палитру свойств и снимем флаг «Сохраняемые данные». При этом остальные сохраняемые настройки формы продолжат работать штатно.
  2. Полное отключение для всей формы: если форме вообще не нужно запоминать значения полей пользователя, выделим корневой элемент в дереве элементов или реквизитов, перейдем в свойства формы и для параметра «Автоматическое сохранение данных в настройках» установим значение Не использовать.

Способ 2. Программное управление загрузкой настроек

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

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


&НаСервере
Процедура ПередЗагрузкойДанныхИзНастроекНаСервере(Настройки)
    // Исключаем перезапись реквизита сохраненными данными пользователя
    Если Настройки.Свойство("ИмяПроблемногоРеквизита") Тогда
        Настройки.Удалить("ИмяПроблемногоРеквизита");
    КонецЕсли;
КонецПроцедуры

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


&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
    // Восстанавливаем актуальное значение после применения сохраненных настроек
    Объект.ИмяПроблемногоРеквизита = РассчитатьАктуальноеЗначение();
КонецПроцедуры

Способ 3. Сброс некорректных пользовательских настроек

Бывают случаи, когда логика автосохранения настроена правильно, но у конкретного пользователя в системном хранилище «застряли» ошибочные данные, введенные им ранее при тестировании. Проанализируем, как очистить эти данные:

  1. Интерактивно пользователем: в правом верхнем углу формы нажать Еще -> Изменить форму, затем в открывшемся окне нажать Еще -> Установить стандартные настройки.
  2. Программно администратором: очистить ветку настроек формы для конкретного пользователя через стандартные механизмы работы с хранилищем:

ХранилищеСистемныхНастроек.Удалить(
    "Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента/НастройкиДанныхФормы", 
    "", 
    ПользовательИнформационнойБазы
);

Альтернативные причины подмены данных

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

  1. Код в обработчике ПередОткрытием: данный клиентский метод вызывается строго перед ПриОткрытии. Если в нем есть обращения к общим клиентским модулям или пересчет элементов формы, изменение значения может происходить именно там.
  2. Механизмы Библиотеки стандартных подсистем (БСП): подсистемы сохранения настроек форм или автозаполнения реквизитов могут программно вызывать методы восстановления из ХранилищеОбщихНастроек в служебных событиях формы.
  3. Влияние функциональных опций: изменение состава или значений параметров функциональных опций в момент инициализации формы может приводить к автоматической очистке связанных с ними реквизитов.
← На главную