При реализации интеграций между 1С и внешними сервисами часто возникает задача выгрузки данных. Стандартный механизм — планы обмена — не всегда удобен из-за блокировок, сложности настройки или необходимости реализации специфической логики. Рассмотрим альтернативные способы отслеживания изменений, разберем их плюсы, минусы и техническую реализацию.
Это классический подход, который часто называют созданием собственной таблицы регистрации. Рассмотрим ситуацию, когда нам нужно выгружать справочник Сотрудники. Вместо простого флажка "Выгрузить", лучше использовать структуру, напоминающую очередь сообщений.
Разберем архитектуру регистра:
ОчередьВыгрузки.Объект (тип Ссылка), ИдентификаторЗаписи (тип УникальныйИдентификатор или Число).ДатаИзменения (Дата/Время), ТипСобытия (Строка: "Запись", "Удаление").Проанализируем, почему использование Уникального Идентификатора в ключе важно. Если объект изменится несколько раз между итерациями обмена, в регистре накопится история. Это позволит избежать "потери" промежуточных состояний, если это критично для внешней системы.
Регистрация события происходит в подписке на событие ПриЗаписи:
Процедура ПриЗаписиОбъектаДляИнтеграции(Источник, Отказ) Экспорт
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
Запись = РегистрыСведений.ОчередьВыгрузки.СоздатьМенеджерЗаписи();
Запись.Объект = Источник.Ссылка;
Запись.ИдентификаторЗаписи = Новый УникальныйИдентификатор();
Запись.ДатаИзменения = ТекущаяДатаСеанса();
Запись.Записать();
КонецПроцедуры
Для выгрузки данных регламентное задание считывает записи из регистра, формирует пакет данных и после успешного ответа от сервиса удаляет обработанные записи. Чтобы избежать удаления новых изменений, которые могли попасть в регистр прямо во время выполнения выгрузки, всегда фильтруйте удаление по ИдентификаторЗаписи или моменту времени.
Выясним причину, по которой это решение считается наиболее современным. В последних версиях платформы 1С (начиная с 8.3.24) появился встроенный механизм, заменяющий планы обмена в простых интеграциях типа "база — сервис".
Рассмотрим основные преимущества:
Для работы с этим механизмом используется объект СистемаОтслеживанияИзменений. Мы можем настроить состав отслеживаемых объектов и получать данные порциями. Рассмотрим пример программного получения изменений:
// Получаем изменения для справочника Сотрудники
ВыборкаИзменений = СистемаОтслеживанияИзменений.ВыбратьИзменения(Метаданные.Справочники.Сотрудники, ПоследнийНомерПорции);
Пока ВыборкаИзменений.Следующий() Цикл
// Обработка объекта
ОбъектСсылка = ВыборкаИзменений.Ссылка;
// ... логика отправки в сервис
КонецЦикла;
// После успешной обработки подтверждаем прочтение
СистемаОтслеживанияИзменений.ПодтвердитьПолучение(ВыборкаИзменений.НомерПорции);
Посмотрим на более "хардкорный" способ, который часто применяют системные архитекторы при работе с большими данными. Каждая таблица в 1С (в SQL-варианте) имеет скрытое поле _Version. Это поле типа rowversion или timestamp, которое автоматически увеличивается при любом обновлении строки в базе данных.
Алгоритм работы интеграции:
_Version последней успешно выгруженной записи.SELECT ... WHERE _Version > @LastVersion.Важный нюанс: Поле _Version не говорит о том, что именно изменилось, и оно не хранит информацию об удалении объектов. Если вам нужно отслеживать удаления, этот метод придется комбинировать с триггерами на уровне базы данных или подписками в 1С.
Проанализируем ситуацию: в конфигурации уже может быть включена стандартная История данных для нужных объектов. Вместо того чтобы создавать новые регистры, мы можем обращаться к программному интерфейсу истории.
С помощью метода ИсторияДанных.ВыбратьВерсии() можно получить список изменений за определенный период. Однако стоит помнить, что этот механизм создавался для аудита пользователями, и при очень интенсивной записи объектов он может создавать значительную нагрузку на базу данных.
Вместо того чтобы заставлять 1С хранить списки изменений (Pull-модель), мы можем использовать Push-модель. В этом случае 1С сама инициирует отправку данных в момент записи объекта.
Разберем реализацию:
ПриЗаписи подготавливаются данные в формате JSON.HTTPСоединение на адрес внешнего сервиса.Такой подход минимизирует задержку между изменением в 1С и обновлением данных во внешней системе (Real-time интеграция).
Выбор метода зависит от ваших условий:
Помните, что ключевая задача при замене планов обмена — обеспечить целостность данных и не допустить потери регистрации изменений при возникновении ошибок в процессе обмена. Всегда используйте механизм подтверждения (квитирования) полученных данных.