Продолжаю делиться опытом написания обменов между базами с типовыми конфигурациями.
Задача
Итак, сегодня задача написать правила обмена между двумя базами (с одинаковыми конфигурациями Бухгалтерия 2.0). Выгрузить покупоки из базы "Источника" и сформировать продажи в "Приемнике" подчиненные обмениваемым.
Реализация (КД 2.1)
Создаю новые правила обмена, указываю конфигурацию (Бухгалтерия 2.0) в Качестве Источника и Приемника, описание конфигурации предварительно получено обработкой MD82Exp.epf с диска ИТС и загружено в КД.
Перехожу к созданию правил, пока пропускаю вкладку "Правила конвертации объектов", перехожу на "Правила выгрузки данных". Создаю новое правило выгрузки (ПВД) "Закупки", "Перед обработкой" пишу произвольный алгоритм вида:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПоступлениеТоваровУслуг.Ссылка,
| ПоступлениеТоваровУслуг.Дата,
| ПоступлениеТоваровУслуг.ВалютаДокумента,
| ПоступлениеТоваровУслуг.Контрагент,
| ПоступлениеТоваровУслуг.Организация,
| ПоступлениеТоваровУслуг.СуммаДокумента,
| ПоступлениеТоваровУслуг.НомерВходящегоДокумента,
| ПоступлениеТоваровУслуг.Комментарий
|ИЗ
| Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
|ГДЕ
| ПоступлениеТоваровУслуг.Дата МЕЖДУ &ДатаНач И &ДатаКон
| И ПоступлениеТоваровУслуг.Контрагент = &Контрагент
|";
Запрос.УстановитьПараметр("ДатаНач", ДатаНачала);
Запрос.УстановитьПараметр("ДатаКон", ДатаОкончания);
Конт = Справочники.Контрагенты;
Запрос.УстановитьПараметр("Контрагент", ...);
Выб = Запрос.Выполнить().Выбрать();
Пока Выб.Следующий() Цикл
ИсходящиеДанные = Новый Структура;
ИсходящиеДанные.Вставить("Ссылка" , Выб.Ссылка);
ИсходящиеДанные.Вставить("Дата" , Выб.Дата);
ИсходящиеДанные.Вставить("ВалютаДокумента" , Выб.ВалютаДокумента);
ИсходящиеДанные.Вставить("Контрагент" , Выб.Контрагент);
ИсходящиеДанные.Вставить("Организация" , Выб.Организация);
ИсходящиеДанные.Вставить("СуммаДокумента" , Выб.СуммаДокумента);
ИсходящиеДанные.Вставить("НомерВходящегоДокумента" , Выб.НомерВходящегоДокумента);
ВыгрузитьПоПравилу(, , ИсходящиеДанные,, "РеализацияТоваровУслуг");
ВыгрузитьПоПравилу(, , ИсходящиеДанные, , "СчетФактураВыданный");
КонецЦикла;
Перехожу на вкладку "Правил конвертации объектов" (ПКО), мне нужно создать 2 правила для созданных ПВД. В произвольном алгоритме я уже указал имена этих правил, как и реквизиты Шапки, для которых нужно будет создать "Правила конвертации свойств". Я специально начал с ПВД, на мой взгляд, в такой последовательности будет вернее рассказывать, сначала получение данных, потом их обработка.
Создаю два ПКО, "РеализацияТоваровУслуг", "СчетФактураВыданный". В создаю ПКС (вручную не помощником) необходимые в новом документах. Это шапки двух документов. На скиншотах видно что их больше чем выгруженных данных, в данной задаче покупки интересны от одного поставщика который явно указывается в коде, возможны варианты и со всеми, либо добавления параметра, возможно позже доработаю и специально для публикации выложу и так.
С реквизитами шапки все ясно, кроме СФ небольшая проблема с тем что в Источнике нет узла для Основания. Пришлось немного сочинять, при написании правил большую роль играет последовательность обработки полученных данных и обработчики событий в которых находится алгоритм. Документ-основание появляется только после завершения загрузки ПКО с Реализацией, я сделал следующим образом, загружаю Счет-фактуру без Документа-основания, как видно из текста выше (ВходящиеДанные такие же как для Реализации), и в обработчике ПКО "После Загрузки" заполняю его из запроса, который в качестве параметров использует поля для поиска (не претендую на гениальность решения).
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Дата = &Дата
| И РеализацияТоваровУслуг.Номер = &Номер
| И РеализацияТоваровУслуг.Контрагент = &Контрагент";
Запрос.УстановитьПараметр("Дата", Объект.Дата);
Запрос.УстановитьПараметр("Номер", ПривестиНомерКДлине(Объект.Номер,11));
Запрос.УстановитьПараметр("Контрагент", Объект.Контрагент);
Выб = Запрос.Выполнить().Выбрать();
Если Выб.Следующий() Тогда
ДокОсн = Объект.ДокументыОснования.Добавить();
ДокОсн.ДокументОснование = Выб.Ссылка;
КонецЕсли;
Попытка
Объект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Немного подробнее как выглядят ПКО. Часть реквизитов заполняется фиксированными данными, через прием с поиском объекта справочника (без переноса, только поиск если объект точно присутствует в Приемнике) в Приемнике: создаем ПКО, заполняем только Приемник например Контрагенты, в ПКС одно единственное свойство например Код для поиска, ПередВыгрузкой: Значение = Источник; (продублировано в скриншотах)
в месте где это правило используется остается передать только значение Кода (Значение = <Ваш код>),
Далее получается как инструкция по сбору "Лего": фиксированные Реквизиты типа Организации, Контрагенты, Валюты может быть, делаем описанным образом, значения Перечислений вообще можно указывать явно без правила Значение = "ПродажаКомиссия";
Данные получаемые из входящих данных
Переходим к табличным частям, создаем "группу ПКС", в качестве Приемника ТЧ. "Перед обработкой" снова добавляем алгоритм со следующим запросом (Поступления из Источника), в качестве параметра для берем Ссылку из входящих данных.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПостТов.Ссылка,
| ПостТов.Количество,
| ПостТов.Номенклатура,
| ПостТов.Сумма,
| ПостТов.СуммаНДС,
| ПостТов.Цена,
| ПостТов.НомерГТД,
| ПостТов.СтранаПроисхождения,
| ПостТов.ЕдиницаИзмерения
|ИЗ
| Документ.ПоступлениеТоваровУслуг.Товары КАК ПостТов
|ГДЕ
| ПостТов.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", ВходящиеДанные.Ссылка);
КоллекцияОбъектов = Запрос.Выполнить().Выгрузить();
Внутри аналогично шапке, создаю ПКС только данные получаемые из запроса будут объектами коллекции, например
Обновление
янв. 2020- прикреплен ознакомительный(!) файл требует доработки, в части указания контрагента (в каждом ПКД) и организации (в каждом ПКС), также проверка всех статичных свойств документа (НДС, Валюты и проч.), для унификации вместо Кода контрагента можно переделать на ИНН, как уже сделано для Организации. написано для конфигурации 2.0.66.44, работает на момент обновления публикации т.е. для релиза 2.0.66.89
p.s. при желании могу индивидуально доработать, заявки в личку, или если требуется указания указанных выше реквизитов (контрагента, организации), могу помочь это сделать бесплатно при условии скачивания ;)
обновление 29/01/2020
добавлен вариант для обмена между БП 3.0, версия релиза (3.0.73.50) пригодны и для более поздних релизов, файл ознакомительный и требует доработки в частности указания контрагента, а также проверки актуальности "статичных" реквизитов (свойств) обмениваемых документов, при возникновении вопросов после скачивания, можете писать мне в личку, либо комментарии