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