Синхронизация данных между различными конфигурациями 1С — это сложный процесс, базирующийся на «Библиотеке стандартных подсистем» (БСП). Одной из наиболее неприятных ошибок, с которой сталкиваются разработчики при добавлении новых объектов в обмен, является сообщение: «Значение не является значением объектного типа (УникальныйИдентификатор)». Рассмотрим подробно, почему возникает эта проблема и как её решить различными способами.
Проанализируем ситуацию: ошибка чаще всего возникает в момент загрузки данных в базу-приемник. Если мы заглянем в стек вызовов, то увидим, что проблема локализована в модуле набора записей регистра сведений СоответствияОбъектовИнформационныхБаз. В процедуре ПередЗаписью этого регистра система пытается выполнить следующий код:
ЭтотОбъект[0]["УникальныйИдентификаторИсточникаСтрокой"] = Строка(ЭтотОбъект[0]["УникальныйИдентификаторИсточника"].УникальныйИдентификатор);
Суть проблемы заключается в том, что поле УникальныйИдентификаторИсточника оказывается пустым (имеет значение Неопределено) или содержит значение, у которого нет метода УникальныйИдентификатор. Поскольку система ожидает объектный тип, а получает что-то иное, выполнение прерывается критической ошибкой.
Выясним основные сценарии, при которых это происходит:
ПланаОбмена в метаданных конфигурации.Рассмотрим первый и самый важный шаг. Если вы добавили новый справочник, например, Должности, необходимо убедиться, что он участвует в обмене на уровне метаданных.
Выполним следующие действия:
ПланОбмена (например, СинхронизацияДанныхЧерезУниверсальныйФормат или специализированный план обмена между УТ и БП).Разрешить (или настроим правила регистрации, если это требуется логикой обмена).Важно: После внесения изменений в состав плана обмена необходимо обновить сведения о конфигурации в самой базе. Для этого в режиме «1С:Предприятие» в настройках синхронизации выберем пункт «Обновить сведения о конфигурации». Это принудительно обновит кэш метаданных, используемый БСП.
Проанализируем настройки в программе «Конвертация данных». Ошибка часто связана с тем, как система пытается сопоставить объекты. Если в ПКО установлен флаг «Продолжить поиск по полям поиска, если по ГУИД объект не найден», система при неудачном поиске по GUID может попытаться создать новую запись в регистре СоответствияОбъектовИнформационныхБаз, имея при этом неполные данные об источнике.
Попробуем изменить логику поиска:
Наименованию или Коду).{УникальныйИдентификатор} в файле выгрузки. Для этого выгрузим данные в файл и откроем его текстовым редактором.Иногда причина кроется в рассинхронизации справочника ИдентификаторыОбъектовМетаданных. БСП активно использует его для определения типов объектов при записи в регистр соответствий.
Посмотрим, как обновить эти данные:
ОбновлениеИнформационнойБазы.epf (входит в состав БСП) или выполним команду в консоли запросов/кода:
Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеСправочника(Истина, Истина);
УникальныйИдентификаторИсточника.В некоторых случаях, особенно при работе со справочниками из расширений, которые не планируется постоянно синхронизировать по GUID, можно использовать программный способ. Рассмотрим совет из практики: использование специальных параметров в обработчиках КД.
В правилах конвертации объектов (ПКО), в обработчике ПриЗагрузке, мы можем указать системе, что не нужно записывать данные в регистр СоответствияОбъектовИнформационныхБаз. Это предотвратит вызов проблемного кода БСП.
Пример кода в обработчике ПриЗагрузке:
// Если объект не должен регистрироваться в таблице соответствий
// Это исключит попытку обращения к методу .УникальныйИдентификатор
Если Объект.ЭтоНовый() Тогда
// Устанавливаем признак, чтобы БСП не пыталась создать запись в РС
ДополнительныеСвойства.Вставить("МимоРегистраСоответствий", Истина);
КонецЕсли;
Этот параметр сообщает механизму загрузки, что сопоставление выполнено (или не требуется), и запись в служебный регистр производить не нужно. Однако будьте осторожны: если поиск по полям настроен неверно, это может привести к дублированию данных.
Если вы используете COM-соединение, проанализируем ситуацию через отладку. Когда база-приемник подключается к базе-источнику, объект УникальныйИдентификатор передается как COM-объект. Если в базе-приемнике в этот момент происходит попытка записи в регистр, метод ТипЗнч() может вернуть некорректный результат из-за разницы контекстов.
Рекомендуется временно переключиться на обмен через XML-файл. Это позволит:
comcntcfg.xml.Разберем краткий чек-лист для быстрой проверки при возникновении данной ошибки:
МимоРегистраСоответствий в обработчиках загрузки, чтобы обойти проблемный участок кода БСП.Соблюдение этих шагов позволит вам успешно завершить настройку синхронизации и избежать критических остановок процесса загрузки данных.