Загрузка данных


&НаСервере
Процедура ЗагрузитьВРегистрПересчетТМЦ(Исполнитель) Экспорт
	
	Данные = ЗагрузитьДокументыПересчетТМЦ(Исполнитель);
	
	Если Данные = Неопределено
		ИЛИ ТипЗнч(Данные) <> Тип("Массив") Тогда
		
		Возврат;
		
	КонецЕсли;
	
	ДатаЗагрузки = ТекущаяДатаСеанса();
	
	// Группируем полученные строки по документам
	ПоДокументам = Новый Соответствие;
	
	Для Каждого СтрокаJSON Из Данные Цикл
		
		КлючДокумента = СокрЛП(
			ЗначениеЭлемента(СтрокаJSON, "Документ")
		);
		
		Если Не ЗначениеЗаполнено(КлючДокумента) Тогда
			Продолжить;
		КонецЕсли;
		
		СтрокиДокумента = ПоДокументам.Получить(КлючДокумента);
		
		Если СтрокиДокумента = Неопределено Тогда
			
			СтрокиДокумента = Новый Массив;
			ПоДокументам.Вставить(
				КлючДокумента,
				СтрокиДокумента
			);
			
		КонецЕсли;
		
		СтрокиДокумента.Добавить(СтрокаJSON);
		
	КонецЦикла;
	
	// Каждый документ обрабатываем в отдельной транзакции
	Для Каждого КлючИЗначение Из ПоДокументам Цикл
		
		ИмяДокумента = КлючИЗначение.Ключ;
		
		НачатьТранзакцию();
		
		Попытка
			
			////////////////////////////////////////////////////////////////////////////////
			// Получаем инвентарные номера, которые уже записаны по этому документу
			
			Запрос = Новый Запрос;
			
			Запрос.Текст =
			"ВЫБРАТЬ РАЗЛИЧНЫЕ
			|	ВРег(
			|		ПересчетТМЦ.ОсновноеСредствоИнвентарныйНомер
			|	) КАК ИнвентарныйНомер
			|ИЗ
			|	РегистрСведений.ПересчетТМЦ КАК ПересчетТМЦ
			|ГДЕ
			|	ПересчетТМЦ.ДокументПересчетТМЦ = &Документ";
			
			Запрос.УстановитьПараметр(
				"Документ",
				ИмяДокумента
			);
			
			СуществующиеНомера = Новый Соответствие;
			
			ВыборкаСуществующихЗаписей =
				Запрос.Выполнить().Выбрать();
			
			Пока ВыборкаСуществующихЗаписей.Следующий() Цикл
				
				СуществующиеНомера.Вставить(
					ВыборкаСуществующихЗаписей.ИнвентарныйНомер,
					Истина
				);
				
			КонецЦикла;
			
			////////////////////////////////////////////////////////////////////////////////
			// Формируем набор только из отсутствующих записей
			
			НаборЗаписей =
				РегистрыСведений.ПересчетТМЦ.СоздатьНаборЗаписей();
			
			// Используется для проверки дублей внутри текущего JSON
			ОбработанныеНомера = Новый Соответствие;
			
			Для Каждого СтрокаJSON Из КлючИЗначение.Значение Цикл
				
				ИнвентарныйНомер = СокрЛП(
					ЗначениеЭлемента(
						СтрокаJSON,
						"ИнвентарныйНомер"
					)
				);
				
				НормализованныйНомер = ВРег(ИнвентарныйНомер);
				
				// Строки без инвентарного номера не загружаем
				Если Не ЗначениеЗаполнено(НормализованныйНомер) Тогда
					Продолжить;
				КонецЕсли;
				
				// Если запись уже есть в регистре — пропускаем
				Если СуществующиеНомера.Получить(
					НормализованныйНомер
				) <> Неопределено Тогда
					
					Продолжить;
					
				КонецЕсли;
				
				// Если номер уже встретился в текущей загрузке — пропускаем
				Если ОбработанныеНомера.Получить(
					НормализованныйНомер
				) <> Неопределено Тогда
					
					Продолжить;
					
				КонецЕсли;
				
				ОбработанныеНомера.Вставить(
					НормализованныйНомер,
					Истина
				);
				
				Запись = НаборЗаписей.Добавить();
				
				Запись.Период = ТекущаяДата();
				
				Запись.ДокументПересчетТМЦ =
					ИмяДокумента;
				
				Запись.ОсновноеСредствоИнвентарныйНомер =
					ИнвентарныйНомер;
				
				// По договоренности не заполняем
				Запись.УИДокумента = "";
				
				Запись.ДатаСоздания = ДатаИзJSON(
					ЗначениеЭлемента(
						СтрокаJSON,
						"ПересчетТМЦДата"
					)
				);
				
				Запись.ДатаЗагрузки = ДатаЗагрузки;
				
				Запись.ОсновноеСредствоНаименование =
					ЗначениеЭлемента(
						СтрокаJSON,
						"НаименованиеОсновногоСредства"
					);
				
				Запись.ОсновноеСредствоУИД =
					ЗначениеЭлемента(
						СтрокаJSON,
						"КодОсновногоСредства"
					);
				
				Запись.ОсновноеСредствоСерийныйНомер =
					ЗначениеЭлемента(
						СтрокаJSON,
						"СерийныйНомер"
					);
				
				// Начальные значения
				Запись.КоличествоПлан = 1;
				Запись.КоличествоФакт = 0;
				Запись.Чек = Ложь;
				
			КонецЦикла;
			
			////////////////////////////////////////////////////////////////////////////////
			// Если обнаружены новые записи — добавляем их без замещения существующих
			
			Если НаборЗаписей.Количество() > 0 Тогда
				
				// Ложь — не удалять ранее существовавшие записи
				НаборЗаписей.Записать(Ложь);
				
				////////////////////////////////////////////////////////////////////////////////
				// Устанавливаем статус документа
				
				НаборЗаписейСтатус =
					РегистрыСведений.СтатусыДокументов.СоздатьНаборЗаписей();
				
				НоваяЗаписьСтатус =
					НаборЗаписейСтатус.Добавить();
				
				НоваяЗаписьСтатус.ДокументТМЦ =
					ИмяДокумента;
				
				НоваяЗаписьСтатус.Период =
					ТекущаяДата();
				
				НоваяЗаписьСтатус.Статус =
					Перечисления.СтатусыДокументовТМЦ.ВРаботе;
				
				НаборЗаписейСтатус.Записать();
				
			КонецЕсли;
			
			ЗафиксироватьТранзакцию();
			
		Исключение
			
			ОтменитьТранзакцию();
			
			Сообщить(
				"Ошибка загрузки документа """ 
				+ ИмяДокумента
				+ """: "
				+ ОписаниеОшибки()
			);
			
		КонецПопытки;
		
	КонецЦикла;
	
КонецПроцедуры