Задача периодической синхронизации большого количества объектов (300 000 и более) между 1С и внешними системами часто сталкивается с проблемой низкой производительности и таймаутов HTTP-соединений. Полная выгрузка всего массива данных становится невозможной из-за нагрузки на сервер 1С. Рассмотрим, как реализовать механизм инкрементальной (частичной) выгрузки, который позволит передавать только измененные данные.
Для решения задачи мы будем использовать специализированный Регистр сведений. Это наиболее гибкий метод, который позволяет отслеживать изменения любых объектов метаданных, включая Пользователи и ПользователиИнформационнойБазы.
ОбъектСсылка (тип — СправочникСсылка или универсальный тип) и ТипОбъекта (строка или перечисление). В качестве ресурса добавляем ДатаИзменения (тип Дата).ПриЗаписи для всех интересующих нас справочников. При каждом изменении объекта в подписке программно записываем в наш регистр ссылку на объект и текущую дату и время.ПоследняяДатаСинхронизации.ДатаИзменения в регистре больше или равна переданному параметру.Рассмотрим пример формирования запроса на языке 1С. Мы соединяем целевой справочник с нашим регистром, чтобы отфильтровать только нужные записи.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Спр.Ссылка КАК Ссылка
|ИЗ
| Справочник.Пользователи КАК Спр
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЖурналИзменений КАК РС
| ПО Спр.Ссылка = РС.ОбъектСсылка
|ГДЕ
| РС.ДатаИзменения >= &ДатаПараметр";
Запрос.УстановитьПараметр("ДатаПараметр", ДатаПоследнейСинхронизации);
Результат = Запрос.Выполнить();
Важно помнить: если синхронизация запускается впервые (параметр даты пустой), необходимо передать весь объем данных, чтобы внешняя система могла инициализировать свою базу.
Передавать 300 000 записей за один раз не рекомендуется — это гарантированно приведет к ошибкам памяти. Рассмотрим подходы к оптимизации:
ВЫБРАТЬ ПЕРВЫЕ 5000. После того как внешняя система подтвердит успешный прием порции данных, вы можете очистить соответствующие записи из регистра или обновить дату синхронизации на стороне клиента.POST и передавайте данные в теле запроса в формате JSON.В ходе анализа мы исключили следующие варианты:
ВерсияДанных требует от внешней системы хранить историю всех версий, а от 1С — перебирать все объекты для проверки изменений, что при 300 000 объектах неприемлемо по времени.ПользователиИнформационнойБазы напрямую, что делает регистр сведений более универсальным инструментом в данном контексте.Для обеспечения высокой скорости и надежности синхронизации:
POST для передачи больших массивов идентификаторов, чтобы избежать ограничений длины URL.Такой подход позволит вам гибко управлять обменом, минимизировать нагрузку на систему 1С и обеспечить актуальность данных во внешней информационной системе.