Конвертация данных 2. Использование исходящих и входящих данных. Свойство "Получить из входящих данных"

29.04.20

Интеграция - Обмен между базами 1C

Разработка правил обмена с использованием исходящих и входящих данных. В качестве примера рассмотрена реальная задача конвертации номенклатуры через регистр сопоставления номенклатур. Статья предназначена в первую очередь для тех, кто только начинает осваивать Конвертацию данных.

1. Теория

В штатной справке по Конвертации данных об этих параметрах написано следующее:

ВходящиеДанные - Произвольный - произвольные вспомогательные данные, переданные правилу конвертации из других правил (например из правила выгрузки данных или правила конвертации свойств). Значение параметра, как правило, имеет тип Структура, где ключи значений соответствуют структуре свойств объекта приемника. Таким образом, при конвертации свойств (в правиле конвертации свойств), конвертируемые данные (или часть данных) могут быть получены из этого параметра.

ИсходящиеДанные - Произвольный - произвольные вспомогательные данные. Данные передаются по следующим правилам:

1) ПВД.ИсходящиеДанные -> ПКО.ВходящиеДанные

2) ПКО.ВходящиеДанные -> ПКС.ВходящиеДанные

3) ПКС.ИсходящиеДанные -> ПКО.ВходящиеДанные

Попробуем разобраться подробнее, как передаются данные параметры.

Шаг 1. ПВД (Правило выгрузки данных)

В правилах выгрузки данных создаем параметр ИсходящиеДанные и помещаем в него некоторое значение.

Шаг 2. ПКО (Правило конвертации объектов)

После выполнения ПВД, параметр передается в ПКО-приемник уже как ВходящиеДанные. К этому параметру можно обратиться в коде, например, поместив еще один элемент в структуру.

Если будет установлено хотя бы одно поле, получаемое из входящих данных, в ПКО добавится вкладка "Параметры, получаемые из входящих данных", где будет отображаться список соответствующих полей. Также отобразится кнопка "Структура запрашиваемых данных", которая позволит посмотреть, какую структуру входящих данных нужно передать в ПКО.

Шаг 3. ПКС (Правило конвертации свойств)

После выполнения кода в ПКО, параметр будет передан в ПКС как ВходящиеДанные. Здесь обращаем внимание на следующую особенность: из ПВД уходят ИсходящиеДанные, в ПКО приходят ВходящиеДанные. Из ПКО уходят ВходящиеДанные, в ПКС также приходят ВходящиеДанные.

Для того, чтобы свойству было присвоено значение из входящих данных, выставляем галку "Получить из входящих данных". Поле Источник очистится, т.к. оно уже потеряло свой смысл.

При совпадении наименовании ключа структуры входящих данных, поля будут заполнятся автоматически из входящих данных. Если наименование в структуре различаются, значение необходимо переназначить в ПКС вручную.

Шаг 4. Снова ПКО

Если поле имеет не примитивный тип данных, то система продолжит конвертацию объекта по правилу. Параметр ИсходящиеДанные, заданный в ПКС, будет передан в ПКО как ВходящиеДанные.

 

2. Практика

Задача: Необходимо настроить передачу документа (для примера будем использовать документ ПоступлениеТоваровУслуг) из базы Источника(1С:ERP Управление предприятием 2) в базу Приемник(Управление производственным предприятием 1.3) через регистр сведений "Сопоставление номенклатуры". У документа есть табличная часть Товары, в которой имеется поле "Номенклатура.

Номенклатура базы Источника должна заменяться на номенклатуру базы Приемника на основании найденного сопоставления, т.к. это эквивалентные номенклатуры, только хранящиеся в разных базах и имеющих разные наименования. В случае, если сопоставление не найдено - отказ в выгрузке всего документа.

Все передаваемые объекты, содержащие в себе поле Номенклатура, должны выгружаться через регистр сопоставлений.

Регистр хранится в базе Источнике.

Решение:

Для начала создадим ПКО для документа ПриобретениеТоваровУслуг, в качестве приемника необходимо указать документ ПоступлениеТоваровУслуг. На вопрос создать ли правила конвертации свойств автоматически, отвечаем утвердительно. Проверяем автоматически созданные ПКС на корректность. Далее создаем ПВД. Теперь можно приступать к доработке правил сопоставления.

Необходимо создать новую табличную часть Товары, в которой заменить номенклатуру Источника на номенклатуру Приемника. Если для выгружаемой Номенклатуры не будет найдено сопоставление, то отказ в выгрузке всего документа. Для этого в ПКО ПриобретениеТоваровУслуг в обработчике события Перед Выгрузкой добавим следующий код:

//Формируем Новую табличную часть, которую будем помещать во входящие данные
ТЧ = Источник.Товары.Выгрузить();

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

Запрос.УстановитьПараметр("Источник", Источник);

РезультатЗапроса = Запрос.Выполнить();

ДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ДетальныеЗаписи.Следующий() Цикл
	//проверяем, найдено ли соответствие
	Если ЗначениеЗаполнено(ДетальныеЗаписи.НоменклатураУПП) Тогда
		МассивНоменклатур.Добавить(ДетальныеЗаписи.НоменклатураУПП);
	Иначе
		//Отказ, если ничего не найдено
		Сообщить("Для документа " + Источник.Ссылка + " не найдено соответствие номенклатур ERP-УПП. Номенклатура "
		+ДетальныеЗаписи.Номенклатура.Наименование+". Выгрузка документа отменена!");
		Отказ = Истина;
		Прервать;
	КонецЕсли;
КонецЦикла;

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

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

Правила обмена готовы. Сохраняем созданные правила. Попытаемся выгрузить из базы Источника и загрузить в Приемник тестовый документ. После загрузки в Приемник видим, что номенклатура была передана корректно, но колонка ЕдиницаИзмерения не загрузилась.

Связана эта ситуация с тем, что свойство ЕдиницаИзмерения привязана к номенклатуре-владельцу. Следовательно, нужно передать из ПКС единиц измерения номенклатуру-владельца в ПКО ЕдиницыИзмерения.


Добавим в обработчик события Перед выгрузкой для ПКС ЕдиницаИзмерения следующий код:

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

То, что указываем в ПКС как ИсходящиеДанные, в ПКО будет уже ВходящиеДанные.

В ПКО ЕдиницыИзмерения установим Галку "Получить из входящих данных" для Поля "Владелец".

Также не забудем дописать в ПКО ПриобретениеТоваровУслуг строку кода для выгрузки единиц измерений в ТЧ

 
 Исправленный код ПКО ПриобретениеТоваровУслуг для Единиц измерения

 

//Формируем Новую табличную часть, которую будем помещать во входящие данные 
ТЧ = Источник.Товары.Выгрузить();

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

Запрос.УстановитьПараметр("Источник", Источник);

РезультатЗапроса = Запрос.Выполнить();

ДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ДетальныеЗаписи.Следующий() Цикл
	//проверяем, найдено ли соответствие  
	Если ЗначениеЗаполнено(ДетальныеЗаписи.НоменклатураУПП) Тогда
		МассивНоменклатур.Добавить(ДетальныеЗаписи.НоменклатураУПП);
		МассивЕдиницИзмерения.Добавить(ДетальныеЗаписи.Номенклатура.ЕдиницаИзмерения);
		
	Иначе
		//Отказ, если ничего не найдено
		Сообщить("Для документа " + Источник.Ссылка + " не найдено соответствие номенклатур ERP-УПП. Номенклатура "+ДетальныеЗаписи.Номенклатура.Наименование+
		". Выгрузка документа отменена!");
		Отказ = Истина;
		Прервать;
	КонецЕсли;
КонецЦикла;

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

 

Как видим на рисунке ниже, табличная часть выгрузилась и загрузилась корректно.

Послесловие

Исходящие и Входящие данные -- неотъемлемый функционал КД2. Без него невозможно представить сложных обменов. К сожалению, на Инфостарте я не нашел статьи, в которой бы разбирались эти моменты, потому решил написать самостоятельно.

Для ситуации, если регистр сопоставления расположен в базе-приемнике, а не источнике, рекомендую прочесть эту статью.

Правила обмена разрабатывались в системе Конвертация данных, редакция 2.1 (2.1.8.2) для конфигураций 1С:ERP Управление предприятием 2 (2.4.10.62) и Управление производственным предприятием, редакция 1.3 (1.3.86.3). Справочник НоменклатураУПП и регистр сведений СопоставлениеНоменклатурыУППERP являются самостоятельно добавленными объектами и отсутствуют в типовой версии 1С:ERP Управление предприятием 2.

 

UPD.

За два с лишним месяца, прошедших с написания статьи, правила обмена были переосмыслены и переписаны с нуля несколько раз. Во многом благодаря комментариям ниже к посту.

Внесенные изменения и отпимизации:

1) Общая оптимизация (не нужно выгружать результат запроса в таблицу значений, обращаться через точку к переменным ссылочного типа и проч.);

2) В случаях, когда входящих и исходящих данных может быть несколько, либо вы дорабатываете уже существующие правила, неплохо бы делать такую вот проверку:

Если ТипЗнч(ВходящиеДанные) <> Тип("Структура") Тогда
	ВходящиеДанные = Новый Структура;
КонецЕсли;

Чтобы случайно не "обнулить" уже существующие данные в переменной.

3) Реализована подмена номенклатуры на сопоставленную на уровне запроса, а не его пост-обработкой в таблице значений;

4) "Сообщить()" везде заменено на "ОбщегоНазначения.СообщитьПользователю()";

5) Реализовано разделение табличной части Товары на две табличных части Товары и Услуги в зависимости от типа номенклатуры. (т.к. в УПП две табличных части, а не одна).

Отредактированный пример кода:

ТЗТовары = Новый ТаблицаЗначений();

Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|	pll_СопоставлениеНоменклатурыУППERP.НоменклатураУПП КАК Номенклатура,
|	ХарактеристикиНоменклатурыДополнительныеРеквизиты.Значение КАК Серия,
|	ПриобретениеТоваровУслугТовары.Номенклатура.Представление КАК ПредставлениеНоменклатуры,
|	ПриобретениеТоваровУслугТовары.Номенклатура.Типноменклатуры КАК ТипНоменклатуры,
|	ПриобретениеТоваровУслугТовары.Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
|	ПриобретениеТоваровУслугТовары.*
|ИЗ
|	Документ.ПриобретениеТоваровУслуг.Товары КАК ПриобретениеТоваровУслугТовары
|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры.ДополнительныеРеквизиты КАК ХарактеристикиНоменклатурыДополнительныеРеквизиты
|		ПО ПриобретениеТоваровУслугТовары.Характеристика = ХарактеристикиНоменклатурыДополнительныеРеквизиты.Ссылка
|		И ХарактеристикиНоменклатурыДополнительныеРеквизиты.Свойство = &СвойствоСерия
|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.pll_СопоставлениеНоменклатурыУППERP КАК pll_СопоставлениеНоменклатурыУППERP
|		ПО ПриобретениеТоваровУслугТовары.Номенклатура = pll_СопоставлениеНоменклатурыУППERP.НоменклатураERP
|ГДЕ
|	ПриобретениеТоваровУслугТовары.Ссылка = &Ссылка";

СвойствоСерия = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Серия продукции");
Запрос.УстановитьПараметр("Ссылка", Источник);
Запрос.УстановитьПараметр("СвойствоСерия", СвойствоСерия);

РезультатЗапроса = Запрос.Выполнить();

Если РезультатЗапроса.Пустой() Тогда
	Отказ = Истина;	
КонецЕсли;

МассивУдаляемыхКолонок = Новый Массив;
МассивУдаляемыхКолонок.Добавить("ПредставлениеНоменклатуры");
МассивУдаляемыхКолонок.Добавить("ТипНоменклатуры");
МассивУдаляемыхКолонок.Добавить("Номенклатура1");
МассивУдаляемыхКолонок.Добавить("Серия1");

Для Каждого Колонка из РезультатЗапроса.Колонки Цикл	
	НайденныйЭлемент = МассивУдаляемыхКолонок.Найти(Колонка.Имя);
	
	Если НайденныйЭлемент = Неопределено Тогда
		ТЗТовары.Колонки.Добавить(Колонка.Имя);
	КонецЕсли;
	
КонецЦикла;

ТЗУслуги = ТЗТовары.СкопироватьКолонки();

Выборка = РезультатЗапроса.Выбрать();
ПредставлениеИсточника = Строка(Источник);
Пока Выборка.Следующий() Цикл
	Если Выборка.Номенклатура = NULL Тогда
		Отказ = Истина;
		ЗначениеСобытия = Новый Структура("ИмяСобытия, ПредставлениеУровня, Комментарий, ДатаСобытия");
		ЗначениеСобытия.ИмяСобытия = "Обмен данными. Ошибка сопоставления номенклатур";
		ЗначениеСобытия.ПредставлениеУровня = "Ошибка";
		ЗначениеСобытия.Комментарий = "Для объекта "+ПредставлениеИсточника +" и номенклатуры "+Выборка.ПредставлениеНоменклатуры+
		" не найдено сопоставление номенклатур. Объект не выгружен!";
		
		Параметры.СобытияДляЖурналаРегистрации.Добавить(ЗначениеСобытия);
		//Сообщаем пользователю
		ОбщегоНазначения.СообщитьПользователю(ЗначениеСобытия.Комментарий);
		
	ИначеЕсли Выборка.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Услуга Тогда
		ТЗ = ТЗУслуги;
	Иначе
		ТЗ = ТЗТовары;
	КонецЕсли;

	Если НЕ Отказ Тогда
		СтрокаТЗ = ТЗ.Добавить();
		ЗаполнитьЗначенияСвойств(СтрокаТЗ,Выборка);
	КонецЕсли;
КонецЦикла;

Если Не Отказ Тогда	
	Если ТипЗнч(ВходящиеДанные) <> Тип("Структура") Тогда
		ВходящиеДанные = Новый Структура;
	КонецЕсли;
	ВходящиеДанные.Вставить("Товары", ТЗТовары);
	ВходящиеДанные.Вставить("Услуги", ТЗУслуги);
КонецЕсли;

 

КонвертацияДанных Обмен ИсходящиеДанные ВходящиеДанные ПравилаОбмена

См. также

SALE! 10%

Перенос данных из УПП 1.3 в ERP 2 / УТ 11 / КА 2. Переносятся документы, справочная информация и остатки

Обмен между базами 1C Платформа 1С v8.3 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Обработка позволяет перенести из УПП 1.3 в ERP / УТ 11 / КА 2 всю возможную информацию. Переносятся документы, а также начальные остатки и справочная информация. Есть фильтр по организации и множество других опциональных параметров выгрузки. Наши правила переноса в продаже с 2015 года, постоянно работаем над их развитием. Более 360 предприятий выполнили переход с использованием этого продукта. Оказываем техническую поддержку по всем вопросам проекта переноса данных из УПП 1.3.

50722 45650 руб.

04.08.2015    159267    363    266    

345

SALE! 10%

[ED3] Обмен для ERP 2.5, КА 2.5, УТ 11.5 БП 3.0, Розница, УНФ и других с EnterpriseData (универсальный формат обмена), правила обмена

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

25080 руб.

12.06.2017    134598    718    291    

387

Перенос данных из УПП 1.3 в БП 3.0. Переносятся документы (обороты за период), справочная информация и остатки

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.223.x) и БП 3.0 (3.0.149.x). Правила подходят для версии ПРОФ и КОРП.

28000 руб.

15.12.2021    20088    132    38    

90

SALE! 10%

Перенос данных из БП 3.0 в УТ 11 / КА 2 / ERP 2

Обмен между базами 1C Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Переносятся документы за выбранный период, нормативно-справочная информация и остатки по счетам бухгалтерского учета из программы "1С:БП 3.0" в "1С:УТ 11" или "1С:КА. 2" или "1С:ERP Управление предприятием, ред. 2".

50722 45650 руб.

31.10.2014    231092    124    326    

295

SALE! 10%

Перенос данных из ERP 2 / КА 2 в ЗУП 3

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Управленческий учет Платные (руб)

Обработка позволяет не только перенести все документы, справочную информацию и начальные остатки из ERP 2 или КА 2 в ЗУП 3, но и организовать регулярный перенос данных между программами 1С:ERP 2 / КА 2 и 1С:ЗУП 3. Вы можете выбрать период отбора данных и установить фильтр по организациям, чтобы выгружать только необходимую информацию. Более того, перенос оперативно обновляется при выходе новых релизов программы 1С, так что вы всегда будете иметь самую актуальную версию обработки.

48278 43450 руб.

03.12.2020    34033    80    57    

78

SALE! 10%

Перенос данных из ERP 2 / КА 2 / УТ 11 в БП 3.0

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос позволяет настроить собственный обмен данными между указанными программами, альтернативный предлагаемому фирмой 1С. Перенос данных осуществляется из 1С:ERP 2 / 1С:КА 2 / 1С:УТ 11 в 1С:БП 3.0. Правила обмена оперативно обновляются при выходе новых релизов программы 1С, так что вы всегда будете иметь самую актуальную версию обработки.

38500 34650 руб.

15.04.2019    68191    176    136    

108

Перенос данных из Парус 10 в ЗГУ ред.3

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Обмен между базами 1C Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    9155    9    8    

10

Перенос данных из УТ 10.3 в УТ 11.5. Переносятся документы (обороты за период), справочная информация и остатки

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 10 1С:Управление торговлей 11 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3 (10.3.87.x) и УТ 11.5 (11.5.16.x).

28000 руб.

23.07.2020    46019    194    64    

153
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Ibrogim 1311 19.02.20 10:28 Сейчас в теме
За теоретическую часть +

С практикой есть вопросы.
Например, уверены ли вы, что сортировка вашего массива будет всегда совпадать с сортировкой ТЗ (которую зачем то вы выгрузили из ТЧ, хотя можно было сконструировать при обходе запроса раз уж вы его всё равно обходите). Я вот не уверен, особенно если используется не MSSQL

"ДетальныеЗаписи.Номенклатура.ЕдиницаИзмерения" зачем двойное разыменование если можно получить в запросе единицу ?

Зачем вообще обходить результат в запросе если можно сразу отказаться в случае отсутствия сопоставления по какой либо позиции (например наложить условие в запросе и определить количество записей)

А зачем использовать не типовой pll_СопоставлениеНоменклатурыУППERP Когда можно пользоваться "СоответствияОбъектовИнформационныхБаз" ?
user712426; Drivingblind; +2 Ответить
2. Drivingblind 227 19.02.20 13:37 Сейчас в теме
(1)
С практикой есть вопросы.

Конечно есть. Это моя первая статья на Инфостарт, да и я сам не претендую на звание гуру 1С :)
Выложенный код не являются стопроцентно готовым решением, а, скорее, примером того, как работают Исходящие и Входящие данные. Но это вовсе не значит, что пример не должен работать.

(1)
Например, уверены ли вы, что сортировка вашего массива будет всегда совпадать с сортировкой ТЗ (которую зачем то вы выгрузили из ТЧ, хотя можно было сконструировать при обходе запроса раз уж вы его всё равно обходите). Я вот не уверен, особенно если используется не MSSQL

Да, вы правы, т.к. используется MSSQL, с такой проблемой не сталкивался. Сортировка по номеру строки не будет лишней. Спасибо за замечание. Поправлю.

"ДетальныеЗаписи.Номенклатура.ЕдиницаИзмерения" зачем двойное разыменование если можно получить в запросе единицу ?

Вы правы, нужно вынести этот момент в запрос. Исправлю.

Зачем вообще обходить результат в запросе если можно сразу отказаться в случае отсутствия сопоставления по какой либо позиции (например наложить условие в запросе и определить количество записей)

Вот тут не уверен, что это будет оптимальнее. Не знаю, что будет быстрее, два запроса (один на проверку, второй на формирование ТЧ), чем один запрос и перебор относительно небольшой (10-20 строк) табличной части. Мне кажется, это менять шило на мыло. Могу ошибаться, конечно. Плюс еще нужно выводить сообщение, какая конкретно номенклатура не сопоставлена.

А зачем использовать не типовой pll_СопоставлениеНоменклатурыУППERP Когда можно пользоваться "СоответствияОбъектовИнформационныхБаз" ?

Создан этот регистр потому, что Номенклатура в УПП не соответствует Номенклатуре в ERP напрямую, а соответствует Номенклатуре и Характеристике в ERP, но про это в тексте я не упомянул, т.к. на разработку правил обмена это никак не влияло.
3. Ibrogim 1311 19.02.20 15:07 Сейчас в теме
(2)
Не знаю, что будет быстрее, два запроса

Зачем два запроса? Можно в одном всё сделать.
Ну а то, что вы сообщаете несопоставленные номенклатуры... вы всё равно сообщаете только первую несопоставленную. Да и смысл что то сообщать?наверняка обмен автоматический и ваше "сообщить" сработает вникуда.

Да и вообще от "Сообщить" лучше отвыкать, чтоб не убирать его потом везде для получения 1С Совместимо )
22. SERGEJ64 04.05.20 11:03 Сейчас в теме
(2)
Создан этот регистр потому, что Номенклатура в УПП не соответствует Номенклатуре в ERP напрямую, а соответствует Номенклатуре и Характеристике в ERP, но про это в тексте я не упомянул, т.к. на разработку правил обмена это никак не влияло.

Добрый день! Подскажите, пжл, чем типовой регистр соответствия не подошел вам? Хочется понимать кейс. У нас аналогичная задача стоит, а согласно скриншотам вашего регистра соответствия в его структуре я не увидел характеристик. Ситуация заключалась в том, что несколько номенклатур УПП = одной номенклатуре ЕРП, но с создаваемыми в ЕРП характеристиками?
Drivingblind; +1 Ответить
23. Drivingblind 227 04.05.20 11:14 Сейчас в теме
(22)
Ситуация заключалась в том, что несколько номенклатур УПП = одной номенклатуре ЕРП, но с создаваемыми в ЕРП характеристиками?

Да, всё верно. Определенная продукция в УПП велась без учета характеристик (так исторически сложилось), а в ERP планируется вести её в разрезе характеристик. Поэтому отсутствует прямое соответствие 1:1.

Почему в итоговом коде запроса (в конце публикации) соединение идет без учета характеристик? Потому что этот вопрос пока временно был отложен, но изначальные планы были именно такие, как написано выше.
4. Eremkin 20.02.20 08:06 Сейчас в теме
Доброе утро. Автор безусловно молодец. За статью +
Вставлю свои 5 копеек про производительность. Попробуйте в ПВД вместо стандартной выборки поставить произвольный алгоритм, одним запросом собрать документы. Так же в обработке результата запроса можно сформировать ИсходящиеДаные (реквизиты + ТЧ) и использовать ВыгрузитьПоПравилу
Drivingblind; +1 Ответить
6. Drivingblind 227 24.02.20 09:13 Сейчас в теме
(4) Здравствуйте. Спасибо за оценку.

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

Да, конечно можно. Изначально при разработке правил обмена отказались от этой идеи, т.к. выгрузка идет по узлам планов обмена, а произвольный алгоритм не работал с планами обмена. Либо я не разобрался, как их подружить.
Но для примера можно и в ПВД сразу всё сделать.
8. Eremkin 24.02.20 11:59 Сейчас в теме
(6) В обработчике самой конвертации "Перед выгрузкой данных" вставить в параметры для примера

ОрганизацииВыгрузки = УзелДляОбмена.Организации.Выгрузить().ВыгрузитьКолонку("Организация");
Параметры.Вставить("ОрганизацияВыгрузки", ОрганизацииВыгрузки[0]) в

И уже в ПВД можно использовать данный параметр для выборки в запросе. Таким образом можно отсечь лишние данные.
9. Drivingblind 227 25.02.20 08:38 Сейчас в теме
(8) Вы предлагаете помещать узел обмена в параметр, а потом делать выборку запросом в ПВД наподобие следующей? Верно я понимаю?
Запрос.Текст =
"ВЫБРАТЬ ПриобретениеТоваровУслугТовары.*
|ИЗ
|	Документ.ПриобретениеТоваровУслуг.Товары КАК ПриобретениеТоваровУслугТовары
|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПриобретениеТоваровУслуг.Изменения КАК ПриобретениеТоваровУслугИзменения 
|		ПО ПриобретениеТоваровУслугИзменения.Ссылка = ПриобретениеТоваровУслугТовары.Ссылка
|ГДЕ
|	ПриобретениеТоваровУслугИзменения = &Узел";

Запрос.УстановитьПараметр("Узел", Параметры.УзелОбмена);
Показать
10. Eremkin 25.02.20 10:04 Сейчас в теме
(9)Добрый день. Мне не совсем понятно все таки для чего вам узел обмена? Какая проблема решается?
12. Drivingblind 227 26.02.20 05:26 Сейчас в теме
(10) Здравствуйте. Узел обмена нужен для выборки объектов, зарегистрированных в узле. Обмен происходит не всеми объектами, а только зарегистрированными в узле.
13. Eremkin 26.02.20 07:42 Сейчас в теме
(12) ага, становится более понятнее. При конвертации и так берутся только те объекты, которые зарегистрированы в узле. Или у вас какой-нибудь самописный план обмена, где для документов по крайней мере стоит признак авторегистрация? И не требуются выгружать документы с каким-либо призраком? Давайте копнем ещё. Какая проблема возникает после конвертации в базе приемнике?
14. Drivingblind 227 26.02.20 08:17 Сейчас в теме
(13) Не совсем понимаю, о чем вы. Да, есть планы обменов, в которых регистрируются объекты к обмену. Каждый раз переносить все документы не нужно. Переносятся только зарегистрированные в узле.
Если мы установим узел обмена в обработке Универсальный обмен xml и попытаемся сделать произвольный алгоритм ПВД -- получим ошибку, о чем я уже писал выше.

(13)
Давайте копнем ещё. Какая проблема возникает после конвертации в базе приемнике?

Тоже не совсем понимаю. Пока никакая.
15. Eremkin 26.02.20 13:17 Сейчас в теме
(14)Так-с, еще интереснее стало. Вы открываете внешнюю обработку Универсальный обмен xml, устанавливаете узел обмена для отбора и пытаетесь выгрузить в файл? Верно? Или мы с вами о разных вещах говорим?
16. Drivingblind 227 26.02.20 13:40 Сейчас в теме
(15) Да, именно это.
Прикрепленные файлы:
17. Eremkin 27.02.20 10:53 Сейчас в теме
(16) Я сегодня вечером дома постараюсь посмотреть. Где-то аналогичный кейс у меня был по решению такой задачи
18. Eremkin 27.02.20 22:31 Сейчас в теме
(17)Попробовал простенький пример. Вроде все норм получилось
Прикрепленные файлы:
Drivingblind; +1 Ответить
19. Drivingblind 227 28.02.20 05:36 Сейчас в теме
(18) в комментарии (9) я именно про это и написал :D
в любом случае, спасибо за идею. Статью дополню, как будет время свободное.
20. Eremkin 28.02.20 07:11 Сейчас в теме
(19)да, но я хотел проверить все-таки ))
21. Drivingblind 227 29.04.20 19:31 Сейчас в теме
(4)
(1)
Обновил статью, исправил всякие ошибки и обращения через точку. Спасибо за критику
5. Megaiff 21.02.20 00:09 Сейчас в теме
в первую очередь + за картинку точно себя увидел. Особенно когда не так часто пользуешься. А то помню смотрел Гилева все делал но без практики и задач вылетает из головы все а тут так много тонкостей ))
Drivingblind; +1 Ответить
7. Drivingblind 227 24.02.20 09:15 Сейчас в теме
(5) мне очень помогли видеоуроки Ильи Леонтьева по КД2 на YouTube. Для начинающих, мне кажется, самое то
ybatiaev; AndrewKop; Megaiff; acanta; +4 Ответить
11. Megaiff 25.02.20 22:59 Сейчас в теме
(7)
Ильи Леонтьева

Спасибо за инфу. Нашел может кому то пригодится
Не реклама https://www.youtube.com/channel/UCtSVt800z-nHQK0fAFENX-A/videos.
ybatiaev; +1 Ответить
24. Yashazz 4707 04.05.20 12:42 Сейчас в теме
Да. Для совсем начинающих - полезная статья.
25. e-9 60 30.06.20 15:50 Сейчас в теме
Своим гражданским долгом считаю везде, где только идет речь про Вх/ИсходящиеДанные, предупредить о "обмане" КД2 - см. скрин. А именно: в обработчике ПВД "Перед выгрузкой" нужно объявлять ВХодящиеДанные, а не ИсходящиеДанные - если потом мы хотим в каких-то ПКС получать значения из входящих данных.
(Убил кучу времени, пока понял, что тут ошибка в мануале)
Прикрепленные файлы:
avbolshakov; +1 Ответить
26. Drivingblind 227 02.07.20 17:59 Сейчас в теме
(25) Там следующая логика:
1) ПВД.ИсходящиеДанные -> ПКО.ВходящиеДанные
2) ПКО.ВходящиеДанные -> ПКС.ВходящиеДанные
3) ПКС.ИсходящиеДанные -> ПКО.ВходящиеДанные
27. e-9 60 03.07.20 12:25 Сейчас в теме
(26) я умею читать) даже мануалы. Откуда Вы и скопировали "логику". А в мануале нет деления на конкретные обработчики.
Перечитайте пожалуйста мое сообщение: в обработчике ПВД "Перед выгрузкой" - не так, как написано в информации по обработчикам. Можете проверить - объявите именно в этом обработчике Исходящие данные, и попробуйте в ПКО, заполнить в каком-то ПКС значение из входящих данных.
28. Drivingblind 227 04.07.20 07:34 Сейчас в теме
(27) да я и не скрываю, что взял оттуда :)
Проверю у себя, если ошибка воспроизведется, дополню статью.
35. avbolshakov 28.06.21 17:26 Сейчас в теме
(25)Спасибо, вы правы.
Если в ПВД Перед выгрузкой вызвать ВыгрузитьПоПравилу и попытаться через Исходящие данные передать в ПКО структуру, то ничего не выходит. Если передавать через ВходящиеДанные, то выходит. Еще раз спасибо
29. user598655_ilia-bers 28.07.20 15:14 Сейчас в теме
Непонятно, зачем создается в ПВД, структура ВходящиеДанные и больше никак не обрабатывается, если мы можем создать ее в ПКО и там заполнить. Я вроде бы все сделал как описано, в файл выгружается, но не загружается, причем никаких ошибок не пишет. Еще непонятно нужно ли ставить галочку на свойствах табличной части. Подскажите пожалуйста кто в курсе, с чем это может быть связано.
Прикрепленные файлы:
30. Drivingblind 227 29.07.20 07:02 Сейчас в теме
(29)
Непонятно, зачем создается в ПВД, структура ВходящиеДанные и больше никак не обрабатывается, если мы можем создать ее в ПКО и там заполнить

Можно один раз объявить ВходящиеДанные в ПВД, чтобы не объявлять каждый раз в ПКО. Еще, как вариант, можно передавать таким образом данные между объектами в пределах одного ПКО. Либо просто создали, например, для отладки и нигде не используют. Такой вариант тоже нельзя исключать.

Я вроде бы все сделал как описано, в файл выгружается, но не загружается, причем никаких ошибок не пишет

Исходящие и входящие данные отрабатывают только на стороне источника. Если в файл выгружаются корректные данные, значит проблема в чем-то другом. Смотрели сам файл с выгрузкой?

Еще непонятно нужно ли ставить галочку на свойствах табличной части

Если всю ТЧ получаем из входящих данных, то не нужно. Главное, чтобы совпадали имени колонок в исходящих данных и в самой ТЧ.
31. Drivingblind 227 29.07.20 07:38 Сейчас в теме
(29)
в файл выгружается, но не загружается

Если не загружается, проверьте еще вот эти галочки в настройках ПКО
Прикрепленные файлы:
32. Aleksandr_prof 189 26.05.21 12:49 Сейчас в теме
Поясните правила передачи данных. Вообще не понял:
1) ПВД.ИсходящиеДанные -> ПКО.ВходящиеДанные
2) ПКО.ВходящиеДанные -> ПКС.ВходящиеДанные
3) ПКС.ИсходящиеДанные -> ПКО.ВходящиеДанные

Получается в ПВД есть одновременно 2 переменные ИсходящиеДанные и ВходящиеДанные? Или как?
33. Drivingblind 227 27.05.21 06:01 Сейчас в теме
(32)
ПВД.ИсходящиеДанные -> ПКО.ВходящиеДанные

Это значит следующее: В ПВД существует параметр ИсходящиеДанные. Мы помещаем в ИсходящиеДанные какую-либо информацию. Для того, чтобы получить эту информацию уже в ПКО, нужно обращаться к параметру ВходящиеДанные.

Получается в ПВД есть одновременно 2 переменные ИсходящиеДанные и ВходящиеДанные? Или как?

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

А вообще, рекомендую встать отладчиком в правилах и посмотреть, как что и куда передается.
Aleksandr_prof; +1 Ответить
34. Aleksandr_prof 189 27.05.21 07:38 Сейчас в теме
(33) Всё понял! Спасибо огромное за разъяснения!
36. ilshatkin 14.12.22 21:36 Сейчас в теме
Всегда с теплой грустью вспоминаю 7.7 с com обменом, когда за полчаса можно выгрузить и загрузить любые данные. Автору большое спасибо!!! Вам надо заниматься тем, что заумные мануалы компании 1с переводить в простой для понимания формат.
37. yaroslav.artem 07.02.23 20:53 Сейчас в теме
Ой долго тупил с Входящими Исходящими данными, по этому примеру всё понял, Спасибо автору!
Оставьте свое сообщение