К статье
Практический материал

Разработка и Конфигурация · 9 мин

Временное хранилище в 1С: как очищать и не допускать переполнения

Как очистить временное хранилище в 1С: методы УдалитьИзВременногоХранилища, время жизни данных, типичные ошибки и профилактика переполнения памяти сервера.

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

Если разработчик помещает объекты в хранилище, но не удаляет их после использования, память сервера постепенно заполняется «мусорными» адресами. На нагруженных системах это приводит к росту потребления оперативной памяти процессом rphost, замедлению работы пользователей и в тяжёлых случаях — к аварийному завершению рабочих процессов. Поэтому очистка временного хранилища — не опция, а обязательная часть грамотной разработки.

Очистить временное хранилище можно тремя способами: явно удалить данные методом УдалитьИзВременногоХранилища(), ограничить время жизни данных при помещении или дождаться автоматической очистки при завершении сеанса. Ниже разобраны все варианты, их ограничения и типичные ошибки.

Как устроено временное хранилище и когда оно очищается само

При вызове ПоместитьВоВременноеХранилище(Значение, Адрес) платформа сохраняет значение на сервере и возвращает уникальный адрес — строку вида e1cib/tempstorage/.... По этому адресу данные можно получить методом ПолучитьИзВременногоХранилища(Адрес) в любом серверном вызове, пока хранилище живо.

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

Важно понимать: получение данных методом ПолучитьИзВременногоХранилища() не удаляет их из хранилища. Метод только читает значение. Многие разработчики ошибочно считают, что после получения данные «забраны» и освобождены — на самом деле копия остаётся в памяти сервера.

Явная очистка методом УдалитьИзВременногоХранилища

Самый надёжный способ — удалить данные сразу после использования. Синтаксис предельно простой:

Данные = ПолучитьИзВременногоХранилища(АдресВХранилище);

// ... обработка данных ...

УдалитьИзВременногоХранилища(АдресВХранилище);

Метод доступен на сервере и на толстом клиенте. Если адрес не существует или данные уже удалены, ошибки не возникает — вызов безопасен для повторного исполнения. Это позволяет вызывать удаление «на всякий случай» в финальных блоках обработчиков.

Правильный паттерн — оборачивать работу с хранилищем в конструкцию Попытка ... Исключение ... КонецПопытки с удалением в обеих ветках, либо помещать удаление в конец процедуры, гарантированно достижимый при штатном выполнении. Иначе при исключении в середине обработки данные останутся в памяти.

Порядок действий при явной очистке
  1. 1
    Получите данные по адресу методом ПолучитьИзВременногоХранилища
  2. 2
    Выполните всю обработку значения (запись в базу, вывод, передачу дальше)
  3. 3
    Вызовите УдалитьИзВременногоХранилища(Адрес) в той же серверной процедуре
  4. 4
    Добавьте удаление в ветку Исключение, чтобы очистка сработала и при ошибке
  5. 5
    Проверьте, что адрес больше нигде не используется — иначе последующие вызовы получат Неопределено

Ограничение времени жизни при помещении данных

Превентивный подход — не давать данным жить дольше необходимого. При помещении в хранилище привяжите данные к форме, передав её уникальный идентификатор:

АдресХранилища = ПоместитьВоВременноеХранилище(Результат, УникальныйИдентификатор);

В этом случае платформа сама удалит данные при закрытии формы, даже если разработчик забыл вызвать удаление. Для фоновых заданий и длительных операций (метод ДлительныеОперации.ВыполнитьВФоне) адрес результата также рекомендуется привязывать к форме-инициатору.

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

Очистка при работе с файлами и картинками

Самые тяжёлые объекты в хранилище — двоичные данные файлов и изображений. Типовой сценарий загрузки файла: НачатьПомещениеФайла() или ПоместитьФайл() кладёт файл в хранилище, серверная процедура забирает его и записывает в базу. Если после записи в справочник присоединенных файлов не удалить адрес, каждая загрузка оставляет в памяти копию файла.

Для картинок в формах (реквизиты типа «строка» с адресом хранилища) очистка нужна при замене изображения: старый адрес удаляется, новый помещается с привязкой к форме. Иначе при многократной смене картинки в одном сеансе старые версии копятся до закрытия формы.

Отдельный случай — временные файлы, помещаемые для передачи на клиент (например, сформированный Excel или PDF для скачивания). После того как клиент получил данные и сохранил их локально, адрес на сервере больше не нужен — удаляйте его в конце клиентской процедуры отдельным серверным вызовом.

Массовая очистка и диагностика переполнения

Штатного метода «очистить всё хранилище сеанса» в платформе нет — удаление выполняется только по конкретным адресам. Поэтому если система уже страдает от накопленного мусора, программно вычистить чужие адреса не получится: они принадлежат другим сеансам и недоступны.

Признаки переполнения: рост памяти rphost без роста числа пользователей, ошибки нехватки памяти в технологическом журнале, периодические аварийные перезапуски рабочих процессов. Диагностируется через технологический журнал (события MEM, EXCP) и мониторинг потребления памяти процессами кластера в консоли администрирования.

Практические меры на уровне администрирования: настройка автоматического перезапуска рабочих процессов по порогу памяти в свойствах кластера, ограничение времени жизни сеансов, разрыв «спящих» соединений. Это не заменяет исправление кода, но снижает ущерб, пока утечки не устранены.

Контрольные точки

Как проверить результат

Память rphost после типовой операции
Норма

Возвращается к исходному уровню после завершения работы пользователя

Тревожный признак

Растёт с каждой итерацией операции и не снижается

Повторное получение по адресу после удаления
Норма

Возвращается Неопределено

Тревожный признак

Данные по-прежнему доступны — удаление не выполнилось

Технологический журнал
Норма

Нет событий нехватки памяти при штатной нагрузке

Тревожный признак

Ошибки памяти и дампы при обычной работе пользователей

Типичные ошибки и как их избежать

Первая ошибка — вера в автоматическую очистку после ПолучитьИзВременногоХранилища. Метод читает, но не удаляет; данные живут до конца срока хранилища. Вторая — удаление адреса до того, как фоновое задание или клиент успели забрать результат: операция завершается «молча» с пустыми данными.

Третья распространённая проблема — помещение в хранилище без привязки к форме в циклах и регламентных операциях. Обработка, которая в цикле формирует тысячи печатных форм и кладёт каждую в хранилище без удаления, способна исчерпать память сервера за один запуск. В циклах удаляйте адрес на каждой итерации.

Типичные ошибки
01
Считать, что ПолучитьИзВременногоХранилища удаляет данные — на деле остаётся копия до конца сеанса
02
Удалять адрес результата длительной операции до того, как форма его забрала — пользователь получает пустые данные
03
Помещать данные в хранилище внутри цикла без удаления на каждой итерации — память растёт лавинообразно
04
Передавать в ПоместитьВоВременноеХранилище новый GUID вместо идентификатора существующей формы — привязка не работает, данные живут до конца сеанса

FAQ

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

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

Что произойдёт, если удалить несуществующий адрес?

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

Как очистить хранилище в файловой базе?

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

Можно ли посмотреть, что сейчас лежит во временном хранилище?

Штатного инструмента просмотра содержимого хранилища сеанса нет. Косвенно объём оценивают по потреблению памяти рабочими процессами и по событиям технологического журнала. Для отладки разработчики обычно логируют адреса и размеры помещаемых данных самостоятельно.

Нужно ли удалять адрес картинки, привязанный к форме?

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

Помогает ли перезапуск сервера 1С решить проблему переполнения?

Только временно: перезапуск освобождает память, но причина — код без очистки — остаётся, и утечка повторится. Перезапуск и настройка автоперезапуска rphost по порогу памяти уместны как защитная мера на время поиска и исправления проблемных мест в конфигурации.

Итог

Что важно запомнить

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