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