Как в КД 2.1 передать строку из произвольного алгоритма ПВД в ПКО без источника для поиска по наименованию

Программист 1С v8.3 (Управляемые формы) Бухгалтерский учет Промышленность, строительство и АПК
← На главную

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

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

Механизм передачи данных через структуру в ПВД

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

Рассмотрим основной инструмент — функцию ВыгрузитьПоПравилу(). В параметрах этой функции вместо реального объекта мы будем использовать структуру. Проанализируем пример кода, который формирует данные для выгрузки:


// В произвольном алгоритме ПВД
ДанныеДляПКО = Новый Структура;
ДанныеДляПКО.Вставить("Наименование", СтрокаНомерЗаказа); // СтрокаНомерЗаказа — это наши 11 символов номера

// Вызываем выгрузку по правилу
// Пятый параметр — имя ПКО в Конвертации
ВыгрузитьПоПравилу(ДанныеДляПКО, , , , "НоменклатурныеГруппы");

Важно понимать, что ключи структуры должны в точности совпадать с именами Правил конвертации свойств (ПКС), которые определены в ПКО НоменклатурныеГруппы. Если в ПКО есть свойство Наименование, то и в структуре ключ должен называться так же.

Настройка ПКО без источника

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

Разберем необходимые настройки в ПКО на стороне Конвертации данных:

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

Теперь настроим само свойство Наименование в списке ПКС этого правила. Установите для него флаг «Поиск». Таким образом, при загрузке система возьмет строку из XML, найдет справочник НоменклатурныеГруппы и попытается найти в нем элемент с таким же наименованием.

Использование механизма «Входящие данные»

Существует еще более гибкий способ передачи данных — использование коллекции ВходящиеДанные. Рассмотрим ситуацию, когда в ПВД мы передаем структуру не как основной источник, а как вспомогательный параметр. Это полезно, если ПКО всё же имеет какой-то источник, но часть данных нужно «вбросить» извне.

Посмотрим на пример реализации в обработчике ПКС «Перед выгрузкой»:


// В ПВД формируем входящие данные
ВходящиеДанныеДляГруппы = Новый Структура("Наименование", СтрокаНомерЗаказа);
ВыгрузитьПоПравилу(Источник, , ВходящиеДанныеДляГруппы, , "НоменклатурныеГруппы");

// В ПКО "НоменклатурныеГруппы" в ПКС "Наименование" в обработчике "Перед выгрузкой":
Если ВходящиеДанные <> Неопределено Тогда
    Значение = ВходящиеДанные.Наименование;
КонецЕсли;

Этот метод гарантирует, что даже если в колонке «Источник» у ПКС ничего не указано, правило корректно получит значение из переданной структуры ВходящиеДанные.

Группировка данных (Схема «Многие к одному»)

Поскольку наша задача — собрать несколько документов ERP в один документ БП, алгоритм в ПВД должен быть сложнее простого цикла по выборке. Проанализируем шаги реализации группировки:

  1. Создаем Таблицу Значений для накопления данных.
  2. Обходим выборку «Этапов производства», заполняя ТЗ. Ключом группировки может выступать, например, аналитика, которая должна стать «шапкой» итогового документа.
  3. Для каждой строки материалов в ТЗ создаем структуру, имитирующую Номенклатурную группу.
  4. После завершения сбора данных запускаем цикл по сгруппированной ТЗ и вызываем ВыгрузитьПоПравилу для формирования итогового документа в БП.

Для передачи табличной части документа (например, «Товары» в Отчете производства за смену) мы должны в структуру-источник документа вставить еще одну таблицу значений, имя которой совпадает с именем ТЧ в приемнике.

Автоматическое создание объектов

Часто программисты сталкиваются с тем, что поиск отрабатывает, но если группа не найдена — загрузка прерывается с ошибкой. Проанализируем настройки ПКО:

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

Оптимизация: использование кэша

Если документов много и в каждом из них повторяются одни и те же номера заказов (номенклатурные группы), постоянный поиск по строке может существенно замедлить загрузку в БП. Рассмотрим способ ускорения:

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

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

← На главную