ОткрытьФайлЗагрузки (БСП)

Автор: 1С
ОбщийМодуль.ОбменДаннымиXDTOСервер
БСП

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

// Открывает файл загрузки данных, записывает заголовок файла в соответствие с форматом обмена.
//
// Параметры:
//  КомпонентыОбмена - Структура - содержит все правила и параметры обмена.
//  ИмяФайлаОбмена - строка - Имя файла обмена.
//
Процедура ОткрытьФайлЗагрузки(КомпонентыОбмена, ИмяФайлаОбмена) Экспорт
	
	ЭтоОбменЧерезПланОбмена = КомпонентыОбмена.ЭтоОбменЧерезПланОбмена;
	
	Чтение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
///////////////////////////////////////////////////////////////////////////////////////////////////////

Рекомендации

Похожие публикации

ОткрытьДатыЗапретаЗагрузкиДанных (БСП)

ОткрытьФормуЗагрузкиКлассификатора (БСП)

ОткрытьФайлСОповещением (БСП)

ОткрытьВерсиюФайла (БСП)

ПодготовитьФайлДляЗагрузки (БСП)

ОткрытьФайлПослеПодтверждения (БСП)

ДиалогЗагрузкиФайла (БСП)

ОткрытьФайл (БСП)

ОткрытьФормуВыбораФайлов (БСП)

Синтакс-помощник БСП с нейросетевым ассистентом