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