evngas.gif (2282 bytes)

Настройка расчета начислений за газ

Рассчеты с населением за газ

evngas.vallmind.ru

www.vallmind.ru

Ситуации при составлении документов и их решения

(Настройка расчета начислений за газ, приема оплаты и составления других документов)

indbul1a.gif (440 bytes) От простого
indbul1a.gif (440 bytes) Две ситуации - два решения
indbul1a.gif (440 bytes) Ситуация 1: Расчет начислений за газ
indbul2a.gif (311 bytes) Расчет объемов по норме
indbul3a.gif (907 bytes) Добавление позиций
indbul3a.gif (907 bytes) Объемы по норме на пищеприготовление и подогрев воды 
indbul3a.gif (907 bytes) Объемы по норме на приготовление корма животным
indbul3a.gif (907 bytes) Объемы по норме на отопление без приборов учета
indbul2a.gif (311 bytes) Расчет сумм в каждом уровне расчета
indbul3a.gif (907 bytes) Суммы за пищеприготовление и подогрев воды
indbul3a.gif (907 bytes) Суммы за приготовление пищи животным
indbul3a.gif (907 bytes) Суммы за отопление без приборов учета
indbul1a.gif (440 bytes) Итоговый расчет
indbul2a.gif (311 bytes) Сумма по показаниям счетчиков
indbul2a.gif (311 bytes) Льготы
indbul3a.gif (907 bytes) Объем (плита, колонка) для начисления льгот без приборов учета
indbul3a.gif (907 bytes) Площадь для начисления льгот без приборов учета
indbul3a.gif (907 bytes) Объем для начисления льгот по приборам учета
Тариф на пригот. пищи и гор.воды
indbul1a.gif (440 bytes) Исключения из ситуаций
indbul2a.gif (311 bytes) Наследование решений
indbul2a.gif (311 bytes) Пример: особенности начислений для участков

Составлением сложных (расчет зарплаты, расчет начислений за газ, ...) и простых (оплата, накладные, ...) документов занимается система умолчаний СКУ "Events". Существует перечень событий при возникновении которых система умолчаний СКУ "Events" обязана проанализировать ситуацию и выполнить ряд действий (решений). Так система умолчаний анализирует ситуацию при заполнении любой позиции документа. Если, например, выбрана(заполнена) товарная позиция в накладной, то необходимо к ней добавить наценку и НДС. Когда в заголовке расчетного листка (зарплата) выбирается (указывается) сотрудник, то система умолчаний обязана проанализировать сложившуюся ситуацию и сгенерировать позиции расчетного листка на основании схемы немыслимой сложности со всеми начислениями, удержаниями и всеми фондами. При пакетном начислении (расчете) зарплаты программа фактически будет брать для каждого работника бланк расчетного листка, заносить туда работника, предлагать системе умолчаний проанализировать ситуацию и сформировать все начисления, удержания, ..., фонды. После расчета бланк сохраняется и берутся новый бланк и новый работник.

Аналогичные вещи происходят и с расчетом начислений за газ. Если Вы возьмете бланк документа начислений за газ (пункт системного меню \Документы\Счет за газ), укажите в нем дату (операция и вид оплаты по умолчанию) и выберите объект газификации, то система умолчаний сформирует все позиции документа.

Полный перечень описателей ситуации и подробные решения составляются в схеме описания. Ни один алгоритм, по которому система умолчаний создает документы не скрыт от администратора и не требует вмешательства разработчика при его составлении или изменении. Схема ситуаций с расчетами за газ вызывается с помощью пункта системного меню  \НСИ\Ситуации составления документов

Опишем наиболее типовые ситуации и составим алгоритм формирования счета за газ. В исходном виде в схеме описания ситуаций (дерево в левой части схемы) перечислены только ситуации без исключений из них. Найдите ситуацию "Ввод оплаты наличными". Решение для этой ситуации по умолчанию было создано при установке программы

Система расчетов и схема проводок по умолчанию настроены таким образом, что в случае указания назначения платежа "Общая сумма платежа" программа распределит сумму оплаты на задолженности по разным областям учета сама. Но ! Программа будет принимать решение чей газ закрывать свой или ОблГаза (долги) на основании приоритетов, которые Вы настроите, а в отсутствии приоритетов и внутри их - строго в порядке хронологии возникновения документов.

Если клиент хочет заплатить конкретно за что-то, например, только за газ регионгазу или задолженность облгазу или за ТО (исключено из настроек с 01.02.2004), то в платежном документе не заполняется позиция "Общая сумма платежа" а указываются суммы в трех других позициях. Этими суммами программа закроет только соответствующие области учета.

С 2004 года в Брянской области звено "регионгаз" прекратило сбор задолженности звена "райгаз" за газ и техобслуживание и отпали сложности по распределению денег.

Синтаксис выражений позиций [^Имя_Реквизита] позволяет вводить значение позиций на первой странице документа, и не работать со страницей документа, где перечислены позиции, вообще. В режиме АРМ эта страница вообще недоступна. Когда в бланке платежного документа считывается штрих-код с квитанции или вручную выбирается лицевой счет, то система умолчаний на основании описанного выше решения создаст позиции документа и предложет ввести нужные значения на первой странице документа.

Если отключить временно режим АРМ с помощью соответствующего пункта меню "Документ" и перейти на страницу "Позиции", то мы увидим знакомое нам решение:

Это был самый простой пример использования системы описания ситуаций. А теперь перейдем к расчету начислений за газ.

Для начисления за газ требуется составить два решения. При формировании начислений за газ программа сначала выберет все факты изменения расчетных реквизитов (в лицевом счете: реквизиты,счетчики и их отключения, площади, оборудование, животные, а также отключения объектов или отдельных площадей или оборудования) за расчетный месяц. Для каждого интервала с неизменными расчетными данными в документе будет сформирован уровень расчета и в него добавятся позиции на основании решения ситуации "Расчет начислений за газ" из схемы описания ситуаций. Большинство вычисляемых переменных для ссылок на данные для уровня рассчета будут начинаться с РАСЧ_%? При генерации документа сочетания символов %? будут заменяться на номер текущего уровня расчета.  После того, как все уровни расчета документов будут сформированы программа добавит в документ еще один итоговый уровень расчета и позиции для него будут сформированы на основании решения ситуации "Итоговый расчет начислений за газ" из схемы описания ситуаций.

Представим, что решения еще не созданы вообще (при установке программы типовые решения уже будет присутствовать) и выбираем в списке ситуаций и описателей

Принимаем, что решение для начисления за газ будет типовым, а сама ситуация самой общей и создаем для нее решение (далее будет показано как создавать исключения из ситуаций путем добавления дополнительных описателей, наследованием и коррекцией решений). Для этого воспользуемся кнопкой button_new_brush.gif (132 bytes)

Начнем с фиксации объемов газа, а потом перейдем к суммам. Для дополнительной аналитики предлагается ввести некоторые уровни вложенности позиций путем комбинации составляющих позиций. Добавим сначала в состав позиции "Уровень расчета N..." (используем уже добавленную пустую) позицию "Объем газа". К ней добавим еще один уровень детализации из составляющих позиций: Объем газа на приготовление горячей воды и пищи по норме, Объем газа на приготовление пищи животным по норме, Объем газа на отопление. Две последних позиции детализируем еще одним уровнем как показано ниже.

Для добавления составляющей позиции в документ технология работы с первичными документами "Paper Edit" СКУ "Events" предоставляет кнопку . По щелчку данной кнопки к текущей в документе суммарной позиции добавится составляющая ее. В документе сразу будет предложено выбрать номенклатурную позицию из появившегося списка. Во фрагменте же документа (решении) вызывать номенклатурный список позиций прийдется принудительно кнопкой  или правой кнопкой мыши. При размещении данных в таблицах DBF появляется полный список позиций, который можно отсортировать, осуществить в нем поиск искомой позиции. При размещении данных в SQL для доступа к более или менее большим таблицам используются только параметризированные запросы. Потому появится окно, в котором необходимо сначала сформулировать условие выборки позиций из номенклатурного справочника, а уж из найденных по этому условию можно выбрать номенклатуру в позицию документа.

Внимание! Если требуемая номенклатурная позиция отсутствует в справочнике, то не рекомендуется создавать ее здесь же, так как потом ее прийдется добавлять в схему проводок. Вызовите сразу схему проводок и создайте для документа "Счет за газ" весь набор позиций. Или держите схему проводок открытой при создании решения и создавайте в ней требуемую позицию одновременно с созданием решения. Для добавления позиции в схему проводок найлите в ней документ "Счет за газ" , операцию "Расчет начислений за газ" и соответствующий вид оплаты. Щелкните кнопку  и выберите в появившемся меню пункт "Финансовая позиция". После чего появится тотже номенклатурнй справочник позиций. После поиска или создания в нем выберите позицию и она будет добавлена в схему проводок. Внимание! Только перечисленные в схеме проводок документа позиции могут быть сохранены вместе с документом. При попытке сохранить документ (Счет за газ, Платежку, ...) и обнаружении в нем позиций отсутствующих в схеме проводок документа будет выдано сообщение об ошибке !

Вернемся к описанию ситуаций и составлению решений.

Суммарно-составляющие позиции названы так потому, что когда одна позиция состоит из других, то ее сумма всегда считается как сумма составляющих ее.

Внимание! Все позиции объемов должны иметь статус "в том числе" (правая кнопка мыши) и не входить в сумму документа. Они используются только для получения ведомостей по объемам газа.

Составим выражения для позиций объемов которые не состоят из других. Переместите границу области полей позиций максимально вверх мышкой и увеличте поле с выражением до нужных размеров щелкая правой кнопкой мыши на нем

gas_situations11.gif (49089 bytes)

Позиция   объема газа по норме на пищеприготовление разбита на три составляющих.

Это сделано не только для разбиения сложного выражения на части, но и потому, что на три суммы (для плиты, плиты с колонкой, плиты с колонкой и ванной) по отдельности и вместе может появиться необходимость ссылаться из выражений других позиций или в отчетах. Выражения составлены в варианте однострочных выражений и для наглядности их изучения можно щелкнуть кнопку '...' за полем с выражением и вызвать построитель выражения, в котором можно разнести скобки по строкам кнокой справа от поля с выражением в построителе

gas_situations36.gif (26388 bytes).

В выражениях очень часто используется функция ЕСЛИ(Условие, Если истина - это значение, Если ложь - это)

Функция возвращанет второй аргумент если первый(логический) равен истине иначе - третий. Выражение содержит несколько вложенных функций ЕСЛИ.

Так, для позиции "плита" вначале мы проверяем имеется ли на объекте оборудование с кодом типа 1. В справочнике оборудования этот тип должен быть проставлен всем плитам. Итак, если на объекте количество неотключенных плит <= 0 [ РАСЧ_%?_ГАЗ_ОБОРУДОВАНИЕ ( &ТИП='1' .И. &СЧЕТЧИК='0' .И. &ОТКЛЮЧ=НЕТ ) ] <=0, то функция возвращает 0, иначе есть смысл говорить о расходе на пищеприготовление (третий аргумент).

Далее (в третьем аргументе) мы вызываем вложенную ЕСЛИ и проверяем есть ли на объекте центролизованное горячее водоснабжение ? Если есть, то расход газа будет только на пищеприготовления и мы берем норму расхода газа только на плиту (с идентификатором ПЛИТА). Для этого используем вычисляемую переменную  [ ГАЗ_НОРМА_ПЛИТА ] 

Для позиции "плита, колонка" вновь проверяем прежде всего есть ли на объекте плита (оборудование  стипом 1), а потом - есть ли горячее водоснабжение? Если есть плита и нет горячей воды, то проверяем есть ли ванна. И если ванны нет, то тогда берем норму для плиты и колонки. Не важно есть ли колонка на самом деле, но важно, что воду нужно греть, но не для помывки.

ЕСЛИ
(
    [РАСЧ_%?_ГАЗ_ОБОРУДОВАНИЕ
    (
        &ТИП='1'.И.&СЧЕТЧИК='0'.И.&ОТКЛЮЧ=НЕТ
    )
    ]<=0,0,ЕСЛИ
    (
        [РАСЧ_%?_ГАЗ_РЕКВИЗИТ_ГОРЯЧ]=ДА,0,ЕСЛИ
        (
            [РАСЧ_%?_ГАЗ_ОБОРУДОВАНИЕ
            (
                &ТИП='3'.И.&СЧЕТЧИК='0'.И.&ОТКЛЮЧ=НЕТ
            )
            ]<=0,0,[ГАЗ_НОРМА_ПЛИТА_КОЛОНКА_ВАННА]
        )
       
    )
    *[РАСЧ_%?_ГАЗ_РЕКВИЗИТ_ЖИЛЬЦОВ]*[РАСЧ_%?_ГАЗ_РЕКВИЗИТ_ДНЕЙ_ОТКЛЮЧ=НЕТ]/ДНЕЙ_В_МЕСЯЦЕ
)

И для позиции "плита, колонка, ванна" проверяем все как и в предыдущей позиции, но берем норму для плиты, колонки и ванны только в случае, если есть плиты , нет горячего водоснабжения и есть ванна (анализируем наличие ванны вычисляемой пременной [ РАСЧ_%?_ГАЗ_ОБОРУДОВАНИЕ ( &ТИП='3' .И. &СЧЕТЧИК='0' .И. &ОТКЛЮЧ=НЕТ ) ] )

ЕСЛИ
(
    [РАСЧ_%?_ГАЗ_ОБОРУДОВАНИЕ
    (
        &ТИП='1'.И.&СЧЕТЧИК='0'.И.&ОТКЛЮЧ=НЕТ
    )
    ]<=0,0,ЕСЛИ
    (
        [РАСЧ_%?_ГАЗ_РЕКВИЗИТ_ГОРЯЧ]=ДА,0,ЕСЛИ
        (
            [РАСЧ_%?_ГАЗ_ОБОРУДОВАНИЕ
            (
                &ТИП='3'.И.&СЧЕТЧИК='0'.И.&ОТКЛЮЧ=НЕТ
            )
            ]<=0,0,[ГАЗ_НОРМА_ПЛИТА_КОЛОНКА_ВАННА]
        )
       
    )
    *[РАСЧ_%?_ГАЗ_РЕКВИЗИТ_ЖИЛЬЦОВ]*[РАСЧ_%?_ГАЗ_РЕКВИЗИТ_ДНЕЙ_ОТКЛЮЧ=НЕТ]/ДНЕЙ_В_МЕСЯЦЕ
)

Обратите внимание, что с помощью функции ЕСЛИ() выражения для трех этих позиций составлены таким образом, что любые два или все не могут одновременно вернуть не ноль.

Во всех трех случаях полученную норму умножаем на количество жильцов в расчете , возвращаемое переменной [РАСЧ_%?_ГАЗ_РЕКВИЗИТ_ЖИЛЬЦОВ ].

Так как нормы - месячные, то далее наш объем необходимо посчитать пропорционально дням в текущем расчете. Для этого умножаем полученную норму на отношение двух переменных : [ РАСЧ_%?_ГАЗ_РЕКВИЗИТ_ДНЕЙ_ОТКЛЮЧ=НЕТ ] / ДНЕЙ_В_МЕСЯЦЕ , первая из которых - вычисляемая, а вторая - в документе.

(см. рисунок)

 

Далее создаем выражения для расчета норм на каждый из четырех видов животных:

Естественно, включаем их в состав позиции "Объем на приготовление пищи животным по норме"

[РАСЧ_%?_ГАЗ_ЖИВОТНЫЕ_ЛОШАДЬ]* [ГАЗ_НОРМА_ЛОШАДЬ]* [РАСЧ_%?_ГАЗ_РЕКВИЗИТ_ДНЕЙ_ОТКЛЮЧ=НЕТ]/ ДНЕЙ_В_МЕСЯЦЕ* ЕСЛИ([РАСЧ_%?_ГАЗ_ОБОРУДОВАНИЕ(&СЧЕТЧИК<>'0'.И.&ОТКЛЮЧ=НЕТ)]<=0,1,0)

Переменная  [ РАСЧ_%?_ГАЗ_ЖИВОТНЫЕ_ЛОШАДЬ ] возвращает количество лошадей на объекте за период текущего в документе расчета, а переменная [ ГАЗ_НОРМА_ЛОШАДЬ ] возвращает текущее значение нормы с идентификатором ЛОШАДЬ. Далее остается умножить это на отношение дней в расчете к количеству дней в месяце.

Аналогично получим для остальных видов животных:

[РАСЧ_%?_ГАЗ_ЖИВОТНЫЕ_КОРОВА]* [ГАЗ_НОРМА_КОРОВА]* [РАСЧ_%?_ГАЗ_РЕКВИЗИТ_ДНЕЙ_ОТКЛЮЧ=НЕТ]/ ДНЕЙ_В_МЕСЯЦЕ* ЕСЛИ([РАСЧ_%?_ГАЗ_ОБОРУДОВАНИЕ(&СЧЕТЧИК<>'0'.И.&ОТКЛЮЧ=НЕТ)]<=0,1,0)

[РАСЧ_%?_ГАЗ_ЖИВОТНЫЕ_СВИНЬЯ]* [ГАЗ_НОРМА_СВИНЬЯ]* [РАСЧ_%?_ГАЗ_РЕКВИЗИТ_ДНЕЙ_ОТКЛЮЧ=НЕТ]/ ДНЕЙ_В_МЕСЯЦЕ* ЕСЛИ([РАСЧ_%?_ГАЗ_ОБОРУДОВАНИЕ(&СЧЕТЧИК<>'0'.И.&ОТКЛЮЧ=НЕТ)]<=0,1,0)

[РАСЧ_%?_ГАЗ_ЖИВОТНЫЕ_КОЗА]* [ГАЗ_НОРМА_КОЗА_ОВЦА]* [РАСЧ_%?_ГАЗ_РЕКВИЗИТ_ДНЕЙ_ОТКЛЮЧ=НЕТ]/ ДНЕЙ_В_МЕСЯЦЕ* ЕСЛИ([РАСЧ_%?_ГАЗ_ОБОРУДОВАНИЕ(&СЧЕТЧИК<>'0'.И.&ОТКЛЮЧ=НЕТ)]<=0,1,0)

(см. рисунок)

 

Далее составляем выражения для расчета объемов расхода газа на отопление помещений по норме.

Делаем общюю для всех отоплений позицию "Объем на отопление", а ее разбиваем на итопление жилых и нежилых помещений.

Выражение для отопления жилых помещений будет выглядеть следующим образом:

ЕСЛИ
(
    [РАСЧ_%?_ГАЗ_ОБОРУДОВАНИЕ
    (
        &ТИП='4'.И.&ОТКЛЮЧ=НЕТ
    )
    ]<=0,0,1
)
*[РАСЧ_%?_ГАЗ_ПЛОЩАДЬ
(
    &ЖИЛАЯ=ДА.И.&СЧЕТЧИК="0".И.&ОТКЛЮЧ=НЕТ
)
]*ЕСЛИ
(
    МЕСЯЦ_РАСЧ<[ГАЗ_КОЭФ_МЕС_НАЧ_ОТОП_СЕЗ].И.МЕСЯЦ_РАСЧ>[ГАЗ_КОЭФ_МЕС_ОКОНЧ_ОТОП_СЕЗ],[ГАЗ_НОРМА_ОТОПЛ_ЖИЛ_ПОМЕЩ_НЕОТОП_ПЕРИОД],[ГАЗ_НОРМА_ОТОПЛ_ЖИЛ_ПОМЕЩ_ОТОП_ПЕРИОД]
)
*[РАСЧ_%?_ГАЗ_РЕКВИЗИТ_ДНЕЙ_ОТКЛЮЧ=НЕТ]/ДНЕЙ_В_МЕСЯЦЕ

Сначала анализируем, есть ли вообще котел на объекте ? Для этого смотрим, что возвращает переменная [ РАСЧ_%?_ГАЗ_ОБОРУДОВАНИЕ ( &ТИП='4' .И. &ОТКЛЮЧ=НЕТ ) ] . Если <=0, то об отоплении говорить не приходится и вся сумма позиции умножается на ноль.

Далее берем неотключенную и неподключенную к счетчику жилую площадь [ РАСЧ_%?_ГАЗ_ПЛОЩАДЬ ( &ЖИЛАЯ=ДА .И. &СЧЕТЧИК="0" .И. &ОТКЛЮЧ=НЕТ ) ]  и умножаем на результат второй функции ЕСЛИ. Во второй функции мы принимаем решение какую норму брать - зимнюю или летнюю? Делаем это с помощью условия МЕСЯЦ_РАСЧ < [ ГАЗ_КОЭФ_МЕС_НАЧ_ОТОП_СЕЗ ] .И. МЕСЯЦ_РАСЧ > [ ГАЗ_КОЭФ_МЕС_ОКОНЧ_ОТОП_СЕЗ ]

Соответствующие переменные со ссылками на нормы расхода газа указываем в качестве второва и третьего аргументов функции ЕСЛИ.

Далее остается умножить это на отношение дней в расчете к количеству дней в месяце [ РАСЧ_%?_ГАЗ_РЕКВИЗИТ_ДНЕЙ_ОТКЛЮЧ=НЕТ ] / ДНЕЙ_В_МЕСЯЦЕ .

Составляющую позицию объемов на отопление нежилых помещений разбиваем на две согласно двум типам норм (на текущий момент) : "Объем на отопление бань" и "Объем на отопление теплиц, гаражей, других хозпостроек".

Так как для этих позиций выражения строились на более поздних версиях СУ "Events", то применен вариант функции (вместо однострочного выражения, возвращающего результат). Такой вормат выражения несравнимо более нагляден и удобен в работе. Так, для бань текст функции выглядит:

ФУНКЦИЯ
IF [РАСЧ_%?_ГАЗ_ОБОРУДОВАНИЕ(&ТИП='4'.И.&ОТКЛЮЧ=НЕТ)]<=0
    ВЕРНУТЬ 0
ENDIF
ВЕРНУТЬ [РАСЧ_%?_ГАЗ_ПЛОЩАДЬ(&ТИП='2'.И.&СЧЕТЧИК="0".И.&ОТКЛЮЧ=НЕТ)]*[ГАЗ_НОРМА_ОТОПЛ_БАНЬ_@ПОДРАЗДЕЛ]*[РАСЧ_%?_ГАЗ_РЕКВИЗИТ_ДНЕЙ_ОТКЛЮЧ=НЕТ]/ДНЕЙ_В_МЕСЯЦЕ
* ВСЕ

а для хозпостроек:

ФУНКЦИЯ
IF [РАСЧ_%?_ГАЗ_ОБОРУДОВАНИЕ(&ТИП='4'.И.&ОТКЛЮЧ=НЕТ)]<=0 OR (МЕСЯЦ_РАСЧ>[ГАЗ_КОЭФ_МЕС_ОКОНЧ_ОТОП_СЕЗ] AND МЕСЯЦ_РАСЧ<[ГАЗ_КОЭФ_МЕС_НАЧ_ОТОП_СЕЗ])
    ВЕРНУТЬ 0
ENDIF
ВЕРНУТЬ [РАСЧ_%?_ГАЗ_ПЛОЩАДЬ((&ТИП='3'.ИЛИ.&ТИП='4'.ИЛИ.&ТИП='5').И.&СЧЕТЧИК="0".И.&ОТКЛЮЧ=НЕТ)]*[ГАЗ_НОРМА_ОТОПЛ_ГАРАЖ_@ПОДРАЗДЕЛ]*[РАСЧ_%?_ГАЗ_РЕКВИЗИТ_ДНЕЙ_ОТКЛЮЧ=НЕТ]/ДНЕЙ_В_МЕСЯЦЕ

В первом случае не учитывается отопительный сезон. Во всем остальном логика отличается от объемов для жилых помещений только ссылкой на тип оборудования (2 и 3).

И еще один очень важный момент! Здесь считается, чо нормы определены индивидуально для каждого района. В справочнике норм они имеют соответственно краткие наименования-идентификаторы: ГАЗ_НОРМА_ОТОПЛ_БАНЬ_1   - для района (участка) N1, ГАЗ_НОРМА_ОТОПЛ_БАНЬ_2   - для района (участка) N2, и т.д.  Район в приложении "Рассчеты с населением за газ" совмещен с подразделениями. По этому вместо ссылки на норму по илентификатору ГАЗ_НОРМА_ОТОПЛ_БАНЬ используентя ссылка ГАЗ_НОРМА_ОТОПЛ_БАНЬ_@ПОДРАЗДЕЛ , и перед поиском нормы в справочнике программа заменит  на код подразделения - района , к которому относится текущий абонент. Также можно ссылаться на:

ГАЗ_НОРМА_ОТОПЛ_БАНЬ_@ГРС на ГРС объекта
ГАЗ_НОРМА_ОТОПЛ_БАНЬ_@ГРО на ГРО объекта
ГАЗ_НОРМА_ОТОПЛ_БАНЬ_@РАЙОН на район объекта
ГАЗ_НОРМА_ОТОПЛ_БАНЬ_@ГОРОД на город объекта
ГАЗ_НОРМА_ОТОПЛ_БАНЬ_@НПУНКТ на населённый пункт объекта
ГАЗ_НОРМА_ОТОПЛ_БАНЬ_@УЛИЦА на улицу объекта

Суммы в уровне расчета

Далее переходим к расчету сумм. Перечислим их в тойже последовательности. (см. рисунок)

Сумма за пищеприготовление и горячую воду

Добавляем в состав непосредственно суммы документа составляющую позицию "Приготовление пищи и горячей воды". В отличие от объемов газа данная позиция должна иметь статус "не в том числе" (желтый фон). В ее состав включаем три составляющих по нормам н пищеприготовление:

"Плита". Выражение:

ЕСЛИ
(
    [РАСЧ_%?_ГАЗ_ОБОРУДОВАНИЕ
    (
        &ТИП='1'.И.&СЧЕТЧИК='0'.И.&ОТКЛЮЧ=НЕТ
    )
    ]<=0,0,ЕСЛИ
    (
        [РАСЧ_%?_ГАЗ_РЕКВИЗИТ_ГОРЯЧ]=ДА,[ГАЗ_ТАРИФ_ПЛИТА],0
    )
    *[РАСЧ_%?_ГАЗ_РЕКВИЗИТ_ЖИЛЬЦОВ]*[РАСЧ_%?_ГАЗ_РЕКВИЗИТ_ДНЕЙ_ОТКЛЮЧ=НЕТ]/ДНЕЙ_В_МЕСЯЦЕ
)

В выражении фактически повторяем выражение для соответствующего объема на пищеприготовление и заменяем в нем переменные ГАЗ_НОРМА_... на ГАЗ_ТАРИФ_...

Для сумм по нормам для "плита, колонка" и "плита, котонка, ванна") в выражениях также только заменятся ссылки на нормы на ссылки на тарифы. (см. рисунок)

 

Суммы за приготовление корма животным

Суммы за приготовление корма животным для аналитики включим в состав промежуточной суммарной позиции "Приготовление пищи животным", а уж в ее состав включим позиции сумм за каждый вид животного. Правила добавления позиций описаны выше. Выражиния будут такими же как в соответствующих позициях объемов , за исключением того, что переменные ссылок на нормы ГАЗ_НОРМА_... заменены переменными ссылок на тарифы ГАЗ_ТАРИФ_....

(см. рисунок)

Суммы за отопление

Последняя сумма в каждом уровне расчета - за отопление - добавляется в документ также с использованием промежуточной суммарной позиции (для аналитики) "Отопление". В нее включаем позиции: "Отопление жилых помещений" и "Отопление нежилых помещений". Так же как и для объемов позиция "Отопление нежилых помещений" разбита на "Отопление бань" и "Отопление хозпостроек".

Выражения будут полностью аналогичны соответствующим позициям объемов, в которых переменные ссылок на нормы ГАЗ_НОРМА_... заменены переменными со ссылкама на тарифы ГАЗ_ТАРИФ_...:

Итоговый расчет

Только когда посчитаны все данные за месяц начисления можно выполнить итоговые начисления на их основе. Кроме того есть ряд начислений, которые просто не зависят от расчетных данных, к которым привязывается уровень расчета.

Выбираем ситуацию "Итоговый расчет начислений за газ" и создаем решение кнопкой  .

По показаниям счетчиков

Очевидно, что начисление по показаниям счетчиков не зависят от каких-либо расчетных реквизитов.

Создаем для аналитики две суммарных позиции: "По показаниям счетчиков" и "Объем газа по показаниям счетчиков".

В состав позиции "По показаниям счетчиков" включаем две позиции: "По счетчику (бытовой)" и "По счетчику (промышленный)". Только две последних позиции имеют статус "не в том числе" и входят в сумму документа! (желтый фон) Можно составить выражения таким образом, чтобы в одной позиции просуммировать показания всех счетчиков одного типа и умножить на соответствующий типу тариф. Но в нашем примере показано как отобразить в документе информацию по каждому счетчику индивидуально. Для этого щелкнем на позиции "По счетчику (бытовой)" правой кнопкой и выберем пункт меню "Повторить для каждого счетчика типа..." (доступно только во фрагменте документа - решении) . Появится список типов счетчиков, из которого надо выбрать тип 1 (бытовой). Выражение для фрагмента будет выглядеть следующим образом:

[ГАЗ_ОБЪЕМ_СЧЕТЧИК_%?]*[ГАЗ_ТАРИФ_ПО_СЧЕТЧИКУ]

При формировании документа эта позиция будет повторена по числу бытовых счетчиков, а символы %? будут заvенены на инвентарные номера счетчиков объекта.

Щелкнем на позиции "По счетчику (промышленный)" правой кнопкой и выберем пункт меню "Повторить для каждого счетчика типа..." (доступно только во фрагменте документа - решении) . Появится список типов счетчиков, из которого надо выбрать тип 2 (промышленный). Выражение для фрагмента будет выглядеть следующим образом:

[ГАЗ_ОБЪЕМ_СЧЕТЧИК_%?]*[ГАЗ_ТАРИФ_ПО_ПРОМ_СЧЕТЧИКУ]

При формировании документа эта позиция будет повторена по числу промышленных счетчиков, а символы %? будут заvенены на инвентарные номера счетчиков объекта.

Методика добавление позиций в документ описана выше

Добавим в состав позиции "Объем газа по показаниям счетчика" позиции "Объем по показаниям бытовых счетчиков" и "Объем по показаниям промышленных счетчиков". Не будем расписывать объемы по каждому счетчика, а просуммируем их по типам. С этой целью составим для двух последних позиций соответственно выражения:  [ГАЗ_ОБЪЕМ_СЧЕТЧИК_ТИП_1] и [ГАЗ_ОБЪЕМ_СЧЕТЧИК_ТИП_2]

Далее - самое "приятное"

Рассчет льгот

Прежде всего отметим, что все льготы разделены на три категории или три метода начисления, которые указаны в справочнике льгот:

  1. Льгота действует на все начисление объекма;

  2. Льгота ограничена объемом на площадь и пищеприготовление по соцнорме;

  3. Льгота действует на объемы на отопление, а объем пищеприготовления - по соцнорме.

Для рассчета льгот применим не составляющие/суммарные а относящиеся позиции. Относящиеся позиции не влияют (не составляют) на сумму ведущей позиции (к которой они "пририсованы") и поэтому в их выражениях можно ссылаться на сумму позици, к которой они относятся. Относящиеся позиции обозначаются значком  и добавляются к любой существующей позиции кнопкой .

У нас будут три типа исходных значений для начисления льгот сумм. Добавляем их к сумме документа относящимися позициями:

После составления выражений и расчета сумм данных позиций на их основании расчитываются льготные объемы, площадя и суммы. Вцелом решение будет выглядеть следующим образом:

gas_situations16.gif (36462 bytes)

Методика создания новых позиций и добавления их в схему проводок описана выше.

Начнем разбирать его по порядку.

***

 

Объем (плита, колонка) для начисления льгот без приборов учета будем вычислять по следующей формуле:

ЕСЛИ
(
    [ГАЗ_ОБЪЕМ_СЧЕТЧИК_ТИП_1]>0,0,УРОВЕНЬ_-1_ПОЗ_1503
)
//##ПЛИТА_КОЛОНКА_НОРМА=ЕСЛИ
(
    [ГАЗ_ОБОРУДОВАНИЕ
    (
        &ТИП='1'.И.&СЧЕТЧИК='0'.И.&ОТКЛЮЧ=НЕТ
    )
    ]<=0,0,ЕСЛИ
    (
        [ГАЗ_РЕКВИЗИТ_ГОРЯЧ]=ДА,[ГАЗ_НОРМА_ПЛИТА],ЕСЛИ
        (
            [ГАЗ_ОБОРУДОВАНИЕ
            (
                &ТИП='3'.И.&СЧЕТЧИК='0'.И.&ОТКЛЮЧ=НЕТ
            )
            ]<=0,[ГАЗ_НОРМА_ПЛИТА_КОЛОНКА],[ГАЗ_НОРМА_ПЛИТА_КОЛОНКА_ВАННА]
        )
       
    )
   
)
##

Коричневым цветом выделено основное выражение для расчета. Оно довольно просто. Если есть показания бытовых счетчиков (переменная [ ГАЗ_ОБЪЕМ_СЧЕТЧИК_ТИП_1 ] больше нуля, то льготы будут начисляться на их объем, а в текущей позиции должен быть ноль. Если нет объемов по показаниям счетчиков то суммируем позицию с кодом 1503 (объем на пищеприготовление). Для этого используется переменная в документе УРОВЕНЬ_L_ПОЗ_NNN, где: L - уровень расчета, в котором надо просуммировать позицию, а NNN - код позиции. Если указать -1 в качестве L, то будут просуммированы позиции во всех предыдущих уровнях.

Кроме основного выражения в поле комментариев указано глобальное препроцессорное оъявление. Поле комментариев может присутствовать в выражении любой позиции. Оно отделяется от основного выражения двумя слэшами // и за ними можно писать любой текст. Кроме любого текста в поле комментариев можно указывать специальные директивы со знаком ^ (типа ^ИЗНОС) и препроцессорные объявления.

Назначение препроцессорных объявлений - сократить длину выражений. Так, если одно длинное выражение присутствует как фрагмент в нескольких местах выражений одной или нескольких позиций, то можно путем препроцессорного объявления присвоить данному фрагменту короткое наименование и в выражениях позиций вместо длинного фрагмента указывать его короткое наименование.

Препроцессорные объявления могут быть локальными и глобальными. Локальные объявления видны только в текущей позиции и указываются в одинарных решетках #, а на глобальные объявления можно ссылаться из любой другой позиции документа. Глобальные объявления объявляются в двойных решетках ##, но ссылка на них по краткому наименованию указывается также в одинарных решетках.

В нашем случае фрагменту ЕСЛИ([ГАЗ_ОБОРУДОВАНИЕ(&ТИП='1'.И.&СЧЕТЧИК='0'.И.&ОТКЛЮЧ=НЕТ)]<=0,0, ЕСЛИ([ГАЗ_РЕКВИЗИТ_ГОРЯЧ]=ДА, [ГАЗ_НОРМА_ПЛИТА],ЕСЛИ([ГАЗ_ОБОРУДОВАНИЕ(&ТИП='3'.И.&СЧЕТЧИК='0'.И.&ОТКЛЮЧ=НЕТ)]<=0, [ГАЗ_НОРМА_ПЛИТА_КОЛОНКА],[ГАЗ_НОРМА_ПЛИТА_КОЛОНКА_ВАННА]))) присваивается краткое наименование ПЛИТА_КОЛОНКА_НОРМА и в выражениях других переменных мы будем указывать краткое наименование #ПЛИТА_КОЛОНКА_НОРМА# вместо всего фрагмента. Данный фрагмент фактически является формулой расчета объема газа по норме на пищеприготовление. Подробно этот фрагмент описан выше при составлении решения для уровня расчета и позиции объема газа на пищеприготовление. Но ! От фрагмента в предыдущих уровнях расчета он отличается тем, что у переменных убран префикс РАСЧ_%?_  . Это говорит о том, что в данном случае будут применяться  значения возвращаемых переменных:

[ ГАЗ_ОБОРУДОВАНИЕ_... ] - количество оборудования в последнем перед итоговым уровне расчета (для среднего: ГАЗ_ОБОРУДОАНИЕ_СРЕДН_...).

[ГАЗ_РЕКВИЗИТ_... ] - значение реквизита в последнем перед итоговым уровне расчета (для среднего - см.выше);

!!! Сначала мы перечислим в документе позиции льгот со значениями объемов в том числе, а потом посчитаем и суммы. Это делается для того, что-бы при списании объемов учесть, что очередная льгота должна браться на остаток льготного объема от предыдущих льгот. То есть надо следить, чтобы набранный льготами объем не превысил общий льготный объем. А уж потом на начисленный по каждой льготе объем посчитаем сумму.

Объем по конкретным категориям льгот будем вычислять путем добавления относящейся позиции "Льготный объем" к позиции Объем (плита, колонка) для начисления льгот без приборов учета . Эти позиции должны иметь признак "в том числе". Льготы будут заноситься в документ вместо этих позиций в порядке, в котором они указаны в лицевом счете.

Щелкаем правой кнопкой мыши на позиции "Льготый объем", в появившемся меню выбираем пункт

gas_situations17.gif (5078 bytes)

gas_situations20.gif (7147 bytes)

Составляем выражение для льготного объема, который должен списаться на каждую льготу.

ЕСЛИ
(
    СУММА<=СУМ_ОТН,0,ЕСЛИ
    (
        [ГАЗ_ЛЬГОТА_%?_МЕТОД]='1',СУММА-СУМ_ОТН,ЕСЛИ
        (
            СУММА-СУМ_ОТН>#ПЛИТА_КОЛОНКА_НОРМА#*ЕСЛИ
            (
                [ГАЗ_ЛЬГОТА_%?_ВСЕ]=ДА,[ГАЗ_ЛЬГОТА_%?_СЕМЬИ],1
            )
            ,#ПЛИТА_КОЛОНКА_НОРМА#*ЕСЛИ
            (
                [ГАЗ_ЛЬГОТА_%?_ВСЕ]=ДА,[ГАЗ_ЛЬГОТА_%?_СЕМЬИ],1
            )
            ,СУММА-СУМ_ОТН
        )
       
    )
   
)
//^!ВЕД<>0

Выражение любой позиции "Льготный объем" начинается с выяснения не исчерпан ли льготный объем предыдущими льготами, которые уже добавлены в документ непосредственно перед текущей. Для этого применяются переменные:

СУММА - сумма позиции, к которой относится текущая (в нашим случае Объем (плита, колонка) для начисления льгот без приборов учета )

СУМ_ОТН - сумма всех позиций относящихся к тойже, что и текущая, но находящикся выше текущей.

Для первой категории льгот, которая берется на все начисление, берем весь остаток льготного объема от предыдущих льгот. Функция ЕСЛИ описана выше. Ссылка на категорию льготы осуществляется переменной [ГАЗ_ЛЬГОТА_%?_МЕТОД] ='1'. Возвращаемое значение - символьное, потому берем в апострофы.

Если категория льготы не первая, то сравниваем норму на пищеприготовление, умноженную на количество членов семьи, на которых распространяется действие льготы (  ЕСЛИ([ГАЗ_ЛЬГОТА_%?_ВСЕ]=ДА,[ГАЗ_ЛЬГОТА_%?_СЕМЬИ],1), с остатком льготного объема от предыдущих льгот и выбираем меньшее. Для ссылки на нормуприщеприготовление используем препроцессорное объявление #ПЛИТА_КОЛОНКА_НОРМА#

В полях комментариев указана директива ^!ВЕД<>0 . Она предписывает для ускорения пересчета документа вообще не анализировать вытажение текущей позиции если сумма ведущей позиции равна нулю.

!!! В процессе замены льготного объема на конкретную льготу при формировании документа знаки %? естественно будут заменены на инвентарный номер льготы.

Далее нам остается посчитать суммы льгот по начисленным им объемам. Для этого после позиций "Льготный объем" к той же позиции Объем (плита, колонка) для начисления льгот без приборов учета добавляем относящуюся позицию "Льгота" с признаком "не в том числе", которая и будет уменьшать сумму документа на сумму льгот. Щелкаем на позиции правой кнопкой и выбираем действие при создании документа

gas_situations17.gif (5078 bytes)

gas_situations21.gif (8226 bytes)

Выражение для позиции "Льгота" (будет заменена на конкретную льготу) будет просто:

ЕСЛИ(СУММА=0,0,ЛЬГОТА_ВЫШЕ/СУММА*УРОВЕНЬ_-1_ПОЗ_1404*ЛЬГОТА_ЗНАЧЕНИЕ/100*-1)//^!ВЕД<>0

Вначале для надежности проверяем не равна ли ведущая позиция 0 (не обязательно, так как есть директива ^!ВЕД<>0, да и вообще)

Переменной ЛЬГОТА_ВЫШЕ определяем сумму объемов льгот с темже кодом позиции, что и текущая. Для получения пропорции делим ее на общий льготный объем на пищеприготовление и умножаем на суммы начислений "Плита, колонка" (код позиции 1404) в предыдущих неитоговых уровнях расчета переменной УРОВЕНЬ_-1_ПОЗ_1404 и умножаем на процент льготы возвращаемый переменной ЛЬГОТА_ЗНАЧЕНИЕ / 100 и умножаем все на -1, так как сумма льготы должна уменьшать сумму документа.  Используется переменная в документе УРОВЕНЬ_L_ПОЗ_NNN, где: L - уровень расчета, в котором надо просуммировать позицию, а NNN - код позиции. Если указать -1 в качестве L, то будут просуммированы позиции во всех предыдущих уровнях.

В полях комментариев указана директива ^!ВЕД<>0 . Она предписывает для ускорения пересчета документа вообще не анализировать вытажение текущей позиции если сумма ведущей позиции равна нулю.

Далее настраиваем начисление льгот на площадя.

***

 

Площадь для начисления льгот без приборов учета будем вычислять по следующей формуле

gas_situations22.gif (9073 bytes)

ЕСЛИ
(
    [ГАЗ_ОБЪЕМ_СЧЕТЧИК_ТИП_1]>0.ИЛИ.УРОВЕНЬ_-1_ПОЗ_1402<=0,0,[ГАЗ_ПЛОЩАДЬ_СРЕДН
    (
        &ЖИЛАЯ=ДА.И.&ОТКЛЮЧ=НЕТ
    )
    ]
)
//##СОЦНОРМА=ЕСЛИ
(
    [ГАЗ_РЕКВИЗИТ_ЖИЛЬЦОВ]<=1,33,ЕСЛИ
    (
        [ГАЗ_РЕКВИЗИТ_ЖИЛЬЦОВ]=2,21,18
    )
   
)
##

В начале основного выражения позиции (отделено от поля комментариев // ) проверяем нет ли показаний бытовых счетчиков. Если есть показания бытовых счетчиков (переменная [ ГАЗ_ОБЪЕМ_СЧЕТЧИК_ТИП_1 ] ) , то льготы на площадь не начисляются. Кроме того надо убедиться, что вообще были начисления за отопление по нормам. Для этого используется переменная в документе УРОВЕНЬ_L_ПОЗ_NNN, где: L - уровень расчета, в котором надо просуммировать позицию, а NNN - код позиции. Если указать -1 в качестве L, то будут просуммированы позиции во всех предыдущих уровнях. Вариантом данной переменной УРОВЕНЬ_-1_ПОЗ_1402 <= 0 суммируем отопление жилых площалей по норме в предыдущих неитоговых уровнях расчета (позиция с кодом 1402). Если и показаний счетчиков нет и начисления за площадь по нормам есть, то сумма позиции равна площади но норме, вычисляемой переменной [ГАЗ_ПЛОЩАДЬ_СРЕДН ( &ЖИЛАЯ=ДА .И. &ОТКЛЮЧ=НЕТ )]  которая вычисляет среднюю сумму жилых неотключенных площадей по всем уровням расчетов.

 

Кроме основного выражения в поле комментариев указано глобальное препроцессорное оъявление. Поле комментариев может присутствовать в выражении любой позиции. Оно отделяется от основного выражения двумя слэшами // и за ними можно писать любой текст. Кроме любого текста в поле комментариев можно указывать специальные директивы со знаком ^ (типа ^ИЗНОС) и препроцессорные объявления.

Назначение препроцессорных объявлений описано выше. В нашем случае фрагменту ЕСЛИ ( [ ГАЗ_РЕКВИЗИТ_ЖИЛЬЦОВ ] <= 1 , 33 , ЕСЛИ ( [ ГАЗ_РЕКВИЗИТ_ЖИЛЬЦОВ ] = 2 , 21 , 18 ) ) присваивается краткое наименование СОЦНОРМА и в выражениях других переменных мы будем указывать краткое наименование #СОЦНОРМА# вместо всего фрагмента. Данный фрагмент - для расчета площади по соцнорме в зависимости от количества жильцов в последнем неитоговом уровне расчета.

Аналогично ситуации со льготными объемами мы сначала должны набрать льготных площадей на сумму не превышающую льготную площадь. Для этого добавляем к текущей позиции позицию "Льготная площадь" для перечисления льгот. Обе позиции как и ведущая позиция льготной площади имеют статус "в том числе".  Щелкаемна на "Льготная площадь" правой кнопкой мыши и выбираем порядок замены льгот:

 

gas_situations23.gif (10361 bytes)

 

Выражение составляем следующим образом:

ЕСЛИ
(
    СУММА<=СУМ_ОТН,0,ЕСЛИ
    (
        [ГАЗ_ЛЬГОТА_%?_МЕТОД]='1'.ИЛИ.[ГАЗ_ЛЬГОТА_%?_МЕТОД]='3',СУММА-СУМ_ОТН,ЕСЛИ
        (
            СУММА-СУМ_ОТН>#СОЦНОРМА#*ЕСЛИ
            (
                [ГАЗ_ЛЬГОТА_%?_ВСЕ]=ДА,[ГАЗ_ЛЬГОТА_%?_СЕМЬИ],1
            )
            ,#СОЦНОРМА#*ЕСЛИ
            (
                [ГАЗ_ЛЬГОТА_%?_ВСЕ]=ДА,[ГАЗ_ЛЬГОТА_%?_СЕМЬИ],1
            )
            ,СУММА-СУМ_ОТН
        )
       
    )
   
)
//^!ВЕД<>0

Знак %? в переменных ГАЗ_ЛЬГОТА_%?_ будет заменен на инвентарный номер льготы при составлении документа.

Прежде всего проверяем не исчерпана ли льготная площадь предыдущими льготами прерисованными к тойже позиции СУММА > СУМ_ОТН, где:

СУММА - сумма позиции, к которой относится текущая;

СУМ_ОТН - сумма всех позиций относящихся к тойже, что и текущая, но находящикся выше текущей.

Далее смотрим расчитывается ли льгота по первому или третьему методу (переменная ГАЗ_ЛЬГОТА_МЕТОД_...) . Если да, то берем остаток от льготного объема после предыдущих льгот.

Для льгот, рассчитываемых по второму методу фрагмент выражения будет более сложным:

                                    ... ЕСЛИ
        (
            СУММА-СУМ_ОТН>#СОЦНОРМА#*ЕСЛИ
            (
                [ГАЗ_ЛЬГОТА_%?_ВСЕ]=ДА,[ГАЗ_ЛЬГОТА_%?_СЕМЬИ],1
            )
            ,#СОЦНОРМА#*ЕСЛИ
            (
                [ГАЗ_ЛЬГОТА_%?_ВСЕ]=ДА,[ГАЗ_ЛЬГОТА_%?_СЕМЬИ],1
            )
            ,СУММА-СУМ_ОТН
        )

...

Сначала проверяем не превышает ли остаток льготных площадей соцнорму (ссылка на препроцессорное объявление #СОЦНОРМА# ) умноженная на количество членов семьи льготника [ ГАЗ_ЛЬГОТА_%?_СЕМЬИ ]  если [ ГАЗ_ЛЬГОТА_%?_ВСЕ ] = ДА ? Если остаток превышает соцнорму, то берем соцнорму умноженную на количество членов семьи льготника если у льготы указан признак "для всех членов семьи". Если остаток не превышает соцнорму, то берем остаток.

В полях комментариев указана директива ^!ВЕД<>0 . Она предписывает для ускорения пересчета документа вообще не анализировать вытажение текущей позиции если сумма ведущей позиции равна нулю.

Кроме льгот может быть начислена скидка малоимущим. Скидка малоимущим начисляется на остаток льготной площади, по этому добавляем позицию "Малоимущие" с признаком "в том числе" после второй позиции "Льготная площадь"

gas_situations24.gif (10611 bytes)

Методика создания номенклатуры позиций описана выше.

Просто составляем для нее выражение:

ЕСЛИ
(
    СУММА>СУМ_ОТН.И.[ГАЗ_РЕКВИЗИТ_МАЛОИМУЩ]=ДА.И.
    (
        МЕСЯЦ_РАСЧ>=[ГАЗ_КОЭФ_МЕС_НАЧ_ОТОП_СЕЗ].ИЛИ.МЕСЯЦ_РАСЧ<=[ГАЗ_КОЭФ_МЕС_ОКОНЧ_ОТОП_СЕЗ]
    )
    ,СУММА-СУМ_ОТН,0
)
//^!ВЕД<>0

Применяем функцию ЕСЛИ . В первом ее аргументе проверяем:

СУММА > СУМ_ОТН не исчерпана ли льготная площадь позициями льгот выше?

и [ ГАЗ_РЕКВИЗИТ_МАЛОИМУЩ ] = ДА в реквизитах соответствующих последнему неитоговому уровню расчета документа указан признак МАЛОИМУЩИЕ

и ( МЕСЯЦ_РАСЧ >= [ ГАЗ_КОЭФ_МЕС_НАЧ_ОТОП_СЕЗ ] .ИЛИ. МЕСЯЦ_РАСЧ <= [ ГАЗ_КОЭФ_МЕС_ОКОНЧ_ОТОП_СЕЗ ] ) в текущем месяце начисляется по зимним нормам.

Тогда относим остаток льготы на скидку малоимущим и больше пока ничего не вычисляем.

Далее рассчитываем суммы льгот на площадь по норме и скидку малоимущим. Для этого добавляем две позиции с признаком "не в том числе", которые и будут уменьшать сумму документа:

gas_situations25.gif (12753 bytes)

Щелкаем правой кнопкой на позиции "Льгота" и выбираем:

Малоимущих не трогаем.

Для позиции льгот выражение будет:

ЕСЛИ(СУММА=0,0,ЛЬГОТА_ВЫШЕ/СУММА*УРОВЕНЬ_-1_ПОЗ_1402*ЛЬГОТА_ЗНАЧЕНИЕ/100*-1)//^!ВЕД<>0

Проверка не равна ли сумма льготной площади нулю не обязательна. Берем пропорцию путем деления площади начисленной для льготы с кодом текущей позиции выше ( ЛЬГОТА_ВЫШЕ ) на льготную площадь - ведущую позицию ( СУММА ) и умножаем это на сумму начислений за отопление по норме в предыдущих уровнях рассчета документа УРОВЕНЬ_-1_ПОЗ_1402 . Полученный результат умножаем на процент текущей льготы (ЛЬГОТА_ЗНАЧЕНИЕ / 100) и на -1, так как сумма должна уменьшать сумму документа.

С суммой скидки малоимущим дело обстоит посложнее. Выражение выглядит следующим образом:

ЕСЛИ
(
    СУММА=0,0,СУМ_ВТЧ_ОТН_0*
    (
        [ГАЗ_ТАРИФ_ОТОПЛ_ЖИЛ_ПОМЕЩ_ОТОП_ПЕРИОД]-[ГАЗ_ТАРИФ_ПРЕД_[ГАЗ_КОЭФ_МАЛОИМУЩИЕ_МЕСЯЦЫ]_ОТОПЛ_ЖИЛ_ПОМЕЩ_ОТОП_ПЕРИОД]
    )
    *-1
)
//^!ВЕД<>0

Начинается с той же необязательной проверки - ненулевая ли льготная площадь? Если не нулевая, то ссылаемся на начисленную выше площадь для малоимущей переменной аналогичной ЛЬГОТА_ВЫШЕ. Это знакомая переменная СУМ_ВТЧ_ОТН_0  (сумма предыдущих позиций относящихся к той же ведущей, что и текущая) но с аргументами _ВТЧ и _0. Аргумент _ВТЧ говорит о том, что нас интересуют предыдущие позиции только с признаком "в том числе" . Аргумент _0 говорит, что нас интересуют только позиции с тем же номенклатурным кодом, что и текущая.

Далее площадь малоимущих необходимо уменьшить на разницу сумм посчитанной по текущему тарифу ( ГАЗ_ТАРИФ_ОТОПЛ_ЖИЛ_ПОМЕЩ_ОТОП_ПЕРИОД ) и тарифу посчитанному  ГАЗ_КОЭФ_МАЛОИМУЩИЕ_МЕСЯЦЫ месяцев назад ( ГАЗ_ТАРИФ_ПРЕД_[ГАЗ_КОЭФ_МАЛОИМУЩИЕ_МЕСЯЦЫ]_ОТОПЛ_ЖИЛ_ПОМЕЩ_ОТОП_ПЕРИОД   ). Результат также надо умножить на -1.

Далее переходим к последнему объекту начисления льгот:

***

Объем для начисления льгот по приборам учета будем вычислять по формуле, которую приведем позже.

Cразу добавим две относящихся к ней позиции:  "Льготный объем"  и "Малоимущие". Все со статусом "в том числе" . Щелкнем на "Льготный объем" правой кнопкой мыши и выберем:

 

 

Эти, повторенные в документе для каждой льготы, позиции сначала рассчитывают нам объем на каждую льготу с убывающим остатком, чтобы суммарный объем по льготам не превысил льготный.

За этими двумя позициями добавим позиции: "Льгота" и "Малоимущие" . Изменим у них признак на "не в том числе". Укажим для позиции "Льгота" - "Заменить на каждую льготу" и получим:

 

gas_situations26.gif (17814 bytes)

 

Перейдем к анализу выражений

Итак льготный объем вычисляем по маленькой формуле:

[ГАЗ_ОБЪЕМ_СЧЕТЧИК_ТИП_1]+ВЫЧСУМ
(
    1,#ЛЬГОТНАЯ_ПЛОЩАДЬ#
)
+ВЫЧСУМ
(
    2,МЕНЬШЕИПОЛОЖИТЕЛЬНО
    (
        #ЛЬГОТНАЯ_ПЛОЩАДЬ#,#СОЦНОРМА#*[ГАЗ_РЕКВИЗИТ_ЖИЛЬЦОВ]
    )
   
)
//##СЕЗОННАЯ_НОРМА=ЕСЛИ
(
    МЕСЯЦ_РАСЧ<[ГАЗ_КОЭФ_МЕС_НАЧ_ОТОП_СЕЗ].И.МЕСЯЦ_РАСЧ>[ГАЗ_КОЭФ_МЕС_ОКОНЧ_ОТОП_СЕЗ],[ГАЗ_НОРМА_ОТОПЛ_ЖИЛ_ПОМЕЩ_НЕОТОП_ПЕРИОД],[ГАЗ_НОРМА_ОТОПЛ_ЖИЛ_ПОМЕЩ_ОТОП_ПЕРИОД]
)
##ПЛИТА_КОЛОНКА_СЧЕТЧИК=ЕСЛИ
(
    [ГАЗ_ОБОРУДОВАНИЕ
    (
        &ТИП='1'.И.&СЧЕТЧИК<>'0'.И.&ОТКЛЮЧ=НЕТ
    )
    ]<=0,0,ЕСЛИ
    (
        [ГАЗ_РЕКВИЗИТ_ГОРЯЧ]=ДА,[ГАЗ_НОРМА_ПЛИТА],ЕСЛИ
        (
            [ГАЗ_ОБОРУДОВАНИЕ
            (
                &ТИП='3'.И.&СЧЕТЧИК<>'0'.И.&ОТКЛЮЧ=НЕТ
            )
            ]<=0,[ГАЗ_НОРМА_ПЛИТА_КОЛОНКА],[ГАЗ_НОРМА_ПЛИТА_КОЛОНКА_ВАННА]
        )
       
    )
   
)
##ЛЬГОТНАЯ_ПЛОЩАДЬ=[ГАЗ_ПЛОЩАДЬ_СРЕДН
(
    &ЖИЛАЯ=ДА.И.&ОТКЛЮЧ=НЕТ
)
]##

Особенностью расчета льготного объема заключается в том, что он не должен превышать одновременно объем по показаниям счетчиков и норму на отопление жилых площадей + норма на пищеприготовление и фактическую площадь. То есть для каждой позиции должны с накоплением вычитаться три суммы. Казалось - нельзя сделать это, так как позиции прерисованы только к одной сумме [ГАЗ_ОБЪЕМ_СЧЕТЧИК_ТИП_1] и только из нее можно вычитать с накоплением.

Хотя храниться в базе может только одна сумма для позиции, но в процессе рассчета динамически можно использовать до 10 сумм и ссылаться на них из выражений других позиций. Для этого предназначена функция ВЫЧСУМ(). Первым аргументом передается номер суммы, а вторым - выражение для ее расчета.

Итак, для позиции "Объем для начисления льготы по приборам учета" вычисляем три суммы:

[ГАЗ_ОБЪЕМ_СЧЕТЧИК_ТИП_1] Непосредственно сумма позиции. Равна показанию бытовых счетчиков.
ВЫЧСУМ(1,#ЛЬГОТНАЯ_ПЛОЩАДЬ#) Сумма N1. Льготная площадь со ссылкой на препроцессорное выражение
ВЫЧСУМ(2,МЕНЬШЕИПОЛОЖИТЕЛЬНО( #ЛЬГОТНАЯ_ПЛОЩАДЬ#,#СОЦНОРМА#* [ГАЗ_РЕКВИЗИТ_ЖИЛЬЦОВ]) Сумма N2. Расчет площади по соцнорме

В препроцессорном объявлении #СЕЗОННАЯ_НОРМА# просто сравниваем месяц расчета с месяцами начала и окончания отопительного периода и выясняем - летнюю изи зимнюю норму надо брать ?

В препроцессорном объявлении #ПЛИТА_КОЛОНКА_СЧЕТЧИК# есть ли вообще оборудование подключенное к счетчикам (  ГАЗ_ОБОРУДОВАНИЕ ( &ТИП='1' .И. &СЧЕТЧИК<>'0' .И. &ОТКЛЮЧ=НЕТ ) ] <=0 ) ? Если есть, то определяем норму на пищеприготовление по формуле аналогично предыдущим уровням расчета.

В препроцессорном объявлении #ЛЬГОТНАЯ_ПЛОЩАДЬ# просто суммируем среднюю за все расчеты месяца жилую площаль.

Выражение для полиции "Льготный объем" очень большое и выглядит:

ФУНКЦИЯ

IF     СУММА-СУМ_ОТН<=0
   && ВЫБРАНВЕСЬ ОБЪЕМ НА ЛЬГОТЫ
    ВЕРНУТЬ 0
ENDIF

IF     [ГАЗ_ЛЬГОТА_%?_ВСЕ]=ДА
    ЛЬГОТНИКОВ    = [ГАЗ_ЛЬГОТА_%?_СЕМЬИ]
ELSE
    ЛЬГОТНИКОВ    = 1
ENDIF

IF     [ГАЗ_ЛЬГОТА_%?_МЕТОД]='1'
    ВЕРНУТЬ МЕНЬШЕ([ГАЗ_ОБЪЕМ_СЧЕТЧИК_ТИП_1],СУММА-СУМ_ОТН)
ELSE

    IF     [ГАЗ_ЛЬГОТА_%?_МЕТОД]='2'

        * ОПРЕДЕЛЯЕМОСТАТОК ЛЬГОТНОЙПЛОЩАДИ
        IF      [ГАЗ_ОБОРУДОВАНИЕ(&ТИП='4'.И.&ОТКЛЮЧ=НЕТ)]<=0
            ПЛОЩАДЬ = 0
        ELSE
            IF      [ГАЗ_ПЛОЩАДЬ_СРЕДН(&ЖИЛАЯ=ДА.И.&ОТКЛЮЧ=НЕТ)]>#СОЦНОРМА#*ЛЬГОТНИКОВ.ИЛИ.[ГАЗ_ПЛОЩАДЬ_СРЕДН(&ЖИЛАЯ=ДА.И.&ОТКЛЮЧ=НЕТ)]<=0
                ПЛОЩАДЬ=#СОЦНОРМА#*ЛЬГОТНИКОВ
            ELSE
                ПЛОЩАДЬ=[ГАЗ_ПЛОЩАДЬ_СРЕДН(&ЖИЛАЯ=ДА.И.&ОТКЛЮЧ=НЕТ)]
            ENDIF
            IF      ПЛОЩАДЬ>СУММА2-СУМ2_ОТН
                IF СУММА2-СУМ2_ОТН > 0
                    ПЛОЩАДЬ     = ВЫЧСУМ(1,ВЫЧСУМ(2,СУММА1-СУМ2_ОТН,1),1)
                ELSE
                    ПЛОЩАДЬ     = ВЫЧСУМ(1,ВЫЧСУМ(2,0,1),1)
                ENDIF
            ELSE
                ПЛОЩАДЬ     = ВЫЧСУМ(1,ВЫЧСУМ(2,ПЛОЩАДЬ,1),1)
            ENDIF
        ENDIF
        ВЕРНУТЬ МЕНЬШЕ(СУММА-СУМ_ОТН,ПЛОЩАДЬ*#СЕЗОННАЯ_НОРМА#+#ПЛИТА_КОЛОНКА_СЧЕТЧИК#*ЛЬГОТНИКОВ)
               
    ELSE

        IF     [ГАЗ_РЕКВИЗИТ_ЖИЛЬЦОВ]-[ГАЗ_ЛЬГОТА_СЕМЬИ]<0OR СУМ1_ОТН>0
            НЕЛЬГОТНИКОВ     = 0
        ELSE
            НЕЛЬГОТНИКОВ     = [ГАЗ_РЕКВИЗИТ_ЖИЛЬЦОВ]-[ГАЗ_ЛЬГОТА_СЕМЬИ]
        ENDIF

        *ОПРЕДЕЛЯЕМ ОСТАТОК ЛЬГОТНОЙ ПЛОЩАДИ
        IF     [ГАЗ_ОБОРУДОВАНИЕ(&ТИП='4'.И.&ОТКЛЮЧ=НЕТ)] <= 0
            ПЛОЩАДЬ = 0
            ОБЪЕМ     = #ПЛИТА_КОЛОНКА_СЧЕТЧИК#*ЛЬГОТНИКОВ
        ELSE
            ПЛОЩАДЬ     = [ГАЗ_ПЛОЩАДЬ_СРЕДН(&ЖИЛАЯ=ДА.И.&ОТКЛЮЧ=НЕТ)]
            IF      [ГАЗ_ОБЪЕМ_СЧЕТЧИК_ТИП_1]-#ПЛИТА_КОЛОНКА_СЧЕТЧИК#*НЕЛЬГОТНИКОВ<=0
                ОБЪЕМ     = [ГАЗ_ОБЪЕМ_СЧЕТЧИК_ТИП_1]
            ELSE
                ОБЪЕМ     =[ГАЗ_ОБЪЕМ_СЧЕТЧИК_ТИП_1]-#ПЛИТА_КОЛОНКА_СЧЕТЧИК#*НЕЛЬГОТНИКОВ
            ENDIF
        ENDIF

        IF     ПЛОЩАДЬ>СУММА1-СУМ1_ОТН
            IF СУММА1-СУМ1_ОТН>0
                ПЛОЩАДЬ     = ВЫЧСУМ(2,ВЫЧСУМ(1,СУММА1-СУМ1_ОТН,1),1)
            ELSE
                ПЛОЩАДЬ     = ВЫЧСУМ(2,ВЫЧСУМ(1,0,1),1)
            ENDIF
        ELSE
            ПЛОЩАДЬ     = ВЫЧСУМ(2,ВЫЧСУМ(1,ПЛОЩАДЬ,1),1)
        ENDIF

        IF    [ГАЗ_ПЛОЩАДЬ_СРЕДН(&ЖИЛАЯ=ДА.И.&ОТКЛЮЧ=НЕТ)]<=0     &&НЕ УКАЗАНА
            ВЕРНУТЬ МЕНЬШЕ(ОБЪЕМ,СУММА-СУМ_ОТН)
        ELSE
            ВЕРНУТЬ МЕНЬШЕ(МЕНЬШЕ([ГАЗ_ОБЪЕМ_СЧЕТЧИК_ТИП_1],ПЛОЩАДЬ*#СЕЗОННАЯ_НОРМА#+#ПЛИТА_КОЛОНКА_СЧЕТЧИК#*ЛЬГОТНИКОВ),СУММА-СУМ_ОТН)
        ENDIF
           
    ENDIF
       
ENDIF
   
//^!ВЕД<>0

Когда мы организовываем выражение как функцию, то вместо препроцессорных объявлений можем использовать переменные и весь остальной синтаксис языка MS Visual FoxPro. В начале функции создаем переменную для количества членов семьи, на которых распространяется льгота

...

IF     [ГАЗ_ЛЬГОТА_%?_ВСЕ]=ДА
    ЛЬГОТНИКОВ    = [ГАЗ_ЛЬГОТА_%?_СЕМЬИ]
ELSE
    ЛЬГОТНИКОВ    = 1
ENDIF

...

Далее анализируем категрию льготы - метод расчета. Если метод расчета льгот - первый, то сразу возвращаем остаток льготного объема.

Далее смотрим, если метод расчета второй, то

Вид оплаты
Владелец
Владелец: Государство
Владелец: КЛАДР. Город
Владелец: КЛАДР. Город: Статус
Владелец: КЛАДР. Район
Владелец: КЛАДР. Район: Статус
Владелец: КЛАДР. Регион
Владелец: КЛАДР. Регион: Статус
Владелец: Не является плательщиком НДС
Владелец: Область бизнеса
Владелец: Статус
Владелец: Физическое лицо
Газораспределительная организация
Газораспределительная станция
Газораспределительная станция: Распределительная организация
Город объекта
Город объекта: Статус
Дата отфактуровки документа
Дата составления документа
Денежная единица
Населённый пункт объекта
Населённый пункт объекта: Статус
Объект газификации
Объект газификации: Город
Объект газификации: Город: Статус
Объект газификации: Горячая вода
Объект газификации: Индекс
Объект газификации: Контролёр
Объект газификации: Контролёр: КЛАДР 1. Регион.
Объект газификации: Контролёр: КЛАДР 1. Регион.: Статус
Объект газификации: Контролёр: КЛАДР 2. Район
Объект газификации: Контролёр: КЛАДР 2. Район: Статус
Объект газификации: Контролёр: КЛАДР 3. Город
Объект газификации: Контролёр: КЛАДР 3. Город: Статус
Объект газификации: Контролёр: Льготы по соцналогу
Объект газификации: Контролёр: Пол(Да=женский,Нет=мужской)
Объект газификации: Контролёр: Статус
Объект газификации: Контролёр: Текущая должность
Объект газификации: Контролёр: Текущая квалификация
Объект газификации: Контролёр: Текущее образование
Объект газификации: Контролёр: Текущее подразделение
Объект газификации: Контролёр: Текущее подразделение: Входит в состав
Объект газификации: Контролёр: Текущее подразделение: Входит в состав: Хозрасчет
Объект газификации: Контролёр: Текущее подразделение: Хозрасчет
Объект газификации: Населенный пункт
Объект газификации: Населенный пункт: Статус
Объект газификации: Начало срока исковой давности
Объект газификации: Не печатать квитанцию
Объект газификации: Негазовое отопление(текущее состояние)
Объект газификации: Район
Объект газификации: Район: Статус
Объект газификации: Текущий статус малоимущего
Объект газификации: Тип
Объект газификации: Участок газификации
Объект газификации: Участок газификации: Тип
Объект газификации: Число единиц оборудования
Объект газификации: Число животных
Объект газификации: Число льгот
Объект газификации: Число площадей
Объект газификации: Число счетчиков
Операция
Операция: Использовать только с группой конкретных видов хранения МЦ
Операция: Использовать только с группой конкретных видов хранения МЦ: Раздел учета
Операция: Использовать только с группой конкретных видов хранения МЦ: Тип объекта
Подразделение
Подразделение: Входит в состав
Подразделение: Входит в состав: Хозрасчет
Подразделение: Хозрасчет
Район объекта
Район объекта: Статус
Свойства объекта газификации
Свойства объекта газификации: Владелец
Свойства объекта газификации: Владелец: Государство
Свойства объекта газификации: Владелец: КЛАДР. Город
Свойства объекта газификации: Владелец: КЛАДР. Город: Статус
Свойства объекта газификации: Владелец: КЛАДР. Район
Свойства объекта газификации: Владелец: КЛАДР. Район: Статус
Свойства объекта газификации: Владелец: КЛАДР. Регион
Свойства объекта газификации: Владелец: КЛАДР. Регион: Статус
Свойства объекта газификации: Владелец: Не является плательщиком НДС
Свойства объекта газификации: Владелец: Область бизнеса
Свойства объекта газификации: Владелец: Статус
Свойства объекта газификации: Владелец: Физическое лицо
Свойства объекта газификации: Горячее водоснабжение
Свойства объекта газификации: Категория объекта
Тип первичного документа
Тип позиции документа
Улица объекта
Улица объекта: Относится к городу
Улица объекта: Относится к городу: Статус
Улица объекта: Относится к населенному пункту
Улица объекта: Относится к населенному пункту: Статус
Улица объекта: Относится к району
Улица объекта: Относится к району: Статус
Улица объекта: Относится к региону
Улица объекта: Относится к региону: Статус
Улица объекта: Статус
Финансовая позиция   

См. в интернет:    Долина разума    Система учета "Events"     Рассчеты с населением за газ    Предприниматель     Инструментальные средства "EvnFox"    www.vallmind.ru    EasySQL4Fox    ECalcPad    VMZipper    Святая трезвость    Трезвая Россия