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


Процедура ЗагрузитьМатериалы(ИзмененныеУслугиМассив) Экспорт
	ТаблицаУслуг = Услуги.Выгрузить(); 
	
	Для Каждого Услуга Из ИзмененныеУслугиМассив Цикл 
		Фильтр = Новый Структура;
		Фильтр.Вставить("Услуга", Услуга); 
		
		НайтиМатериалы = Материалы.НайтиСтроки(Фильтр);
		Для каждого СтрМатериал из НайтиМатериалы Цикл
			Материалы.Удалить(СтрМатериал);
		КонецЦикла;  
	КонецЦикла;
	
	
	
	ПредварительноеТЗ = Новый ТаблицаЗначений;
	ПредварительноеТЗ.Колонки.Добавить("Номенклатура");
	ПредварительноеТЗ.Колонки.Добавить("Партия");
	ПредварительноеТЗ.Колонки.Добавить("Остаток");
	ПредварительноеТЗ.Колонки.Добавить("Услуга");
	ПредварительноеТЗ.Колонки.Добавить("НетНаОстатке");
	ПредварительноеТЗ.Колонки.Добавить("Цена");
	ПредварительноеТЗ.Колонки.Добавить("Количество");   
	ПредварительноеТЗ.Колонки.Добавить("Единица");    
	ПредварительноеТЗ.Колонки.Добавить("Сумма");

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

			ОбщегоНазначенияКлиентСервер.СообщитьПользователю("По услуге: " + Материал.Услуга + " на остатке не хватает материала: " + Материал.Материалы +
			" в количестве " + ОсталосьВзять + " (требуется " + Требуется + ")");  		
		КонецЕсли;
	КонецЦикла; 
	
	Для Каждого Стр из ПредварительноеТЗ Цикл 
		ДобСтрМат = Материалы.Добавить();  
		ЗаполнитьЗначенияСвойств(ДобСтрМат, Стр);
	КонецЦикла;  
	   		
	РасчитатьСуммуСУчетомМатериалов(Услуга);

КонецПроцедуры