К статье
Практический материал

Разработка и Конфигурация · 10 мин

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

Как зарегистрировать объект в плане обмена 1С программно: методы ЗарегистрироватьИзменения, работа с узлами, проверка регистрации, типичные ошибки и примеры кода.

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

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

Как устроена регистрация изменений в плане обмена

Для каждого плана обмена платформа автоматически создаёт таблицы регистрации изменений — по одной на каждый тип объекта, входящего в состав плана. Когда объект регистрируется, в такой таблице появляется запись «узел — ссылка на объект». При выгрузке механизм обмена читает эти таблицы и помещает зарегистрированные объекты в сообщение обмена, после успешной отправки регистрация снимается.

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

Базовый способ: ПланыОбмена.ЗарегистрироватьИзменения

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

Узел = ПланыОбмена.ОбменСФилиалами.НайтиПоКоду("ФЛ01");

Если Не Узел.Пустая() Тогда

ПланыОбмена.ОбменСФилиалами.ЗарегистрироватьИзменения(Узел, ДокументСсылка);

КонецЕсли;

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

МассивУзлов = Новый Массив;

МассивУзлов.Добавить(УзелФилиал1);

МассивУзлов.Добавить(УзелФилиал2);

ПланыОбмена.ОбменСФилиалами.ЗарегистрироватьИзменения(МассивУзлов, ДокументСсылка);

Регистрация всех объектов одного типа

Для первоначальной выгрузки часто требуется зарегистрировать все объекты определённого вида. В этом случае вторым параметром передаётся объект метаданных:

ПланыОбмена.ОбменСФилиалами.ЗарегистрироватьИзменения(

Узел, Метаданные.Документы.РеализацияТоваровУслуг);

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

Альтернатива: регистрация через объект узла

Второй способ — работа с записями регистрации через объект узла. Метод ЗарегистрироватьИзменения доступен и у объекта ПланОбменаОбъект, что удобно, когда узел уже получен как объект для изменения его свойств:

УзелОбъект = Узел.ПолучитьОбъект();

УзелОбъект.ЗарегистрироватьИзменения(ДокументСсылка);

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

// Снять регистрацию конкретного объекта

ПланыОбмена.ОбменСФилиалами.УдалитьРегистрациюИзменений(Узел, ДокументСсылка);

Как выбрать узлы и проверить состав плана обмена

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

СоставПлана = Метаданные.ПланыОбмена.ОбменСФилиалами.Состав;

Если СоставПлана.Найти(Метаданные.Документы.РеализацияТоваровУслуг) <> Неопределено Тогда

// регистрация возможна

КонецЕсли;

При выборе узлов исключайте предопределённый узел текущей базы. Типовой приём — запрос с отбором:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Узлы.Ссылка КАК Узел

|ИЗ

| ПланОбмена.ОбменСФилиалами КАК Узлы

|ГДЕ

| НЕ Узлы.ЭтотУзел

| И НЕ Узлы.ПометкаУдаления";

Порядок действий для регистрации объекта
  1. 1
    Определите целевой узел по коду или наименованию, исключив «этот узел»
  2. 2
    Проверьте, что тип объекта входит в состав плана обмена
  3. 3
    Вызовите ПланыОбмена.ИмяПлана.ЗарегистрироватьИзменения(Узел, Ссылка)
  4. 4
    Проверьте регистрацию через ВыбратьИзменения или типовую обработку регистрации изменений
  5. 5
    Выполните тестовую выгрузку и убедитесь, что объект попал в сообщение обмена

Проверка результата регистрации

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

Выборка = ПланыОбмена.ОбменСФилиалами.ВыбратьИзменения(

Узел, 1, Метаданные.Документы.РеализацияТоваровУслуг);

Пока Выборка.Следующий() Цикл

Сообщить("Зарегистрирован: " + Выборка.Получить());

КонецЦикла;

Второй параметр — номер сообщения обмена; для проверки без фактической выгрузки обычно используют текущий номер принятого сообщения плюс один либо смотрят регистрацию через типовые инструменты. В типовых конфигурациях есть обработка «Регистрация изменений для обмена данными», которая показывает зарегистрированные объекты по узлу в наглядном виде — это самый быстрый способ визуальной проверки.

Контрольные точки

Как проверить результат

Запись в таблице регистрации
Норма

Объект виден в обработке регистрации изменений для нужного узла

Тревожный признак

Записи нет — проверьте узел и состав плана обмена

Поведение при выгрузке
Норма

Объект попадает в файл сообщения обмена

Тревожный признак

Сообщение пустое — регистрация не выполнена или уже снята

Вызов метода
Норма

Метод отрабатывает без исключения

Тревожный признак

Ошибка «тип не входит в состав плана обмена» — объект не включён в план

Типичные ошибки и их последствия

Наиболее частая ошибка — регистрация для предопределённого узла текущей базы. Платформа не всегда явно сообщает об этом, но выгрузка в «этот узел» не выполняется, и объект никуда не уходит. Вторая распространённая проблема — попытка зарегистрировать объект, тип которого не включён в состав плана обмена: метод вызывает исключение, и транзакция прерывается.

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

Типичные ошибки
01
Регистрация для «этого узла» — объект никогда не будет выгружен
02
Регистрация типа, не входящего в состав плана обмена — исключение и откат транзакции
03
Регистрация в цикле по одному объекту без массива узлов — лишняя нагрузка при массовой обработке
04
Игнорирование даты начала выгрузки и отборов узла — объект зарегистрирован, но не попадает в сообщение
05
Регистрация ссылки на несуществующий (битый) объект — ошибки при чтении сообщения обмена

Практические сценарии и ограничения

Типичный сценарий — повторная отправка объектов после сбоя синхронизации. Здесь удобно получить список ссылок запросом по журналу ошибок и зарегистрировать их для конкретного узла одним вызовом с массивом. Другой сценарий — принудительная выгрузка связанных объектов: например, при регистрации документа дополнительно регистрируют контрагента и договор, чтобы в базе-приёмнике не было битых ссылок.

Помните об ограничениях: регистрация не гарантирует доставку, а лишь ставит объект в очередь на выгрузку. Если в приёмнике объект не загрузится из-за правил или ошибок, регистрацию придётся выполнять повторно. Также избегайте регистрации внутри транзакций записи самих объектов в высоконагруженных системах — это увеличивает время блокировок; по возможности выносите массовую регистрацию в регламентные задания.

Итог

Что важно запомнить

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

Частые вопросы

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

Передайте вторым параметром значение Неопределено — будут зарегистрированы все данные, входящие в состав плана обмена. Учтите, что в большой базе это длительная операция, поэтому выполняйте её на копии или вне рабочего времени.

Почему метод ЗарегистрироватьИзменения выдаёт ошибку?

Чаще всего причина в том, что тип передаваемого объекта не включён в состав плана обмена. Проверьте свойство «Состав» плана обмена в конфигураторе и добавьте нужный тип метаданных, после чего обновите конфигурацию базы данных.

Можно ли зарегистрировать набор записей регистра?

Да. В качестве данных можно передать набор записей регистра с установленным отбором по регистратору или измерениям — регистрация будет выполнена для этого набора. Убедитесь, что регистр включён в состав плана обмена.

Как снять регистрацию, если объект не должен выгружаться?

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

Объект зарегистрирован, но не попадает в файл обмена. В чём причина?

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

Чем программная регистрация отличается от автоматической?

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