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

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

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

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

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

Выясняем причину ошибки «Несоответствие типов» при записи

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

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

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

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

---

Решение 1. Включение регистра в состав плана обмена

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

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

---

Решение 2. Программный обход ошибки без изменения метаданных

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

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

Рассмотрим пример кода:


НаборЗаписей = РегистрыСведений.СоответствияОбъектовИнформационныхБаз.СоздатьНаборЗаписей();

// Устанавливаем обязательные отборы
НаборЗаписей.Отбор.УзелИнформационнойБазы.Установить(СсылкаНаУзелОбмена);
НаборЗаписей.Отбор.СобственнаяСсылка.Установить(СсылкаНаОбъектИсточника);

НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.УзелИнформационнойБазы = СсылкаНаУзелОбмена;
НоваяЗапись.СобственнаяСсылка = СсылкаНаОбъектИсточника;
НоваяЗапись.УникальныйИдентификаторИсточникаСтрокой = Строка(СсылкаНаОбъектИсточника.УникальныйИдентификатор());
НоваяЗапись.УникальныйИдентификаторПриемникаСтрокой = Строка(НужныйGUIDПриемника);

// Критически важная строка для обхода ошибки "Несоответствие типов"
НаборЗаписей.ОбменДанными.Загрузка = True; 

Попытка
    НаборЗаписей.Записать();
Исключение
    ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
    ВызватьИсключение;
КонецПопытки;

Благодаря установке флага ОбменДанными.Загрузка = True, платформа пропускает выполнение кода в модуле набора записей, предотвращая возникновение ошибки несоответствия типов параметров.

---

Решение 3. Восстановление регистра после обновления конфигурации

Если ошибка начала возникать внезапно после обновления релиза конфигурации, это сигнализирует о повреждении данных в регистре (например, очистке строковых представлений уникальных идентификаторов). Такое часто происходит из-за наличия «битых» ссылок (объектов вида <Объект не найден>) в информационной базе.

Разберем по шагам, как исправить эту ситуацию без отката на резервную копию:

  1. Выполните операцию «Тестирование и исправление» (ТиИС) через Конфигуратор. Обязательно выберите пункт «Очищать ссылки» или «Создавать объекты» при наличии битых ссылок. Это удалит некорректные записи, на которых прерываются стандартные обработчики обновления БСП.
  2. Перезапишите записи регистра программно. Достаточно написать небольшую внешнюю обработку, которая считает записи регистра и перезапишет их в режиме ОбменДанными.Загрузка = Ложь. При обычной перезаписи платформенные обработчики ПередЗаписью автоматически заполнят поле УникальныйИдентификаторИсточникаСтрокой актуальными строковыми значениями GUID на основе существующих ссылок.

---

Настройка сопоставления объектов в Универсальном формате обмена

Рассмотрим еще одну частую бизнес-задачу: как настроить сопоставление объектов (например, сопоставить «Подразделение А» в базе-источнике с «Подразделением А1» в базе-приемнике) при обмене через универсальный формат синхронизации (EnterpriseData).

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

Переключение варианта идентификации

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

Если в правилах указано:

ПравилоКонвертации.ВариантИдентификации = "ПоПолямПоиска";

то система при импорте данных вообще не будет обращаться к регистрам сопоставления по уникальным идентификаторам. Она будет искать объект исключительно по полям поиска (например, по наименованию или связке ИНН/КПП). Чтобы сопоставление по GUID заработало, необходимо настроить вариант идентификации по ссылкам или комбинированный поиск.

Переход на регистр «Публичные идентификаторы синхронизируемых объектов»

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

Разберем разницу между ними:

Если вы хотите настроить сопоставление программно в современной базе, выполняйте запись именно в регистр ПубличныеИдентификаторыСинхронизируемыхОбъектов, указывая узел обмена, объект базы и его публичный идентификатор, пришедший из сторонней системы.

Интерактивное сопоставление (рекомендуемый способ)

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

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

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

← На главную