Открыть файл загрузки. Открывает файл загрузки данных, записывает заголовок файла в соответствие с форматом обмена.
// Открывает файл загрузки данных, записывает заголовок файла в соответствие с форматом обмена.
//
// Параметры:
// КомпонентыОбмена - Структура - содержит все правила и параметры обмена.
// ИмяФайлаОбмена - строка - Имя файла обмена.
//
Процедура ОткрытьФайлЗагрузки(КомпонентыОбмена, ИмяФайлаОбмена) Экспорт
ЭтоОбменЧерезПланОбмена = КомпонентыОбмена.ЭтоОбменЧерезПланОбмена;
ЧтениеXML = Новый ЧтениеXML;
КомпонентыОбмена.ФлагОшибки = Истина;
ПрерватьЦикл = Ложь;
Пока Не ПрерватьЦикл Цикл
ПрерватьЦикл = Истина;
Попытка
ЧтениеXML.ОткрытьФайл(ИмяФайлаОбмена);
КомпонентыОбмена.Вставить("ФайлОбмена", ЧтениеXML);
Исключение
СтрокаСообщенияОбОшибке = НСтр("ru = 'Ошибка при загрузке данных: %1'");
СтрокаСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, ОписаниеОшибки());
ЗаписатьВПротоколВыполнения(КомпонентыОбмена, СтрокаСообщенияОбОшибке);
Прервать;
КонецПопытки;
ЧтениеXML.Прочитать(); // Message
Если (ЧтениеXML.ТипУзла <> ТипУзлаXML.НачалоЭлемента
Или ЧтениеXML.ЛокальноеИмя <> "Message") Тогда
Если СообщениеОтНеобновленнойНастройки(ЧтениеXML) Тогда
СтрокаСообщенияОбОшибке = НСтр("ru = 'Получение данных от источника, в котором не выполнено
|обновление настройки синхронизации данных. Необходимо:'")
+ Символы.ПС + НСтр("ru = '1) Выполнить повторную синхронизацию данных через некоторое время.'")
+ Символы.ПС + НСтр("ru = '2) Выполнить синхронизацию данных на стороне источника, после этого
|повторно выполнить синхронизацию данных в этой информационной базе.'")
+ Символы.ПС + НСтр("ru = '(1 - для вида транспорта Через интернет, 2 - для вида транспорта Другое)'");
ЗаписатьВПротоколВыполнения(КомпонентыОбмена, СтрокаСообщенияОбОшибке);
Иначе
ЗаписатьВПротоколВыполнения(КомпонентыОбмена, 9);
КонецЕсли;
Прервать;
КонецЕсли;
ЧтениеXML.Прочитать(); // Header
Если ЧтениеXML.ТипУзла <> ТипУзлаXML.НачалоЭлемента
Или ЧтениеXML.ЛокальноеИмя <> "Header" Тогда
ЗаписатьВПротоколВыполнения(КомпонентыОбмена, 9);
Прервать;
КонецЕсли;
Header = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ФабрикаXDTO.Тип(XMLБазоваяСхема(), "Header"));
URIФормата = Header.Format;
Если ЭтоОбменЧерезПланОбмена Тогда
Если Не Header.Установлено("Confirmation") Тогда
ЗаписатьВПротоколВыполнения(КомпонентыОбмена, 9);
Прервать;
КонецЕсли;
Confirmation = Header.Confirmation;
Если КомпонентыОбмена.ОбменДаннымиСВнешнейСистемой Тогда
ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(КомпонентыОбмена.УзелКорреспондента);
Иначе
ИмяПланаОбмена = Confirmation.ExchangePlan;
Если Метаданные.ПланыОбмена.Найти(ИмяПланаОбмена) = Неопределено Тогда
ЗаписатьВПротоколВыполнения(КомпонентыОбмена, 177);
Прервать;
КонецЕсли;
КонецЕсли;
ФорматПланаОбмена = ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(ИмяПланаОбмена, "ФорматОбмена");
КомпонентыОбмена.ТолькоНастройкиXDTO =
Не ОбменДаннымиСервер.НастройкаСинхронизацииЗавершена(КомпонентыОбмена.УзелКорреспондента)
Или (URIФормата = ФорматПланаОбмена);
Если Confirmation.MessageNo <> Неопределено Тогда
КомпонентыОбмена.НомерВходящегоСообщения = Confirmation.MessageNo;
Иначе
КомпонентыОбмена.НомерВходящегоСообщения = 0;
КонецЕсли;
Если Confirmation.ReceivedNo <> Неопределено Тогда
КомпонентыОбмена.НомерСообщенияПолученногоКорреспондентом = Confirmation.ReceivedNo;
Иначе
КомпонентыОбмена.НомерСообщенияПолученногоКорреспондентом = 0;
КонецЕсли;
КодОтКого = Confirmation.From;
КодКому = Confirmation.To;
Если Не КомпонентыОбмена.ТолькоНастройкиXDTO Тогда
КомпонентыОбмена.XMLСхема = URIФормата;
ФорматОбмена = РазложитьФорматОбмена(КомпонентыОбмена.XMLСхема);
// Проверяем базовый формат.
Если ФорматПланаОбмена <> ФорматОбмена.БазовыйФормат Тогда
СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Формат сообщения обмена ""%1"" не соответствует формату плана обмена ""%2"".'"),
ФорматОбмена.БазовыйФормат,
ФорматПланаОбмена);
ЗаписатьВПротоколВыполнения(КомпонентыОбмена, СтрокаСообщения);
Прервать;
КонецЕсли;
// Проверяем версию формата сообщения обмена.
Если ВерсииФорматаОбменаМассив(КомпонентыОбмена.УзелКорреспондента).Найти(ФорматОбмена.Версия) = Неопределено Тогда
СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Версия ""%1"" формата сообщения обмена ""%2"" не поддерживается.'"),
ФорматОбмена.Версия, ФорматОбмена.БазовыйФормат);
ЗаписатьВПротоколВыполнения(КомпонентыОбмена, СтрокаСообщения);
Прервать;
КонецЕсли;
КомпонентыОбмена.ВерсияФорматаОбмена = ФорматОбмена.Версия;
КомпонентыОбмена.МенеджерОбмена = МенеджерОбменаВерсииФормата(КомпонентыОбмена.ВерсияФорматаОбмена,
КомпонентыОбмена.УзелКорреспондента);
Если КомпонентыОбмена.НомерВходящегоСообщения <= 0 Тогда
КомпонентыОбмена.ИспользоватьКвитирование = Ложь;
КонецЕсли;
Если Не КомпонентыОбмена.ОбменДаннымиСВнешнейСистемой Тогда
КодОтКогоНовый = "";
Если Header.Установлено("NewFrom") Тогда
КодОтКогоНовый = Header.NewFrom;
КонецЕсли;
ПолучательИзСообщения = ОбменДаннымиСервер.УзелПланаОбменаПоКоду(ИмяПланаОбмена, КодКому);
Если ПолучательИзСообщения <> ПланыОбмена[ИмяПланаОбмена].ЭтотУзел() Тогда
// Возможно, задан виртуальный код получателя.
ПсевдонимПредопределенногоУзла = ОбменДаннымиСервер.ПсевдонимПредопределенногоУзла(КомпонентыОбмена.УзелКорреспондента);
Если ПсевдонимПредопределенногоУзла <> КодКому Тогда
ЗаписатьВПротоколВыполнения(КомпонентыОбмена, 178);
Прервать;
КонецЕсли;
КонецЕсли;
ОтправительИзСообщения = ОбменДаннымиСервер.УзелПланаОбменаПоКоду(ИмяПланаОбмена, КодОтКого);
Если (ОтправительИзСообщения = Неопределено
Или ОтправительИзСообщения <> КомпонентыОбмена.УзелКорреспондента)
И ЗначениеЗаполнено(КодОтКогоНовый) Тогда
ОтправительИзСообщения = ОбменДаннымиСервер.УзелПланаОбменаПоКоду(ИмяПланаОбмена, КодОтКогоНовый);
КонецЕсли;
Если ОтправительИзСообщения = Неопределено
Или ОтправительИзСообщения <> КомпонентыОбмена.УзелКорреспондента Тогда
СтрокаСообщения = НСтр("ru = 'Не найден узел обмена для загрузки данных. План обмена: %1, Идентификатор: %2'");
СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, ИмяПланаОбмена, КодОтКого);
ЗаписатьВПротоколВыполнения(КомпонентыОбмена, СтрокаСообщения);
Прервать;
КонецЕсли;
КонецЕсли;
Если КомпонентыОбмена.ИспользоватьКвитирование Тогда
НомерПринятого = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(КомпонентыОбмена.УзелКорреспондента, "НомерПринятого");
Если НомерПринятого >= КомпонентыОбмена.НомерВходящегоСообщения Тогда
// Номер сообщения меньше либо равен ранее принятому.
КомпонентыОбмена.СостояниеОбменаДанными.РезультатВыполненияОбмена =
Перечисления.РезультатыВыполненияОбмена.Предупреждение_СообщениеОбменаБылоРанееПринято;
ЗаписатьВПротоколВыполнения(КомпонентыОбмена, 174,,,,, Истина);
КомпонентыОбмена.ТолькоНастройкиXDTO = Истина;
Иначе
// Добавляем публичные идентификаторы для ссылочных объектов, о получении которых отчитался узел-корреспондент.
ДобавитьВыгруженныеОбъектыВРегистрПубличныеИдентификаторы(КомпонентыОбмена);
// Удаляем регистрацию изменений, о получении которых отчитался узел-корреспондент.
ПланыОбмена.УдалитьРегистрациюИзменений(КомпонентыОбмена.УзелКорреспондента, КомпонентыОбмена.НомерСообщенияПолученногоКорреспондентом);
// Снимаем признак начальной выгрузки данных.
РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.СнятьПризнакНачальнойВыгрузкиДанных(
КомпонентыОбмена.УзелКорреспондента, КомпонентыОбмена.НомерСообщенияПолученногоКорреспондентом);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если КомпонентыОбмена.ОбменДаннымиСВнешнейСистемой Тогда
КомпонентыОбмена.ИдентификаторКорреспондента = КодОтКого;
КонецЕсли;
ЗаполнитьСтруктуруНастроекXDTOКорреспондента(КомпонентыОбмена.НастройкиXDTOКорреспондента,
Header, Не (URIФормата = ФорматПланаОбмена), КомпонентыОбмена.УзелКорреспондента);
Если Header.Установлено("Prefix") Тогда
КомпонентыОбмена.ПрефиксКорреспондента = Header.Prefix;
КонецЕсли;
// Проверяем поддержку кодировки по УИДам в корреспонденте.
КомпонентыОбмена.Вставить("КорреспондентПоддерживаетИдентификаторОбменаДанными",
ВерсияПоддерживается(КомпонентыОбмена.НастройкиXDTOКорреспондента.ПоддерживаемыеВерсии, НомерВерсииСПоддержкойИдентификатораОбменаДанными()));
Иначе
КомпонентыОбмена.XMLСхема = URIФормата;
ФорматОбмена = РазложитьФорматОбмена(КомпонентыОбмена.XMLСхема);
КомпонентыОбмена.ВерсияФорматаОбмена = ФорматОбмена.Версия;
КомпонентыОбмена.МенеджерОбмена = МенеджерОбменаВерсииФормата(КомпонентыОбмена.ВерсияФорматаОбмена);
КонецЕсли;
Если Не КомпонентыОбмена.ТолькоНастройкиXDTO Тогда
Если ЧтениеXML.ТипУзла <> ТипУзлаXML.НачалоЭлемента
Или ЧтениеXML.ЛокальноеИмя <> "Body" Тогда
ЗаписатьВПротоколВыполнения(КомпонентыОбмена, 9);
Прервать;
КонецЕсли;
ЧтениеXML.Прочитать(); // Body
КонецЕсли;
КомпонентыОбмена.ФлагОшибки = Ложь;
КонецЦикла;
Если КомпонентыОбмена.ФлагОшибки Тогда
ЧтениеXML.Закрыть();
Иначе
КомпонентыОбмена.Вставить("ФайлОбмена", ЧтениеXML);
КонецЕсли;
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
ОткрытьДатыЗапретаЗагрузкиДанных (БСП)
ОткрытьФормуЗагрузкиКлассификатора (БСП)
ПодготовитьФайлДляЗагрузки (БСП)
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)