Как правильно выгрузить контактную информацию через ВыгрузитьПоПравилу в Конвертации данных 2.1?

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

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

Анализ ошибки: почему возникает «Поле объекта не обнаружено»

Проанализируем типичный ошибочный код, который разработчики помещают в обработчик события ПослеВыгрузкиОбъекта правила конвертации объектов (ПКО) Контрагенты:


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

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    ВыгрузитьПоПравилу(ВыборкаДетальныеЗаписи.Объект, , , , "КонтактнаяИнформация");
КонецЦикла;

Разберем по шагам, что происходит при таком вызове:

  1. В функцию ВыгрузитьПоПравилу первым параметром передается ВыборкаДетальныеЗаписи.Объект. Это ссылка на справочник Контрагенты (владельца контактной информации).
  2. ПКО КонтактнаяИнформация настроено для конвертации записей регистра сведений. В правилах конвертации свойств (ПКС) этого ПКО прописаны реквизиты регистра: Вид, Тип, Представление, Поле1 и так далее.
  3. Механизм выгрузки пытается прочитать реквизит Вид у переданного объекта (то есть у СправочникСсылка.Контрагенты). Поскольку у контрагента нет реквизита Вид, платформа генерирует исключение «Поле объекта не обнаружено (Вид)».

Важное правило Конвертации данных: параметр Источник в функции ВыгрузитьПоПравилу — это произвольный источник данных. Он не обязан быть ссылкой на объект ИБ, но его состав полей должен строго соответствовать тем свойствам, которые настроены в ПКС целевого ПКО.

Решение 1. Выгрузка полной выборки запроса через обработчик «После выгрузки в файл»

Рассмотрим основной и наиболее простой способ. Для этого сформируем запрос, который извлекает все необходимые поля контактной информации, и передадим саму строку выборки в качестве источника.

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


Если НЕ Источник.ЭтоГруппа Тогда
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    ИСТИНА КАК Активность,
        |    КонтактнаяИнформация.Объект КАК Объект,
        |    КонтактнаяИнформация.Тип КАК Тип,
        |    КонтактнаяИнформация.Вид КАК Вид,
        |    КонтактнаяИнформация.Представление КАК Представление,
        |    КонтактнаяИнформация.Поле1 КАК Поле1,
        |    КонтактнаяИнформация.Поле2 КАК Поле2,
        |    КонтактнаяИнформация.Поле3 КАК Поле3,
        |    КонтактнаяИнформация.Поле4 КАК Поле4,
        |    КонтактнаяИнформация.Поле5 КАК Поле5,
        |    КонтактнаяИнформация.Поле6 КАК Поле6,
        |    КонтактнаяИнформация.Поле7 КАК Поле7,
        |    КонтактнаяИнформация.Поле8 КАК Поле8,
        |    КонтактнаяИнформация.Поле9 КАК Поле9,
        |    КонтактнаяИнформация.Поле10 КАК Поле10,
        |    КонтактнаяИнформация.Комментарий КАК Комментарий
        |ИЗ
        |    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
        |ГДЕ
        |    КонтактнаяИнформация.Объект = &Объект";
        
    Запрос.УстановитьПараметр("Объект", Источник.Ссылка);
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        // Передаем строку выборки целиком в качестве Источника
        ВыгрузитьПоПравилу(Выборка, , , , "КонтактнаяИнформация");
    КонецЦикла;
КонецЕсли;

В ПКО КонтактнаяИнформация для реквизитов Вид и Тип должны быть указаны соответствующие ПКО перечислений и справочников, чтобы ссылочные данные корректно сопоставились в приемнике.

Решение 2. Выгрузка через «ВходящиеДанные»

Если структура источника и приемника отличается или в ПКО регистра не задан объект-источник, данные удобно передавать через структуру входящих данных.

Разберем по шагам настройку такого варианта:

  1. В ПКО КонтактнаяИнформация очистим поле Объект-источник (оставим его пустым).
  2. Во всех ПКС правила КонтактнаяИнформация установим флаг «Получать свойство из входящих данных».
  3. В обработчике ПКО Контрагенты напишем код упаковки выборки в структуру:

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

Решение 3. Выгрузка через объект «РегистрСведенийНаборЗаписей»

Если в ПКО тип источника жестко указан как РегистрСведенийНаборЗаписей.КонтактнаяИнформация, передача выборки или структуры вызовет ошибку поиска свойств набора. В таком случае необходимо сформировать и передать полноценный набор записей:


Если НЕ Источник.ЭтоГруппа Тогда
    НаборЗаписей = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Объект.Установить(Источник.Ссылка);
    НаборЗаписей.Прочитать();
    
    Если НаборЗаписей.Количество() > 0 Тогда
        ВыгрузитьПоПравилу(НаборЗаписей, , , , "КонтактнаяИнформация_Набор");
    КонецЕсли;
КонецЕсли;

Чек-лист проверки при отсутствии записей в базе-приемнике

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

  1. Флаги поиска в ПКС: Для ключевых измерений регистра сведений (Объект, Тип, Вид) в ПКО должны стоять флаги поиска (галочки ключевых полей).
  2. Замещение записей: По умолчанию при загрузке каждой строки непериодического регистра создается отдельный набор записей, который может затирать предыдущие строки по отбору. Если выгружаются отдельные записи, в ПКО регистра сведений необходимо проверить режим записи наборов.
  3. Корректность ссылочных измерений: Убедимся, что справочник Виды контактной информации корректно сопоставляется по наименованию или коду и не создаются пустые ссылки, из-за которых запись регистра отсекается платформой.
← На главную