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


#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

Процедура СформироватьОтчет(ПараметрыОтчета, АдресХранилища) Экспорт
	
	НачалоПериода	= ПараметрыОтчета.НачалоПериода;
	КонецПериода	= ПараметрыОтчета.КонецПериода;
	Куст			= ПараметрыОтчета.Куст;
	Склад			= ПараметрыОтчета.Склад;
	ТаблицаДЛяЗагрузкиВДок	= ПараметрыОтчета.ТаблицаДЛяЗагрузкиВДок;
	
	ТаблицаДЛяЗагрузкиВДок.Очистить();  //ПСВ
	
	ТабличныйДокумент = Новый ТабличныйДокумент;
	
	Макет = Обработки.БС_ЛимитКассыПоМагазину.ПолучитьМакет("Отчет");
	ОбластьЗаголовок   	= Макет.ПолучитьОбласть("Заголовок");	
	ОбластьШапка  		= Макет.ПолучитьОбласть("ШапкаТаблицы");
	ОбластьСклад  		= Макет.ПолучитьОбласть("Склад");
	
	ОбластьЗаголовок.Параметры.Заголовок = "Анализ лимита кассы "+?(ЗначениеЗаполнено(Куст),Строка(Куст)+" куст ","магазина №"+Склад.НомерМагазина)+" с "+Формат(НачалоПериода,"ДФ=dd.MM.yyyy")+" по "+Формат(КонецПериода,"ДФ=dd.MM.yyyy");
	ТабличныйДокумент.Вывести(ОбластьЗаголовок);
	ТабличныйДокумент.Вывести(ОбластьШапка);
		
	ЛимитИтого			= 0;
	ОстатокКассыИтого	= 0;
	РазницаИтого		= 0;
	ДатаОтбора			= КонецДня(НачалоПериода);

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

		КоличествоВсего = Результат.Количество();

		Пока Результат.Следующий() цикл
			
			// === ИСПРАВЛЕНИЕ 2: Отключаем "костыль" предыдущего разработчика ===
			ЛимитКассы = Результат.Лимит; // Теперь тут ВСЕГДА правильный лимит благодаря новой архитектуре
			
			/* СТАРЫЙ КОСТЫЛЬ ЗАКОММЕНТИРОВАН
			СчетчикДней=60*60*24;
			Если Результат.ЛимитНаОдинДень И Результат.Период<>НачалоДня(ДатаОтбора) тогда
				ЛимитНаОдинДень_=Истина;	
				Пока ЛимитНаОдинДень_ цикл		
					// ... тут был вложенный запрос к регистру ...
				КонецЦикла;
			КонецЕсли;
			*/
								
			ОбластьСклад.Параметры.Дата 		= Формат(ДатаОтбора,"ДФ=dd.MM.yyyy");
			ОбластьСклад.Параметры.Склад 		= Результат.Склад;
			ОбластьСклад.Параметры.Лимит 		= ?(ЛимитКассы = 0, "!!Лимит не установлен!!", ЛимитКассы);
			ОбластьСклад.Параметры.ОстатокКассы = Результат.ОстатокКассы;
			ОбластьСклад.Параметры.Разница 		= ЛимитКассы-Результат.ОстатокКассы;
			
			//ПСВ((
			Если ЛимитКассы-Результат.ОстатокКассы < 0 Тогда
				
				// === ИСПРАВЛЕНИЕ 3: Ищем базовые данные в НОВОМ годовом регистре ===
				Запрос = новый запрос;
				Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
				               |	ГодовойЛимит.Лимит как Лимит,
				               |	ГодовойЛимит.ДатаПриказа как ДатаПриказа,
				               |	ГодовойЛимит.НомерПриказа как НомерПриказа,
				               |	ГодовойЛимит.Склад КАК Склад
				               |ИЗ
				               |	РегистрСведений.БС_ЛимитКассыГодовой КАК ГодовойЛимит
				               |ГДЕ
				               |	ГодовойЛимит.Склад = &Склад
				               |	И &ДатаОтчета МЕЖДУ ГодовойЛимит.ДействуетС И ГодовойЛимит.ДействуетДо";
							   
				Запрос.УстановитьПараметр("ДатаОтчета",	ДатаОтбора);
				Запрос.УстановитьПараметр("Склад",		Результат.Склад);
				ДатаНомерЛимита = Запрос.Выполнить().Выгрузить();
				
				НоваяСтрокаТаблицы = ТаблицаДЛяЗагрузкиВДок.Добавить();
				НоваяСтрокаТаблицы.НомерСтроки 	= ТаблицаДЛяЗагрузкиВДок.Количество();
				НоваяСтрокаТаблицы.Дата 		= ДатаОтбора;
				НоваяСтрокаТаблицы.Магазин 		= Результат.Склад;
				
				//Башспирт ПСВ(( 13.11.2018
				XDTOКонтактная = УправлениеКонтактнойИнформациейЛокализация.АдресXMLВXDTO(, Результат.Склад.АдресМагазинаПоКЛАДР, );
				Если  XDTOКонтактная.Состав.Состав.Город = неопределено Тогда
					НоваяСтрокаТаблицы.НасПункт	= XDTOКонтактная.Состав.Состав.НаселПункт;
					Если  XDTOКонтактная.Состав.Состав.НаселПункт = неопределено Тогда
						НоваяСтрокаТаблицы.НасПункт 	= Результат.Склад.Местонахождение;	
					КонецЕсли;
				Иначе
					НоваяСтрокаТаблицы.НасПункт	= XDTOКонтактная.Состав.Состав.Город;
				КонецЕсли;
				//Башспирт ПСВ)) 13.11.2018
				
				НоваяСтрокаТаблицы.Лимит 		= Цел(Результат.ОстатокКассы+1);
				
				Если ДатаНомерЛимита.Количество()> 0 Тогда
					НоваяСтрокаТаблицы.ЛимитКассы 				= ДатаНомерЛимита[0].Лимит;
					НоваяСтрокаТаблицы.ПриказЛимитКассы 		= ДатаНомерЛимита[0].НомерПриказа;
					НоваяСтрокаТаблицы.ДатаПриказаЛимитКассы	= ДатаНомерЛимита[0].ДатаПриказа;
				Иначе
					НоваяСтрокаТаблицы.ПриказЛимитКассы = "нет номера";
				КонецЕсли;	
			КонецЕсли;	
			//ПСВ))
			ТабличныйДокумент.Вывести(ОбластьСклад);  
			
		КонецЦикла;

		ДатаОтбора=КонецДня(ДатаОтбора+ 60 * 60 * 24);
			
		Если КоличествоВсего>0 тогда
			ЛимитИтого=ЛимитИтого+ЛимитКассы;
			ОстатокКассыИтого=ОстатокКассыИтого+Результат.ОстатокКассы;
			РазницаИтого=РазницаИтого+(ЛимитКассы-Результат.ОстатокКассы);
		КонецЕсли;

	КонецЦикла; //Цикл по дата отбора

	ОбщиеИтоги = Макет.ПолучитьОбласть("ОбщиеИтоги");
	ОбщиеИтоги.Параметры.Лимит			= ЛимитИтого;
	ОбщиеИтоги.Параметры.ОстатокКассы	= ОстатокКассыИтого;
	ОбщиеИтоги.Параметры.Разница 		= РазницаИтого;
	ТабличныйДокумент.Вывести(ОбщиеИтоги);
			
	ТабличныйДокумент.ОриентацияСтраницы	= ОриентацияСтраницы.Портрет;
	ТабличныйДокумент.ПолеСлева  			= 5;
	ТабличныйДокумент.ПолеСправа 			= 5;
	
	СтруктураРезультата = Новый Структура;
	СтруктураРезультата.Вставить("ТабличныйДокумент", 		ТабличныйДокумент);
	СтруктураРезультата.Вставить("ТаблицаДЛяЗагрузкиВДок",	ТаблицаДЛяЗагрузкиВДок);
	
	ПоместитьВоВременноеХранилище(СтруктураРезультата, АдресХранилища);
	
КонецПроцедуры

#КонецЕсли