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

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

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

Анализируем исходную ситуацию

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

Проанализируем классический запрос для проверки изменений по справочнику:


ВЫБРАТЬ
    КонтрагентыИзменения.Ссылка КАК Ссылка,
    КонтрагентыИзменения.НомерСообщения КАК НомерСообщения,
    КонтрагентыИзменения.Узел КАК Узел
ИЗ
    Справочник.Контрагенты.Изменения КАК КонтрагентыИзменения
ГДЕ
    КонтрагентыИзменения.Узел = &Узел

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

Главная причина: Особенность «ЭтогоУзла»

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

Ключевое правило платформы: изменения никогда не регистрируются для того узла, который является текущим (свойство ЭтотУзел). Логика 1С проста: в текущей базе данные и так актуальны, поэтому нет смысла записывать информацию об их изменении «самому себе». Регистрация изменений предназначена исключительно для других узлов — тех информационных систем, в которые эти данные должны быть переданы позже.

Разберем, как это работает на практике:

  1. При создании плана обмена платформа автоматически создает один предопределенный элемент. Это и есть ЭтотУзел.
  2. Если вы заходите в справочник и меняете наименование контрагента, система проверяет список узлов-получателей для этого плана обмена.
  3. Если в списке узлов есть только «ЭтотУзел», регистрация произведена не будет.
  4. Чтобы регистрация началась, необходимо создать в режиме «1С:Предприятие» второй узел (узел-корреспондент). Именно для него будут фиксироваться все изменения объектов, входящих в состав плана.

Ошибки визуального восприятия в интерфейсе «Такси»

Иногда путаница возникает из-за особенностей интерфейса «Такси». При открытии списка узлов плана обмена первая строка может выглядеть пустой. Программист может принять её за «заготовку» для новой записи и попытаться работать с ней. Однако зачастую это и есть тот самый предопределенный ЭтотУзел, у которого просто не заполнены код и наименование.

Рассмотрим рекомендации по настройке узлов:

Программный контроль регистрации

Если создание второго узла не помогло, проанализируем программный код. Существуют способы отменить авторегистрацию в коде объекта, даже если в метаданных стоит «Разрешить». Проверьте модули объектов (справочников, документов) на наличие работы со свойством ОбменДанными.Получатели.

В обработчике ПередЗаписью регистрацию можно очистить следующим образом:


Процедура ПередЗаписью(Отказ)
    // Если этот код присутствует в конфигурации, авторегистрация может быть подавлена
    ЭтотОбъект.ОбменДанными.Получатели.Очистить();
КонецПроцедуры

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

Дополнительные факторы и нюансы платформы

Рассмотрим менее очевидные причины, по которым регистрация может не работать:

  1. Транзакционность: Регистрация изменений происходит в той же транзакции, что и запись самого объекта. Если после записи объекта в коде возникла ошибка и транзакция была отменена, запись в таблице Изменения также будет удалена.
  2. Кэширование метаданных: На платформе 8.3 (особенно версии 8.3.18) иногда встречается проблема, когда после изменения состава плана обмена сервер 1С не сразу «подхватывает» новые правила. В этом случае может помочь перезапуск службы сервера или очистка серверного кэша.
  3. Режим совместимости: Поведение механизмов обмена может зависеть от версии режима совместимости конфигурации. В старых режимах некоторые оптимизации регистрации могут работать иначе.

Как проверить регистрацию без запросов к таблице «Изменения»

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

Проанализируем пример кода для проверки:


УзелСсылка = ПланыОбмена.МойПланОбмена.НайтиПоКоду("002");
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелСсылка, 1); // 1 - номер сообщения

Пока ВыборкаИзменений.Следующий() Цикл
    Данные = ВыборкаИзменений.Получить();
    Сообщить("Зарегистрировано изменение объекта: " + Данные);
КонецЦикла;

Если данный код возвращает данные, значит, механизм регистрации работает исправно, а проблема была в некорректном запросе или неверно указанном узле в параметрах запроса.

Итоги и чек-лист для проверки

Подведем итог. Если вы столкнулись с тем, что изменения не регистрируются, пройдите по следующим шагам:

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

← На главную