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

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

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

Понимание архитектуры планов обмена: роль узлов

Для начала разберем фундаментальное понятие — узлы плана обмена. В каждом плане обмена существует один специальный предопределенный узел, который называется ЭтотУзел. Проанализируем ситуацию: многие новички пытаются искать зарегистрированные изменения именно на этом узле, но это ошибка. Используя конструктор API для обмена, важно помнить, что ЭтотУзел представляет текущую информационную базу, и система никогда не регистрирует изменения «сама на себя».

Чтобы механизм заработал, нам необходимо выполнить следующие действия:

  1. Открыть в конфигураторе или в режиме «1С:Предприятие» нужный план обмена.
  2. Создать новый узел (назовем его, например, «ОбменССайтом»).
  3. Именно для этого нового узла система будет накапливать изменения.

Выясним причину, почему это сделано так. План обмена может обслуживать сразу несколько получателей (например, сайт, Google Таблицы и бухгалтерию). Каждому из них нужны свои данные. Наличие разных узлов позволяет 1С вести раздельный учет изменений для каждого контрагента.

Программная выборка изменений

Рассмотрим подробнее, как получить список объектов, которые были изменены с момента последней выгрузки. Для этого используется метод ПланыОбмена.ВыбратьИзменения(). Посмотрим на пример реализации кода:


// Определяем узел-получатель (не ЭтотУзел!)
УзелОбъекта = ПланыОбмена.НайтиПоНаименованию("ОбменССайтом");

// Номер сообщения обычно используется для подтверждения получения данных
НомерСообщения = 0; 

// Получаем выборку измененных объектов
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбъекта, НомерСообщения);

Пока ВыборкаИзменений.Следующий() Цикл
    // Получаем сам объект (справочник, документ или запись регистра)
    ОбъектДанных = ВыборкаИзменений.Получить();
    
    // Здесь выполняется логика отправки на сайт
    // Например: ОтправитьНаСайт(ОбъектДанных.Ссылка);
    
    // Добавляем в массив для последующего удаления регистрации
    МассивДляУдаления.Добавить(ОбъектДанных);
КонецЦикла;

В данном примере мы используем переменную НомерСообщения. Это критически важный момент для надежного обмена данными. Когда мы вызываем ВыбратьИзменения, система «замораживает» текущий набор изменений под этим номером. Если в процессе отправки данных на сайт произойдет сбой (например, пропадет интернет), мы просто не будем подтверждать получение, и при следующем запуске эти же данные снова попадут в выборку.

Удаление регистрации изменений

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

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

  1. Массовое удаление по номеру сообщения: метод ПланыОбмена.УдалитьРегистрациюИзменений(Узел, НомерСообщения). Это самый быстрый и правильный способ. Он удаляет все записи, которые были включены в пакет с данным номером.
  2. Точечное удаление объектов: используется, если нужно очистить регистрацию только для конкретных ссылок.

// Пример точечного удаления регистрации
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбъекта, МассивОбъектов);

Авторегистрация против ручного управления

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

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

Запретить авторегистрацию: в этом случае программист сам решает, когда фиксировать изменения. Это делается с помощью метода ПланыОбмена.ЗарегистрироватьИзменения() — для этого подойдёт массовая регистрация объектов в планах обмена. Рассмотрим ситуацию, когда мы хотим регистрировать только проведенные документы:


Если ДокументОбъект.Проведен Тогда
    ПланыОбмена.ЗарегистрироватьИзменения(СсылкаНаУзелСайта, ДокументОбъект.Ссылка);
КонецЕсли;

Такой подход позволяет существенно снизить объем передаваемых данных и нагрузку на базу данных.

Работа с удаленными объектами

Одной из сложнейших задач при интеграции является синхронизация удаления. Если объект просто удалить из 1С, как сайт узнает, что его больше нет? Планы обмена решают эту проблему элегантно. При удалении элемента в таблицу регистрации записывается не ссылка на него (так как ссылаться уже не на что), а объект типа УдалениеОбъекта, который содержит уникальный идентификатор (GUID).

При обходе выборки изменений обязательно нужно проверять тип полученных данных:


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

Особенности работы в расширениях

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

Производительность и оптимизация

Если ваша база данных содержит сотни тысяч товаров и изменения происходят часто, метод ВыбратьИзменения может стать «узким местом». Разберем несколько советов по оптимизации:

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

← На главную