Вопрос сохранения и очистки данных во временном хранилище является одним из ключевых при разработке на платформе 1С:Предприятие 8. Довольно часто возникает внештатная ситуация: сеанс пользователя внезапно прерывается из-за сбоя сети, ошибки операционной системы или принудительного снятия задачи 1cv8.exe через диспетчер задач. Разберем подробно, что в этот момент происходит с помещенными во временное хранилище данными, от чего зависит срок их жизни и как избежать потери критически важной информации.
Чтобы понять механику очистки данных, проанализируем разницу в поведении файлового и клиент-серверного вариантов информационной базы:
rphost, либо в виде временных файлов на сервере (если объем данных достаточно велик). Когда процесс клиента 1С принудительно завершается, серверный кластер не получает мгновенного сигнала о разрыве. Сеанс пользователя остается активным на сервере до тех пор, пока не истечет установленный таймаут неактивности (по умолчанию перевод в спящий режим через 20 минут с последующим завершением) или пока сеанс не будет сброшен вручную администратором. Следовательно, пока сеанс числится на сервере, данные во временном хранилище продолжают существовать.1cv8.exe на компьютере пользователя. Если этот процесс «убить» через диспетчер задач, вся выделенная оперативная память мгновенно освобождается операционной системой. Данные временного хранилища безвозвратно теряются в ту же секунду.Рассмотрим подробнее правила, по которым платформа управляет временем жизни значений во временном хранилище при вызове функции ПоместитьВоВременноеХранилище(). Время жизни напрямую зависит от переданного второго параметра:
УникальныйИдентификатор конкретной управляемой формы, данные живут ровно столько, сколько открыта эта форма. При аварийном падении клиента форма на сервере будет уничтожена вместе с завершением зависшего сеанса.УникальныйИдентификатор (не связанный с формой), значение живет на протяжении всей жизни серверного сеанса либо до явного вызова метода УдалитьИзВременногоХранилища().Посмотрим на пример правильной инициализации данных с привязкой к сеансу:
// Создаем новый уникальный идентификатор сеанса
УникальныйИдентификаторСеанса = Новый УникальныйИдентификатор;
АдресВХранилище = ПоместитьВоВременноеХранилище(ТаблицаДанных, УникальныйИдентификаторСеанса);
Выясним причину, по которой на сервере могут накапливаться остаточные данные. При передаче больших массивов информации платформа 1С сбрасывает их из оперативной памяти во временные файлы в каталоге сервера. В штатном режиме при завершении сеанса или вызове УдалитьИзВременногоХранилища() эти файлы удаляются автоматически.
Однако, если аварийно завершается сам рабочий процесс сервера rphost, ссылки на эти файлы могут быть утрачены в памяти, но физически файлы останутся на диске как временный кэш. В таком случае платформа уже не может прочитать эти данные через адрес хранилища, хотя место на дисковой подсистеме сервера остается занятым до плановой очистки временных папок или перезапуска службы кластера 1С.
Если специфика бизнес-процесса требует стопроцентной гарантии сохранения информации при любых нештатных завершениях клиента, опираться исключительно на временное хранилище нельзя. Рассмотрим надежные альтернативы:
ХранилищеЗначения. Это обеспечивает транзакционность и полную сохранность данных в СУБД независимо от состояния клиента.ХранилищеОбщихНастроек.Сохранить() и ХранилищеОбщихНастроек.Загрузить().