При работе с инструментом «Конвертация данных 2.1» программисты часто сталкиваются с ситуациями, когда стандартный механизм обмена ведет себя непредсказуемо при использовании произвольных алгоритмов выгрузки. Одной из наиболее неприятных ошибок является сбой при получении подтверждения (квитировании) сообщений, который сопровождается текстом: Значение не является значением объектного типа (Менеджер) в модуле обработки КонвертацияОбъектовИнформационныхБаз. Рассмотрим подробнее, почему это происходит и как правильно настроить правила обмена, чтобы избежать подобных проблем.
Давайте проанализируем стек ошибки. Сбой происходит в функции ПрочитатьИнформациюОРегистрацииОбъекта(). В этот момент база-источник обрабатывает входящее сообщение от базы-приемника, в котором содержится информация о том, какие объекты были успешно загружены. Для того чтобы зафиксировать связь между объектом в источнике и объектом в приемнике, система обращается к регистру сведений СоответствияОбъектовИнформационныхБаз.
Проблема заключается в том, что при попытке получить ссылку на объект по его уникальному идентификатору, система использует менеджер метаданных (например, Документы.ОперацияУПР). Если в правилах или в процессе выгрузки была нарушена передача строкового представления типа объекта, переменная СтруктураСвойств.Менеджер принимает значение Неопределено. Попытка вызвать метод ПолучитьСсылку() у Неопределено и вызывает искомое исключение.
Выясним причину, по которой тип источника или приемника может оказаться пустым. Чаще всего это происходит при использовании метода ВыгрузитьПоПравилу внутри обработчика ПВД (Правила выгрузки данных). Рассмотрим типичный сценарий, который привел к ошибке в нашем примере:
ВходящиеДанные в виде структуры, собирая туда данные из различных таблиц или свойств.ВыгрузитьПоПравилу(Объект.Ссылка,, ВходящиеДанные,, "ИмяПКО").Отказ = Истина в ПВД, чтобы предотвратить стандартную выгрузку объекта.В этом случае, если в самом ПКО (Правило конвертации объектов) неверно указан «Объект источника» или «Объект приемника», либо ПКО является «виртуальным» (работает только на основании входящих данных), механизм регистрации соответствий не может однозначно определить метаданные. В файл обмена (XML) записывается узел ссылки, но в нем отсутствуют атрибуты ТипИсточника или ТипПриемника. При загрузке подтверждения база не понимает, к какому справочнику или документу относится данный GUID.
Посмотрим на пример кода, который часто используется в ПВД «Перед выгрузкой» для трансформации одного документа в другой (например, ВводВЭксплуатациюОС в ОперацияУПР):
ВходящиеДанные = Новый Структура;
ВходящиеДанные.Вставить("Комментарий", Объект.Комментарий);
ВходящиеДанные.Вставить("Организация", Объект.Организация);
ВходящиеДанные.Вставить("Дата", Объект.Дата);
// Получаем движения по регистрам для заполнения документа ОперацияУПР
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Хозрасчетный.СчетДт,
| Хозрасчетный.СчетКт,
| Хозрасчетный.Сумма
|ИЗ
| РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
|ГДЕ
| Хозрасчетный.Регистратор = &Регистратор";
Запрос.УстановитьПараметр("Регистратор", Объект.Ссылка);
ТЗ = Запрос.Выполнить().Выгрузить();
ВходящиеДанные.Вставить("Хозрасчетный", ТЗ);
ВходящиеДанные.Вставить("СуммаОперации", ТЗ.Итог("Сумма"));
// Выгружаем объект по конкретному правилу
ВыгрузитьПоПравилу(Объект.Ссылка, , ВходящиеДанные, , "ОперацияУПР");
// Отменяем стандартную выгрузку исходного документа
Отказ = Истина;
В приведенном коде критически важно, чтобы ПКО ОперацияУПР знало, что его источником является ДокументСсылка.ВводВЭксплуатациюОС. Если в поле «Объект источника» в ПКО стоит пустота, то при формировании регистра соответствий возникнет программный вакуум.
Проанализируем ситуацию и выполним следующие действия для устранения ошибки:
ОперацияУПР в конфигурации «Конвертация данных». Убедимся, что поле «Объект источника» заполнено и соответствует типу объекта, который мы передаем первым параметром в ВыгрузитьПоПравилу (в нашем случае это ВводВЭксплуатациюОС).GUID в приемнике будет таким же, как в источнике, что может быть удобно, но требует четкого соответствия типов в метаданных.ИсходящиеДанные вместо ВходящиеДанные, если вы хотите передать структуру свойств непосредственно в ПКО, где они будут приняты как ВходящиеДанные. Разберем этот нюанс: данные, переданные в ВыгрузитьПоПравилу как третий параметр, становятся ВходящимиДанными в обработчиках ПКО.Соответствия объектов информационных баз. Если мы видим записи, где поле Тип приемника пустое — это и есть причина сбоя. Такие записи нужно удалить, а правила — исправить, заполнив типы метаданных в ПКО.Если ваша задача — выгрузить данные вообще без привязки к конкретному объекту-ссылке (например, создание записи справочника из строки), то в ПКО поле «Источник» действительно остается пустым. В этом случае, чтобы не возникало ошибки при подтверждении:
Менеджер для подтверждения получения, так как записи в регистр соответствий просто не будут создаваться.Ошибка Значение не является значением объектного типа (Менеджер) — это сигнал о том, что механизм обмена данными потерял информацию о типах объектов. Пересоздание узла обмена, о котором упоминалось в обсуждении, помогает лишь временно, так как оно очищает старые (битые) записи о регистрации, но при первой же выгрузке по некорректным правилам проблема вернется. Следуйте правилу: всегда явно указывайте типы объектов в ПКО, если используете синхронизацию по идентификаторам и планируете использовать подтверждение получения сообщений.