Обмен через универсальный формат. Пример нестандартной конвертации данных

25.05.21

Интеграция - Файловый обмен (TXT, XML, DBF), FTP

В статье описан небольшой пример обмена данными через EnterpriseData без снятия конфигурации с поддержки. Тестовая площадка: Управление торговлей, редакция 11 (11.4.3.126), версия платформы 8.3.11

Обмен через универсальный формат широко используется в типовых конфигурациях. Для ознакомления есть хорошая статья //infostart.ru/public/695523/, также множество различных курсов, в которых разложены основные моменты по работе с правилами конвертации, синхронизации объектов метаданных.

Основной принцип создания "нестандартных" правил обмена заключается в доработке модуля "МенеджерОбменаЧерезУниверсальныйФормат" (в различных конфигурациях название может немного отличаться). Но что делать, если в компании участвуют несколько баз данных - стандартных, самописных (неважно), между которыми идет активный обмен данными EnterpriseData - и на каждый узел обмена могут действовать свои специфические правила?

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

Рассмотрим пример передачи данных из базы УТ 11.3 в идентичную по структуре базу данных "Дочерняя УТ 11.3". 

Постановка задачи: в основной базе данных производятся продажи товаров специфическому контрагенту, который является "дочерней фирмой" по отношению к основной. Необходимо реализовать "одностороннее" правило обмена "Реализации товаров и услуг -> Поступления товаров и услуг" по контрагенту с фиксированным ИНН.

Сокращения:

ЦБ - база-источник УТ 11.3, из которой идет выгрузка документов "Реализации товаров и услуг"

УТ - база приемник, в которой при обмене создаются "Поступления товаров"

ED - универсальный обмен (EnterpriseData)

В базе ЦБ создаются и проводятся "Реализации товаров" - и после проведения регистрируются в обмене ED, далее происходит обмен (через фоновое задание, либо вручную через каталог обмена). В при этом документ "Реализация товаров" должен "превратиться" в "Поступление товаров и услуг", а контрагент и организация "поменяться местами".

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

Предположим, что у нас настроен обмен, при котором главный узел организации-источника имеет код "ЦБ", а узел приемника код "УТ".

База-источник:

База-приемник:

Для начала создадим расширение конфигурации: назовем его, для примера "РасширениеОбмен" - и добавим модули, которые нам нужны для решения задачи.

1.Установка активного узла обмена в параметре сеанса. К сожалению, в процессе обмена не всегда можно получить активный узел, для которого происходит обмен. В процессе самого обмена данными структура данных "КомпонентыОбмена", содержащая все настройки обмена ED (в том числе ссылку на узел обмена) доступна не в каждой процедуре при обмене данными: например, при непосредственном заполнении перечня правил обмена "МенеджерОбменаЧерезУниверсальныйФормат.ЗаполнитьПравилаОбработкиДанных" этой переменной в параметрах нет.

На этапе инициализации обмена данными установим код узла обмена в параметры сеанса:

&Перед("ИнициализироватьТаблицыПравилОбмена")
Процедура РасшОбмен_ИнициализироватьТаблицыПравилОбмена(КомпонентыОбмена) Экспорт
	
	Если КомпонентыОбмена.УзелКорреспондента <> Неопределено Тогда
	
		Буф = Новый Структура(ПараметрыСеанса.БуферОбмена);
		Буф.Вставить("КомпонентыОбмена_УзелКорреспондента_Код", КомпонентыОбмена.УзелКорреспондента.Код);
		ПараметрыСеанса.БуферОбмена = Новый ФиксированнаяСтруктура(Буф);
	
	КонецЕсли;
	
КонецПроцедуры

 

2. Регистрация объектов. Также необходимо выделить перечень объектов, необходимых для регистрации в нужном нам узле универсального обмена. Это можно сделать, отредактировав правила регистрации объектов с использованием конфигурации "Конвертер 2.1", но в случае с расширением достаточно переопределить работу функции, разбирающей правила регистрации. В задании для нашего узла обмена нам нужны совсем "немногие" ссылки на объекты, остальное необходимо "отсечь".

Регистрироваться будет документ "Реализации товаров и услуг" и некоторые входящие в него ссылки: организация, контрагент, валюта, склад.

 
Код изменения правил регистрации объектов
&После("ВыполнитьПравилаРегистрацииОбъектовДляПланаОбмена")
// Процедура-обертка, выполняет код основной процедуры в режиме попытки
// (см. ВыполнитьПравилаРегистрацииОбъектовДляПланаОбменаПопыткаИсключение).
//
// Параметры:
//  МассивУзловРезультат - Массив - массив узлов получателей плана обмена ИмяПланаОбмена,
//   для которых необходимо выполнить регистрацию.
//  Объект - Произвольный - изменяемые данные: объект, набор записей, константа или сведения об удалении объекта.
//  ИмяПланаОбмена - Строка - имя плана обмена, для которого выполняется механизм регистрации.
//  ДополнительныеПараметры - Структура - уточняющие сведения об изменяемых данных:
//    * ОбъектМетаданных - ОбъектМетаданных - объект метаданных, которому соответствуют изменяемые данные. Обязательный.
//    * ЭтоРегистр - Булево - значение Истина означает, что обрабатывается регистр.
//        Необязательный, значение по умолчанию Ложь.
//    * ЭтоУдалениеОбъекта - Булево - значение Истина означает, что обрабатывается удаление объекта.
//        Необязательный, значение по умолчанию Ложь.
//    * РежимЗаписи - см. в синтаксис-помощнике РежимЗаписиДокумента - режим записи документа (только для документов).
//        Необязательный, значение по умолчанию Неопределено.
//    * Замещение - Булево - режим записи регистра (только для регистров).
//        Необязательный, значение по умолчанию Неопределено.
//    * ПроверятьСсылку - Булево - признак необходимости учитывать версию данных на момент до их изменения.
//        Необязательный, значение по умолчанию Ложь.
//    * Выгрузка - Булево - параметр определяет контекст выполнения правила регистрации.
//        Истина - правило регистрации выполняется в контексте выгрузки объекта.
//        Ложь - правило регистрации выполняется в контексте перед записью объекта.
//        Необязательный, значение по умолчанию Ложь.
//
Процедура РасшОбмен_ВыполнитьПравилаРегистрацииОбъектовДляПланаОбмена(МассивУзловРезультат, Объект, ИмяПланаОбмена, ДополнительныеПараметры)
	
	Если ИмяПланаОбмена = "СинхронизацияДанныхЧерезУниверсальныйФормат" Тогда 
		
		//ищем входит ли регистрируемый объект ключевой узел обмена с кодом "УТ"
		ПОСсылка = Неопределено;
		Для каждого ТекУзел Из МассивУзловРезультат Цикл
			Если ТипЗнч(ТекУзел.Ссылка) = Тип("ПланОбменаСсылка."+ИмяПланаОбмена) И ТекУзел.Код = "УТ" Тогда
				ПОСсылка = ТекУзел.Ссылка
			КонецЕсли;
		КонецЦикла;
		
		Если ПОСсылка <> Неопределено Тогда
		
			Если ТипЗнч(Объект) = Тип("ДокументОбъект.РеализацияТоваровУслуг") Тогда
				
				//проверяем, является ли контрагент по документу реализации "фирмой", ИНН которой есть среди "Справочник.Организации"
				ЭтоОрганизация = ложь;
				Выборка = Справочники.Организации.выбрать();
				Пока Выборка.Следующий() Цикл
					Если НЕ Выборка.ПометкаУдаления И Выборка.ИНН = Объект.Контрагент.ИНН Тогда
						ЭтоОрганизация = истина;
					КонецЕсли;
				КонецЦикла;
				
				Если Не ЭтоОрганизация Тогда
					МассивУзловРезультат.Удалить(МассивУзловРезультат.Найти(ПОСсылка));
					Возврат
				КонецЕсли;
				
				// для регистрации данных в файле обмена должны появиться не только сам документ-реализация, 
				// но и определенный перечень ссылок из объекта: так как возможно, что какой-то из объектов "уходит"
				// в приемник в 1-й раз
				МассивСсылок = новый Массив;
				МассивСсылок.Добавить(Объект.Организация);
				МассивСсылок.Добавить(Объект.Контрагент);
				МассивСсылок.Добавить(Объект.Склад);
				МассивСсылок.Добавить(Объект.Валюта);
				
				Для каждого ТекСтрока Из Объект.Товары Цикл
					МассивСсылок.Добавить(ТекСтрока.Номенклатура);
					ПолучитьСсылкиВнутриОбъекта(ТекСтрока.Номенклатура, МассивСсылок);
					Если Не ТекСтрока.Упаковка.Пустая() Тогда
						МассивСсылок.Добавить(ТекСтрока.Упаковка);
					КонецЕсли;
				КонецЦикла;
				Взаимодействия.УдалитьПовторяющиесяЭлементыМассива(МассивСсылок);
				
				Для каждого ТекСсылка Из МассивСсылок Цикл
					Если ТекСсылка  = Объект.Ссылка Тогда 
						Продолжить;
					ИначеЕсли Не ЗначениеЗаполнено(ТекСсылка) Тогда 
						Продолжить;
					ИначеЕсли Метаданные.ПланыОбмена[ИмяПланаОбмена].Состав.Найти(ТекСсылка.Метаданные()) = Неопределено тогда
						Продолжить;
					КонецЕсли;
					ОбъектПоСсылке = ТекСсылка.ПолучитьОбъект();
					ОбъектПоСсылке.ДополнительныеСвойства.Вставить("РегистрироватьОбмен", истина);
					ПланыОбмена.ЗарегистрироватьИзменения(ПОСсылка, ОбъектПоСсылке);
				КонецЦикла;
				
			ИначеЕсли Не Объект.ДополнительныеСвойства.Свойство("РегистрироватьОбмен") Тогда
				МассивУзловРезультат.Удалить(МассивУзловРезультат.Найти(ПОСсылка));
			КонецЕсли;
		
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

 

Также создана простая дополнительная процедура, которая "собирает" все подчиненные ссылки объекта в массив

 
 Процедура сбора подчиненных ссылок объекта
// собирает рекурсивно ссылки из объекта "ОбъектИлиСсылка" в массив "МассивСсылок"
Процедура ПолучитьСсылкиВнутриОбъекта(ОбъектИлиСсылка, МассивСсылок)
	
	Если ОбщегоНазначения.ЭтоПеречисление(ОбъектИлиСсылка.Метаданные()) Тогда
		Возврат
	ИначеЕсли МассивСсылок.Найти(ОбъектИлиСсылка) <> Неопределено Тогда
		Возврат
	КонецЕсли;
	МассивСсылок.Добавить(ОбъектИлиСсылка.Ссылка);
	
	Для каждого ТекМД Из ОбъектИлиСсылка.Метаданные().Реквизиты Цикл
		
		Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(ОбъектИлиСсылка[ТекМД.Имя])) И Не ОбъектИлиСсылка[ТекМД.Имя].Пустая() Тогда
			ПолучитьСсылкиВнутриОбъекта(ОбъектИлиСсылка[ТекМД.Имя], МассивСсылок)
		КонецЕсли;
	
	КонецЦикла;
	
	Для каждого ТекМДТЧ Из ОбъектИлиСсылка.Метаданные().ТабличныеЧасти Цикл
		
		Для каждого ТекСтрока Из ОбъектИлиСсылка[ТекМДТЧ.Имя] Цикл
		
			Для каждого ТекМД Из ОбъектИлиСсылка.Метаданные().ТабличныеЧасти[ТекМДТЧ.Имя].Реквизиты Цикл
				Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(ТекСтрока[ТекМД.Имя])) И Не ТекСтрока[ТекМД.Имя].Пустая() Тогда
					ПолучитьСсылкиВнутриОбъекта(ТекСтрока[ТекМД.Имя], МассивСсылок)
				КонецЕсли;
			КонецЦикла;
		
		КонецЦикла;
		
	КонецЦикла;
	
КонецПроцедуры

 

3. Создание правил отправки данных. Все правила конвертации/отправки/получения данных находятся в модуле "МенеджерОбменаЧерезУниверсальныйФормат". Данный модуль содержит множество стандартных правил обмена - необходимо добавить к ним несколько "своих" правил конвертации. Новых правил можно выделить 3:

  • Реализация товаров, услуг -> Поступление товаров,услуг
  • Организации -> Контрагенты
  • Контрагенты -> Организации

Для создания правил можно использовать конфигурацию "Конвертер 3.0", но в целом можно просто использовать функции из типового модуля МенеджерОбменаЧерезУниверсальныйФормат как шаблоны методом "копи-пасты".

В результате получилась область с набором процедур следующего вида:

 
Функционал новых правил отправки объектов

4. Создание правил получения данных. На каждое правило отправки данных должно быть введено хотя бы одно правило получения: выгруженный файл нужно каким-то образом загрузить в приемник.

Для создания правил получения можно воспользоваться конвертером 3.0, можно написать правила вручную (используя существующие примеры в модуле обмена).

 

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

 
 Код получения Поступления товаров,услуг

4.2. Правила получения контрагентов, организаций. На данном этапе сталкиваемся с 2-мя проблемами: 

  • Типовые функции модуля "МенеджерОбменаЧерезУниверсальныйФормат" конфликтуют с функциями, которые создаются в расширении. Если для организации или контрагента уже существует хотя бы одно  правило обмена - то система при получении найдет именно его и будет его использовать при конвертации. Нам это не подходит - тем самым необходимо программно удалять,либо изменять типовые правила получения.

  • Все (или почти все) типовые правила получения данных имеют вариант идентификации объектов "ПоУникальномуИдентификатору", что зачастую не подходит для решения задач обмена. В нашем примере в базах данных проводился независимый учет данных - тем самым при первом же обмене получим дублирование организаций, контрагентов итд...

Определим порядок поиска контрагентов и организаций: вариант идентификации "ПоПолямПоиска" и поля поиска "ИНН,КПП". Код обработки получения организаций, контрагентов примерно следующий:

 
 Код правил получения организаций и контрагентов

4.3. Прочие правила получения. Проблема идентификации остается актуальной и для прочих ссылочных объектов: нам не нужны дубли номенклатуры итд... Для остальных объектов решено использовать вариант синхронизации "СначалаПоУникальномуИдентификаторуПотомПоПолямПоиска" - в этом случае идет поиск сначала по идентификатору, потом по полям поиска (если по идентификатору) не найдено. Также при этом используется специальный регистр соответствий ссылок, в котором можно задать соответствия ссылок объектов (подробно углубляться не будем, есть курсы и статьи, в которых это описано).

 
 Код изменения типовых правил получения данных

5. Служебные функции по обмену данными. Чтобы указанные изменения были инициализированы - нужно доработать типовые функции по заполнению правил, отработке алгоритмов итд..., иначе вышеописанные изменения не будут работать. Если вы используете конфигурацию "Конвертация данных 3.0" - то служебные функции будут автоматически созданы вместе с правилами конвертации и отправки, но можно без особого труда написать функции вручную (в нашем примере нестандартных правил немного).

Код дозаполнения правил конвертации:

&После("ЗаполнитьПравилаКонвертацииОбъектов")
Процедура РасшОбмен_ЗаполнитьПравилаКонвертацииОбъектов(НаправлениеОбмена, ПравилаКонвертации) Экспорт
	
	//фильтр по узлам источника/применика
	Если ПараметрыСеанса.БуферОбмена.Свойство("КомпонентыОбмена_УзелКорреспондента_Код") Тогда
		Если НаправлениеОбмена = "Отправка" И ПараметрыСеанса.БуферОбмена.КомпонентыОбмена_УзелКорреспондента_Код = "УТ" Тогда
		ИначеЕсли НаправлениеОбмена = "Получение" И ПараметрыСеанса.БуферОбмена.КомпонентыОбмена_УзелКорреспондента_Код =  "ЦБ" Тогда
		Иначе
			Возврат
		КонецЕсли;
	КонецЕсли;

	Если НаправлениеОбмена = "Отправка" Тогда
		ДобавитьПКО_Документ_Расход_Приход(ПравилаКонвертации);
		ДобавитьПКО_Справочник_Контрагенты_Организации(ПравилаКонвертации);
		ДобавитьПКО_Справочник_Организации_Контрагенты(ПравилаКонвертации);
		
	ИначеЕсли НаправлениеОбмена = "Получение" Тогда
		ДобавитьПКО_Документ_Расход_Приход_Получение(ПравилаКонвертации);
		ИзменитьПКО_Справочники_Получение(ПравилаКонвертации);
		РасшОбмен_ДобавитьПКО_Справочник_Контрагенты_Получение(ПравилаКонвертации);
		РасшОбмен_ДобавитьПКО_Справочник_Организации_Получение(ПравилаКонвертации);
		
	КонецЕсли;
	
КонецПроцедуры

Код дополнения правил обработки данных:

&После("ЗаполнитьПравилаОбработкиДанных")
Процедура РасшОбмен_ЗаполнитьПравилаОбработкиДанных(НаправлениеОбмена, ПравилаОбработкиДанных) Экспорт
	
	//фильтр по узлам источника/применика
	Если ПараметрыСеанса.БуферОбмена.Свойство("КомпонентыОбмена_УзелКорреспондента_Код") Тогда
		Если НаправлениеОбмена = "Отправка" И ПараметрыСеанса.БуферОбмена.КомпонентыОбмена_УзелКорреспондента_Код = "УТ" Тогда
		ИначеЕсли НаправлениеОбмена = "Получение" И ПараметрыСеанса.БуферОбмена.КомпонентыОбмена_УзелКорреспондента_Код =  "ЦБ" Тогда
		Иначе
			Возврат
		КонецЕсли;
	КонецЕсли;
	
	Если НаправлениеОбмена = "Отправка" Тогда
		Если ПравилаОбработкиДанных.Колонки.Найти("ОчисткаДанных") = Неопределено Тогда
			ПравилаОбработкиДанных.Колонки.Добавить("ОчисткаДанных");
		КонецЕсли;
		
		ДобавитьПОД_Документ_Расход_Приход(ПравилаОбработкиДанных);
		ДобавитьПОД_Справочник_Контрагенты_Организации(ПравилаОбработкиДанных);
		ДобавитьПОД_Справочник_Организации_Контрагенты(ПравилаОбработкиДанных);
		
	ИначеЕсли НаправлениеОбмена = "Получение" Тогда
		//ПравилаОбработкиДанных.Удалить(ПравилаОбработкиДанных.Найти("Документ.ПоступлениеТоваровУслуг", "ОбъектВыборкиФормат"));

	КонецЕсли;
	
КонецПроцедуры

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

	//добавим свое спец.правило
	ПравилоОбработки                         = ПравилаОбработкиДанных.Добавить();
	ПравилоОбработки.Имя                     = "Справочник_Контрагенты_Организации";
	ПравилоОбработки.ОбъектВыборкиМетаданные = Метаданные.Справочники.Контрагенты;
	ПравилоОбработки.ОчисткаДанных           = Ложь;
	ПравилоОбработки.ИспользуемыеПКО.Добавить("Справочник_Контрагенты_Организации");
	
КонецПроцедуры
#КонецОбласти
#Область Справочник_Организации_Контрагенты
Процедура ДобавитьПОД_Справочник_Организации_Контрагенты(ПравилаОбработкиДанных)
	
	//удалим типовое правило
	ПравилоОбработки = ПравилаОбработкиДанных.Найти(Метаданные.Справочники.Организации, "ОбъектВыборкиМетаданные");
	ПравилаОбработкиДанных.Удалить(ПравилоОбработки);

	//добавим свое спец.правило
	ПравилоОбработки                         = ПравилаОбработкиДанных.Добавить();
	ПравилоОбработки.Имя                     = "Справочник_Организации_Контрагенты";
	ПравилоОбработки.ОбъектВыборкиМетаданные = Метаданные.Справочники.Организации;
	ПравилоОбработки.ОчисткаДанных           = Ложь;
	ПравилоОбработки.ИспользуемыеПКО.Добавить("Справочник_Организации_Контрагенты");
	
КонецПроцедуры
#КонецОбласти
#КонецОбласти

Выполнение спец.событий при обмене данными:

#Область ОбщегоНазначения
// Процедура-обертка, выполняет запуск указанной в параметрах процедуры модуля менеджера обмена через формат.
//
// Параметры:
//  ИмяПроцедуры - строка.
//  СтруктураПараметров - структура, содержащая передаваемые параметры.
&После("ВыполнитьПроцедуруМодуляМенеджера")
Процедура Расш_ВыполнитьПроцедуруМодуляМенеджера(ИмяПроцедуры, Параметры) Экспорт
	
	Если ИмяПроцедуры = "ПКО_Документ_Расход_Приход_ПриОтправкеДанных" Тогда 
		ПКО_Документ_Расход_Приход_ПриОтправкеДанных(
			Параметры.ДанныеИБ, Параметры.ДанныеXDTO, Параметры.КомпонентыОбмена, Параметры.СтекВыгрузки);
	ИначеЕсли ИмяПроцедуры = "ПКО_Документ_Расход_Приход_Получение_ПриКонвертацииДанныхXDTO" Тогда 
		ПКО_Документ_Расход_Приход_Получение_ПриКонвертацииДанныхXDTO(
			Параметры.ДанныеXDTO, Параметры.ПолученныеДанные, Параметры.КомпонентыОбмена);
		КонецЕсли;
		
КонецПроцедуры

#КонецОбласти

 

На этом доработки правил обмена практически завершены - осталось только очистить регистрацию выгруженных данных из узла плана обмена. В модуле "ОбменДаннымиXDTOСервер" допишем функцию по очистке регистрации, в случае если обмен был завершен без ошибок:

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

 

Завершающим шагом в режиме Конфигуратора добавляем в обе базы данных созданное расширение - оно должно работать как в источнике, так и в приемнике.

После создания расширения для начала можно "потестировать" обмен в режиме выгрузки файла в каталог, чтобы сразу не использовать прямое подключение к другой базе (вдруг на этапе выгрузки какие-то ошибки вскроются). Для примера проведем некий документ "реализации товаров и услуг" - после чего он должен появиться в списке зарегистрированных изменений для узла обмена "УТ":

После этого проводим синхронизацию данных: в результате в каталоге обмена должен появиться xml-файл, среди узлов которого присутствует некий документ "Поступление товаров и услуг" с номером и товарами выгруженного документа-реализации:

 

См. также

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    159287    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    134617    719    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    20097    132    38    

90

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    34042    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    68206    176    136    

108

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

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

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

60000 руб.

05.10.2022    9156    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    46026    194    64    

153

Перенос данных из Камин 3.0, 4.0, 5.0 в ЗУП 3.х

Обмен между базами 1C Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет НДФЛ ФОМС, ЕФС Платные (руб)

Обработки для быстрого перехода с конфигураций «КАМИН:Расчет заработной платы 3.0», «КАМИН:Зарплата для бизнеса 4.0» и «КАМИН:Зарплата 5.0» на конфигурацию «Зарплата и управление персоналом» версии 3.1.

12000 руб.

25.09.2016    77260    276    247    

240
Вознаграждение за ответ
Показать полностью
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. shutilin 19.06.18 09:21 Сейчас в теме
"Но что делать, если в компании участвуют несколько баз данных - стандартных, самописных (неважно), между которыми идет активный обмен данными EnterpriseData - и на каждый узел обмена могут действовать свои специфические правила?"

Обычно в таких случаях модуль обмена помещаем в модуль внешней обработки,
и при настройке обмена указываем путь к ней. Разве так не проще?
Alien_job; +1 Ответить
5. Leits 1 08.08.18 15:15 Сейчас в теме
(1) мне на партнерском портале отвечали что в новых версия так уже не прокатит - типа юзайте расширения :)
2. artkor 244 19.06.18 09:36 Сейчас в теме
Изначально так и делалось, только с отладкой "замучался" - пока не знаю способа отладки внешней обработки в режиме "Подключить". Принцип одинаковый, но имхо через расширение в разы удобнее делать, если совместимость конфы позволяет :)
Alien_job; +1 Ответить
4. MaxS 2823 19.06.18 15:47 Сейчас в теме
(2) В этой статье указана ссылка на статью, где описано как отлаживать внешние обработки с правилами. ;)
3. acanta 19.06.18 11:33 Сейчас в теме
Я тоже с этим столкнулась. Не понимаю, почему в узел нельзя добавить какой нибудь реквизит, чтобы обозначить по какой конвертации он работает - 2й или 3ей?
План обмена полный может быть один (регистрируются все). А узлы по одному переводить правильнее (разные релизы периферийных баз могут же быть).
6. kolya_tlt 85 08.08.18 17:07 Сейчас в теме
спасибо за идею, как раз нужно почти тоже самое. но гонять каждый раз ссылочные данные документов (номенклатуру, контрагенты и т.д.) избыточно.
7. KRIHA 111 05.06.19 10:39 Сейчас в теме
Подскажите пожалуйста, в

Процедура РасшОбмен_ВыполнитьПравилаРегистрацииОбъектовДляПланаОбмена(МассивУзловРезультат, Объект, ИмяПланаОбмена, ДополнительныеПараметры)


в месте:

Для каждого ТекСтрока Из Объект.Товары Цикл
					МассивСсылок.Добавить(ТекСтрока.Номенклатура);
					ПолучитьСсылкиВнутриОбъекта(ТекСтрока.Номенклатура.Родитель, МассивСсылок);
					Если Не ТекСтрока.Упаковка.Пустая() Тогда
						МассивСсылок.Добавить(ТекСтрока.Упаковка);
					КонецЕсли;
				КонецЦикла;


ПолучитьСсылкиВнутриОбъекта(ТекСтрока.Номенклатура.   ->Родитель<-    , МассивСсылок);
Показать

в чем смысл этой строки?
8. artkor 244 05.06.19 10:55 Сейчас в теме
(7) Цель - собрать все ссылки внутри номенклатуры, чтобы в приемнике не было "сюрпризов" вида "<Объект не найден...>" внутри карточки товара и всех объектов по цепочке. Возможно там ошибка в коде "ТекСтрока.Номенклатура.Родитель", а надо просто "ТекСтрока.Номенклатура", спасибо что заметили ;) надо в рабочем проекте проверить...
9. KRIHA 111 05.06.19 10:59 Сейчас в теме
да, я про "родителя" и написал ))
10. KRIHA 111 05.06.19 16:59 Сейчас в теме
Кстати, вопрос с самого начала, у меня:

КомпонентыОбмена.УзелКорреспондента.Код равен "90af25b2-c4cc-4890-a62a-418ec3a70977", и до буквенного префикса (в отладчике смотрю) - даже не знаю как к нему подобраться.
11. artkor 244 05.06.19 21:54 Сейчас в теме
(10) Обычно все безвыходные ситуации в новых "конфах" на 8.3.10 и выше решаю расширениями: можно и процедуры переопределить и нужные реквизиты на форму выложить...
12. KRIHA 111 06.06.19 09:24 Сейчас в теме
да обойти понятно как - по наименованию тому же - суть не в этом - поменялась там логика немного - ымей ввиду )
13. pvlunegov 157 03.09.20 08:02 Сейчас в теме
В данной публикации упоминаются конфигурации "Конвертер 2.1", "Конвертер 3". Первый раз слышу о таких конфигурациях, в интернете не нашел таких.
Может быть, имеются ввиду конфигурации "Конвертация данных 2.1", "Конвертация данных 3" ?
14. artkor 244 03.09.20 23:40 Сейчас в теме
(13) Да, Имелась ввиду "Конвертация данных" 2.1, 3.0, вы точное название огласили)
15. user811769 13 28.01.21 21:12 Сейчас в теме
artkor, спасибо тебе огромное за труды! твой опыт очень помог мне!
16. artkor 244 29.01.21 00:17 Сейчас в теме +0.5 $m
(15) Пожалуйста! Я вообще чувак самокритичный - долго думал писать/не писать. Хотелось явить сообществу что-то хоть немного годное. Рад что вам понравилось =)
17. user811769 13 29.01.21 12:29 Сейчас в теме
(16) у тебя активна кнопочка отметить ответ вознаграждением?) отметь любой свой ответ, пожалуйста)))
18. user811769 13 29.01.21 12:30 Сейчас в теме
(16) и кстати, может быть, ты бы мог мне ещё кое-что подсказать? по поводу конвертации 1 ко многим
19. khnatik 30.04.21 16:08 Сейчас в теме
Добрый день!
Подскажите пожалуйста, можно ли через МенеджерОбменаЧерезУниверсальныйФормат передавать данные, которые не являются реквизитами объектов?
Мне нужно получить из КА вес номенклатуры, перевести его в килограммы и передать в БП. В БП я заранее создала доп реквизит, куда хочу этот вес поместить.

В ОМ МенеджерОбменаЧерезУниверсальныйФормат ПКО_Справочник_Номенклатура_Отправка_ПриОтправкеДанных получаю вес в кг и записываю его в: ДанныеXDTO.Вставить("Вес", ВесКГ);

Далее, смотрю по шагам, что происходит при выгрузке:
в ДанныеXDTO реквизит Вес есть, а вот ОбъектXDTO формируется без него.

В коде видно, что ОбъектXDTO формируется по типу справочника Номенклатура, вот Вес и не попадает туда.

Может быть нужно где-то доопределить этот Вес, никак не соображу, подскажите пожалуйста.
20. artkor 244 30.04.21 16:51 Сейчас в теме
(19) Здравствуйте, занимался когда-то давно подобными вещами. Посмотрите в статье https://infostart.ru/1c/articles/695523/ есть примеры: поиск (ctrl-F) по слову AdditionalInfo. Это в стандарте EnterpriseData стандартное базовое свойство для каждого объекта метаданных, в которое можно добавлять доп.свойства., а сам пакет XDTO менять крайне "нехорошо" )
21. khnatik 04.05.21 12:12 Сейчас в теме
(20) Спасибо за ссылку! Разобралась, передала вес через AdditionalInfo =)
22. daab 22.05.21 17:46 Сейчас в теме
преверте плиз
Прикрепленные файлы:
23. artkor 244 22.05.21 22:27 Сейчас в теме
Не путайте "длинное с зеленым", правила конвертации объектов и правила обработки данных это разные вещи.

&После("ЗаполнитьПравилаКонвертацииОбъектов")
Процедура РасшОбмен_ЗаполнитьПравилаКонвертацииОбъектов(НаправлениеОбмена, ПравилаКонвертации) Экспорт

Здесь "ДобавитьПКО_"

&После("ЗаполнитьПравилаОбработкиДанных")
Процедура РасшОбмен_ЗаполнитьПравилаОбработкиДанных(НаправлениеОбмена, ПравилаОбработкиДанных) Экспорт

Здесь "ДобавитьПОД_"
24. daab 24.05.21 21:14 Сейчас в теме
25. artkor 244 25.05.21 10:38 Сейчас в теме
(24) Спасибо что заметили, забыл кусок кода добавить) Там идет подмена стандартных правил обмена данными на свои: добавил в текст публикации
26. Julya 09.06.22 10:11 Сейчас в теме
Добрый день подскажите пожалуйста как настроить выгрузку из ЗУП 3 в ЕРП справочник Подразделение в Структуру предприятия. Не сталкивалась с КД3. По вашему примеру сделала, но в Объект формата нет даже справочника такого. Подразделение зуп=сП ЕРП (наименованию).
27. artkor 244 09.06.22 15:59 Сейчас в теме
(26) Здравствуйте. Сомневаюсь что Вы правильными вещами занимаетесь, ибо "Структура предприятия" - это независимый справочник, применяемый для упр. учета, а "Подразделения организаций" - подчиненный Организации. Косвенная связь между данными субстанциями проводится в документе "Утверждение/Изменение штатного расписания" если память не изменяет. И более они никак не связаны, да и в целом ЕРП по структуре содержит блок ЗУПа полностью идентичный обычному ЗУП 3.0 по структуре. Там также есть "Структура предприятия" и "Подразделения организаций", что там что там).
28. Julya 09.06.22 16:21 Сейчас в теме
(27)При обмене документ отражение зп в табличной части -"Подразделение по умолчанию"-это спр.СП. Какой тогда выход, создавать спр.СП в ЗУПе и в ЕРП
29. user1364680 08.11.23 05:03 Сейчас в теме
дд.
а можно при выгрузке документа подставить определенную организацию?
в КД 2.0 решалось одной строчкой кода в правилах обмена, а здесь что то никак не получается подменить организацию при выгрузке документа...
30. artkor 244 08.11.23 09:16 Сейчас в теме
(29) вроде все предельно просто, как раз недавно правила допиливал из УНФ, вот на примере передача склада:
#Область Документ_ОтчетОРозничныхПродажах_Отправка
Процедура ДобавитьПКО_Документ_ОтчетОРозничныхПродажах_Отправка(ПравилаКонвертации)

	ПравилоКонвертации = ОбменДаннымиXDTOСервер.ИнициализироватьПравилоКонвертацииОбъекта(ПравилаКонвертации);
	ПравилоКонвертации.ИмяПКО            = "Документ_ОтчетОРозничныхПродажах_Отправка";
	ПравилоКонвертации.ОбъектДанных      = Метаданные.Документы.ОтчетОРозничныхПродажах;
	ПравилоКонвертации.ОбъектФормата     = "Документ.ОтчетОРозничныхПродажах";
	ПравилоКонвертации.ПриОтправкеДанных = "ПКО_Документ_ОтчетОРозничныхПродажах_Отправка_ПриОтправкеДа­нных";
	
	СвойстваШапки = ПравилоКонвертации.Свойства;
	ДобавитьПКС(СвойстваШапки, "ВалютаДокумента",    "Валюта", , "Справочник_Валюты");
	ДобавитьПКС(СвойстваШапки, "ВидЦен",             "ТипЦен", , "Справочник_ТипыЦен");
	ДобавитьПКС(СвойстваШапки, "Дата",               "Дата");
	ДобавитьПКС(СвойстваШапки, "КассоваяСмена",      "КассоваяСмена", , "Документ_КассоваяСменаОткрытие_Отправка");
	ДобавитьПКС(СвойстваШапки, "Комментарий",        "Комментарий");
	ДобавитьПКС(СвойстваШапки, "НалогообложениеНДС", "Налогообложение", , "Перечисления_ТипыНалогообложенияНДС_Отправка");
	ДобавитьПКС(СвойстваШапки, "Номер",              "Номер");
	ДобавитьПКС(СвойстваШапки, "Организация",        "Организация", , "Справочник_Организации_Отправка");
	ДобавитьПКС(СвойстваШапки, "Подразделение",      "Подразделение", , "Справочник_Подразделения_Отправка");
	ДобавитьПКС(СвойстваШапки, "Статья",             "СтатьяДДС", , "Справочник_СтатьиДДС");
	ДобавитьПКС(СвойстваШапки, "СуммаВключаетНДС",   "СуммаВключаетНДС");
	ДобавитьПКС(СвойстваШапки, "СуммаДокумента",     "Сумма");
	ДобавитьПКС(СвойстваШапки, "",                   "", 1);
	ДобавитьПКС(СвойстваШапки, "",                   "КассаККМ", 1, "Справочник_КассыККМ_Отправка");
	ДобавитьПКС(СвойстваШапки, "",                   "Патент", 1, "Справочник_Патенты_Отправка");
	ДобавитьПКС(СвойстваШапки, "СтруктурнаяЕдиница", "Склад", 1, "Справочник_Склады_Отправка");
....................................................

Процедура ПКО_Документ_ОтчетОРозничныхПродажах_Отправка_ПриОтправкеДан­ных(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена, СтекВыгрузки)
	Если СтекВыгрузки.Количество() > 1 Тогда
		Возврат;
	КонецЕсли;
	
	Если ВерсияФорматаЧислом(КомпонентыОбмена.ВерсияФорматаОбмена) >= ВерсияФорматаЧислом("1.6") Тогда
		ДанныеXDTO.Вставить("КассаККМ", ДанныеИБ.КассаККМ);
	КонецЕсли;
	
	Если КомпонентыОбмена.ПараметрыКонвертации.ИспользуютсяСкладыВТабличныхЧастях Тогда
		Склад = КомпонентыОбмена.ПараметрыКонвертации.ОбобщенныйСклад; 
	Иначе
		Склад = ДанныеИБ.СтруктурнаяЕдиница;
	КонецЕсли;
	ДанныеXDTO.Вставить("Склад", Склад);
....................................................
Показать
31. user1364680 08.11.23 09:51 Сейчас в теме
т.е. это в каждом выгружаемом документе править правило выгрузки?
а есть еще ссылки на организацию в справочниках...

а просто подставить организацию при выгрузке именно организации нельзя?
32. artkor 244 08.11.23 15:02 Сейчас в теме
(31) чтобы в каждом выгружаемом документе фиксированная Организация была? В целом все можно - надо "костыль" свой написать в процедуре "ВыполнитьПроцедуруМодуляМенеджера" (я бы так сделал). Только очень аккуратно, ибо функция глобальная - можно что-то поломать.
Оставьте свое сообщение