Разработка и Конфигурация · 9 мин
Временное хранилище в 1С: как очищать и не допускать переполнения
Как очистить временное хранилище в 1С: методы УдалитьИзВременногоХранилища, время жизни данных, типичные ошибки и профилактика переполнения памяти сервера.
Временное хранилище в 1С — это механизм передачи данных между серверными вызовами, чаще всего между клиентом и сервером: сюда помещают двоичные данные файлов, таблицы значений, результаты запросов, адреса картинок и печатных форм. Данные хранятся в оперативной памяти рабочего процесса сервера 1С (или в файловой базе — в памяти приложения) и не удаляются автоматически в момент, когда они перестали быть нужны.
Если разработчик помещает объекты в хранилище, но не удаляет их после использования, память сервера постепенно заполняется «мусорными» адресами. На нагруженных системах это приводит к росту потребления оперативной памяти процессом rphost, замедлению работы пользователей и в тяжёлых случаях — к аварийному завершению рабочих процессов. Поэтому очистка временного хранилища — не опция, а обязательная часть грамотной разработки.
Очистить временное хранилище можно тремя способами: явно удалить данные методом УдалитьИзВременногоХранилища(), ограничить время жизни данных при помещении или дождаться автоматической очистки при завершении сеанса. Ниже разобраны все варианты, их ограничения и типичные ошибки.
Как устроено временное хранилище и когда оно очищается само
При вызове ПоместитьВоВременноеХранилище(Значение, Адрес) платформа сохраняет значение на сервере и возвращает уникальный адрес — строку вида e1cib/tempstorage/.... По этому адресу данные можно получить методом ПолучитьИзВременногоХранилища(Адрес) в любом серверном вызове, пока хранилище живо.
Время жизни данных зависит от второго параметра. Если передан уникальный идентификатор формы — данные удаляются автоматически при закрытии этой формы. Если передана пустая строка или адрес не привязан к форме — данные живут до конца сеанса пользователя. Именно второй вариант чаще всего становится источником утечек памяти: сеанс может жить часами, а данные нужны были на несколько секунд.
Важно понимать: получение данных методом ПолучитьИзВременногоХранилища() не удаляет их из хранилища. Метод только читает значение. Многие разработчики ошибочно считают, что после получения данные «забраны» и освобождены — на самом деле копия остаётся в памяти сервера.
Явная очистка методом УдалитьИзВременногоХранилища
Самый надёжный способ — удалить данные сразу после использования. Синтаксис предельно простой:
Данные = ПолучитьИзВременногоХранилища(АдресВХранилище);
// ... обработка данных ...
УдалитьИзВременногоХранилища(АдресВХранилище);
Метод доступен на сервере и на толстом клиенте. Если адрес не существует или данные уже удалены, ошибки не возникает — вызов безопасен для повторного исполнения. Это позволяет вызывать удаление «на всякий случай» в финальных блоках обработчиков.
Правильный паттерн — оборачивать работу с хранилищем в конструкцию Попытка ... Исключение ... КонецПопытки с удалением в обеих ветках, либо помещать удаление в конец процедуры, гарантированно достижимый при штатном выполнении. Иначе при исключении в середине обработки данные останутся в памяти.
- 1Получите данные по адресу методом ПолучитьИзВременногоХранилища
- 2Выполните всю обработку значения (запись в базу, вывод, передачу дальше)
- 3Вызовите УдалитьИзВременногоХранилища(Адрес) в той же серверной процедуре
- 4Добавьте удаление в ветку Исключение, чтобы очистка сработала и при ошибке
- 5Проверьте, что адрес больше нигде не используется — иначе последующие вызовы получат Неопределено
Ограничение времени жизни при помещении данных
Превентивный подход — не давать данным жить дольше необходимого. При помещении в хранилище привяжите данные к форме, передав её уникальный идентификатор:
АдресХранилища = ПоместитьВоВременноеХранилище(Результат, УникальныйИдентификатор);
В этом случае платформа сама удалит данные при закрытии формы, даже если разработчик забыл вызвать удаление. Для фоновых заданий и длительных операций (метод ДлительныеОперации.ВыполнитьВФоне) адрес результата также рекомендуется привязывать к форме-инициатору.
Ограничение подхода: если форма открыта долго (например, рабочий стол с обработкой мониторинга), данные живут столько же. Для таких сценариев привязка к форме не спасает — нужна явная очистка после каждого цикла использования.
Очистка при работе с файлами и картинками
Самые тяжёлые объекты в хранилище — двоичные данные файлов и изображений. Типовой сценарий загрузки файла: НачатьПомещениеФайла() или ПоместитьФайл() кладёт файл в хранилище, серверная процедура забирает его и записывает в базу. Если после записи в справочник присоединенных файлов не удалить адрес, каждая загрузка оставляет в памяти копию файла.
Для картинок в формах (реквизиты типа «строка» с адресом хранилища) очистка нужна при замене изображения: старый адрес удаляется, новый помещается с привязкой к форме. Иначе при многократной смене картинки в одном сеансе старые версии копятся до закрытия формы.
Отдельный случай — временные файлы, помещаемые для передачи на клиент (например, сформированный Excel или PDF для скачивания). После того как клиент получил данные и сохранил их локально, адрес на сервере больше не нужен — удаляйте его в конце клиентской процедуры отдельным серверным вызовом.
Массовая очистка и диагностика переполнения
Штатного метода «очистить всё хранилище сеанса» в платформе нет — удаление выполняется только по конкретным адресам. Поэтому если система уже страдает от накопленного мусора, программно вычистить чужие адреса не получится: они принадлежат другим сеансам и недоступны.
Признаки переполнения: рост памяти rphost без роста числа пользователей, ошибки нехватки памяти в технологическом журнале, периодические аварийные перезапуски рабочих процессов. Диагностируется через технологический журнал (события MEM, EXCP) и мониторинг потребления памяти процессами кластера в консоли администрирования.
Практические меры на уровне администрирования: настройка автоматического перезапуска рабочих процессов по порогу памяти в свойствах кластера, ограничение времени жизни сеансов, разрыв «спящих» соединений. Это не заменяет исправление кода, но снижает ущерб, пока утечки не устранены.
Как проверить результат
Возвращается к исходному уровню после завершения работы пользователя
Растёт с каждой итерацией операции и не снижается
Возвращается Неопределено
Данные по-прежнему доступны — удаление не выполнилось
Нет событий нехватки памяти при штатной нагрузке
Ошибки памяти и дампы при обычной работе пользователей
Типичные ошибки и как их избежать
Первая ошибка — вера в автоматическую очистку после ПолучитьИзВременногоХранилища. Метод читает, но не удаляет; данные живут до конца срока хранилища. Вторая — удаление адреса до того, как фоновое задание или клиент успели забрать результат: операция завершается «молча» с пустыми данными.
Третья распространённая проблема — помещение в хранилище без привязки к форме в циклах и регламентных операциях. Обработка, которая в цикле формирует тысячи печатных форм и кладёт каждую в хранилище без удаления, способна исчерпать память сервера за один запуск. В циклах удаляйте адрес на каждой итерации.
FAQ
Удаляются ли данные из временного хранилища при закрытии сеанса?
Да, при завершении сеанса все его данные во временном хранилище освобождаются автоматически. Проблема в том, что сеансы живут долго, и за это время мусор успевает накопиться. Полагаться на закрытие сеанса как на способ очистки нельзя.
Что произойдёт, если удалить несуществующий адрес?
Ничего критичного: метод УдалитьИзВременногоХранилища не вызывает исключения для отсутствующего или уже удалённого адреса. Это позволяет безопасно вызывать его в блоках Исключение и при повторной обработке.
Как очистить хранилище в файловой базе?
Механизмы те же: УдалитьИзВременногоХранилища и привязка к форме. Разница лишь в том, что в файловом режиме данные хранятся в памяти клиентского приложения, поэтому переполнение бьёт по конкретному пользователю, а не по всему серверу.
Можно ли посмотреть, что сейчас лежит во временном хранилище?
Штатного инструмента просмотра содержимого хранилища сеанса нет. Косвенно объём оценивают по потреблению памяти рабочими процессами и по событиям технологического журнала. Для отладки разработчики обычно логируют адреса и размеры помещаемых данных самостоятельно.
Нужно ли удалять адрес картинки, привязанный к форме?
Если картинка одна на всё время жизни формы — нет, платформа очистит её при закрытии. Если изображение заменяется многократно, старый адрес нужно удалять перед помещением нового, иначе прежние версии будут копиться до закрытия формы.
Помогает ли перезапуск сервера 1С решить проблему переполнения?
Только временно: перезапуск освобождает память, но причина — код без очистки — остаётся, и утечка повторится. Перезапуск и настройка автоперезапуска rphost по порогу памяти уместны как защитная мера на время поиска и исправления проблемных мест в конфигурации.
Что важно запомнить
Временное хранилище очищается явным вызовом УдалитьИзВременногоХранилища, автоматически при закрытии формы-владельца или при завершении сеанса. Получение данных не удаляет их. Привязывайте данные к форме, удаляйте адреса после использования и в циклах, а перезапуск процессов используйте только как защитную меру, а не как решение.