Разработка и Конфигурация · 10 мин
Как программно зарегистрировать объект в плане обмена 1С
Как зарегистрировать объект в плане обмена 1С программно: методы ЗарегистрироватьИзменения, работа с узлами, проверка регистрации, типичные ошибки и примеры кода.
Регистрация объектов в плане обмена — ключевой механизм обмена данными в 1С: пока объект не зарегистрирован, он не попадёт в выгрузку при синхронизации. В типовых конфигурациях регистрация выполняется автоматически подписками на события, но на практике часто требуется зарегистрировать объект вручную из кода: для первоначальной выгрузки, повторной отправки после ошибок или интеграции с нестандартными механизмами.
Программная регистрация выполняется через менеджер планов обмена методом ПланыОбмена.ЗарегистрироватьИзменения() либо через объект узла с помощью ЗарегистрироватьИзменения в составе набора записей регистрации изменений. Ниже разобраны оба подхода, выбор узлов для регистрации, проверка результата и типичные ошибки.
Как устроена регистрация изменений в плане обмена
Для каждого плана обмена платформа автоматически создаёт таблицы регистрации изменений — по одной на каждый тип объекта, входящего в состав плана. Когда объект регистрируется, в такой таблице появляется запись «узел — ссылка на объект». При выгрузке механизм обмена читает эти таблицы и помещает зарегистрированные объекты в сообщение обмена, после успешной отправки регистрация снимается.
Важно понимать: регистрация выполняется для конкретного узла. Один и тот же документ может быть зарегистрирован для одного узла и не зарегистрирован для другого. Именно поэтому любой программный вызов требует указания узла или массива узлов, для которых объект должен быть отправлен.
Базовый способ: ПланыОбмена.ЗарегистрироватьИзменения
Основной метод регистрации вызывается через менеджер конкретного плана обмена. Он принимает два параметра: узел (или массив узлов) и данные для регистрации. В качестве данных можно передать ссылку, объект, набор записей, тип метаданных или даже Неопределено для регистрации всего состава плана.
Узел = ПланыОбмена.ОбменСФилиалами.НайтиПоКоду("ФЛ01");
Если Не Узел.Пустая() Тогда
ПланыОбмена.ОбменСФилиалами.ЗарегистрироватьИзменения(Узел, ДокументСсылка);
КонецЕсли;
Если нужно зарегистрировать объект для нескольких узлов, передайте массив ссылок на узлы первым параметром. Это эффективнее, чем вызывать метод в цикле, особенно при массовой регистрации.
МассивУзлов = Новый Массив;
МассивУзлов.Добавить(УзелФилиал1);
МассивУзлов.Добавить(УзелФилиал2);
ПланыОбмена.ОбменСФилиалами.ЗарегистрироватьИзменения(МассивУзлов, ДокументСсылка);
Регистрация всех объектов одного типа
Для первоначальной выгрузки часто требуется зарегистрировать все объекты определённого вида. В этом случае вторым параметром передаётся объект метаданных:
ПланыОбмена.ОбменСФилиалами.ЗарегистрироватьИзменения(
Узел, Метаданные.Документы.РеализацияТоваровУслуг);
Будьте осторожны: при большом объёме данных такая операция выполняется долго и создаёт значительную нагрузку. Для выборочной регистрации лучше получить ссылки запросом и регистрировать их пакетно в цикле с отбором по периоду, организации или другим условиям.
Альтернатива: регистрация через объект узла
Второй способ — работа с записями регистрации через объект узла. Метод ЗарегистрироватьИзменения доступен и у объекта ПланОбменаОбъект, что удобно, когда узел уже получен как объект для изменения его свойств:
УзелОбъект = Узел.ПолучитьОбъект();
УзелОбъект.ЗарегистрироватьИзменения(ДокументСсылка);
Дополнительно платформа предоставляет методы управления регистрацией через ПланыОбменаМенеджер: УдалитьРегистрациюИзменений для снятия регистрации и ВыбратьИзменения для выборки зарегистрированных данных. Удаление регистрации полезно, когда объект ошибочно зарегистрирован и не должен уходить в другую базу.
// Снять регистрацию конкретного объекта
ПланыОбмена.ОбменСФилиалами.УдалитьРегистрациюИзменений(Узел, ДокументСсылка);
Как выбрать узлы и проверить состав плана обмена
Перед регистрацией убедитесь, что тип объекта входит в состав плана обмена — иначе метод завершится ошибкой. Проверку можно выполнить через метаданные:
СоставПлана = Метаданные.ПланыОбмена.ОбменСФилиалами.Состав;
Если СоставПлана.Найти(Метаданные.Документы.РеализацияТоваровУслуг) <> Неопределено Тогда
// регистрация возможна
КонецЕсли;
При выборе узлов исключайте предопределённый узел текущей базы. Типовой приём — запрос с отбором:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Узлы.Ссылка КАК Узел
|ИЗ
| ПланОбмена.ОбменСФилиалами КАК Узлы
|ГДЕ
| НЕ Узлы.ЭтотУзел
| И НЕ Узлы.ПометкаУдаления";
- 1Определите целевой узел по коду или наименованию, исключив «этот узел»
- 2Проверьте, что тип объекта входит в состав плана обмена
- 3Вызовите ПланыОбмена.ИмяПлана.ЗарегистрироватьИзменения(Узел, Ссылка)
- 4Проверьте регистрацию через ВыбратьИзменения или типовую обработку регистрации изменений
- 5Выполните тестовую выгрузку и убедитесь, что объект попал в сообщение обмена
Проверка результата регистрации
После вызова метода полезно убедиться, что запись регистрации действительно появилась. Программно это делается методом ВыбратьИзменения, который возвращает выборку зарегистрированных данных по узлу:
Выборка = ПланыОбмена.ОбменСФилиалами.ВыбратьИзменения(
Узел, 1, Метаданные.Документы.РеализацияТоваровУслуг);
Пока Выборка.Следующий() Цикл
Сообщить("Зарегистрирован: " + Выборка.Получить());
КонецЦикла;
Второй параметр — номер сообщения обмена; для проверки без фактической выгрузки обычно используют текущий номер принятого сообщения плюс один либо смотрят регистрацию через типовые инструменты. В типовых конфигурациях есть обработка «Регистрация изменений для обмена данными», которая показывает зарегистрированные объекты по узлу в наглядном виде — это самый быстрый способ визуальной проверки.
Как проверить результат
Объект виден в обработке регистрации изменений для нужного узла
Записи нет — проверьте узел и состав плана обмена
Объект попадает в файл сообщения обмена
Сообщение пустое — регистрация не выполнена или уже снята
Метод отрабатывает без исключения
Ошибка «тип не входит в состав плана обмена» — объект не включён в план
Типичные ошибки и их последствия
Наиболее частая ошибка — регистрация для предопределённого узла текущей базы. Платформа не всегда явно сообщает об этом, но выгрузка в «этот узел» не выполняется, и объект никуда не уходит. Вторая распространённая проблема — попытка зарегистрировать объект, тип которого не включён в состав плана обмена: метод вызывает исключение, и транзакция прерывается.
Третья группа ошибок связана с логикой обмена: объект зарегистрирован, но не выгружается из-за правил конвертации, отборов по дате начала выгрузки или функциональных опций узла. В таких случаях регистрация есть, а в сообщении объекта нет — диагностировать нужно уже правила обмена, а не регистрацию.
Практические сценарии и ограничения
Типичный сценарий — повторная отправка объектов после сбоя синхронизации. Здесь удобно получить список ссылок запросом по журналу ошибок и зарегистрировать их для конкретного узла одним вызовом с массивом. Другой сценарий — принудительная выгрузка связанных объектов: например, при регистрации документа дополнительно регистрируют контрагента и договор, чтобы в базе-приёмнике не было битых ссылок.
Помните об ограничениях: регистрация не гарантирует доставку, а лишь ставит объект в очередь на выгрузку. Если в приёмнике объект не загрузится из-за правил или ошибок, регистрацию придётся выполнять повторно. Также избегайте регистрации внутри транзакций записи самих объектов в высоконагруженных системах — это увеличивает время блокировок; по возможности выносите массовую регистрацию в регламентные задания.
Что важно запомнить
Программная регистрация выполняется методом ПланыОбмена.ИмяПлана.ЗарегистрироватьИзменения(Узел, Данные). Узел не должен быть предопределённым, тип объекта обязан входить в состав плана обмена, а результат проверяется через ВыбратьИзменения или типовую обработку регистрации изменений.
Частые вопросы
Как зарегистрировать сразу все объекты плана обмена для узла?
Передайте вторым параметром значение Неопределено — будут зарегистрированы все данные, входящие в состав плана обмена. Учтите, что в большой базе это длительная операция, поэтому выполняйте её на копии или вне рабочего времени.
Почему метод ЗарегистрироватьИзменения выдаёт ошибку?
Чаще всего причина в том, что тип передаваемого объекта не включён в состав плана обмена. Проверьте свойство «Состав» плана обмена в конфигураторе и добавьте нужный тип метаданных, после чего обновите конфигурацию базы данных.
Можно ли зарегистрировать набор записей регистра?
Да. В качестве данных можно передать набор записей регистра с установленным отбором по регистратору или измерениям — регистрация будет выполнена для этого набора. Убедитесь, что регистр включён в состав плана обмена.
Как снять регистрацию, если объект не должен выгружаться?
Используйте метод ПланыОбмена.ИмяПлана.УдалитьРегистрациюИзменений(Узел, Данные). Он удаляет записи из таблицы регистрации для указанного узла, не затрагивая сам объект и уже отправленные сообщения.
Объект зарегистрирован, но не попадает в файл обмена. В чём причина?
Проверьте дату начала выгрузки узла, отборы в правилах конвертации и функциональные опции. Также убедитесь, что регистрация выполнена именно для того узла, из которого формируется сообщение, а не для другого участника обмена.
Чем программная регистрация отличается от автоматической?
Автоматическая регистрация срабатывает при записи объекта через подписки на события плана обмена. Программная выполняется явным вызовом метода и нужна для первоначальной выгрузки, повторной отправки и нестандартных сценариев, где штатных подписок недостаточно.