Удаляются ли данные из временного хранилища при аварийном завершении клиента 1С?

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

Вопрос сохранения и очистки данных во временном хранилище является одним из ключевых при разработке на платформе 1С:Предприятие 8. Довольно часто возникает внештатная ситуация: сеанс пользователя внезапно прерывается из-за сбоя сети, ошибки операционной системы или принудительного снятия задачи 1cv8.exe через диспетчер задач. Разберем подробно, что в этот момент происходит с помещенными во временное хранилище данными, от чего зависит срок их жизни и как избежать потери критически важной информации.

Поведение платформы в зависимости от архитектуры базы

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

  1. Клиент-серверный вариант работы. В этом режиме временное хранилище физически располагается на стороне сервера: либо в оперативной памяти рабочего процесса rphost, либо в виде временных файлов на сервере (если объем данных достаточно велик). Когда процесс клиента 1С принудительно завершается, серверный кластер не получает мгновенного сигнала о разрыве. Сеанс пользователя остается активным на сервере до тех пор, пока не истечет установленный таймаут неактивности (по умолчанию перевод в спящий режим через 20 минут с последующим завершением) или пока сеанс не будет сброшен вручную администратором. Следовательно, пока сеанс числится на сервере, данные во временном хранилище продолжают существовать.
  2. Файловый вариант работы. Здесь клиентская и серверная части выполняются в рамках одного общего процесса 1cv8.exe на компьютере пользователя. Если этот процесс «убить» через диспетчер задач, вся выделенная оперативная память мгновенно освобождается операционной системой. Данные временного хранилища безвозвратно теряются в ту же секунду.

Время жизни данных и привязка к идентификаторам

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

  1. Привязка к форме. Если в качестве второго параметра передан УникальныйИдентификатор конкретной управляемой формы, данные живут ровно столько, сколько открыта эта форма. При аварийном падении клиента форма на сервере будет уничтожена вместе с завершением зависшего сеанса.
  2. Привязка к сеансу. Если передан новый экземпляр УникальныйИдентификатор (не связанный с формой), значение живет на протяжении всей жизни серверного сеанса либо до явного вызова метода УдалитьИзВременногоХранилища().
  3. Без указания идентификатора. Если второй параметр опущен, платформа автоматически удалит данные из хранилища уже при следующем серверном вызове.

Посмотрим на пример правильной инициализации данных с привязкой к сеансу:


// Создаем новый уникальный идентификатор сеанса
УникальныйИдентификаторСеанса = Новый УникальныйИдентификатор;
АдресВХранилище = ПоместитьВоВременноеХранилище(ТаблицаДанных, УникальныйИдентификаторСеанса);

Очистка дискового кэша и возможные сбои

Выясним причину, по которой на сервере могут накапливаться остаточные данные. При передаче больших массивов информации платформа 1С сбрасывает их из оперативной памяти во временные файлы в каталоге сервера. В штатном режиме при завершении сеанса или вызове УдалитьИзВременногоХранилища() эти файлы удаляются автоматически.

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

Гарантированные способы сохранения данных при сбоях

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

  1. Использование таблиц базы данных. Запись информации в регистры сведений или справочники с реквизитом типа ХранилищеЗначения. Это обеспечивает транзакционность и полную сохранность данных в СУБД независимо от состояния клиента.
  2. Хранилище общих настроек. Для пользовательских сценариев подходит сохранение сериализуемых структур через глобальный контекст с помощью методов ХранилищеОбщихНастроек.Сохранить() и ХранилищеОбщихНастроек.Загрузить().
  3. Запись во внешние файлы. Сохранение сформированных отчетов или промежуточных выгрузок в сетевые каталоги или тома хранения с фиксацией полного пути.
← На главную