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

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

При настройке обменов с помощью конфигурации «Конвертация данных 2.1» (КД 2.1) часто возникает задача передачи данных из одного документа-источника в документ-приемник с совершенно другой структурой. Проанализируем типичную ситуацию: нам необходимо выгрузить данные из документа «Поступление товаров и услуг» в некий управленческий документ «ОперацияУПР».

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


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

Кажется, что механизм работает: документ передается, объекты снимаются с регистрации после успешного обмена. Однако, при обратном обмене (от базы-приемника к базе-источнику) в журнале регистрации источника возникает критическая ошибка:


Значение не является значением объектного типа (Менеджер)
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(8978)}:    УникальныйИдентификаторИсточника = СтруктураСвойств.Менеджер.ПолучитьСсылку(УникальныйИдентификаторИсточника);

Разберем по шагам, почему возникает эта проблема и как ее правильно решить, используя механизмы КД 2.1 и Библиотеки стандартных подсистем (БСП).

Выясним причину появления пустого типа и ошибки при обмене

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

В частности, в функцию формирования файла обмена не передаются метаданные приемника или источника, из-за чего атрибут ТипПриемника или ТипИсточника остается пустым. Посмотрим на код функции чтения информации в базе-источнике:


Функция ПрочитатьИнформациюОРегистрацииОбъекта()
    // Присваиваем ПЕРЕКРЕСТНЫЕ значения переменным; РС симметричен.
    УникальныйИдентификаторПриемника = одАтрибут(ФайлОбмена, ТипСтрока, "УникальныйИдентификаторИсточника");
    УникальныйИдентификаторИсточника = одАтрибут(ФайлОбмена, ТипСтрока, "УникальныйИдентификаторПриемника");
    ТипПриемника                     = одАтрибут(ФайлОбмена, ТипСтрока, "ТипИсточника");
    ТипИсточника                     = одАтрибут(ФайлОбмена, ТипСтрока, "ТипПриемника");
    ПустойНабор                      = одАтрибут(ФайлОбмена, ТипБулево, "ПустойНабор");

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

Как правильно настроить правила конвертации объектов (ПКО)

Для трансформации одного объекта в другой (даже если у них разная структура) в Конвертации данных 2.1 совершенно не обязательно писать код ручной выгрузки в ПВД. Применим правильный архитектурный подход:

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

При таком подходе платформенные обработчики БСП «понимают», какой именно ссылочный тип конвертируется. Они корректно формируют узлы регистрации для регистра соответствий. Ошибка пустого типа приемника будет полностью исключена.

Проанализируем влияние способа выборки в ПВД на планы обмена

Существует распространенное заблуждение, что ПВД вообще не учитываются при обмене через Планы обмена. Разберем подробнее, как это работает на самом деле:

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

«Произвольный алгоритм». Если установить этот способ, стандартное чтение таблицы регистрации изменений (например, таблиц _Изменения) игнорируется платформой. Если вы не напишете собственный запрос к таблицам регистрации в обработчике выборки данных, система может начать выгружать объекты целиком при каждом сеансе обмена (полная выгрузка) или выгружать лишние данные, игнорируя квитирование. Поэтому произвольный алгоритм стоит использовать только для нестандартных задач начальной выгрузки, а не для регулярного обмена по расписанию.

Используя механизм ПКО напрямую и оставляя стандартную выборку в ПВД, мы не только избавляемся от ошибки типа менеджера, но и обеспечиваем стабильную и прозрачную работу обмена данными на базе механизмов БСП.

← На главную