Разработка и Конфигурация · 10 мин
Временное хранилище в 1С: когда очищается и как это контролировать
Разбираем, когда очищается временное хранилище в 1С: срок жизни данных, помещение и удаление значений, типовые ошибки и способы освободить память сервера.
Временное хранилище в 1С — это механизм платформы для передачи данных между сервером и клиентом: туда помещают таблицы значений, двоичные данные файлов, результаты обработок и другие объекты, которые нельзя напрямую передать в форму. Каждое помещённое значение получает адрес — строку вида уникального идентификатора, по которой данные можно извлечь позже.
Главный вопрос, который возникает у разработчиков, — когда хранилище очищается. Ответ зависит от того, как именно значение было помещено: с указанием срока жизни, с привязкой к форме или без параметров. Неправильное понимание жизненного цикла приводит к двум типичным проблемам: данные «исчезают» раньше времени, либо хранилище разрастается и потребляет память сервера.
Ниже разобраны правила очистки, способы явного удаления данных, диагностика утечек и практические рекомендации по безопасной работе с хранилищем.
Что такое временное хранилище и зачем оно нужно
Временное хранилище — это область памяти на сервере 1С, доступная через адрес-идентификатор. Клиентская часть (тонкий клиент, веб-клиент) не может напрямую оперировать серверными объектами вроде таблицы значений или результата запроса, поэтому объект сериализуется и помещается в хранилище, а на клиент передаётся только адрес.
Типовые сценарии использования: передача файла с клиента на сервер (ПоместитьФайл), возврат результата длительной операции из фонового задания, хранение данных формы между серверными вызовами, обмен данными между основной и дополнительной формами. Во всех случаях ключевой момент — время жизни данных ограничено, и разработчик обязан понимать его границы.
Когда временное хранилище очищается автоматически
Автоматическая очистка происходит в нескольких ситуациях, и их важно различать. Первая — завершение сеанса пользователя: все данные хранилища, созданные в рамках сеанса, уничтожаются. Вторая — закрытие формы, если значение было помещено с привязкой к уникальному идентификатору формы: при закрытии формы платформа удаляет связанные данные.
Третий случай — истечение срока жизни, заданного при помещении. Метод ПоместитьВоВременноеХранилище принимает вторым параметром либо уникальный идентификатор формы, либо дату, до которой данные должны храниться. Если передана дата, после её наступления данные становятся недоступны.
Если же значение помещено без второго параметра, его время жизни минимально: данные гарантированно доступны только до конца текущего серверного вызова. На практике они могут прожить дольше, но рассчитывать на это нельзя — платформа вправе очистить их при следующем обращении к серверу. Это самая частая причина ошибки «Ошибка получения данных по адресу временного хранилища».
Как явно удалить данные из хранилища
Для явного удаления используется процедура УдалитьИзВременногоХранилища(Адрес). Она освобождает память немедленно, не дожидаясь автоматической очистки. Это особенно важно при работе с большими объектами: файлами, объёмными таблицами, результатами запросов на сотни тысяч строк.
Рекомендуемый шаблон: получили данные по адресу — сразу удалили адрес, если данные больше не понадобятся. Например, в обработчике загрузки файла после чтения двоичных данных адрес следует удалить, иначе копия файла останется в памяти сервера до конца сеанса.
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
УдалитьИзВременногоХранилища(АдресХранилища);При работе с фоновыми заданиями (ДлительныеОперации в БСП) платформа и библиотека сами управляют адресом результата: после получения результата через API библиотеки хранилище освобождается. Если вы реализуете фоновое выполнение вручную через ФоновыеЗадания.Выполнить, ответственность за удаление адреса лежит на вас.
Признаки проблем с очисткой хранилища
Симптомы с двух сторон. Со стороны пользователя — ошибки вида «по указанному адресу данные отсутствуют» или «ошибка передачи данных между клиентом и сервером»: значит, данные были очищены раньше, чем код попытался их прочитать. Со стороны сервера — рост потребления памяти рабочими процессами rphost, который не снижается после завершения операций: значит, в хранилище копятся неудалённые объекты.
Диагностировать утечку можно через технологический журнал (события памяти и длительные вызовы) и косвенно — по мониторингу сеансов в консоли кластера. Если память растёт пропорционально активности конкретной обработки, проверьте, все ли адреса удаляются после использования.
Как проверить результат
Данные возвращаются, если задан срок жизни или идентификатор формы
Ошибка получения данных — адрес был помещён без параметров
Возвращается к исходному уровню после завершения операций
Продолжает расти — адреса не удаляются явно
Данные формы освобождаются автоматически
Данные живут до конца сеанса — не использован УникальныйИдентификатор формы
Как правильно задавать срок жизни данных
Выбор второго параметра ПоместитьВоВременноеХранилище определяет судьбу данных. Если данные нужны, пока открыта форма (например, таблица подбора товаров), передавайте УникальныйИдентификатор формы — платформа сама очистит хранилище при закрытии. Это самый безопасный вариант, исключающий утечки.
Если данные нужны ограниченное время вне формы — например, ссылка на сформированный отчёт для скачивания — передавайте дату с запасом: ТекущаяДатаСеанса() + 3600 даст час жизни. Учитывайте, что на медленных каналах пользователь может начать скачивание с задержкой.
Избегайте помещения без параметров в любом коде, где чтение происходит не в том же серверном вызове. Это допустимо только в цепочке «поместили — тут же прочитали» внутри одного обработчика.
Как выбрать действие
Типичные ошибки при работе с хранилищем
Самая распространённая ошибка — помещение значения в хранилище на клиенте в ПриНачалеРаботыСистемы или при открытии формы без привязки, а чтение — через несколько серверных вызовов. Данные к этому моменту уже удалены, и пользователь видит ошибку. Вторая частая проблема — хранение адреса в реквизите формы между вызовами при том, что сам адрес был создан без срока жизни.
Третья ошибка — помещение в хранилище больших данных «про запас» без последующего удаления. В файловой базе это менее критично, а в клиент-серверном режиме сотни пользователей с неудалёнными объектами создают ощутимую нагрузку на память сервера приложений.
Ограничения и альтернативы
Временное хранилище не предназначено для долговременного хранения: если данные нужны между сеансами, используйте регистры сведений, константы или хранилище значений в реквизитах объектов. Хранилище также не подходит для обмена между разными сеансами — адрес валиден только в рамках создавшего его сеанса (за исключением специальных механизмов вроде общих фоновых заданий с передачей адреса).
Для передачи файлов в веб-клиенте учитывайте ограничения браузера и таймауты соединения: очень большие файлы лучше передавать через механизмы, ориентированные на потоковую загрузку, а не через единичное помещение в хранилище.
Что важно запомнить
Хранилище очищается при закрытии формы, по сроку жизни, при завершении сеанса или явным удалением. Всегда задавайте второй параметр при помещении и удаляйте адрес после чтения — это исключает и ошибки «данных нет», и утечки памяти.
Частые вопросы
Очищается ли временное хранилище при закрытии программы 1С?
Да. При завершении сеанса пользователя все данные хранилища, созданные в этом сеансе, удаляются автоматически независимо от заданного срока жизни. Если нужно сохранить данные между запусками, используйте базу данных, а не хранилище.
Почему возникает ошибка «по адресу временного хранилища данные отсутствуют»?
Чаще всего значение было помещено без второго параметра, а чтение выполняется в другом серверном вызове — платформа уже очистила данные. Реже причина в истёкшем сроке жизни или закрытой форме, к идентификатору которой был привязан адрес.
Сколько данных можно поместить во временное хранилище?
Жёсткого документированного лимита нет — объём ограничен памятью сервера. Однако помещение файлов в сотни мегабайт создаёт заметную нагрузку на rphost, особенно при многопользовательской работе, поэтому большие данные стоит обрабатывать порциями и удалять адрес сразу после чтения.
Можно ли использовать один адрес хранилища для разных пользователей?
Нет, адрес действителен только в рамках сеанса, в котором он был создан. Для обмена данными между пользователями используйте регистры сведений, справочники или другие объекты базы данных.
Нужно ли удалять адрес, если задан идентификатор формы?
Платформа сама удалит данные при закрытии формы, поэтому явное удаление не обязательно. Но если данные большие и уже не нужны, пока форма ещё открыта, явный вызов УдалитьИзВременногоХранилища освободит память раньше.
Как найти в конфигурации места, которые «забивают» хранилище?
Выполните глобальный поиск по конфигурации по строке «ПоместитьВоВременноеХранилище» и проверьте каждое место: задан ли второй параметр и есть ли парный вызов УдалитьИзВременногоХранилища. Места без обоих признаков — первые кандидаты на доработку.