Загрузка данных
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Процедура СформироватьОтчет(ПараметрыОтчета, АдресХранилища) Экспорт
НачалоПериода = ПараметрыОтчета.НачалоПериода;
КонецПериода = ПараметрыОтчета.КонецПериода;
Куст = ПараметрыОтчета.Куст;
Склад = ПараметрыОтчета.Склад;
ТаблицаДЛяЗагрузкиВДок = ПараметрыОтчета.ТаблицаДЛяЗагрузкиВДок;
ТаблицаДЛяЗагрузкиВДок.Очистить(); //ПСВ
ТабличныйДокумент = Новый ТабличныйДокумент;
Макет = Обработки.БС_ЛимитКассыПоМагазину.ПолучитьМакет("Отчет");
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьШапка = Макет.ПолучитьОбласть("ШапкаТаблицы");
ОбластьСклад = Макет.ПолучитьОбласть("Склад");
ОбластьЗаголовок.Параметры.Заголовок = "Анализ лимита кассы "+?(ЗначениеЗаполнено(Куст),Строка(Куст)+" куст ","магазина №"+Склад.НомерМагазина)+" с "+Формат(НачалоПериода,"ДФ=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;
СтруктураРезультата = Новый Структура;
СтруктураРезультата.Вставить("ТабличныйДокумент", ТабличныйДокумент);
СтруктураРезультата.Вставить("ТаблицаДЛяЗагрузкиВДок", ТаблицаДЛяЗагрузкиВДок);
ПоместитьВоВременноеХранилище(СтруктураРезультата, АдресХранилища);
КонецПроцедуры
#КонецЕсли