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


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