Обмен документами между одинаковыми конфигурациями







Простой вариант передавать созданное основание в подчиненный документ при обмене и делать обмен по произвольному алгоритму.

Небольшое вступление, почему я пишу так много про обмен очевидных вещей? На первый взгляд они очевидные, но я описываю конкретные решения стандартных проблемных, которые либо совсем не описаны в литературе, либо описаны вскользь. 

 

Итак, сегодня задача используя Конвертацию данных 2.1 по произвольному алгоритмом обменять две базы с одинаковыми конфигурациями (например Бухгалтерия 2.0)  и при этом сформировать документы подчиненные обмениваемым(точнее вновь созданным). Алгоритмом содержащим запрос формирую данные для загрузки например в базе Источнике  у меня Поступления товаров, в Приемник хочу сделать Реализации (встречные). 

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

 

Запрос = Новый Запрос;

Запрос.Текст =
"ВЫБРАТЬ
| ПоступлениеТоваровУслуг.Ссылка,
| ПоступлениеТоваровУслуг.Дата,
| ПоступлениеТоваровУслуг.ВалютаДокумента,
| ПоступлениеТоваровУслуг.Контрагент,
| ПоступлениеТоваровУслуг.Организация,
| ПоступлениеТоваровУслуг.СуммаДокумента,
| ПоступлениеТоваровУслуг.НомерВходящегоДокумента,
| ПоступлениеТоваровУслуг.Комментарий
|ИЗ
| Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
|ГДЕ
| ПоступлениеТоваровУслуг.Дата МЕЖДУ &ДатаНач И &ДатаКон
| И ПоступлениеТоваровУслуг.Контрагент = &Контрагент
|";

Запрос.УстановитьПараметр("ДатаНач", ДатаНачала);
Запрос.УстановитьПараметр("ДатаКон", ДатаОкончания);

Конт = Справочники.Контрагенты;
Запрос.УстановитьПараметр("Контрагент", ...);

Выб = Запрос.Выполнить().Выбрать();

Пока Выб.Следующий() Цикл

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

ВыгрузитьПоПравилу(, , ИсходящиеДанные,, "РеализацияТоваровУслуг");

ВыгрузитьПоПравилу(, , ИсходящиеДанные, , "СчетФактураВыданный");


КонецЦикла;

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

Запрос = Новый Запрос;

Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Дата = &Дата
| И РеализацияТоваровУслуг.Номер = &Номер
| И РеализацияТоваровУслуг.Контрагент = &Контрагент";

Запрос.УстановитьПараметр("Дата", Объект.Дата);
Запрос.УстановитьПараметр("Номер", ПривестиНомерКДлине(Объект.Номер,11));
Запрос.УстановитьПараметр("Контрагент", Объект.Контрагент);

Выб = Запрос.Выполнить().Выбрать();

Если Выб.Следующий() Тогда
ДокОсн = Объект.ДокументыОснования.Добавить();
ДокОсн.ДокументОснование = Выб.Ссылка;
КонецЕсли;

Попытка
Объект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;

Скептики не оценят, но это работает и достаточно быстро, вариант 100%.

Теперь немного подробнее как выглядят ПКО. Часть реквизитов заполняется фиксированными данными, через общеизвестный прием с поиском объекта справочника в Приемнике: создаем ПКО, заполняем только Приемник например Контрагенты, в ПКС одно единственное свойство например Код для поиска, ПередВыгрузкой: Значение = Источник;

 в месте где это правило используется остается передать только значение Кода (Значение = <Ваш код>),

Далее получается как инструкция по сбору "Лего": фиксированные Реквизиты типа Организации, Контрагенты, Валюты может быть, делаем описанным образом, значения Перечислений вообще можно указывать явно без правила Значение = "ПродажаКомиссия"; 

Данные получаемые из входящих данных

Табличные части, получаются запросом (Поступления из Источника), в качестве параметра для берем Ссылку из входящих данных.

Запрос = Новый Запрос;

Запрос.Текст =
"ВЫБРАТЬ
| ПостТов.Ссылка,
| ПостТов.Количество,
| ПостТов.Номенклатура,
| ПостТов.Сумма,
| ПостТов.СуммаНДС,
| ПостТов.Цена,
| ПостТов.НомерГТД,
| ПостТов.СтранаПроисхождения,
| ПостТов.ЕдиницаИзмерения
|ИЗ
| Документ.ПоступлениеТоваровУслуг.Товары КАК ПостТов
|ГДЕ
| ПостТов.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", ВходящиеДанные.Ссылка);

КоллекцияОбъектов = Запрос.Выполнить().Выгрузить();

Внутри ТЧ, реквизиты аналогично шапке, только данные получаемые из запроса будут объектами коллекции, например

Постарался проиллюстрировать все описанное, а так все!

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *