Настройка обмена с любой устаревшей конфигурацией на базе 8.2 через обработку "Универсальный обмен данными в формате XML" и "Конвертацию данных 2.0"

Публикация № 1322060

Разработка - Системная интеграция - Обмен через XML

настройка обмена данными конвертация данных универсальный обмен

Разберем кейс, как настроить простенький обмен с любой устаревшей конфигурацией на базе 8.2 через обработку "Универсальный обмен данными в формате XML" и Конвертацию данных 2.0 с возможностью настройки гибких отборов по периоду, организации и списку документов.

Вступление

Несмотря на бурное развитие 1С и на огромное количество технологий обмена данными в среде 1С, обработка "Универсальный обмен данными в формате XML"  по-моему мнению до сих пор остается очень мощным инструментом, позволяющим настроить обмен данными между различными конфигурациями, за достаточно короткий срок. Одним из ее основных преимуществ, это возможность полностью "программной" настройки.  Не всегда же бизнесу требуются сложные обмены, иногда достаточно одностороннего обмена с 1С:Бухгалтерия 3.0, но при этом источником данных может быть любая конфигурация "динозавр". Так же потребуется выполнить определенные манипуляции с правилами конвертации в 1С:Конвертации данных 2.0.

Постановка задачи

Необходимо настроить односторонний обмен между устаревшей конфигурацией (например УНФ 1.4) и 1С:Бухгалтерия 3.0. Прежде всего у нас уже должны быть разработаны правила конвертации в Конвертации данных 2.0. Некоторые лайфхаки для настройки правил будут разобраны чуть ниже по тексту.

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

Реализация

1. Создание обработки и подключение макета с правилами 

Создаем внешнюю обработку, добавляем к ней макет с типом двоичные данные, загружаем наши правила, разработанные в КД 2.0 в формате XML. Во вложениях к публикации есть примерные правила, которые можно использовать как заготовку.

 

2. Накидаем простенький интерфейс на форме

Тут просто пример как это можно сделать.

 

3. Реализуем основную логику выгрузки данных

Программный код для кнопки выгрузить данные:

//Инициализируем обработку
Обработка = Обработки.УниверсальныйОбменДаннымиXMLОбмен.Создать();    
Обработка.РежимОбмена="Выгрузка";

//Указваем наши правила обмена    
ВремФайл = ПолучитьИмяВременногоФайла("xml");    
МакетПравилОбмена = РеквизитФормыВЗначение("Объект").ПолучитьМакет("ПравилаВыгрузкиВБухгалтерию");        
МакетПравилОбмена.Записать(ВремФайл);
Обработка.ИмяФайлаПравилОбмена = ВремФайл;

//Заполняем всякие разные параметры
Обработка.НеВыводитьНикакихИнформационныхСообщенийПользователю = Истина;
Обработка.ЗагружатьДанныеВРежимеОбмена = Истина;
Обработка.ЗаписыватьРегистрыНаборамиЗаписей = Истина;
Обработка.ЗапоминатьЗагруженныеОбъекты = Истина;
Обработка.ИспользоватьОтборПоДатеДляВсехОбъектов = Истина;
Обработка.ФлагКомментироватьОбработкуОбъектов = Истина;    
Обработка.ВыгружатьТолькоРазрешенные = Истина;      
Обработка.ТипУдаленияРегистрацииИзмененийДляУзловОбменаПослеВыгрузки=0;
// 0 - не снимать регистрацию, 1 - снимать регистрацию  
Обработка.НеВыводитьНикакихИнформационныхСообщенийПользователю = ложь;    
Обработка.ЭтоИнтерактивныйРежим     = Истина;
Обработка.ПараметрыИнициализированы = Истина;

//Указываем период выгрузки данных    
Обработка.ДатаНачала = ПериодВыгрузки.ДатаНачала;
Обработка.ДатаОкончания = ПериодВыгрузки.ДатаОкончания;

//Указываем выходной файл с данными
Обработка.ИмяФайлаОбмена = ИмяФайла;        
Обработка.ЗагрузитьПравилаОбмена();

 

4. Настраиваем отбор по организациям с использованием Конвертации данных 2.0

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

 

Далее этот параметр нужно задействовать в правилах выгрузки данных (ПВД) в событии "Перед выгрузкой" Например вот так:

Если Объект.Метаданные().Реквизиты.Найти("Организация") <> Неопределено Тогда
    Если (Параметры.Организация <> Объект.Организация) Тогда
        Отказ = Истина;
    КонецЕсли;
КонецЕсли;

 

И в правилах конвертации объектов (ПКО) в событии "Перед выгрузкой", например вот так:

Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Источник)) Тогда
    Если Источник.Метаданные().Реквизиты.Найти("Организация") <> Неопределено Тогда
        Если (Параметры.Организация <> Источник.Организация) Тогда
            Отказ = Истина;
        КонецЕсли;
    КонецЕсли;
    Если Источник.Метаданные().Реквизиты.Найти("Владелец") <> Неопределено Тогда
        Если Источник.Владелец.Метаданные().Имя = "Организации" Тогда
            Если (Параметры.Организация <> Источник.Владелец) Тогда
                Отказ = Истина;
            КонецЕсли;
        КонецЕсли;
    ИначеЕсли Источник.Метаданные().Владельцы.Содержит(Параметры.Организация.Метаданные()) Тогда 
        Если Источник.Владелец <> Параметры.Организация Тогда
            Отказ = Истина;
        КонецЕсли; 
    КонецЕсли;
КонецЕсли;

Для выгрузки данных с отбором по организации программно заполняем значение нашего параметра в обработке

Обработка.Параметры.Организация = Объект.Организация;

Для каждого СтрокаТаблицыПараметров ИЗ Обработка.ТаблицаНастройкиПараметров Цикл
        Если СтрокаТаблицыПараметров.Имя = "Организация" Тогда 
            СтрокаТаблицыПараметров.Значение =     Объект.Организация;
        КонецЕсли;    
КонецЦикла;


//Отключим текущие правила, чтобы лишнего не выгружалось
//Обработка.ТаблицаПравилВыгрузки.Строки[0] - Справочники

Для Каждого СтрокаУровня Из Обработка.ТаблицаПравилВыгрузки.Строки[0].Строки Цикл  
        СтрокаУровня.Включить = 0; 
КонецЦикла;

//Обработка.ТаблицаПравилВыгрузки.Строки[1] - Документы
Для Каждого СтрокаУровня Из Обработка.ТаблицаПравилВыгрузки.Строки[1].Строки Цикл
        СтрокаУровня.Включить = 0; 
КонецЦикла;

//Определим список документов по которым нужно выгружать данные
СписокАктивныхОбъектовКВыгрузке = ОпределитьСписокАктивных();  

Реализуем дополнительную функцию для определения активных документов

Функция ОпределитьСписокАктивных()
    СписокАктивныхОбъектовКВыгрузке = Новый СписокЗначений;
    СписокАктивныхОбъектовКВыгрузке.Добавить(?(Объект.ПриходнаяНакладная=Истина,"ПриходнаяНакладная",""));
    СписокАктивныхОбъектовКВыгрузке.Добавить(?(Объект.РасходнаяНакладная=Истина,"РасходнаяНакладная",""));
    СписокАктивныхОбъектовКВыгрузке.Добавить(?(Объект.СчетФактура=Истина,"СчетФактура",""));
    СписокАктивныхОбъектовКВыгрузке.Добавить(?(Объект.СчетФактураПолученный=Истина,"СчетФактураПолученный",""));
    СписокАктивныхОбъектовКВыгрузке.Добавить(?(Объект.СчетНаОплату=Истина,"СчетНаОплату",""));
    СписокАктивныхОбъектовКВыгрузке.Добавить(?(Объект.РасходИзКассы=Истина,"РасходИзКассы",""));
    СписокАктивныхОбъектовКВыгрузке.Добавить(?(Объект.ПоступлениеВКассу=Истина,"ПоступлениеВКассу",""));
    СписокАктивныхОбъектовКВыгрузке.Добавить(?(Объект.РасходСоСчета=Истина,"РасходСоСчета",""));
    СписокАктивныхОбъектовКВыгрузке.Добавить(?(Объект.ПоступлениеНаСчет=Истина,"ПоступлениеНаСчет",""));
    СписокАктивныхОбъектовКВыгрузке.Добавить(?(Объект.ОприходованиеЗапасов=Истина,"ОприходованиеЗапасов",""));
    СписокАктивныхОбъектовКВыгрузке.Добавить(?(Объект.СписаниеЗапасов=Истина,"СписаниеЗапасов",""));

    Возврат СписокАктивныхОбъектовКВыгрузке;    
КонецФункции

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

Для Каждого ТекущееПВД Из Обработка.ТаблицаПравилВыгрузки.Строки[1].Строки Цикл
	
	НаименованиеОбъектаДляВыгрузки = ТекущееПВД.Имя;
	
	Если СписокАктивныхОбъектовКВыгрузке.НайтиПоЗначению(НаименованиеОбъектаДляВыгрузки) <> Неопределено Тогда
		
		Построитель = Новый ПостроительОтчета;
		Построитель.Текст = 
		"ВЫБРАТЬ Разрешенные Объект.Ссылка КАК Ссылка ИЗ Документ."
		+НаименованиеОбъектаДляВыгрузки+
		" КАК Объект {ГДЕ Объект.Ссылка.* КАК Документ_"
		+НаименованиеОбъектаДляВыгрузки+
		"}";
		
		Построитель.ЗаполнитьНастройки();
		Построитель.Отбор.Добавить("Документ_"+НаименованиеОбъектаДляВыгрузки+".Ссылка");
		
		Построитель.Отбор[0].ВидСравнения = ВидСравнения.ВСписке;
		Построитель.Отбор[0].Значение = ОпределитьСписокСсылокПоТипуДокумента(НаименованиеОбъектаДляВыгрузки);
		Построитель.Отбор[0].Использование = Истина;
		
		ДоступностьПостроителя = Истина;
		
		Если Построитель.Отбор.Количество() > 0 Тогда
			
			ТекущееПВД.Включить = 1;
			ТекущееПВД.НастройкиПостроителя = Построитель.ПолучитьНастройки();
			ТекущееПВД.ИспользоватьОтбор    = ИСТИНА;
			
		КонецЕсли;
		
	КонецЕсли;
	
КонецЦикла;

Обходим табличную часть "Список документов" на форме, для формирования списка документов к выгрузке

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

Непосредственно выгрузка.

Обработка.ВыполнитьВыгрузку();
Обработка = Неопределено;    

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

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

КонецПроцедуры

После выгрузки данных полученный XML файл можно легко загрузить обработкой "Универсальный обмен данными в формате XML"  в конфигурации-приемнике.

При желании данный обмен можно реализовать в регламентом задании.

Проверено на УНФ 1.4.1.19 - Бухгалтерия 3.0.81.30.

Скачать файлы

Наименование Файл Версия Размер
Шаблон обработки выгрузки данных УНФ 1.4.1.19 - Бухгалтерия 3.0.81.30

.epf 193,40Kb
2
.epf 193,40Kb 2 Скачать
Правила обмена данными УНФ 1.4.1.19 - Бухгалтерия 3.0.81.30

.xml 795,40Kb
1
.xml 795,40Kb 1 Скачать

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. quazare 727 24.11.20 04:27 Сейчас в теме
такие вещи нужно делать на события самих правил, например "перед выгрузкой данных"
triviumfan; zqzq; orfos; +3 Ответить
2. orfos 83 24.11.20 09:31 Сейчас в теме
(1) вы имеете ввиду глобальное событие "перед выгрузкой данных"? А там есть доступ к выгружаемому объекту, чтобы отсечь ссылки с ненужной организацией, если да то так будет еще интереснее.
3. quazare 727 24.11.20 09:35 Сейчас в теме
(2) совершенно верно! не только с ненужной организацией, но это позволяет даже выбрать источник выгрузки, а не только сами объекты.
4. orfos 83 24.11.20 10:05 Сейчас в теме
(3)все таки есть сомнения, в справке написано глобальное событие выполняется 1 раз, да и подходящего примера так и не нашел. В глобальном событии в основном просто параметры заполняются. Поделитесь примером? ))
5. maks_20 134 25.11.20 10:43 Сейчас в теме
Почему сразу с устаревшей конфигурацией? Данную методологию можно на любой конфигурации применить.
6. orfos 83 25.11.20 11:06 Сейчас в теме
(5) согласен))), мне гораздо комфортней использовать КД 2.0 и универсальный обмен, а устаревшей потому что, 1с выпилила правила конвертации и заменило их на технологию Конвертации 3.0.
7. maks_20 134 25.11.20 11:15 Сейчас в теме
(6) это да, но еще остались решения типовые, где до сих пор синхронизация на кд 2.0 сделана.
texnic79; +1 Ответить
8. RocKeR_13 872 26.11.20 09:45 Сейчас в теме
Название публикации вводит в заблуждение. Скорее подойдет название "Использование обработки "Универсальный обмен данными в формате XML" для настройки постоянного обмена с возможностью настройки отборов". А "Настройка обмена с любой устаревшей конфигурацией" навевает на мысль о ранее невиданном чуде) К тому же в этой схеме есть один минус: без использования плана обмена нам придется каждый раз ограничивать выгрузку отборами либо повторно выгружать данные, которые не были изменены.
texnic79; Drivingblind; +2 Ответить
9. orfos 83 26.11.20 11:53 Сейчас в теме
(8) кликбэйт что-ли? это точно не специально, название раз 5 менял. На самом деле в универсальном обмене можно и план обмена указать , с последующей очисткой после выгрузки и будет совсем красиво. Пожалуй надо будет дополнить статью
10. RocKeR_13 872 26.11.20 12:17 Сейчас в теме
(9)
кликбэйт что-ли?

Ох уже эти новомодные термины. Наверное в моем сообщении все-таки не хватает "на мой взгляд")
Drivingblind; orfos; +2 Ответить
11. orfos 83 26.11.20 12:32 Сейчас в теме
(10) да это точно, сам их не люблю, если честно
12. lvictor58 130 27.11.20 09:42 Сейчас в теме
Я делал подобные выгрузки. Правило выгрузки данных нужно создать одно, установить признак "Произвольный алгоритм".
В обработчик "Перед обработкой" запихнуть запрос аналогичный описанному в процедуре ОбновитьСписокДокументовНаСервереСкладской только его надо собрать обходом списка выгружаемых видов документов через ОБЪЕДИНИТЬ ВСЕ с фильтрами по дате и организации.
И добавить в выборку кроме ссылки еще "ТипДокумента" (организация в общем-то и не нужна),
а при обходе выборки использовать метод ВыгрузитьПоПравилу(Выборка.Ссылка, , , , Выборка.ТипДокумента); Ест-но правила конвертации должны называться как и ТипДокумента.
13. orfos 83 27.11.20 10:41 Сейчас в теме
(12) да тоже интересный способ, правда мне кажется немного сложноватый
14. AneJIbcuH 28 30.12.20 11:31 Сейчас в теме
(13) выигрышный по скорости
Оставьте свое сообщение