РезультатАнализаДанныхКЗагрузке (БСП)

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

Результат анализа данных загрузке. Анализирует данные к загрузке:

// Анализирует данные к загрузке:
// Вычисляет количество объектов к загрузке, размер файла сообщения обмена, другие служебные данные.
// Параметры:
//  ИмяФайлаОбмена - Строка - имя файла сообщения обмена.
//  ЭтоОбменXDTO - Булево - признак того, что выполняется обмен через универсальный формат.
// 
// Возвращаемое значение:
//  Структура - свойства структуры:
//    * РазмерФайлаСообщенияОбмена  - Число - размер файла в мегабайтах, по умолчанию 0.
//    * КоличествоОбъектовКЗагрузке - Число - количество объектов к загрузке, по умолчанию 0.
//    * From - Строка - Код узла-отправителя сообщения.
//    * To - Строка - Код узла-получателя сообщения.
//    * NewFrom - Строка - Код узла-отправителя в новом формате (для перевода существующих обменов на новую кодировку).
Функция РезультатАнализаДанныхКЗагрузке(Знач ИмяФайлаОбмена, ЭтоОбменXDTO, ЭтоОбменРИБ = Ложь) Экспорт
	
	Результат = Новый Структура;
	Результат.Вставить("РазмерФайлаСообщенияОбмена", 0);
	Результат.Вставить("КоличествоОбъектовКЗагрузке", 0);
	Результат.Вставить("From", "");
	Результат.Вставить("NewFrom", "");
	Результат.Вставить("To", "");
	
	Если НЕ ЗначениеЗаполнено(ИмяФайлаОбмена) Тогда
		Возврат Результат;
	КонецЕсли;
	
	ФайлСДанными = Новый Файл(ИмяФайлаОбмена);
	Если Не ФайлСДанными.Существует() Тогда
		Возврат Результат;
	КонецЕсли;
	
	ФайлОбмена = Новый ЧтениеXML;
	Попытка
		// Размер сразу переводим в мегабайты.
		Результат.РазмерФайлаСообщенияОбмена = Окр(ФайлСДанными.Размер() / 1048576, 1);
		ФайлОбмена.ОткрытьФайл(ИмяФайлаОбмена);
	Исключение
		Возврат Результат;
	КонецПопытки;
	
	// В зависимости от вида обмена используется разный алгоритм анализа файла обмена.
	Если ЭтоОбменXDTO Тогда
		ФайлОбмена.Прочитать(); // Message.
		ФайлОбмена.Прочитать();  // Header начало.
		НачатьСчетОбъектов = Ложь;
		Пока ФайлОбмена.Прочитать() Цикл
			Если ФайлОбмена.ЛокальноеИмя = "Header" Тогда
				// Закончено чтение заголовка.
				НачатьСчетОбъектов = Истина;
				ФайлОбмена.Пропустить(); 
			ИначеЕсли ФайлОбмена.ЛокальноеИмя = "Confirmation" Тогда
				ФайлОбмена.Прочитать();
			ИначеЕсли ФайлОбмена.ЛокальноеИмя = "From" Тогда
				ФайлОбмена.Прочитать();
				Результат.From = ФайлОбмена.Значение;
				ФайлОбмена.Пропустить();
			ИначеЕсли ФайлОбмена.ЛокальноеИмя = "To" Тогда
				ФайлОбмена.Прочитать();
				Результат.To = ФайлОбмена.Значение;
				ФайлОбмена.Пропустить();
			ИначеЕсли ФайлОбмена.ЛокальноеИмя = "NewFrom" Тогда
				ФайлОбмена.Прочитать();
				Результат.NewFrom = ФайлОбмена.Значение;
				ФайлОбмена.Пропустить();
			ИначеЕсли НачатьСчетОбъектов 
				И ФайлОбмена.ТипУзла = ТипУзлаXML.НачалоЭлемента 
				И ФайлОбмена.ЛокальноеИмя <> "УдалениеОбъекта" 
				И ФайлОбмена.ЛокальноеИмя <> "Body" Тогда
				Результат.КоличествоОбъектовКЗагрузке = Результат.КоличествоОбъектовКЗагрузке + 1;
				ФайлОбмена.Пропустить();
			КонецЕсли;
		КонецЦикла;

	ИначеЕсли ЭтоОбменРИБ Тогда
		ФайлОбмена.Прочитать(); // Message.
		ФайлОбмена.Прочитать();  // Header начало.
		ФайлОбмена.Пропустить(); // Header конец.
		ФайлОбмена.Прочитать(); //Body начало.
		Пока ФайлОбмена.Прочитать() Цикл
			Если ФайлОбмена.ЛокальноеИмя = "Changes"
				ИЛИ ФайлОбмена.ЛокальноеИмя = "Data" Тогда
				Продолжить;
			ИначеЕсли СтрНайти(ФайлОбмена.ЛокальноеИмя, "Config") = 0 
				И СтрНайти(ФайлОбмена.ЛокальноеИмя, "Signature") = 0
				И СтрНайти(ФайлОбмена.ЛокальноеИмя, "Nodes") = 0
				И ФайлОбмена.ЛокальноеИмя <> "Parameters"
				И ФайлОбмена.ЛокальноеИмя <> "Body" Тогда
				Результат.КоличествоОбъектовКЗагрузке = Результат.КоличествоОбъектовКЗагрузке + 1;
			КонецЕсли;
			ФайлОбмена.Пропустить();
		КонецЦикла;	
	Иначе
		
		ФайлОбмена.Прочитать(); // Файл обмена.
		ФайлОбмена.Прочитать();  // ПравилаОбмена начало.
		ФайлОбмена.Пропустить(); // ПравилаОбмена конец.

		ФайлОбмена.Прочитать();  // Типы данных начало.
		ФайлОбмена.Пропустить(); // ТипыДанных конец.

		ФайлОбмена.Прочитать();  // Данные по обмену начало.
		ФайлОбмена.Пропустить(); // Данные по обмену конец.
		Пока ФайлОбмена.Прочитать() Цикл
			Если ФайлОбмена.ЛокальноеИмя = "Объект"
				ИЛИ ФайлОбмена.ЛокальноеИмя = "НаборЗаписейРегистра"
				ИЛИ ФайлОбмена.ЛокальноеИмя = "УдалениеОбъекта"
				ИЛИ ФайлОбмена.ЛокальноеИмя = "ИнформацияОРегистрацииОбъекта" Тогда
				Результат.КоличествоОбъектовКЗагрузке = Результат.КоличествоОбъектовКЗагрузке + 1;
			КонецЕсли;
			ФайлОбмена.Пропустить();
		КонецЦикла;
	КонецЕсли;
	ФайлОбмена.Закрыть();
	
	Возврат Результат;
КонецФункции

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

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

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

ПроизвестиЧтениеДанныхВРежимеАнализа (БСП)

РезультатАнализаОшибочныхПолучателей (БСП)

АнализДоступностиФайловКлассификатораВКаталоге (БСП)

Замеряет скорость выполнения запроса и получает его выгрузки

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

РезультатЗагрузкиКомпоненты (БСП)

ПриПопыткеЗанятьФайл (БСП)

ПриЗагрузкеОбъекта (БСП)

ХешированиеДанныхПослеПолученияРезультата (БСП)

Обновлятор-1С: групповое (пакетное) обновление и обслуживание всех баз за один раз