Как исправить ошибку записи в регистр «Соответствия объектов информационных баз» при синхронизации данных?

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

При настройке обмена данными между конфигурациями 1С, использующими Библиотеку стандартных подсистем (БСП) версии 2.1 и выше, разработчики часто сталкиваются со специфической ошибкой при загрузке данных. Проблема проявляется на этапе записи объекта в базу-приемник и сопровождается аварийным завершением транзакции. Давайте подробно разберем, почему возникает эта ошибка и как ее правильно устранить, не нарушая логику работы типовых механизмов.

Анализ проблемы и симптомы

Рассмотрим типичную ситуацию: вы настроили правила обмена в Конвертации данных 2.0, выгрузили данные из источника, но при загрузке в приемник (например, в «Бухгалтерию предприятия») система выдает ошибку. Текст ошибки в журнале регистрации или окне сообщений обычно выглядит следующим образом:


{РегистрСведений.СоответствияОбъектовИнформационныхБаз.МодульНабораЗаписей(32)}: Ошибка при вызове метода контекста (Добавить)
по причине:
Несоответствие типов (параметр номер '1')

Проанализируем контекст ошибки. Она возникает в процедуре ПередЗаписью модуля набора записей регистра сведений СоответствияОбъектовИнформационныхБаз. Проблемная строка кода выглядит так:

ОбменДанными.Получатели.Добавить(Отбор.УзелИнформационнойБазы.Значение);

Здесь Отбор.УзелИнформационнойБазы.Значение является ссылкой на узел плана обмена (например, ПланОбменаСсылка.СинхронизацияДанныхЧерезУниверсальныйФормат). Казалось бы, тип данных верный, но платформа выбрасывает исключение «Несоответствие типов».

Выясняем причину ошибки

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

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

Интересно заметить, что при использовании обработки «Универсальный обмен данными в формате XML» данные могут загружаться без ошибок. Это происходит потому, что обработка часто работает напрямую с объектами, минуя высокоуровневые механизмы регистрации изменений БСП, в то время как штатная «Синхронизация данных» работает через узлы планов обмена и строго соблюдает правила метаданных.

Пошаговое решение проблемы

Чтобы устранить ошибку, нам необходимо «легализовать» технический регистр для нашего плана обмена. Выполним следующие шаги в Конфигураторе:

  1. Откроем Конфигуратор базы-приемника.
  2. Найдем в дереве метаданных Планы обмена и выберем тот план обмена, который используется для синхронизации (тот самый, ссылка на который передается в ошибке).
  3. Перейдем на вкладку Состав.
  4. В списке объектов найдем РегистрСведений.СоответствияОбъектовИнформационныхБаз.
  5. Установим «галочку» напротив этого регистра, включив его в состав.
  6. Важный нюанс: в колонке Авторегистрация для данного регистра необходимо обязательно выбрать значение Запретить.
  7. Сохраним изменения в конфигурации БД (клавиша F7).

Почему важно ставить «Авторегистрация = Запретить»?

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

Если оставить Авторегистрация = Разрешить, то возникнет эффект «зацикливания»:

Установка режима Запретить позволяет коду БСП программно управлять регистрацией (через коллекцию Получатели) только тогда, когда это действительно необходимо, избегая бесконечных циклов обмена.

Дополнительные рекомендации

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

Также проанализируем ситуацию с программным кодом. Если вы пишете собственный механизм обмена, всегда проверяйте, установлен ли флаг ОбменДанными.Загрузка = Истина при записи объектов. Это отключает большинство стандартных проверок в модулях объектов и наборов записей, что ускоряет загрузку и предотвращает выполнение лишних обработчиков. Однако в случае с планами обмена БСП, даже при включенном флаге Загрузка, запись в регистр соответствий может инициироваться платформой или внутренними механизмами библиотеки, поэтому корректная настройка состава плана обмена в Конфигураторе является обязательным условием стабильной работы.

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

← На главную