Процедура РассчитатьРасходПоСреднемуИНормативу(Дата, ПоказанияСчетчиков, ЛицевойСчет=Неопределено,Контрагент = Неопределено,Счетчик = Неопределено) Экспорт //Определим норматив на дату документа Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = новый МенеджерВременныхТаблиц; Запрос.Текст = "ВЫБРАТЬ | ТабСчетчики.Счетчик, | ТабСчетчики.ЛицевойСчет, | ТабСчетчики.Помещение, | ТабСчетчики.ВидУслуги, | ТабСчетчики.НомерСтроки, | ТабСчетчики.Контрагент, | ТабСчетчики.ДатаПредыдущихПоказаний |ПОМЕСТИТЬ ТабДокумент |ИЗ | &парамТабСчетчики КАК ТабСчетчики"; Запрос.УстановитьПараметр("парамТабСчетчики",ПоказанияСчетчиков); Запрос.Выполнить(); Запрос.Текст = "ВЫБРАТЬ | ТабСчетчики.Счетчик, | ТабСчетчики.ЛицевойСчет, | ТабСчетчики.Помещение, | ТабСчетчики.Помещение.Владелец, | ТабСчетчики.Помещение.КатегорияПомещения, | ТабСчетчики.Счетчик.ВидУслуги КАК ВидУслуги, | ТабСчетчики.НомерСтроки, | ВЫБОР | КОГДА ТабСчетчики.Счетчик.флСчетчикПоДопТарифу | ТОГДА ВЫБОР | КОГДА ТабСчетчики.ЛицевойСчет.ДатаОткрытия < ТабСчетчики.Счетчик.ОсновнойСчетчик.ДатаУстановки | ТОГДА ТабСчетчики.Счетчик.ОсновнойСчетчик.ДатаУстановки | ИНАЧЕ ТабСчетчики.ЛицевойСчет.ДатаОткрытия | КОНЕЦ | ИНАЧЕ ВЫБОР | КОГДА ТабСчетчики.ЛицевойСчет.ДатаОткрытия < ТабСчетчики.Счетчик.ДатаУстановки | ТОГДА ТабСчетчики.Счетчик.ДатаУстановки | ИНАЧЕ ТабСчетчики.ЛицевойСчет.ДатаОткрытия | КОНЕЦ | КОНЕЦ КАК ДатаУстановки, | ТабСчетчики.ЛицевойСчет.Контрагент, | ТабСчетчики.Помещение.Владелец.КатегорияБлагоустройства, | ТабСчетчики.ДатаПредыдущихПоказаний |ПОМЕСТИТЬ ТабСчетчики |ИЗ | ТабДокумент КАК ТабСчетчики |ГДЕ | (ТабСчетчики.ЛицевойСчет = &ЛицевойСчет | ИЛИ &БезОтбораПоЛицевомуСчету) | И (ТабСчетчики.ЛицевойСчет.Контрагент = &Контрагент | ИЛИ &БезОтбораПоКонтрагенту) | И (ТабСчетчики.Счетчик = &Счетчик | ИЛИ &БезОтбораПоСчетчику) |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТабСчетчики.Счетчик, | ТабСчетчики.ЛицевойСчет, | ТабСчетчики.Помещение, | ТабСчетчики.Помещение.Владелец, | ТабСчетчики.Помещение.КатегорияПомещения, | ТабСчетчики.ВидУслуги, | ТабСчетчики.НомерСтроки, | ТабСчетчики.ЛицевойСчет.Контрагент, | ТабСчетчики.ДатаУстановки, | ТабСчетчики.Помещение.Владелец.КатегорияБлагоустройства, | ТабСчетчики.ДатаПредыдущихПоказаний, | ВЫБОР | КОГДА ДЕНЬ(ТабСчетчики.ДатаУстановки) = 1 | ТОГДА РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(ТабСчетчики.ДатаУстановки, ДЕНЬ), НАЧАЛОПЕРИОДА(ТабСчетчики.ДатаПредыдущихПоказаний, ДЕНЬ), МЕСЯЦ) + 1 | ИНАЧЕ РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(ТабСчетчики.ДатаУстановки, ДЕНЬ), НАЧАЛОПЕРИОДА(ТабСчетчики.ДатаПредыдущихПоказаний, ДЕНЬ), МЕСЯЦ) | КОНЕЦ КАК КоличествоМесяцев |ПОМЕСТИТЬ ТабДанные |ИЗ | ТабСчетчики КАК ТабСчетчики |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | КУ_Нормативы.Ссылка КАК Норматив, | ВЫБОР | КОГДА КУ_Нормативы.ВидНорматива = ЗНАЧЕНИЕ(Перечисление.КУ_ВидыНормативов.НаЛицевойСчет) | ТОГДА 1 | КОГДА КУ_Нормативы.ВидНорматива = ЗНАЧЕНИЕ(Перечисление.КУ_ВидыНормативов.НаЗдание) | И КУ_Нормативы.КатегорияПомещения <> ЗНАЧЕНИЕ(Справочник.КУ_КатегорииПомещений.ПустаяСсылка) | ТОГДА 2 | КОГДА КУ_Нормативы.ВидНорматива = ЗНАЧЕНИЕ(Перечисление.КУ_ВидыНормативов.НаЗдание) | И КУ_Нормативы.КатегорияПомещения = ЗНАЧЕНИЕ(Справочник.КУ_КатегорииПомещений.ПустаяСсылка) | ТОГДА 3 | КОГДА КУ_Нормативы.ВидНорматива = ЗНАЧЕНИЕ(Перечисление.КУ_ВидыНормативов.НаКатегориюБлагоустройства) | ТОГДА 4 | КОГДА КУ_Нормативы.ВидНорматива = ЗНАЧЕНИЕ(Перечисление.КУ_ВидыНормативов.НаУслугу) | И КУ_Нормативы.КатегорияПомещения <> ЗНАЧЕНИЕ(Справочник.КУ_КатегорииПомещений.ПустаяСсылка) | ТОГДА 5 | КОГДА КУ_Нормативы.ВидНорматива = ЗНАЧЕНИЕ(Перечисление.КУ_ВидыНормативов.НаУслугу) | И КУ_Нормативы.КатегорияПомещения = ЗНАЧЕНИЕ(Справочник.КУ_КатегорииПомещений.ПустаяСсылка) | ТОГДА 6 | ИНАЧЕ 7 | КОНЕЦ КАК Приоритет, | ВЫБОР | КОГДА КУ_Нормативы.КоличествоПотребителей = ЗНАЧЕНИЕ(Перечисление.КУ_КоличествоПотребителей.НаЛицевойСчет) | ТОГДА 1 | КОГДА КУ_Нормативы.КоличествоПотребителей = ЗНАЧЕНИЕ(Перечисление.КУ_КоличествоПотребителей.КоличествоПроживающих) | ТОГДА ЕСТЬNULL(КУ_КоличествоПроживающихПоЛСОстатки.КоличествоПроживающихОстаток, 0) | КОГДА КУ_Нормативы.КоличествоПотребителей = ЗНАЧЕНИЕ(Перечисление.КУ_КоличествоПотребителей.КоличествоЗарегистрированных) | ТОГДА ЕСТЬNULL(КУ_КоличествоПроживающихПоЛСОстатки.КоличествоЗарегистрированныхОстаток, 0) | КОГДА КУ_Нормативы.КоличествоПотребителей = ЗНАЧЕНИЕ(Перечисление.КУ_КоличествоПотребителей.КоличествоПостоянноЗарегистрированных) | ТОГДА ЕСТЬNULL(КУ_КоличествоПроживающихПоЛСОстатки.КоличествоПостоянноЗарегистрированныхОстаток, 0) | КОГДА КУ_Нормативы.КоличествоПотребителей = ЗНАЧЕНИЕ(Перечисление.КУ_КоличествоПотребителей.ПоХарактеристикеПомещения) | ТОГДА ЕСТЬNULL(КУ_ЗначенияХарактеристикПомещенийСрезПоследних.Значение, 0) | ИНАЧЕ 0 | КОНЕЦ КАК КоличествоПотребителей, | ТабДанные.НомерСтроки КАК НомерСтроки, | ТабДанные.Счетчик, | ТабДанные.ДатаУстановки, | ТабДанные.ДатаПредыдущихПоказаний, | ВЫБОР | КОГДА ТабДанные.КоличествоМесяцев >= &КоличествоМесяцевПоСреднему | ТОГДА &КоличествоМесяцевПоСреднему | ИНАЧЕ ТабДанные.КоличествоМесяцев | КОНЕЦ КАК КоличествоМесяцев |ПОМЕСТИТЬ ТабНормативы |ИЗ | ТабДанные КАК ТабДанные | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.КУ_КоличествоПроживающихПоЛС.Остатки(&Дата, ЛицевойСчет В (&СпЛицевыхСчетов)) КАК КУ_КоличествоПроживающихПоЛСОстатки | ПО ТабДанные.ЛицевойСчет = КУ_КоличествоПроживающихПоЛСОстатки.ЛицевойСчет | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КУ_Нормативы КАК КУ_Нормативы | ПО ТабДанные.ВидУслуги = КУ_Нормативы.ВидУслуги | И (ТабДанные.ЛицевойСчет = КУ_Нормативы.ЛицевойСчет | ИЛИ КУ_Нормативы.ВидНорматива <> ЗНАЧЕНИЕ(Перечисление.КУ_ВидыНормативов.НаЛицевойСчет)) | И (КУ_Нормативы.ДатаОкончания = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) | ИЛИ КУ_Нормативы.ДатаОкончания > &Дата) | И (НЕ КУ_Нормативы.ПометкаУдаления) | И (КУ_Нормативы.ДатаНачала <= &Дата) | И (ТабДанные.Помещение.Владелец = КУ_Нормативы.Здание | ИЛИ КУ_Нормативы.ВидНорматива <> ЗНАЧЕНИЕ(Перечисление.КУ_ВидыНормативов.НаЗдание)) | И (КУ_Нормативы.КатегорияПомещения = ЗНАЧЕНИЕ(Справочник.КУ_КатегорииПомещений.ПустаяСсылка) | ИЛИ КУ_Нормативы.КатегорияПомещения = ТабДанные.Помещение.КатегорияПомещения) | И (КУ_Нормативы.ВидПотребления = ЗНАЧЕНИЕ(Перечисление.КУ_ВидыПотреблений.Индивидуальный)) | И (ТабДанные.Помещение.Владелец = КУ_Нормативы.Здание | ИЛИ КУ_Нормативы.ВидНорматива <> ЗНАЧЕНИЕ(Перечисление.КУ_ВидыНормативов.НаЗдание)) | И (ТабДанные.Помещение.Владелец.КатегорияБлагоустройства = КУ_Нормативы.КатегорияБлагоустройства | ИЛИ КУ_Нормативы.ВидНорматива <> ЗНАЧЕНИЕ(Перечисление.КУ_ВидыНормативов.НаКатегориюБлагоустройства)) | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КУ_ЗначенияХарактеристикПомещений.СрезПоследних КАК КУ_ЗначенияХарактеристикПомещенийСрезПоследних | ПО ТабДанные.Помещение = КУ_ЗначенияХарактеристикПомещенийСрезПоследних.Помещение | И (КУ_ЗначенияХарактеристикПомещенийСрезПоследних.Характеристика = КУ_Нормативы.Характеристика) |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТабНормативы.Норматив, | ТабНормативы.Приоритет, | ТабНормативы.КоличествоПотребителей, | ТабНормативы.НомерСтроки, | ТабНормативы.Счетчик, | ТабНормативы.ДатаУстановки, | ТабНормативы.КоличествоМесяцев, | ТабНормативы.ДатаПредыдущихПоказаний |ПОМЕСТИТЬ ТабПриоритетныеНормативы |ИЗ | ТабНормативы КАК ТабНормативы | ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ | ТабНормативы.НомерСтроки КАК НомерСтроки, | МИНИМУМ(ТабНормативы.Приоритет) КАК Приоритет | ИЗ | ТабНормативы КАК ТабНормативы | | СГРУППИРОВАТЬ ПО | ТабНормативы.НомерСтроки) КАК ВложенныйЗапрос | ПО ТабНормативы.НомерСтроки = ВложенныйЗапрос.НомерСтроки | И ТабНормативы.Приоритет = ВложенныйЗапрос.Приоритет |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТабПриоритетныеНормативы.Норматив, | ТабПриоритетныеНормативы.Приоритет, | ТабПриоритетныеНормативы.КоличествоПотребителей, | ТабПриоритетныеНормативы.НомерСтроки КАК НомерСтроки, | ТабПриоритетныеНормативы.Счетчик, | СУММА(ЕСТЬNULL(КУ_РасходПоСчетчикам.РасходПоПоказаниям, 0)) КАК РасходПоПоказаниям, | ТабПриоритетныеНормативы.КоличествоМесяцев, | ТабПриоритетныеНормативы.ДатаУстановки, | ТабПриоритетныеНормативы.ДатаПредыдущихПоказаний, | ВЫБОР | КОГДА КУ_РасходПоСчетчикам.Счетчик.флИспользоватьКоэффициент | И КУ_РасходПоСчетчикам.Счетчик.Коэффициент <> 0 | ТОГДА КУ_РасходПоСчетчикам.Счетчик.Коэффициент | ИНАЧЕ 1 | КОНЕЦ КАК КоэффициентСчетчика |ИЗ | ТабПриоритетныеНормативы КАК ТабПриоритетныеНормативы | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.КУ_РасходПоСчетчикам КАК КУ_РасходПоСчетчикам | ПО ТабПриоритетныеНормативы.Счетчик = КУ_РасходПоСчетчикам.Счетчик | И (НАЧАЛОПЕРИОДА(КУ_РасходПоСчетчикам.Период, МЕСЯЦ) МЕЖДУ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(ТабПриоритетныеНормативы.ДатаПредыдущихПоказаний, МЕСЯЦ), МЕСЯЦ, -ТабПриоритетныеНормативы.КоличествоМесяцев + 1) И НАЧАЛОПЕРИОДА(ТабПриоритетныеНормативы.ДатаПредыдущихПоказаний, МЕСЯЦ)) | |СГРУППИРОВАТЬ ПО | ТабПриоритетныеНормативы.Норматив, | ТабПриоритетныеНормативы.Приоритет, | ТабПриоритетныеНормативы.КоличествоПотребителей, | ТабПриоритетныеНормативы.НомерСтроки, | ТабПриоритетныеНормативы.Счетчик, | ТабПриоритетныеНормативы.ДатаУстановки, | ТабПриоритетныеНормативы.КоличествоМесяцев, | ТабПриоритетныеНормативы.ДатаПредыдущихПоказаний, | ВЫБОР | КОГДА КУ_РасходПоСчетчикам.Счетчик.флИспользоватьКоэффициент | И КУ_РасходПоСчетчикам.Счетчик.Коэффициент <> 0 | ТОГДА КУ_РасходПоСчетчикам.Счетчик.Коэффициент | ИНАЧЕ 1 | КОНЕЦ | |УПОРЯДОЧИТЬ ПО | НомерСтроки |АВТОУПОРЯДОЧИВАНИЕ"; КоличествоМесяцевПоСреднему = Константы.КУ_КоличествоМесяцевДляРасчетаПоСреднему.Получить(); Если КоличествоМесяцевПоСреднему <= 0 Тогда КУ_ИнтерфейсКлиентСервер.СообщитьОбОшибке("Не установлена константа ""Количество месяцев для расчета среднемесячного расхода по счетчику""! Расчет выполнен из расчета 6 месяцев."); КоличествоМесяцевПоСреднему=6; КонецЕсли; Запрос.УстановитьПараметр("Дата",Дата); Запрос.УстановитьПараметр("СпЛицевыхСчетов",ПоказанияСчетчиков.ВыгрузитьКолонку("ЛицевойСчет")); Запрос.УстановитьПараметр("ПредыдущийПериод",НачалоМесяца(ДобавитьМесяц(Дата,-1))); Запрос.УстановитьПараметр("КоличествоМесяцевПоСреднему",КоличествоМесяцевПоСреднему); Запрос.УстановитьПараметр("ЛицевойСчет", ЛицевойСчет); Запрос.УстановитьПараметр("БезОтбораПоЛицевомуСчету", НЕ ЗначениеЗаполнено(ЛицевойСчет)); Запрос.УстановитьПараметр("Контрагент", Контрагент); Запрос.УстановитьПараметр("БезОтбораПоКонтрагенту", НЕ ЗначениеЗаполнено(Контрагент)); Запрос.УстановитьПараметр("Счетчик", Счетчик); Запрос.УстановитьПараметр("БезОтбораПоСчетчику", НЕ ЗначениеЗаполнено(Счетчик)); ЗачитыватьРасходПоСреднему = Константы.КУ_ЗачитыватьРасходПоСреднемуПриВводеТекущихПоказаний.Получить(); Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока Выборка.Следующий() Цикл ТекущиеДанные = ПоказанияСчетчиков.Получить(Выборка.НомерСтроки - 1); Если ТекущиеДанные.ТекущееПоказание = 0 ИЛИ (ТекущиеДанные.ДатаПредыдущихПоказаний < НачалоМесяца(ДобавитьМесяц(Дата,-1)) И НЕ ЗачитыватьРасходПоСреднему) Тогда //Расчет по среднему или нормативу в целом по лицевому счету по одному из счетчиков ПериодПоследнихПоказаний = ТекущиеДанные.ДатаПредыдущихПоказаний; //ОТЛ. КоличествоМесяцев = Выборка.КоличествоМесяцев; //счетчик снят - считаем по-среднему 3 месяца для жилых и 2 месяца для нежилых помещений, далее - норматив Если ЗначениеЗаполнено(ТекущиеДанные.Счетчик.ДатаСнятия) И КонецМесяца(ТекущиеДанные.Счетчик.ДатаСнятия) < НачалоМесяца(Дата) Тогда Если ЗначениеЗаполнено(ТекущиеДанные.Помещение.КатегорияПомещения.ВидКатегории) И ТекущиеДанные.Помещение.КатегорияПомещения.ВидКатегории = Справочники.КУ_ВидыКатегорийПомещений.НеЖилоеПомещение Тогда КоличествоМесяцевПоСреднему = 2; Иначе //+tolick КоличествоМесяцевПоСреднему = 6; //-tolick КонецЕсли; КонецЕсли; РасходПоПоказаниям = Выборка.РасходПоПоказаниям; Если ПериодПоследнихПоказаний < НачалоМесяца(ДобавитьМесяц(Дата,-КоличествоМесяцевПоСреднему)) ИЛИ КоличествоМесяцев < 3 ИЛИ Выборка.РасходПоПоказаниям <= 0 Тогда //Проверка на ранее установленные счетчики (23.12.2015) Если (Выборка.Счетчик.РанееУстановленныйСчетчик <> Справочники.КУ_Счетчики.ПустаяСсылка() ИЛИ Выборка.Счетчик.ОсновнойСчетчик.РанееУстановленныйСчетчик <> Справочники.КУ_Счетчики.ПустаяСсылка()) И (Выборка.Счетчик.ДатаУстановки >= ДобавитьМесяц(НачалоМесяца(Дата), -(6)) ИЛИ Выборка.Счетчик.ОсновнойСчетчик.ДатаУстановки >= ДобавитьМесяц(НачалоМесяца(Дата), -(6))) Тогда //Счетчик установлен в текущем месяце расчета Если НачалоМесяца(Выборка.Счетчик.ДатаУстановки) = НачалоМесяца(Дата) ИЛИ Выборка.Счетчик.ОсновнойСчетчик.ДатаУстановки = НачалоМесяца(Дата) Тогда Если Выборка.Счетчик.ОсновнойСчетчик = Справочники.КУ_Счетчики.ПустаяСсылка() Тогда ТарифностьТекущийСчетчик = Выборка.Счетчик.ТарифностьСчетчика; ТарифностьПредыдущийСчетчик = Выборка.Счетчик.РанееУстановленныйСчетчик.ТарифностьСчетчика; Иначе ТарифностьТекущийСчетчик = Выборка.Счетчик.ОсновнойСчетчик.ТарифностьСчетчика; ТарифностьПредыдущийСчетчик = Выборка.Счетчик.ОсновнойСчетчик.РанееУстановленныйСчетчик.ТарифностьСчетчика; КонецЕсли; Если ТарифностьТекущийСчетчик = ТарифностьПредыдущийСчетчик Тогда нЗапрос = Новый Запрос; нЗапрос.Текст = "ВЫБРАТЬ | КУ_ПоказанияСчетчиков.РасходПоПоказаниям, | КУ_ПоказанияСчетчиков.Период КАК Период |ИЗ | РегистрСведений.КУ_ПоказанияСчетчиков КАК КУ_ПоказанияСчетчиков |ГДЕ | КУ_ПоказанияСчетчиков.Счетчик = &Счетчик | И КУ_ПоказанияСчетчиков.Период МЕЖДУ &НачалоПериода И &КонецПериода | И КУ_ПоказанияСчетчиков.РасходПоПоказаниям <> 0 | |УПОРЯДОЧИТЬ ПО | Период"; Если Выборка.Счетчик.ОсновнойСчетчик = Справочники.КУ_Счетчики.ПустаяСсылка() Тогда нЗапрос.УстановитьПараметр("Счетчик",Выборка.Счетчик.РанееУстановленныйСчетчик); нЗапрос.УстановитьПараметр("НачалоПериода", ДобавитьМесяц(НачалоМесяца(Дата), -(КоличествоМесяцевПоСреднему))); нЗапрос.УстановитьПараметр("КонецПериода",Дата); Иначе Если Выборка.Счетчик.ОсновнойСчетчик.СчетчикВторойТариф = Выборка.Счетчик Тогда нЗапрос.УстановитьПараметр("Счетчик",Выборка.Счетчик.ОсновнойСчетчик.РанееУстановленныйСчетчик.СчетчикВторойТариф); Иначе нЗапрос.УстановитьПараметр("Счетчик",Выборка.Счетчик.ОсновнойСчетчик.РанееУстановленныйСчетчик.СчетчикТретийТариф) КонецЕсли; нЗапрос.УстановитьПараметр("НачалоПериода", ДобавитьМесяц(НачалоМесяца(Дата), -(КоличествоМесяцевПоСреднему))); нЗапрос.УстановитьПараметр("КонецПериода",Дата); КонецЕсли; нВыборка = нЗапрос.Выполнить().Выбрать(); КоличествоМесяцев = нВыборка.Количество(); Пока нВыборка.Следующий() Цикл РасходПоПоказаниям = РасходПоПоказаниям + нВыборка.РасходПоПоказаниям; КонецЦикла; ПериодПоследнихПоказаний = нВыборка.Период; Иначе Если Выборка.Счетчик.РанееУстановленныйСчетчик.ТарифностьСчетчика = Перечисления.КУ_ТарифностьСчетчика.Двухтарифный Тогда //Расчет для первого тарифа нЗапрос = Новый Запрос; нЗапрос.Текст = "ВЫБРАТЬ | КУ_ПоказанияСчетчиков.РасходПоПоказаниям, | КУ_ПоказанияСчетчиков.Период КАК Период |ИЗ | РегистрСведений.КУ_ПоказанияСчетчиков КАК КУ_ПоказанияСчетчиков |ГДЕ | КУ_ПоказанияСчетчиков.Счетчик = &Счетчик | И КУ_ПоказанияСчетчиков.Период МЕЖДУ &НачалоПериода И &КонецПериода | И КУ_ПоказанияСчетчиков.РасходПоПоказаниям <> 0 | |УПОРЯДОЧИТЬ ПО | Период"; нЗапрос.УстановитьПараметр("Счетчик",Выборка.Счетчик.РанееУстановленныйСчетчик); нЗапрос.УстановитьПараметр("НачалоПериода", ДобавитьМесяц(НачалоМесяца(Дата), -(КоличествоМесяцевПоСреднему))); нЗапрос.УстановитьПараметр("КонецПериода",Дата); нВыборка = нЗапрос.Выполнить().Выбрать(); КоличествоМесяцев = нВыборка.Количество(); Пока нВыборка.Следующий() Цикл РасходПоПоказаниям = РасходПоПоказаниям + нВыборка.РасходПоПоказаниям; КонецЦикла; //РасходПоСреднемуПервыйТариф = РасходПоПоказаниям / КоличествоМесяцев / Выборка.КоэффициентСчетчика; ПериодПоследнихПоказаний = нВыборка.Период; //Расчет для второго тарифа нЗапрос = Новый Запрос; нЗапрос.Текст = "ВЫБРАТЬ | КУ_ПоказанияСчетчиков.РасходПоПоказаниям, | КУ_ПоказанияСчетчиков.Период КАК Период |ИЗ | РегистрСведений.КУ_ПоказанияСчетчиков КАК КУ_ПоказанияСчетчиков |ГДЕ | КУ_ПоказанияСчетчиков.Счетчик = &Счетчик | И КУ_ПоказанияСчетчиков.Период МЕЖДУ &НачалоПериода И &КонецПериода | И КУ_ПоказанияСчетчиков.РасходПоПоказаниям <> 0 | |УПОРЯДОЧИТЬ ПО | Период"; нЗапрос.УстановитьПараметр("Счетчик",Выборка.Счетчик.РанееУстановленныйСчетчик.СчетчикВторойТариф); нЗапрос.УстановитьПараметр("НачалоПериода", ДобавитьМесяц(НачалоМесяца(Дата), -(КоличествоМесяцевПоСреднему))); нЗапрос.УстановитьПараметр("КонецПериода",Дата); нВыборка = нЗапрос.Выполнить().Выбрать(); нКоличествоМесяцев = нВыборка.Количество(); //РасходПоПоказаниям = 0; Пока нВыборка.Следующий() Цикл РасходПоПоказаниям = РасходПоПоказаниям + нВыборка.РасходПоПоказаниям; КонецЦикла; //РасходПоСреднемуВторойТариф = РасходПоПоказаниям / нКоличествоМесяцев / Выборка.КоэффициентСчетчика; Иначе //Расчет для первого тарифа нЗапрос = Новый Запрос; нЗапрос.Текст = "ВЫБРАТЬ | КУ_ПоказанияСчетчиков.РасходПоПоказаниям, | КУ_ПоказанияСчетчиков.Период КАК Период |ИЗ | РегистрСведений.КУ_ПоказанияСчетчиков КАК КУ_ПоказанияСчетчиков |ГДЕ | КУ_ПоказанияСчетчиков.Счетчик = &Счетчик | И КУ_ПоказанияСчетчиков.Период МЕЖДУ &НачалоПериода И &КонецПериода | И КУ_ПоказанияСчетчиков.РасходПоПоказаниям <> 0 | |УПОРЯДОЧИТЬ ПО | Период"; нЗапрос.УстановитьПараметр("Счетчик",Выборка.Счетчик.РанееУстановленныйСчетчик); нЗапрос.УстановитьПараметр("НачалоПериода", ДобавитьМесяц(НачалоМесяца(Дата), -(КоличествоМесяцевПоСреднему))); нЗапрос.УстановитьПараметр("КонецПериода",Дата); нВыборка = нЗапрос.Выполнить().Выбрать(); КоличествоМесяцев = нВыборка.Количество(); Пока нВыборка.Следующий() Цикл РасходПоПоказаниям = РасходПоПоказаниям + нВыборка.РасходПоПоказаниям; КонецЦикла; //РасходПоСреднемуПервыйТариф = РасходПоПоказаниям / КоличествоМесяцев / Выборка.КоэффициентСчетчика; ПериодПоследнихПоказаний = нВыборка.Период; //Расчет для второго тарифа нЗапрос = Новый Запрос; нЗапрос.Текст = "ВЫБРАТЬ | КУ_ПоказанияСчетчиков.РасходПоПоказаниям, | КУ_ПоказанияСчетчиков.Период КАК Период |ИЗ | РегистрСведений.КУ_ПоказанияСчетчиков КАК КУ_ПоказанияСчетчиков |ГДЕ | КУ_ПоказанияСчетчиков.Счетчик = &Счетчик | И КУ_ПоказанияСчетчиков.Период МЕЖДУ &НачалоПериода И &КонецПериода | И КУ_ПоказанияСчетчиков.РасходПоПоказаниям <> 0 | |УПОРЯДОЧИТЬ ПО | Период"; нЗапрос.УстановитьПараметр("Счетчик",Выборка.Счетчик.РанееУстановленныйСчетчик.СчетчикВторойТариф); нЗапрос.УстановитьПараметр("НачалоПериода", ДобавитьМесяц(НачалоМесяца(Дата), -(КоличествоМесяцевПоСреднему))); нЗапрос.УстановитьПараметр("КонецПериода",Дата); нВыборка = нЗапрос.Выполнить().Выбрать(); нКоличествоМесяцев = нВыборка.Количество(); //РасходПоПоказаниям = 0; Пока нВыборка.Следующий() Цикл РасходПоПоказаниям = РасходПоПоказаниям + нВыборка.РасходПоПоказаниям; КонецЦикла; //РасходПоСреднемуВторойТариф = РасходПоПоказаниям / нКоличествоМесяцев / Выборка.КоэффициентСчетчика; //Расчет для третьего тарифа нЗапрос = Новый Запрос; нЗапрос.Текст = "ВЫБРАТЬ | КУ_ПоказанияСчетчиков.РасходПоПоказаниям, | КУ_ПоказанияСчетчиков.Период КАК Период |ИЗ | РегистрСведений.КУ_ПоказанияСчетчиков КАК КУ_ПоказанияСчетчиков |ГДЕ | КУ_ПоказанияСчетчиков.Счетчик = &Счетчик | И КУ_ПоказанияСчетчиков.Период МЕЖДУ &НачалоПериода И &КонецПериода | И КУ_ПоказанияСчетчиков.РасходПоПоказаниям <> 0 | |УПОРЯДОЧИТЬ ПО | Период"; нЗапрос.УстановитьПараметр("Счетчик",Выборка.Счетчик.РанееУстановленныйСчетчик.СчетчикТретийТариф); нЗапрос.УстановитьПараметр("НачалоПериода", ДобавитьМесяц(НачалоМесяца(Дата), -(КоличествоМесяцевПоСреднему))); нЗапрос.УстановитьПараметр("КонецПериода",Дата); нВыборка = нЗапрос.Выполнить().Выбрать(); нКоличествоМесяцев = нВыборка.Количество(); //РасходПоПоказаниям = 0; Пока нВыборка.Следующий() Цикл РасходПоПоказаниям = РасходПоПоказаниям + нВыборка.РасходПоПоказаниям; КонецЦикла; //РасходПоСреднемуТретийТариф = РасходПоПоказаниям / нКоличествоМесяцев / Выборка.КоэффициентСчетчика; КонецЕсли; КонецЕсли; Иначе //Счетчик установлен не в текущем месяце расчета //Определяем количество месяцев расчитанных по среднему для нового счетчика пЗапрос = Новый Запрос; пЗапрос.Текст = "ВЫБРАТЬ | КУ_РасходПоСчетчикам.РасходПоСреднему |ИЗ | РегистрНакопления.КУ_РасходПоСчетчикам КАК КУ_РасходПоСчетчикам |ГДЕ | КУ_РасходПоСчетчикам.Счетчик = &Счетчик | И КУ_РасходПоСчетчикам.Период МЕЖДУ &НачалоПериода И &КонецПериода | И КУ_РасходПоСчетчикам.РасходПоСреднему <> 0"; Если Выборка.Счетчик.ОсновнойСчетчик = Справочники.КУ_Счетчики.ПустаяСсылка() Тогда пЗапрос.УстановитьПараметр("Счетчик",Выборка.Счетчик); пЗапрос.УстановитьПараметр("НачалоПериода", Выборка.Счетчик.ДатаУстановки); пЗапрос.УстановитьПараметр("КонецПериода", Дата); Иначе пЗапрос.УстановитьПараметр("Счетчик",Выборка.Счетчик); пЗапрос.УстановитьПараметр("НачалоПериода", Выборка.Счетчик.ОсновнойСчетчик.ДатаУстановки); пЗапрос.УстановитьПараметр("КонецПериода", Дата); КонецЕсли; пВыборка = пЗапрос.Выполнить().Выбрать(); пКоличествоМесяцев = пВыборка.Количество(); //Проверка на тарифность нового и ранееустановленного счетчика Если Выборка.Счетчик.ОсновнойСчетчик = Справочники.КУ_Счетчики.ПустаяСсылка() Тогда ТарифностьТекущийСчетчик = Выборка.Счетчик.ТарифностьСчетчика; ТарифностьПредыдущийСчетчик = Выборка.Счетчик.РанееУстановленныйСчетчик.ТарифностьСчетчика; Иначе ТарифностьТекущийСчетчик = Выборка.Счетчик.ОсновнойСчетчик.ТарифностьСчетчика; ТарифностьПредыдущийСчетчик = Выборка.Счетчик.ОсновнойСчетчик.РанееУстановленныйСчетчик.ТарифностьСчетчика; КонецЕсли; Если ТарифностьТекущийСчетчик = ТарифностьПредыдущийСчетчик Тогда Если пКоличествоМесяцев < 6 Тогда нЗапрос = Новый Запрос; нЗапрос.Текст = "ВЫБРАТЬ | КУ_ПоказанияСчетчиков.РасходПоПоказаниям, | КУ_ПоказанияСчетчиков.Период КАК Период |ИЗ | РегистрСведений.КУ_ПоказанияСчетчиков КАК КУ_ПоказанияСчетчиков |ГДЕ | КУ_ПоказанияСчетчиков.Счетчик = &Счетчик | И КУ_ПоказанияСчетчиков.Период МЕЖДУ &НачалоПериода И &КонецПериода | И КУ_ПоказанияСчетчиков.РасходПоПоказаниям <> 0 | |УПОРЯДОЧИТЬ ПО | Период"; Если РасходПоПоказаниям = 0 Тогда Если Выборка.Счетчик.ОсновнойСчетчик = Справочники.КУ_Счетчики.ПустаяСсылка() Тогда нЗапрос.УстановитьПараметр("Счетчик",Выборка.Счетчик.РанееУстановленныйСчетчик); нЗапрос.УстановитьПараметр("НачалоПериода", ДобавитьМесяц(НачалоМесяца(Выборка.Счетчик.РанееУстановленныйСчетчик.ДатаСнятия), -(КоличествоМесяцевПоСреднему - 1))); нЗапрос.УстановитьПараметр("КонецПериода", Выборка.Счетчик.РанееУстановленныйСчетчик.ДатаСнятия); Иначе Если Выборка.Счетчик.ОсновнойСчетчик.СчетчикВторойТариф = Выборка.Счетчик Тогда нЗапрос.УстановитьПараметр("Счетчик",Выборка.Счетчик.ОсновнойСчетчик.РанееУстановленныйСчетчик.СчетчикВторойТариф); Иначе нЗапрос.УстановитьПараметр("Счетчик",Выборка.Счетчик.ОсновнойСчетчик.РанееУстановленныйСчетчик.СчетчикТретийТариф) КонецЕсли; нЗапрос.УстановитьПараметр("НачалоПериода", ДобавитьМесяц(НачалоМесяца(Выборка.Счетчик.ОсновнойСчетчик.РанееУстановленныйСчетчик.ДатаСнятия), -(КоличествоМесяцевПоСреднему - 1))); нЗапрос.УстановитьПараметр("КонецПериода", Выборка.Счетчик.ОсновнойСчетчик.РанееУстановленныйСчетчик.ДатаСнятия); КонецЕсли; НаличиеПоказаний = Ложь; Иначе Если Выборка.Счетчик.ОсновнойСчетчик = Справочники.КУ_Счетчики.ПустаяСсылка() Тогда нЗапрос.УстановитьПараметр("Счетчик",Выборка.Счетчик.РанееУстановленныйСчетчик); нЗапрос.УстановитьПараметр("НачалоПериода", ДобавитьМесяц(НачалоМесяца(Выборка.Счетчик.РанееУстановленныйСчетчик.ДатаСнятия), -(КоличествоМесяцевПоСреднему - 1 - КоличествоМесяцев))); нЗапрос.УстановитьПараметр("КонецПериода", Выборка.Счетчик.РанееУстановленныйСчетчик.ДатаСнятия); Иначе Если Выборка.Счетчик.ОсновнойСчетчик.СчетчикВторойТариф = Выборка.Счетчик Тогда нЗапрос.УстановитьПараметр("Счетчик",Выборка.Счетчик.ОсновнойСчетчик.РанееУстановленныйСчетчик.СчетчикВторойТариф); Иначе нЗапрос.УстановитьПараметр("Счетчик",Выборка.Счетчик.ОсновнойСчетчик.РанееУстановленныйСчетчик.СчетчикТретийТариф) КонецЕсли; нЗапрос.УстановитьПараметр("НачалоПериода", ДобавитьМесяц(НачалоМесяца(Выборка.Счетчик.ОсновнойСчетчик.РанееУстановленныйСчетчик.ДатаСнятия), -(КоличествоМесяцевПоСреднему - 1 - КоличествоМесяцев))); нЗапрос.УстановитьПараметр("КонецПериода", Выборка.Счетчик.ОсновнойСчетчик.РанееУстановленныйСчетчик.ДатаСнятия); КонецЕсли; НаличиеПоказаний = Истина; КонецЕсли; нВыборка = нЗапрос.Выполнить().Выбрать(); КоличествоМесяцев = (КоличествоМесяцев + нВыборка.Количество()) - 1; Пока нВыборка.Следующий() Цикл РасходПоПоказаниям = РасходПоПоказаниям + нВыборка.РасходПоПоказаниям; КонецЦикла; Если НаличиеПоказаний = Истина Тогда КоличествоМесяцев = (Выборка.КоличествоМесяцев + нВыборка.Количество()); КонецЕсли; КонецЕсли; Иначе Если пКоличествоМесяцев < 6 Тогда //Расчет для первого тарифа нЗапрос = Новый Запрос; нЗапрос.Текст = "ВЫБРАТЬ | КУ_ПоказанияСчетчиков.РасходПоПоказаниям, | КУ_ПоказанияСчетчиков.Период КАК Период |ИЗ | РегистрСведений.КУ_ПоказанияСчетчиков КАК КУ_ПоказанияСчетчиков |ГДЕ | КУ_ПоказанияСчетчиков.Счетчик = &Счетчик | И КУ_ПоказанияСчетчиков.Период МЕЖДУ &НачалоПериода И &КонецПериода | И КУ_ПоказанияСчетчиков.РасходПоПоказаниям <> 0 | |УПОРЯДОЧИТЬ ПО | Период"; Если РасходПоПоказаниям = 0 Тогда НаличиеПоказаний = Ложь; Иначе НаличиеПоказаний = Истина; КонецЕсли; нЗапрос.УстановитьПараметр("Счетчик",Выборка.Счетчик.РанееУстановленныйСчетчик); нЗапрос.УстановитьПараметр("НачалоПериода", ДобавитьМесяц(НачалоМесяца(Выборка.Счетчик.РанееУстановленныйСчетчик.ДатаСнятия), -(КоличествоМесяцевПоСреднему - 1))); нЗапрос.УстановитьПараметр("КонецПериода", Выборка.Счетчик.РанееУстановленныйСчетчик.ДатаСнятия); нВыборка = нЗапрос.Выполнить().Выбрать(); КоличествоМесяцев = (КоличествоМесяцев + нВыборка.Количество()) - 1; Пока нВыборка.Следующий() Цикл РасходПоПоказаниям = РасходПоПоказаниям + нВыборка.РасходПоПоказаниям; //РасходПоСреднемуПервыйТариф = РасходПоПоказаниям / КоличествоМесяцев / Выборка.КоэффициентСчетчика; КонецЦикла; Если НаличиеПоказаний = Истина Тогда КоличествоМесяцев = (Выборка.КоличествоМесяцев + нВыборка.Количество()); КонецЕсли; //Расчет для второго тарифа нЗапрос = Новый Запрос; нЗапрос.Текст = "ВЫБРАТЬ | КУ_ПоказанияСчетчиков.РасходПоПоказаниям, | КУ_ПоказанияСчетчиков.Период КАК Период |ИЗ | РегистрСведений.КУ_ПоказанияСчетчиков КАК КУ_ПоказанияСчетчиков |ГДЕ | КУ_ПоказанияСчетчиков.Счетчик = &Счетчик | И КУ_ПоказанияСчетчиков.Период МЕЖДУ &НачалоПериода И &КонецПериода | И КУ_ПоказанияСчетчиков.РасходПоПоказаниям <> 0 | |УПОРЯДОЧИТЬ ПО | Период"; нЗапрос.УстановитьПараметр("Счетчик",Выборка.Счетчик.РанееУстановленныйСчетчик.СчетчикВторойТариф); нЗапрос.УстановитьПараметр("НачалоПериода", ДобавитьМесяц(НачалоМесяца(Выборка.Счетчик.РанееУстановленныйСчетчик.ДатаСнятия), -(КоличествоМесяцевПоСреднему - 1))); нЗапрос.УстановитьПараметр("КонецПериода", Выборка.Счетчик.РанееУстановленныйСчетчик.ДатаСнятия); нВыборка = нЗапрос.Выполнить().Выбрать(); //нКоличествоМесяцев = 0; //РасходПоПоказаниям = 0; //нКоличествоМесяцев = нВыборка.Количество(); Пока нВыборка.Следующий() Цикл РасходПоПоказаниям = РасходПоПоказаниям + нВыборка.РасходПоПоказаниям; //РасходПоСреднемуВторойТариф = РасходПоПоказаниям / нКоличествоМесяцев / Выборка.КоэффициентСчетчика; КонецЦикла; //Расчет для третьего тарифа Если Выборка.Счетчик.РанееУстановленныйСчетчик.ТарифностьСчетчика = Перечисления.КУ_ТарифностьСчетчика.Трехтарифный Тогда нЗапрос = Новый Запрос; нЗапрос.Текст = "ВЫБРАТЬ | КУ_ПоказанияСчетчиков.РасходПоПоказаниям, | КУ_ПоказанияСчетчиков.Период КАК Период |ИЗ | РегистрСведений.КУ_ПоказанияСчетчиков КАК КУ_ПоказанияСчетчиков |ГДЕ | КУ_ПоказанияСчетчиков.Счетчик = &Счетчик | И КУ_ПоказанияСчетчиков.Период МЕЖДУ &НачалоПериода И &КонецПериода | И КУ_ПоказанияСчетчиков.РасходПоПоказаниям <> 0 | |УПОРЯДОЧИТЬ ПО | Период"; нЗапрос.УстановитьПараметр("Счетчик",Выборка.Счетчик.РанееУстановленныйСчетчик.СчетчикТретийТариф); нЗапрос.УстановитьПараметр("НачалоПериода", ДобавитьМесяц(НачалоМесяца(Выборка.Счетчик.РанееУстановленныйСчетчик.ДатаСнятия), -(КоличествоМесяцевПоСреднему - 1))); нЗапрос.УстановитьПараметр("КонецПериода", Выборка.Счетчик.РанееУстановленныйСчетчик.ДатаСнятия); нВыборка = нЗапрос.Выполнить().Выбрать(); //нКоличествоМесяцев = 0; //РасходПоПоказаниям = 0; нКоличествоМесяцев = нВыборка.Количество(); Пока нВыборка.Следующий() Цикл РасходПоПоказаниям = РасходПоПоказаниям + нВыборка.РасходПоПоказаниям; //РасходПоСреднемуТретийТариф = РасходПоПоказаниям / нКоличествоМесяцев / Выборка.КоэффициентСчетчика; КонецЦикла; КонецЕсли; КонецЕсли КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; Если ПериодПоследнихПоказаний < НачалоМесяца(ДобавитьМесяц(Дата,-КоличествоМесяцевПоСреднему)) ИЛИ КоличествоМесяцев < 3 ИЛИ РасходПоПоказаниям <= 0 Тогда //Расчет по нормативу Если ТекущиеДанные.Счетчик.флЗаполнятьРасходПоНормативу И НЕ ТекущиеДанные.Счетчик.флСчетчикПоДопТарифу И НЕ ТекущиеДанные.Счетчик.флСчетчикПоВторомуТарифу И НЕ ТекущиеДанные.Счетчик.флСчетчикПоТретьемуТарифу Тогда Норматив = КУ_ПроцедурыРасчета.ПолучитьРазмерНорматива(Выборка.Норматив,Выборка.КоличествоПотребителей,ТекущиеДанные.Помещение.КоличествоКомнат); ТекущиеДанные.РасходПоПоказаниям = 0; ТекущиеДанные.РасходПоСреднему = 0; ТекущиеДанные.РасходПоНормативу = Норматив * Выборка.КоличествоПотребителей / Выборка.КоэффициентСчетчика; ТекущиеДанные.Расход = ТекущиеДанные.РасходПоНормативу; Иначе ТекущиеДанные.РасходПоПоказаниям = 0; ТекущиеДанные.РасходПоСреднему = 0; ТекущиеДанные.РасходПоНормативу = 0; ТекущиеДанные.Расход = 0; КонецЕсли; ИначеЕсли ПериодПоследнихПоказаний < НачалоМесяца(Дата) Тогда //Расчет по среднему по конкретному счетчику ТекущиеДанные.РасходПоПоказаниям = 0; ТекущиеДанные.РасходПоСреднему = РасходПоПоказаниям / КоличествоМесяцев / Выборка.КоэффициентСчетчика; ТекущиеДанные.РасходПоНормативу = 0; ТекущиеДанные.Расход = ТекущиеДанные.РасходПоСреднему; КонецЕсли; Если пКоличествоМесяцев <> Неопределено Тогда Если пКоличествоМесяцев < 6 И ПериодПоследнихПоказаний < НачалоМесяца(Дата) Тогда ТекущиеДанные.РасходПоПоказаниям = 0; ТекущиеДанные.РасходПоСреднему = РасходПоПоказаниям / КоличествоМесяцев / Выборка.КоэффициентСчетчика; ТекущиеДанные.РасходПоНормативу = 0; ТекущиеДанные.Расход = ТекущиеДанные.РасходПоСреднему; КонецЕсли; КонецЕсли; //Если ТарифностьТекущийСчетчик <> ТарифностьПредыдущийСчетчик И ПериодПоследнихПоказаний < НачалоМесяца(Дата) Тогда // ТекущиеДанные.РасходПоПоказаниям = 0; // ТекущиеДанные.РасходПоСреднему = РасходПоСреднемуПервыйТариф + РасходПоСреднемуВторойТариф + РасходПоСреднемуТретийТариф; // ТекущиеДанные.РасходПоНормативу = 0; // ТекущиеДанные.Расход = ТекущиеДанные.РасходПоСреднему; //КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры