Как исправить ошибку «Поле объекта не обнаружено» при выгрузке табличной части по правилам обмена 1С?

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

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

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

Причины возникновения ошибки

Проанализируем типичные архитектурные ошибки при выгрузке:

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

Решение 1. Стандартная выгрузка через ПКГС (Рекомендуемый способ)

Рассмотрим наиболее надежный и простой способ без ручного переопределения выборки в ПВД. Всю работу со сворачиванием и формированием строк мы переносим в правило конвертации группы свойств (ПКГС) нужной табличной части.

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

// Сворачиваем исходную табличную часть по ставке НДС
ТаблицаДляСвертки = Источник.Товары.Выгрузить();
ТаблицаДляСвертки.Свернуть("СтавкаНДС", "Сумма, СуммаНДС");

// Создаем и инициализируем результирующую коллекцию для приемника
КоллекцияОбъектов = Новый ТаблицаЗначений;
КоллекцияОбъектов.Колонки.Добавить("СуммаПлатежа");
КоллекцияОбъектов.Колонки.Добавить("СтавкаНДС");
КоллекцияОбъектов.Колонки.Добавить("СуммаНДС");

Для Каждого Строка Из ТаблицаДляСвертки Цикл
    НСтр = КоллекцияОбъектов.Добавить();
    НСтр.СуммаПлатежа = Строка.Сумма;
    НСтр.СтавкаНДС    = Строка.СтавкаНДС;
    НСтр.СуммаНДС     = Строка.СуммаНДС;
КонецЦикла;

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

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

Значение = "РозничнаяВыручка";

Решение 2. Программная выгрузка через структуру и входящие данные

Разберем ситуацию, когда объект формируется полностью вручную из структуры и выгружается программно.

Посмотрим на сигнатуру функции ВыгрузитьПоПравилу:

ВыгрузитьПоПравилу(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ИмяПКО, ...)

Если в ПКО очистить объект-источник (оставить только приемник), то данные должны передаваться именно через третий параметр — ВходящиеДанные. Пошаговый алгоритм выглядит так:

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

ТаблицаДляСвертки = Объект.Товары.Выгрузить();
ТаблицаДляСвертки.Свернуть("СтавкаНДС", "Сумма, СуммаНДС");

КоллекцияОбъектов = Новый ТаблицаЗначений;
КоллекцияОбъектов.Колонки.Добавить("СуммаПлатежа");
КоллекцияОбъектов.Колонки.Добавить("СтавкаНДС");
КоллекцияОбъектов.Колонки.Добавить("СуммаНДС");

Для Каждого Строка Из ТаблицаДляСвертки Цикл
    НСтр = КоллекцияОбъектов.Добавить();
    НСтр.СуммаПлатежа = Строка.Сумма;
    НСтр.СтавкаНДС    = Строка.СтавкаНДС;
    НСтр.СуммаНДС     = Строка.СуммаНДС;
КонецЦикла;

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

// Передаем структуру в качестве входящих данных (3-й параметр):
ВыгрузитьПоПравилу(,, СтруктураДляВыгрузки,, "ПриходныйКассовыйОрдер");

// Отменяем стандартную выгрузку исходного документа
Отказ = Истина;

Особенности поиска объектов при загрузке

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

← На главную