Небольшое вступление, почему я пишу так много про обмен очевидных вещей? На первый взгляд они очевидные, но я описываю конкретные решения стандартных проблемных, которые либо совсем не описаны в литературе, либо описаны вскользь.
Итак, сегодня задача используя Конвертацию данных 2.1 по произвольному алгоритмом обменять две базы с одинаковыми конфигурациями (например Бухгалтерия 2.0) и при этом сформировать документы подчиненные обмениваемым(точнее вновь созданным). Алгоритмом содержащим запрос формирую данные для загрузки например в базе Источнике у меня Поступления товаров, в Приемник хочу сделать Реализации (встречные).
С этой частью все ясно, делаем ПВД- Произвольный алгоритм, из Источника выбираем Поступления ,формируем структуру и используя стандартную функцию ВыгрузитьПоПравилу() передаем в ПКО Реализация. Так мы получим данные только для шапки, ниже напишу подробнее, табличную часть придется получать отдельно через запрос.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПоступлениеТоваровУслуг.Ссылка,
| ПоступлениеТоваровУслуг.Дата,
| ПоступлениеТоваровУслуг.ВалютаДокумента,
| ПоступлениеТоваровУслуг.Контрагент,
| ПоступлениеТоваровУслуг.Организация,
| ПоступлениеТоваровУслуг.СуммаДокумента,
| ПоступлениеТоваровУслуг.НомерВходящегоДокумента,
| ПоступлениеТоваровУслуг.Комментарий
|ИЗ
| Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
|ГДЕ
| ПоступлениеТоваровУслуг.Дата МЕЖДУ &ДатаНач И &ДатаКон
| И ПоступлениеТоваровУслуг.Контрагент = &Контрагент
|";
Запрос.УстановитьПараметр("ДатаНач", ДатаНачала);
Запрос.УстановитьПараметр("ДатаКон", ДатаОкончания);
Конт = Справочники.Контрагенты;
Запрос.УстановитьПараметр("Контрагент", ...);
Выб = Запрос.Выполнить().Выбрать();
Пока Выб.Следующий() Цикл
ИсходящиеДанные = Новый Структура;
ИсходящиеДанные.Вставить("Ссылка" , Выб.Ссылка);
ИсходящиеДанные.Вставить("Дата" , Выб.Дата);
ИсходящиеДанные.Вставить("ВалютаДокумента" , Выб.ВалютаДокумента);
ИсходящиеДанные.Вставить("Контрагент" , Выб.Контрагент);
ИсходящиеДанные.Вставить("Организация" , Выб.Организация);
ИсходящиеДанные.Вставить("СуммаДокумента" , Выб.СуммаДокумента);
ИсходящиеДанные.Вставить("НомерВходящегоДокумента" , Выб.НомерВходящегоДокумента);
ВыгрузитьПоПравилу(, , ИсходящиеДанные,, "РеализацияТоваровУслуг");
ВыгрузитьПоПравилу(, , ИсходящиеДанные, , "СчетФактураВыданный");
КонецЦикла;
Но для завершенности я решил сделать еще и ПКО СчетФактураВыданный, все данные для счета фактуры есть, проблема небольшая с тем что в Источнике нет узла для Основания, первая мысль использовать снова ВыгрузитьПоПравилу() , Входящие данные, честно говоря тоже думал об этом, но отбросил эту мысль. При написании правил большую роль играет последовательность действий и обработчики событий, то есть нужно следить за тем в какой базе и при каком событии выполняется тот или иной алгоритм. Так как Документ-основание появляется только после завершения загрузки ПКО с Реализацией, я сделал следующим образом, первоначально загружаю Счет-фактуру без Документа-основания, как видно из текста выше (ВходящиеДанные такие же как для Реализации), и в обработчике ПКО ПослеЗагрузки заполняю его из запроса, который в качестве параметров использует поля для поиска.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Дата = &Дата
| И РеализацияТоваровУслуг.Номер = &Номер
| И РеализацияТоваровУслуг.Контрагент = &Контрагент";
Запрос.УстановитьПараметр("Дата", Объект.Дата);
Запрос.УстановитьПараметр("Номер", ПривестиНомерКДлине(Объект.Номер,11));
Запрос.УстановитьПараметр("Контрагент", Объект.Контрагент);
Выб = Запрос.Выполнить().Выбрать();
Если Выб.Следующий() Тогда
ДокОсн = Объект.ДокументыОснования.Добавить();
ДокОсн.ДокументОснование = Выб.Ссылка;
КонецЕсли;
Попытка
Объект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Скептики не оценят, но это работает и достаточно быстро, вариант 100%.
Теперь немного подробнее как выглядят ПКО. Часть реквизитов заполняется фиксированными данными, через общеизвестный прием с поиском объекта справочника в Приемнике: создаем ПКО, заполняем только Приемник например Контрагенты, в ПКС одно единственное свойство например Код для поиска, ПередВыгрузкой: Значение = Источник;
в месте где это правило используется остается передать только значение Кода (Значение = <Ваш код>),
Далее получается как инструкция по сбору "Лего": фиксированные Реквизиты типа Организации, Контрагенты, Валюты может быть, делаем описанным образом, значения Перечислений вообще можно указывать явно без правила Значение = "ПродажаКомиссия";
Данные получаемые из входящих данных
Табличные части, получаются запросом (Поступления из Источника), в качестве параметра для берем Ссылку из входящих данных.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПостТов.Ссылка,
| ПостТов.Количество,
| ПостТов.Номенклатура,
| ПостТов.Сумма,
| ПостТов.СуммаНДС,
| ПостТов.Цена,
| ПостТов.НомерГТД,
| ПостТов.СтранаПроисхождения,
| ПостТов.ЕдиницаИзмерения
|ИЗ
| Документ.ПоступлениеТоваровУслуг.Товары КАК ПостТов
|ГДЕ
| ПостТов.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", ВходящиеДанные.Ссылка);
КоллекцияОбъектов = Запрос.Выполнить().Выгрузить();
Внутри ТЧ, реквизиты аналогично шапке, только данные получаемые из запроса будут объектами коллекции, например
Постарался проиллюстрировать все описанное, а так все!