Обмен данными между УПП 1.3.64.х и БП 3.0 по расписанию через Универсальный обмен данными + План обмена
1C-admin
09.04.2019
Описание доработки конфигурации УПП 1.3.64.х для выполнения обмена данными по расписанию в БП 3.0. через обработку Универсальный Обмен Данными XML и План Обмена.
Дано: На момент доработки есть правила обмена XML (созданные в КД2) из УПП 1.3 в БП 3.0.
Обмен производится вручную через обработку УниверсальныйОбменДаннымиXML (выгрузка данных в файл на стороне УПП / загрузка из файла на стороне БП).
Цель: выгружать данные из УПП в БП по расписанию через план обмена (при успешном обмене снимается регистрация изменения)
Описание решения:
Будем использовать:
— штатный справочник НастройкиОбменаДанными (Код элемента будет передаваться параметром регламентного задания)
— штатную обработку УниверсальныйОбменДаннымиXML с использованием выгрузки по узлу обмена
1. Создаем серверный модуль для регламентного задания.
КодНастройки — это параметр регламентного задания — по нему будем искать элемент в справочнике НастройкиОбменаДанными.
Процедура ВыполнитьОбменДаннымиДляНастройкиОбменаДанными(КодНастройки) Экспорт
НастройкаОбменаДанными = Справочники.НастройкиОбменаДанными.НайтиПоКоду(КодНастройки);
Если
НЕ ЗначениеЗаполнено(НастройкаОбменаДанными)
ИЛИ НастройкаОбменаДанными.ПометкаУдаления
Тогда
Возврат;
КонецЕсли;
ПланыОбмена.DEV_ОбменБП30.ВыполнитьОбменДаннымиДляНастройкиОбменаДанными(НастройкаОбменаДанными);
КонецПроцедуры
2. Создаем регламентное задание ВыполнениеОбменаПоКодуНастройки
ИмяМетода прописываем из п.1
3. Создаем ПланОбмена "DEV_ОбменБП30".
В состав я включил необходимые мне документы с авторегистрацией. Управляю выгрузкой объектов через правила КД2.
Процедура ОпределитьТипОтправкиДанных(ЭлементДанных, ОтправкаЭлемента) Экспорт
КонецПроцедуры
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ОбработчикиСобытий
#КонецОбласти
#Область ПрограммныйИнтерфейс
Процедура ВыполнитьОбменДаннымиДляНастройкиОбменаДанными(НастройкаОбменаДанными) Экспорт
Если НЕ ЗначениеЗаполнено(НастройкаОбменаДанными) Тогда
Возврат;
КонецЕсли;
Если
НЕ НастройкаОбменаДанными.OnLineОбмен
ИЛИ НЕ ЗначениеЗаполнено(НастройкаОбменаДанными.УзелИнформационнойБазы)
Тогда
Возврат;
КонецЕсли;
// временные файлы
ПравилаОбмена = НастройкаОбменаДанными.ПравилаОбмена.Получить();
ПравилаОбменаФайл = ПолучитьИмяВременногоФайла("xml");
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПравилаОбменаФайл);
ЗаписьXML.ЗаписатьБезОбработки(ПравилаОбмена);
ЗаписьXML.Закрыть();
ПравилаОбменаДляПриемника = НастройкаОбменаДанными.ПравилаОбменаДляПриемника.Получить();
ПравилаОбменаДляПриемникаФайл = ПолучитьИмяВременногоФайла("xml");
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПравилаОбменаДляПриемникаФайл);
ЗаписьXML.ЗаписатьБезОбработки(ПравилаОбменаДляПриемника);
ЗаписьXML.Закрыть();
ДанныеОбменаФайл = ПолучитьИмяВременногоФайла("xml");
ИмяФайлаПротоколаОбмена = ПолучитьИмяВременногоФайла("txt");
ИмяФайлаПротоколаОбменаЗагрузка = ПолучитьИмяВременногоФайла("txt");
// инициализация
обработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
обработкаОбмена.ДатаНачала = ТекущаяДата();
обработкаОбмена.РежимОбмена = "Выгрузка";
обработкаОбмена.ИмяФайлаПравилОбмена = ПравилаОбменаФайл;
обработкаОбмена.ЗагрузитьПравилаОбмена();
УстановитьУзелОбменаУСтрокДерева(обработкаОбмена.ТаблицаПравилВыгрузки.Строки, НастройкаОбменаДанными.УзелИнформационнойБазы);
// установить ПараметрыCOMСоединенияСПриемником
обработкаОбмена.НепосредственноеЧтениеВИБПриемнике = Истина;
обработкаОбмена.ТипУдаленияРегистрацииИзмененийДляУзловОбменаПослеВыгрузки = 1;
списокСвойств = "ТипИнформационнойБазыДляПодключения"
+ ",КаталогИнформационнойБазыДляПодключения"
+ ",ИмяСервераИнформационнойБазыДляПодключения"
+ ",ИмяИнформационнойБазыНаСервереДляПодключения"
+ ",АутентификацияWindowsИнформационнойБазыДляПодключения"
+ ",ПользовательИнформационнойБазыДляПодключения"
+ ",ПарольИнформационнойБазыДляПодключения"
+ ",ВерсияПлатформыИнформационнойБазыДляПодключения";
ЗаполнитьЗначенияСвойств(обработкаОбмена, НастройкаОбменаДанными, списокСвойств);
обработкаОбмена.ИмяФайлаОбмена = ДанныеОбменаФайл;
обработкаОбмена.ВыводВПротоколИнформационныхСообщений = Истина;
обработкаОбмена.ВыводВПротоколСообщенийОбОшибках = Истина;
обработкаОбмена.ИмяФайлаПротоколаОбмена = ИмяФайлаПротоколаОбмена;
обработкаОбмена.ИмяФайлаПротоколаОбменаЗагрузка = ИмяФайлаПротоколаОбменаЗагрузка;
обработкаОбмена.ВыполнитьВыгрузку();
обработкаОбмена.ДатаОкончания = ТекущаяДата();
результатВыполненияОбмена = Новый Структура("ДатаНачала,ДатаОкончания,ФлагОшибки");
ЗаполнитьЗначенияСвойств(результатВыполненияОбмена, обработкаОбмена);
обработкаОбмена = Неопределено;
// удаление временных файлов
УдалитьФайлы(ПравилаОбменаФайл);
УдалитьФайлы(ПравилаОбменаДляПриемникаФайл);
УдалитьФайлы(ДанныеОбменаФайл);
// протокол обмена
записьРС = РегистрыСведений.DEV_ОбменБП30.СоздатьМенеджерЗаписи();
записьРС.Период = результатВыполненияОбмена.ДатаНачала;
записьРС.ДатаОкончания = результатВыполненияОбмена.ДатаОкончания;
записьРС.УзелИнформационнойБазы = НастройкаОбменаДанными.УзелИнформационнойБазы;
записьРС.ФлагОшибки = результатВыполненияОбмена.ФлагОшибки;
записьРС.ПротоколОбмена = ДанныеФайла(ИмяФайлаПротоколаОбмена, "ПротоколОбмена");
записьРС.ПротоколОбменаЗагрузка = ДанныеФайла(ИмяФайлаПротоколаОбменаЗагрузка, "ПротоколОбменаЗагрузка");
записьРС.Записать();
УдалитьФайлы(ИмяФайлаПротоколаОбмена);
УдалитьФайлы(ИмяФайлаПротоколаОбменаЗагрузка);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура УстановитьУзелОбменаУСтрокДерева(СтрокиДерева, УзелОбмена)
Для Каждого строкаДерева Из СтрокиДерева Цикл
Если строкаДерева.ЭтоГруппа Тогда
УстановитьУзелОбменаУСтрокДерева(строкаДерева.Строки, УзелОбмена);
Иначе
строкаДерева.СсылкаНаУзелОбмена = УзелОбмена;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ДанныеФайла(Знач ИмяФайла, Знач ТипФайла)
Попытка
ЧтениеТекста = Новый ЧтениеТекста(ИмяФайла);
Возврат ЧтениеТекста.Прочитать();
Исключение
ОписаниеОшибки = ОписаниеОшибки();
Возврат СтрШаблон("Внимание! Не удалось прочитать файл <%1> (%2)%3%4"
, ИмяФайла
, ТипФайла
, Символы.ПС
, ОписаниеОшибки
);
КонецПопытки;
КонецФункции
#КонецОбласти
#КонецЕсли
4. Создаем РС DEV_ОбменБП30
5. Обновляем.
6. Загружаемся в 1С Предприятие.
Создаем 2 узла в ПланеОбмена DEV_ОбменБП30
Создаем элемент в справочнике НастройкиОбменаДанными
— выбираем узел
— подкидываем правила
— настраиваем приемник по COM
Настраиваем регламентное задание и в параметр прописываем код настройки обмена
Профит.
Буду рад, если кто поделится своим решением данной проблемы.
Писал и тестировал на 8.3.13.1513 (совместимо с другими версиями 8.*).