При работе с механизмом «Конвертация данных 2.1» программисты часто сталкиваются с ситуацией, когда стандартная обработка УниверсальныйОбменДаннымиВФорматеXML внезапно прерывает работу с ошибкой «Значение не является значением объектного типа (ИмяТипа)». Эта проблема особенно характерна для обменов между сильно измененными конфигурациями или при наличии «битых» ссылок в базе-источнике. Разберем подробно, почему это происходит и как реанимировать процесс выгрузки.
Для начала проанализируем ситуацию на уровне программного кода самой обработки обмена. Ошибка обычно локализуется в процедурах, отвечающих за формирование XML-узла объекта или свойства. Проблема возникает в следующей строке:
СтруктураСвойств = Менеджеры[ТипОбъекта];
ИмяТипаОбъекта = СтруктураСвойств.ИмяТипа;
Выясним причину сбоя: переменная ТипОбъекта в этот момент содержит строку, которая не является именем ссылочного типа (например, просто «Строка», «Число» или вообще пустое значение). В результате обращение к коллекции Менеджеры возвращает значение Неопределено. Попытка получить свойство ИмяТипа у Неопределено закономерно приводит к падению системы.
Это происходит потому, что правила конвертации свойств (ПКС) ожидают на входе объект или ссылку, а получают примитивный тип данных. Чаще всего это случается с реквизитами составного типа или когда в справочнике (например, Номенклатура) реквизит, который должен быть ссылкой (например, ЕдиницаИзмерения), содержит строковое значение из-за программных ошибок или некорректного удаления объектов.
Прежде чем вносить изменения в правила, нам нужно понять, на каком именно объекте «спотыкается» обмен. Рассмотрим несколько способов детекции:
СтруктураСвойств = Неопределено. Проверив значение переменной ТипОбъекта или Источник, можно вычислить виновника.ПередВыгрузкой добавим код:
Сообщить("Выгрузка объекта: " + Источник.Ссылка + " (" + Источник.Метаданные().Имя + ")");
Если мы выяснили, что проблема в конкретном реквизите (например, ЕдиницаИзмерения у номенклатуры), который иногда вместо ссылки содержит строку, мы можем программно обработать эту ситуацию в «Конвертации данных».
Рассмотрим вариант, когда вместо отсутствующей ссылки мы хотим подставить пустое значение или попытаться найти/создать объект программно. В правиле конвертации свойства (ПКС) в обработчике ПередВыгрузкой пропишем проверку типа:
// Проверяем, является ли значение ссылкой.
// Если пришла строка вместо справочника, предотвращаем ошибку.
Если ТипЗнч(Значение) = Тип("Строка") Тогда
// Вариант 1: Просто обнуляем значение, чтобы не вызывать ошибку типа
Значение = Неопределено;
// Вариант 2: Если это критично, можно попробовать найти ссылку по наименованию
// Значение = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию(Значение);
КонецЕсли;
Также проанализируем ситуацию с «битыми» ссылками (Объект не найден). Если в базе есть ссылка на удаленный объект, 1С может интерпретировать ее странным образом при выгрузке. Чтобы обезопасить обмен, можно использовать следующий код в ПКС:
Если Значение.ПолучитьОбъект() = Неопределено Тогда
// Ссылка битая, объект в базе отсутствует
Значение = Неопределено;
Отказ = Истина; // Или пропускаем выгрузку этого свойства
КонецЕсли;
Иногда корень зла кроется в том, что структура метаданных в «Конвертации данных» устарела. Выполним следующие шаги для синхронизации:
MD83Exp.epf.ЛюбаяСсылка и СправочникСсылка.Номенклатура), убедимся, что указано конкретное ПКО для сопоставления.Как показывает практика, иногда ошибка ИмяТипа — это лишь верхушка айсберга проблем с базой данных. Если тестирование и исправление (ТиИ) выдает ошибки SQL, рассмотрим план действий:
Во-первых, выполним реиндексацию таблиц и очистку кэша сервера 1С. Во-вторых, если ТиИ «вылетает» на конкретной таблице, стоит воспользоваться средствами SQL Server Management Studio для проверки целостности (команда DBCC CHECKDB). После исправления физических ошибок на уровне СУБД, ошибки при конвертации типов в XML часто исчезают сами собой, так как объекты начинают корректно считываться платформой 1С:Предприятие.
Подводя итог, отметим: ошибка «Значение не является значением объектного типа» при обмене — это всегда сигнал о том, что программный код обработки ожидает увидеть описание метаданных объекта, а получает пустоту или примитивный тип. Внимательный анализ данных в ПКС и проверка ссылочной целостности базы — залог успешного обмена без «вылетов».