Как организовать хранение кэша в оперативной памяти сервера 1С для доступа из любого сеанса?

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

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

Разберем архитектуру платформы, выясним причины ограничений встроенных инструментов и рассмотрим проверенные практические способы реализации быстрого кэширования данных.

Архитектурные ограничения встроенных механизмов 1С

Проанализируем стандартные платформенные инструменты и выясним, почему они не подходят для создания управляемого межсеансового In-Memory кэша:

  1. Временное хранилище (ПоместитьВоВременноеХранилище): адреса временного хранилища строго привязаны к контексту конкретного пользовательского сеанса или фонового задания. Попытка прочитать адрес из другого сеанса приведет к ошибке отсутствия данных.
  2. Повторное использование возвращаемых значений (кэш функций общих модулей): кэш со значением На время сеанса изолирован внутри каждого отдельного сеанса. Кэш На время вызова сбрасывается по окончании вызова сервера. Кроме того, в платформе отсутствует программный API для точечной инвалидации (принудительного сброса) кэшированных значений при изменении данных в базе.
  3. Параметры сеанса: инициализируются отдельно для каждого входящего подключения и не разделяются между параллельными пользователями.
  4. Хранилище общих настроек: сохраняет данные в таблицах СУБД, создавая стандартную дисковую и транзакционную нагрузку, что исключает преимущество прямого доступа к оперативной памяти.
  5. Кластерная архитектура и изоляция процессов: сервер 1С работает через пул рабочих процессов (rphost), которые могут быть распределены по разным физическим серверам. Память одного процесса rphost изолирована от других процессов на уровне операционной системы.

Способ 1. Использование внешних In-Memory хранилищ (Redis, Memcached, Tarantool)

Рассмотрим наиболее популярный и масштабируемый подход. Внешняя база данных типа «ключ-значение», работающая в оперативной памяти, выступает единым источником кэша для всех рабочих процессов кластера 1С.

Разберем типовой алгоритм работы HTTP-сервиса с внешним кэшем:

  1. HTTP-сервис принимает входящий запрос и формирует ключ кэша.
  2. Выполняется запрос к In-Memory хранилищу по протоколу HTTP (REST API) или TCP-соединению.
  3. Если данные найдены — отдаем готовый результат без обращения к таблицам СУБД.
  4. Если данных нет — читаем информацию из базы 1С через запрос, преобразуем в JSON, сохраняем в кэш и возвращаем клиенту.
  5. При записи или изменении исходных объектов в 1С (например, в подписке на событие ПриЗаписи) отправляем команду на удаление ключа из кэша.

Посмотрим на пример работы с сериализацией и десериализацией данных для кэша средствами платформы:


// Сериализация структуры данных перед отправкой в кэш
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураДанных);
СтрокаJSON = ЗаписьJSON.Закрыть();

// Восстановление данных из кэша
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
ДанныеИзКэша = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();

Способ 2. Кэширование на уровне обратного прокси (Nginx, Varnish)

Если задача заключается в отдаче неизменных или редко обновляемых ответов на входящие GET-запросы, перенесем логику кэширования за пределы 1С на веб-сервер или прокси-сервер.

Рассмотрим преимущества и схему реализации:

  1. Перед веб-сервером публикации 1С (IIS или Apache) настраивается обратный прокси Nginx или Varnish.
  2. Прокси принимает входящий HTTP-запрос и проверяет локальный кэш в оперативной памяти. Если ответ закэширован, он моментально отдается клиенту с минимальной задержкой.
  3. Запрос передается в публикацию 1С только при отсутствии кэша (Cache Miss).
  4. Для сброса устаревших данных при изменении объектов в 1С настраиваем отправку служебного HTTP-запроса на очистку кэша (Cache Purge) по адресу веб-сервера.

Способ 3. Выделенный микросервис-прослойка (Middleware)

В сценариях с высокой частотой запросов в секунду (RPS) оптимальным решением является вынос API во внешний легковесный сервис (написанный на Go, C#, Node.js или Python).

Проанализируем взаимодействие компонентов:

  1. Микросервис держит в своей оперативной памяти актуальное состояние необходимых данных и напрямую обрабатывает входящий трафик от клиентов.
  2. База 1С выступает исключительно учетным ядром (Master-системой).
  3. Синхронизация выполняется асинхронно: при изменении справочников или документов 1С отправляет вебхук или сообщение в очередь (RabbitMQ, Kafka), после чего сервис точечно обновляет данные в памяти.

Способ 4. Внешняя компонента Native API для разделяемой памяти (Shared Memory)

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

Разберем особенности реализации:

  1. Разрабатывается внешняя компонента на C++ (Native API).
  2. Компонента использует системные вызовы для работы с разделяемой памятью (CreateFileMapping / MapViewOfFile в ОС Windows или shm_open / mmap в Linux).
  3. Каждый рабочий процесс rphost загружает экземпляр компоненты и обращается к общему участку оперативной памяти ОС.
  4. Важно учитывать: этот способ требует ручной реализации потокобезопасности (мьютексы, блокировки) и не работает между разными серверами в распределенном кластере 1С.
← На главную