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