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

Обмен - Перенос данных из 1C8 в 1C8

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

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

 

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

В этой теме еще нет сообщений.
Оставьте свое сообщение