Как регистрировать изменения объектов в 1С без использования планов обмена?

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

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

Метод 1: Использование регистра сведений как очереди (Стек изменений)

Это классический подход, который часто называют созданием собственной таблицы регистрации. Рассмотрим ситуацию, когда нам нужно выгружать справочник Сотрудники. Вместо простого флажка "Выгрузить", лучше использовать структуру, напоминающую очередь сообщений.

Разберем архитектуру регистра:

  1. Создадим непериодический независимый регистр сведений ОчередьВыгрузки.
  2. Измерения: Объект (тип Ссылка), ИдентификаторЗаписи (тип УникальныйИдентификатор или Число).
  3. Ресурсы: ДатаИзменения (Дата/Время), ТипСобытия (Строка: "Запись", "Удаление").

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

Регистрация события происходит в подписке на событие ПриЗаписи:


Процедура ПриЗаписиОбъектаДляИнтеграции(Источник, Отказ) Экспорт
    Если Источник.ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    
    Запись = РегистрыСведений.ОчередьВыгрузки.СоздатьМенеджерЗаписи();
    Запись.Объект = Источник.Ссылка;
    Запись.ИдентификаторЗаписи = Новый УникальныйИдентификатор();
    Запись.ДатаИзменения = ТекущаяДатаСеанса();
    Запись.Записать();
КонецПроцедуры

Для выгрузки данных регламентное задание считывает записи из регистра, формирует пакет данных и после успешного ответа от сервиса удаляет обработанные записи. Чтобы избежать удаления новых изменений, которые могли попасть в регистр прямо во время выполнения выгрузки, всегда фильтруйте удаление по ИдентификаторЗаписи или моменту времени.

Метод 2: Платформенная система отслеживания изменений (8.3.24+)

Выясним причину, по которой это решение считается наиболее современным. В последних версиях платформы 1С (начиная с 8.3.24) появился встроенный механизм, заменяющий планы обмена в простых интеграциях типа "база — сервис".

Рассмотрим основные преимущества:

Для работы с этим механизмом используется объект СистемаОтслеживанияИзменений. Мы можем настроить состав отслеживаемых объектов и получать данные порциями. Рассмотрим пример программного получения изменений:


// Получаем изменения для справочника Сотрудники
ВыборкаИзменений = СистемаОтслеживанияИзменений.ВыбратьИзменения(Метаданные.Справочники.Сотрудники, ПоследнийНомерПорции);

Пока ВыборкаИзменений.Следующий() Цикл
    // Обработка объекта
    ОбъектСсылка = ВыборкаИзменений.Ссылка;
    // ... логика отправки в сервис
КонецЦикла;

// После успешной обработки подтверждаем прочтение
СистемаОтслеживанияИзменений.ПодтвердитьПолучение(ВыборкаИзменений.НомерПорции);

Метод 3: Использование поля версии объекта (_Version) на уровне СУБД

Посмотрим на более "хардкорный" способ, который часто применяют системные архитекторы при работе с большими данными. Каждая таблица в 1С (в SQL-варианте) имеет скрытое поле _Version. Это поле типа rowversion или timestamp, которое автоматически увеличивается при любом обновлении строки в базе данных.

Алгоритм работы интеграции:

  1. Интегратор (внешний сервис или сама 1С через внешний запрос к SQL) запоминает значение _Version последней успешно выгруженной записи.
  2. При следующем запуске выполняется запрос: SELECT ... WHERE _Version > @LastVersion.
  3. Это позволяет моментально получить список измененных объектов без ведения дополнительных логов внутри 1С.

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

Метод 4: Использование механизма "История данных"

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

С помощью метода ИсторияДанных.ВыбратьВерсии() можно получить список изменений за определенный период. Однако стоит помнить, что этот механизм создавался для аудита пользователями, и при очень интенсивной записи объектов он может создавать значительную нагрузку на базу данных.

Метод 5: Переход к событийной модели (Webhooks / Push-уведомления)

Вместо того чтобы заставлять 1С хранить списки изменений (Pull-модель), мы можем использовать Push-модель. В этом случае 1С сама инициирует отправку данных в момент записи объекта.

Разберем реализацию:

Такой подход минимизирует задержку между изменением в 1С и обновлением данных во внешней системе (Real-time интеграция).

Итоги и рекомендации

Выбор метода зависит от ваших условий:

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

← На главную