Работа в веб-клиенте 1С:Предприятие имеет свои специфические особенности, продиктованные средой исполнения — интернет-браузером. Одной из самых острых проблем является случайное закрытие вкладки пользователем, в результате чего все не сохраненные данные в открытых формах (например, в длинном документе) бесследно исчезают. В рамках этой статьи мы подробно разберем, почему это происходит, как работают механизмы платформы и какие стратегии защиты данных можно реализовать.
Первое, на что мы должны обратить внимание — это штатное поведение платформы 1С. В управляемых формах существует стандартный механизм отслеживания изменений. Рассмотрим, как он работает. Когда пользователь начинает вводить данные в поля формы, платформа автоматически устанавливает флаг Модифицированность в значение Истина.
Теоретически, если этот флаг установлен, при попытке закрыть вкладку браузер должен вывести стандартное окно с вопросом: "Вы уверены, что хотите покинуть сайт? Внесенные изменения могут не сохраниться". Однако на практике это срабатывает не всегда. Проанализируем причины:
beforeunload.Чтобы убедиться, что механизм включен, мы можем программно управлять этим флагом в коде формы:
&НаКлиенте
Процедура ПриИзмененииДанных(Элемент)
ЭтаФорма.Модифицированность = Истина;
КонецПроцедуры
Разберем ситуацию, которая часто вызывает недоумение у разработчиков. В методологических материалах иногда встречается рекомендация использовать обработчик СохранениеНесохраненныхДанныхНаСервере. Однако при попытке вызвать серверный метод в момент закрытия вкладки мы сталкиваемся с архитектурным ограничением протокола HTTP и движков JavaScript.
Когда вкладка закрывается, браузер немедленно обрывает все сетевые соединения. Вызов &НаСервере — это сетевой запрос. В 99% случаев он просто не успевает дойти до сервера 1С или сервер не успевает зафиксировать транзакцию до того, как процесс вкладки будет полностью уничтожен. Именно поэтому блокирующие вызовы сервера в обработчиках закрытия запрещены или неэффективны. Выясним, что же можно предпринять в такой ситуации.
Поскольку "поймать" момент закрытия вкладки гарантированно невозможно, самым надежным способом защиты данных является их периодическое сохранение в фоновом режиме. Рассмотрим алгоритм реализации системы черновиков.
Мы можем использовать обработчик ожидания, который будет периодически проверять наличие изменений в форме и записывать их в специальное временное хранилище или технический регистр сведений.
Пример реализации в модуле формы:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Подключаем обработчик, который будет срабатывать каждые 2 минуты (120 секунд)
ПодключитьОбработчикОжидания("ФоновоеСохранениеДанных", 120);
КонецПроцедуры
&НаКлиенте
Процедура ФоновоеСохранениеДанных()
Если ЭтаФорма.Модифицированность Тогда
СохранитьДанныеЧерновикаНаСервере();
// После сохранения можно сбросить флаг или оставить для штатного закрытия
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура СохранитьДанныеЧерновикаНаСервере()
// Здесь мы сериализуем объект или записываем его поля в промежуточную таблицу
// Например, в регистр сведений "ЧерновикиОбъектов"
МенеджерЗаписи = РегистрыСведений.ЧерновикиОбъектов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Пользователь = Пользователи.ТекущийПользователь();
МенеджерЗаписи.Данные = СериализоватьОбъект(Объект);
МенеджерЗаписи.Записать();
КонецПроцедуры
При следующем открытии формы система должна проверить наличие записи в регистре черновиков и предложить пользователю восстановить данные.
Проанализируем современный подход в веб-разработке. Вместо нестабильного события закрытия окна, разработчики рекомендуют отслеживать изменение видимости страницы — visibilitychange. Это событие срабатывает, когда пользователь переключает вкладку, сворачивает браузер или собирается закрыть его.
Хотя в платформе 1С нет прямого обработчика для этого события "из коробки", понимание этого механизма помогает осознать, почему штатные средства иногда ведут себя непредсказуемо. В корпоративных информационных системах иногда внедряются расширения браузеров, которые перехватывают это событие и принудительно инициируют синхронизацию с сервером 1С, но это требует дополнительной настройки инфраструктуры.
Иногда проблема потери данных усугубляется тем, что при кратковременном разрыве связи или случайном обновлении страницы сеанс пользователя мгновенно завершается. Мы можем повлиять на это через настройки публикации информационной базы на веб-сервере (Apache или IIS).
Рекомендуется:
SessionTimeout в файле default.vrd, чтобы задать разумный интервал ожидания перед окончательным завершением сеанса.Подводя итог, можно сказать, что 100% гарантии отлова закрытия вкладки в веб-клиенте средствами самой платформы не существует из-за ограничений безопасности современных браузеров. Однако, комбинируя штатное свойство Модифицированность и механизм фонового автосохранения, мы можем свести риски потери данных к минимуму.
Проанализировав ситуацию, мы рекомендуем разработчикам не полагаться на стандартные диалоги браузера, а внедрять логику "черновиков" для критически важных и сложных в заполнении документов. Это обеспечит лучший пользовательский опыт и сохранность данных даже в нестабильных условиях веб-среды.