Как исправить ошибку «Значение не является значением объектного типа (Менеджер)» при подтверждении обмена данными

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

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

Анализ технической причины ошибки

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

Проблема заключается в том, что при попытке получить ссылку на объект по его уникальному идентификатору, система использует менеджер метаданных (например, Документы.ОперацияУПР). Если в правилах или в процессе выгрузки была нарушена передача строкового представления типа объекта, переменная СтруктураСвойств.Менеджер принимает значение Неопределено. Попытка вызвать метод ПолучитьСсылку() у Неопределено и вызывает искомое исключение.

Почему система «теряет» менеджер объекта

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

  1. Мы создаем ВходящиеДанные в виде структуры, собирая туда данные из различных таблиц или свойств.
  2. Вызываем ВыгрузитьПоПравилу(Объект.Ссылка,, ВходящиеДанные,, "ИмяПКО").
  3. Устанавливаем Отказ = Истина в ПВД, чтобы предотвратить стандартную выгрузку объекта.

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

Разбор реализации выгрузки в ПВД

Посмотрим на пример кода, который часто используется в ПВД «Перед выгрузкой» для трансформации одного документа в другой (например, ВводВЭксплуатациюОС в ОперацияУПР):


ВходящиеДанные = Новый Структура;
ВходящиеДанные.Вставить("Комментарий", Объект.Комментарий);
ВходящиеДанные.Вставить("Организация", Объект.Организация);
ВходящиеДанные.Вставить("Дата", Объект.Дата);

// Получаем движения по регистрам для заполнения документа ОперацияУПР
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Хозрасчетный.СчетДт,
    |   Хозрасчетный.СчетКт,
    |   Хозрасчетный.Сумма
    |ИЗ
    |   РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
    |ГДЕ
    |   Хозрасчетный.Регистратор = &Регистратор";

Запрос.УстановитьПараметр("Регистратор", Объект.Ссылка);
ТЗ = Запрос.Выполнить().Выгрузить();

ВходящиеДанные.Вставить("Хозрасчетный", ТЗ);
ВходящиеДанные.Вставить("СуммаОперации", ТЗ.Итог("Сумма"));

// Выгружаем объект по конкретному правилу
ВыгрузитьПоПравилу(Объект.Ссылка, , ВходящиеДанные, , "ОперацияУПР");

// Отменяем стандартную выгрузку исходного документа
Отказ = Истина;

В приведенном коде критически важно, чтобы ПКО ОперацияУПР знало, что его источником является ДокументСсылка.ВводВЭксплуатациюОС. Если в поле «Объект источника» в ПКО стоит пустота, то при формировании регистра соответствий возникнет программный вакуум.

Шаги по исправлению проблемы

Проанализируем ситуацию и выполним следующие действия для устранения ошибки:

  1. Проверка настроек ПКО: Откроем ПКО ОперацияУПР в конфигурации «Конвертация данных». Убедимся, что поле «Объект источника» заполнено и соответствует типу объекта, который мы передаем первым параметром в ВыгрузитьПоПравилу (в нашем случае это ВводВЭксплуатациюОС).
  2. Синхронизация по идентификаторам: Проверим флаги поиска. Если мы хотим, чтобы документы корректно сопоставлялись при повторных обменах, должна стоять галочка «Поиск по внутреннему идентификатору». Однако помните, что при трансформации одного типа в другой (Документ А -> Документ Б), GUID в приемнике будет таким же, как в источнике, что может быть удобно, но требует четкого соответствия типов в метаданных.
  3. Использование Исходящих данных: В некоторых случаях в ПВД эффективнее использовать ИсходящиеДанные вместо ВходящиеДанные, если вы хотите передать структуру свойств непосредственно в ПКО, где они будут приняты как ВходящиеДанные. Разберем этот нюанс: данные, переданные в ВыгрузитьПоПравилу как третий параметр, становятся ВходящимиДанными в обработчиках ПКО.
  4. Регистр соответствий: Если ошибка сохраняется, заглянем в базу-источник в регистр сведений Соответствия объектов информационных баз. Если мы видим записи, где поле Тип приемника пустое — это и есть причина сбоя. Такие записи нужно удалить, а правила — исправить, заполнив типы метаданных в ПКО.

Вариант с «пустым» источником

Если ваша задача — выгрузить данные вообще без привязки к конкретному объекту-ссылке (например, создание записи справочника из строки), то в ПКО поле «Источник» действительно остается пустым. В этом случае, чтобы не возникало ошибки при подтверждении:

Заключение

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

← На главную