При настройке интеграции и обмена данными между различными конфигурациями 1С программисты часто сталкиваются с необходимостью ручной или программной привязки объектов. Для этого используется специализированный регистр сведений СоответствияОбъектовИнформационныхБаз. Однако при попытке записать в него новые данные может возникнуть критическая ошибка:
«Несоответствие типов (параметр номер '1') {РегистрСведений.СоответствияОбъектовИнформационныхБаз.МодульНабораЗаписей(40)}: ОбменДанными.Получатели.Добавить(Отбор.УзелИнформационнойБазы.Значение)»
В этой статье мы подробно разберем, почему возникает данная ошибка, как ее обойти программными средствами, а также выясним, как правильно настроить сопоставление объектов (например, при передаче подразделений или контрагентов) при использовании современных механизмов синхронизации данных.
Проанализируем ситуацию, которая происходит на уровне платформы «1С:Предприятие» в момент вызова метода Записать() для набора записей регистра СоответствияОбъектовИнформационныхБаз. В модуле набора записей этого регистра существует предопределенный обработчик, который автоматически регистрирует изменения для узлов обмена. Код обработчика пытается выполнить следующую операцию:
ОбменДанными.Получатели.Добавить(Отбор.УзелИнформационнойБазы.Значение);
Эта строка пытается добавить узел информационной базы в коллекцию получателей обмена. Ошибка несоответствия типов возникает в том случае, если данный регистр сведений не включен в состав плана обмена, узел которого передается в отборе. Платформа проверяет метаданные плана обмена и, не обнаружив там этот регистр, блокирует добавление узла в получатели, генерируя системное исключение.
Также проблема часто проявляется после глобальных обновлений конфигурации (например, «1С:Бухгалтерия предприятия 3.0» на новые релизы платформы и БСП), когда фоновые процедуры обновления очищают или повреждают колонку УникальныйИдентификаторИсточникаСтрокой в данном регистре.
---
Если вы разрабатываете собственную систему обмена или дорабатываете существующую конфигурацию, которая находится на поддержке с возможностью изменения, самым правильным архитектурным решением будет добавление регистра в состав плана обмена. Рассмотрим этот процесс по шагам:
СинхронизацияДанныхЧерезУниверсальныйФормат или ваш собственный обмен).СоответствияОбъектовИнформационныхБаз.---
Что делать, если конфигурация находится на строгой поддержке, закрыта для редактирования, а вам необходимо программно записать сопоставление объектов? В этом случае мы можем применить обходной путь через отключение регистрации изменений при записи набора.
Для этого перед вызовом метода Записать() необходимо установить свойство ОбменДанными.Загрузка в значение Истина. Это заставит платформу проигнорировать стандартные обработчики и выполнить прямую запись в базу данных без обращения к механизмам авторегистрации плана обмена.
Рассмотрим пример кода:
НаборЗаписей = РегистрыСведений.СоответствияОбъектовИнформационныхБаз.СоздатьНаборЗаписей();
// Устанавливаем обязательные отборы
НаборЗаписей.Отбор.УзелИнформационнойБазы.Установить(СсылкаНаУзелОбмена);
НаборЗаписей.Отбор.СобственнаяСсылка.Установить(СсылкаНаОбъектИсточника);
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.УзелИнформационнойБазы = СсылкаНаУзелОбмена;
НоваяЗапись.СобственнаяСсылка = СсылкаНаОбъектИсточника;
НоваяЗапись.УникальныйИдентификаторИсточникаСтрокой = Строка(СсылкаНаОбъектИсточника.УникальныйИдентификатор());
НоваяЗапись.УникальныйИдентификаторПриемникаСтрокой = Строка(НужныйGUIDПриемника);
// Критически важная строка для обхода ошибки "Несоответствие типов"
НаборЗаписей.ОбменДанными.Загрузка = True;
Попытка
НаборЗаписей.Записать();
Исключение
ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
ВызватьИсключение;
КонецПопытки;
Благодаря установке флага ОбменДанными.Загрузка = True, платформа пропускает выполнение кода в модуле набора записей, предотвращая возникновение ошибки несоответствия типов параметров.
---
Если ошибка начала возникать внезапно после обновления релиза конфигурации, это сигнализирует о повреждении данных в регистре (например, очистке строковых представлений уникальных идентификаторов). Такое часто происходит из-за наличия «битых» ссылок (объектов вида <Объект не найден>) в информационной базе.
Разберем по шагам, как исправить эту ситуацию без отката на резервную копию:
ОбменДанными.Загрузка = Ложь. При обычной перезаписи платформенные обработчики ПередЗаписью автоматически заполнят поле УникальныйИдентификаторИсточникаСтрокой актуальными строковыми значениями GUID на основе существующих ссылок.---
Рассмотрим еще одну частую бизнес-задачу: как настроить сопоставление объектов (например, сопоставить «Подразделение А» в базе-источнике с «Подразделением А1» в базе-приемнике) при обмене через универсальный формат синхронизации (EnterpriseData).
Для правильной работы механизма сопоставления необходимо учитывать две важные особенности современных конфигураций 1С.
Если система упорно игнорирует созданные вами записи сопоставления и продолжает создавать дубли или перезаписывать объекты некорректно, проверьте настройки правил конвертации объектов.
Если в правилах указано:
ПравилоКонвертации.ВариантИдентификации = "ПоПолямПоиска";
то система при импорте данных вообще не будет обращаться к регистрам сопоставления по уникальным идентификаторам. Она будет искать объект исключительно по полям поиска (например, по наименованию или связке ИНН/КПП). Чтобы сопоставление по GUID заработало, необходимо настроить вариант идентификации по ссылкам или комбинированный поиск.
В современных редакциях конфигураций на базе БСП при использовании синхронизации через универсальный формат регистр СоответствияОбъектовИнформационныхБаз считается устаревшим. Вместо него используется регистр сведений ПубличныеИдентификаторыСинхронизируемыхОбъектов.
Разберем разницу между ними:
Если вы хотите настроить сопоставление программно в современной базе, выполняйте запись именно в регистр ПубличныеИдентификаторыСинхронизируемыхОбъектов, указывая узел обмена, объект базы и его публичный идентификатор, пришедший из сторонней системы.
Вместо написания сложных обработок по ручному заполнению регистров, проанализируем стандартный интерактивный механизм, заложенный в БСП:
При интерактивном сопоставлении платформа 1С самостоятельно создаст все необходимые записи в регистрах соответствий, что полностью исключает риск возникновения ошибок «Несоответствие типов» и гарантирует корректность последующих сеансов обмена данными.