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