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

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

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

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

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

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

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

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

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

Состав плана обмена определяет, какие типы метаданных вообще могут регистрироваться. Если справочник не включён в состав плана обмена, попытка зарегистрировать его объект вызовет ошибку или будет проигнорирована — это первое, что стоит проверить при отладке.

Метод ЗарегистрироватьИзменения: базовый синтаксис

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

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

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

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

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

Массовая регистрация по запросу и отбору

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

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

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

"ВЫБРАТЬ

| Реализация.Ссылка

|ИЗ

| Документ.РеализацияТоваровУслуг КАК Реализация

|ГДЕ

| Реализация.Дата МЕЖДУ &Начало И &Конец

| И Реализация.Проведен";

Запрос.УстановитьПараметр("Начало", НачалоМесяца(ТекущаяДата()));

Запрос.УстановитьПараметр("Конец", КонецМесяца(ТекущаяДата()));

ПланыОбмена.ЗарегистрироватьИзменения(Узел, Запрос.Выполнить());

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

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

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

Регистрация всего состава плана обмена

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

ПланыОбмена.ЗарегистрироватьИзменения(Узел, Неопределено);

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

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

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

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

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

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

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

"ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК Количество

|ИЗ Справочник.Номенклатура.Изменения КАК Изменения

|ГДЕ Изменения.Узел = &Узел";

Запрос.УстановитьПараметр("Узел", Узел);

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

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

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

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

Записи в таблице изменений
Норма

Запрос к таблице Изменения по узлу возвращает ожидаемое количество

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

Ноль записей при корректных исходных данных

Состав плана обмена
Норма

Тип объекта присутствует в составе плана

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

Типа нет в составе — регистрация невозможна

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

После обмена записи регистрации очищаются, данные появляются в приёмнике

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

Записи остаются, данные не уходят — проблема в правилах или транспорте

Регистрация через обработчики и типовые механизмы

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

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

Для планов обмена с авторегистрацией, отключённой у отдельных объектов (свойство «Авторегистрация» в составе плана), программная регистрация — единственный способ отправки данных. Такой подход используют, когда нужен полный контроль над составом выгрузки.

Маршрут решения

Как выбрать подход

Нужно отправить один конкретный объектВызовите ЗарегистрироватьИзменения с ссылкой на объект
Нужна выгрузка пакета данных по условиюСформируйте запрос и передайте его результат в ЗарегистрироватьИзменения
Нужна первоначальная полная синхронизация узлаПередайте Неопределено вторым параметром для регистрации всего состава
Регистрация должна зависеть от бизнес-логики при записиИспользуйте правила регистрации и их обработчики вместо прямых вызовов

Типичные ошибки и ограничения

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

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

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

Типичные ошибки
01
Регистрация объекта, не входящего в состав плана обмена — изменение не зафиксируется, диагностика затруднена
02
Использование узла текущей базы вместо узла-приёмника — данные никуда не уходят
03
Вызов метода в цикле по одной ссылке вместо передачи результата запроса — лишняя нагрузка на больших объёмах
04
Регистрация без последующей проверки таблицы изменений — ошибка обнаруживается только после неудачного обмена
05
Ожидание, что регистрация равна выгрузке — без выполнения обмена данные в приёмник не попадут

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

Отмена регистрации и очистка изменений

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

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

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

Ещё один способ косвенной очистки — изменение номера принятого сообщения в узле (типовая команда «Изменить номера сообщений»), но это влияет на логику квитирования обмена, и применять его следует осознанно.

Итог

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

Программная регистрация выполняется методом ПланыОбмена.ЗарегистрироватьИзменения с узлом и данными; для массовых операций передавайте результат запроса, для полной выгрузки — Неопределено. Всегда проверяйте состав плана обмена, корректность узла и фактическое наличие записей в таблице изменений, а массовые операции сначала тестируйте на копии базы.

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

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

Да. Передайте первым параметром массив узлов, сформированный выборкой из плана обмена с отбором: исключите предопределённый узел текущей базы (проверка через ЭтотУзел) и помеченные на удаление элементы. Единого параметра «все узлы» в методе нет.

Почему после регистрации объект не попал в файл обмена?

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

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

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

Чем отличается ЗарегистрироватьИзменения от ВыбратьИзменения?

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

Безопасно ли вызывать регистрацию в транзакции записи объекта?

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

Как массово снять регистрацию по ошибочно зарегистрированным данным?

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