Как исправить ошибку Поле объекта не обнаружено (ЭтоГруппа) в Конвертации данных 2.1

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

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

Анализ причины возникновения ошибки

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

Ситуация, когда Источник внезапно оказывается Структурой, возникает в следующих случаях:

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

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

Решение №1: Программный «костыль» в обработчике ПКС

Наиболее быстрый и надежный способ — добавить проверку типа источника непосредственно в Правило Конвертации Свойства (ПКС) для реквизита ЭтоГруппа. Это позволит правилу корректно отрабатывать и для полноценных объектов, и для структур.

Найдем ПКС ЭтоГруппа внутри ПКО Номенклатура и в обработчике «Перед выгрузкой» напишем следующий код:


Если ТипЗнч(Источник) = Тип("Структура") Тогда
    Если Не Источник.Свойство("ЭтоГруппа") Тогда
        // Если в структуре нет свойства, определяем его по умолчанию
        // Чаще всего структуры передаются для элементов, поэтому ставим Ложь
        Значение = Ложь; 
    Иначе
        Значение = Источник.ЭтоГруппа;
    КонецЕсли;
КонецЕсли;

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

Решение №2: Поиск виновника через поиск в файле правил

Если мы хотим устранить первопричину, нам нужно найти код, который формирует структуру без поля ЭтоГруппа. Для этого проанализируем файл правил обмена (XML) с помощью любого текстового редактора (например, Notepad++ или VS Code).

  1. Выгрузим правила обмена в файл XML.
  2. Выполним поиск по строке ВыгрузитьПоПравилу.
  3. Проанализируем места, где в качестве третьего параметра (Источник) передается переменная, отличная от ссылки (обычно это переменные с именами типа СтруктураДанных, ПараметрыОбъекта и т.д.).
  4. Проверим, заполняется ли в этих местах свойство ЭтоГруппа.

Пример проблемного кода, который можно встретить в алгоритмах:


ДанныеНоменклатуры = Новый Структура;
ДанныеНоменклатуры.Вставить("Код", СсылкаНаТовар.Код);
ДанныеНоменклатуры.Вставить("Наименование", СсылкаНаТовар.Наименование);
// Ошибка: забыли вставить "ЭтоГруппа"
ВыгрузитьПоПравилу(ДанныеНоменклатуры, , , , "Номенклатура");

Чтобы исправить это, достаточно просто добавить недостающее свойство в структуру перед вызовом функции выгрузки.

Решение №3: Глобальная проверка в ПКО

Рассмотрим ситуацию, когда ПКО используется во многих местах, и мы не хотим менять каждое ПКС. Мы можем воспользоваться обработчиком ПКО «Перед выгрузкой». Здесь мы проанализируем Источник и, если это структура, дополним её необходимыми техническими полями.


Если ТипЗнч(Источник) = Тип("Структура") Тогда
    Если Не Источник.Свойство("ЭтоГруппа") Тогда
        // Пытаемся дозаполнить из ссылки, если она есть в структуре
        Если Источник.Свойство("Ссылка") И ЗначениеЗаполнено(Источник.Ссылка) Тогда
            Источник.Вставить("ЭтоГруппа", Источник.Ссылка.ЭтоГруппа);
        Иначе
            Источник.Вставить("ЭтоГруппа", Ложь);
        КонецЕсли;
    КонецЕсли;
КонецЕсли;

Как отладить выгрузку и найти конкретный объект

Если ошибка возникает на большом объеме данных, выясним, на каком именно объекте происходит сбой. Для этого в обработке «Универсальный обмен данными XML» следует выполнить следующие шаги:

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

СтекВыгрузки — это массив, который показывает цепочку вызовов правил. Анализируя его, мы поймем, из какого ПКО был вызван текущий процесс конвертации номенклатуры, что значительно сузит область поиска ошибки.

Резюме

Ошибка Поле объекта не обнаружено (ЭтоГруппа) при источнике-структуре — это классический симптом того, что в правилах используется программная передача данных. Рекомендуется использовать Решение №1 как наиболее универсальное, так как оно защищает правила от некорректных входящих данных в будущем, независимо от того, откуда вызывается конвертация номенклатуры.

← На главную