Как организовать инкрементальную выгрузку данных из 1С через HTTP-сервис при больших объемах?

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

Задача периодической синхронизации большого количества объектов (300 000 и более) между 1С и внешними системами часто сталкивается с проблемой низкой производительности и таймаутов HTTP-соединений. Полная выгрузка всего массива данных становится невозможной из-за нагрузки на сервер 1С. Рассмотрим, как реализовать механизм инкрементальной (частичной) выгрузки, который позволит передавать только измененные данные.

Принцип работы инкрементальной выгрузки через Регистр сведений

Для решения задачи мы будем использовать специализированный Регистр сведений. Это наиболее гибкий метод, который позволяет отслеживать изменения любых объектов метаданных, включая Пользователи и ПользователиИнформационнойБазы.

  1. Создание регистра: Создаем регистр сведений (в расширении или основной конфигурации). Основными измерениями будут ОбъектСсылка (тип — СправочникСсылка или универсальный тип) и ТипОбъекта (строка или перечисление). В качестве ресурса добавляем ДатаИзменения (тип Дата).
  2. Регистрация изменений: Используем подписки на события ПриЗаписи для всех интересующих нас справочников. При каждом изменении объекта в подписке программно записываем в наш регистр ссылку на объект и текущую дату и время.
  3. Механизм получения данных: Внешняя система отправляет GET-запрос к нашему HTTP-сервису, передавая параметр ПоследняяДатаСинхронизации.
  4. Формирование ответа: Внутри сервиса мы выполняем запрос к 1С, выбирая только те объекты, чья ДатаИзменения в регистре больше или равна переданному параметру.

Реализация логики запроса

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    Спр.Ссылка КАК Ссылка
    |ИЗ
    |    Справочник.Пользователи КАК Спр
    |ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЖурналИзменений КАК РС
    |    ПО Спр.Ссылка = РС.ОбъектСсылка
    |ГДЕ
    |    РС.ДатаИзменения >= &ДатаПараметр";
Запрос.УстановитьПараметр("ДатаПараметр", ДатаПоследнейСинхронизации);
Результат = Запрос.Выполнить();

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

Оптимизация передачи данных: использование порций и POST-запросов

Передавать 300 000 записей за один раз не рекомендуется — это гарантированно приведет к ошибкам памяти. Рассмотрим подходы к оптимизации:

Почему не стоит использовать другие методы?

В ходе анализа мы исключили следующие варианты:

Заключение

Для обеспечения высокой скорости и надежности синхронизации:

  1. Создайте Регистр сведений для регистрации фактов изменения.
  2. Настройте Подписки на события для автоматического заполнения регистра.
  3. Реализуйте в HTTP-сервисе передачу данных порциями по 5–10 тысяч объектов.
  4. Используйте POST для передачи больших массивов идентификаторов, чтобы избежать ограничений длины URL.

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

← На главную