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

Пример одного пакета запросов для конфигурации 1С Зарплата и Управление персоналом 2.5 для 1С Предприятия 8.2, который вычисляет актуальное значение северной надбавки на заданный момент.

Параметры запроса :
ГоловнаяОрганизация, ДатаСреза.
На выходе запроса — таблица из двух колонок :
Физлицо, АктуальныйПроцентСевернойНадбавки.

Шкалы северной надбавки в таблицах базы данных 1С пока нет, поэтому я явно задаю шкалу в отдельной временной таблице ИсходнаяШкалаНадбавок (а не читаю из какой-либо таблицы базы данных).

Для простоты восприятия запроса я «сшиваю» в запросе необходимый минимум таблиц, и потому регистр сведений ПлановыеНачисленияРаботниковОрганизаций не анализируется. То есть, вычисляется только процентное значение северной надбавки (исходя из шкалы и данных о северном стаже), а запланирована ли северная надбавка для данного физического лица — запрос «не знает».

Текст запроса :

 
ВЫБРАТЬ
РаботникиОрганизацийСрезПоследних.Сотрудник.Физлицо КАК Физлицо,
&ДатаСреза КАК ПериодРаботники
ПОМЕСТИТЬ ВТРаботникиИНачисления
ИЗ
РегистрСведений.РаботникиОрганизаций.СрезПоследних(&ДатаСреза, Организация = &ГоловнаяОрганизация) КАК РаботникиОрганизацийСрезПоследних
ГДЕ
РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДатыСтажа.Физлицо,
ДатыСтажа.ПериодРаботники,
ДатыСтажа.ПериодСеверногоСтажа КАК ДатаРегистрацииСеверногоСтажа,
СведенияОСтажеРаботыНаСевере.ПорядокНачисленияСеверныхНадбавок,
СведенияОСтажеРаботыНаСевере.НачальныйПроцентСевернойНадбавки,
СведенияОСтажеРаботыНаСевере.СеверныйСтажМесяцев,
СведенияОСтажеРаботыНаСевере.СеверныйСтажДней
ПОМЕСТИТЬ РаботникиИСтажи
ИЗ
(ВЫБРАТЬ
СписокНачислений.Физлицо КАК Физлицо,
СписокНачислений.ПериодРаботники КАК ПериодРаботники,
МАКСИМУМ(СведенияОСтажеРаботыНаСевере.Период) КАК ПериодСеверногоСтажа
ИЗ
ВТРаботникиИНачисления КАК СписокНачислений
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСтажеРаботыНаСевере КАК СведенияОСтажеРаботыНаСевере
ПО СписокНачислений.Физлицо = СведенияОСтажеРаботыНаСевере.ФизЛицо
И СписокНачислений.ПериодРаботники >= СведенияОСтажеРаботыНаСевере.Период

СГРУППИРОВАТЬ ПО
СписокНачислений.Физлицо,
СписокНачислений.ПериодРаботники) КАК ДатыСтажа
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСтажеРаботыНаСевере КАК СведенияОСтажеРаботыНаСевере
ПО ДатыСтажа.Физлицо = СведенияОСтажеРаботыНаСевере.ФизЛицо
И ДатыСтажа.ПериодСеверногоСтажа = СведенияОСтажеРаботыНаСевере.Период
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ЗНАЧЕНИЕ(Перечисление.ПорядокНачисленияСеверныхНадбавок.Группа1Льготная) КАК ПорядокНачисления,
6 КАК РазмерПериода1,
20 КАК РазмерПрироста1,
60 КАК Ограничение1,
6 КАК РазмерПериода2,
10 КАК РазмерПрироста2,
100 КАК Ограничение2
ПОМЕСТИТЬ ИсходнаяШкалаНадбавок

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
ЗНАЧЕНИЕ(Перечисление.ПорядокНачисленияСеверныхНадбавок.Группа1Обычная),
6,
10,
100,
0,
0,
0

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
ЗНАЧЕНИЕ(Перечисление.ПорядокНачисленияСеверныхНадбавок.Группа2Льготная),
6,
20,
60,
12,
20,
80

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
ЗНАЧЕНИЕ(Перечисление.ПорядокНачисленияСеверныхНадбавок.Группа2Обычная),
6,
10,
60,
12,
10,
80

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
ЗНАЧЕНИЕ(Перечисление.ПорядокНачисленияСеверныхНадбавок.Группа3Льготная),
6,
10,
50,
0,
0,
0

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
ЗНАЧЕНИЕ(Перечисление.ПорядокНачисленияСеверныхНадбавок.Группа3Обычная),
12,
10,
50,
0,
0,
0

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
ЗНАЧЕНИЕ(Перечисление.ПорядокНачисленияСеверныхНадбавок.Группа4Льготная),
6,
10,
30,
0,
0,
0

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
ЗНАЧЕНИЕ(Перечисление.ПорядокНачисленияСеверныхНадбавок.Группа4Обычная),
12,
10,
10,
24,
10,
30
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ШкалаНадбавок.ПорядокНачисления,
ШкалаНадбавок.РазмерПериода1,
ШкалаНадбавок.РазмерПрироста1,
ШкалаНадбавок.Ограничение1,
ШкалаНадбавок.РазмерПериода2,
ШкалаНадбавок.РазмерПрироста2,
ШкалаНадбавок.Ограничение2,
ВЫБОР
КОГДА ШкалаНадбавок.Ограничение2 = 0
ТОГДА 0
ИНАЧЕ ШкалаНадбавок.РазмерПериода2 * (ШкалаНадбавок.Ограничение2 - ШкалаНадбавок.Ограничение1) / ШкалаНадбавок.РазмерПрироста2
КОНЕЦ КАК КоличествоМесяцевДляДостиженияВторогоОграничения,
ШкалаНадбавок.РазмерПериода1 * ШкалаНадбавок.Ограничение1 / ШкалаНадбавок.РазмерПрироста1 КАК КоличествоМесяцевДляДостиженияПервогоОграничения
ПОМЕСТИТЬ ШкалаНадбавок
ИЗ
ИсходнаяШкалаНадбавок КАК ШкалаНадбавок
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
РаботникиИСтажи.Физлицо,
ШкалаНадбавок.ПорядокНачисления,
ШкалаНадбавок.РазмерПериода1,
ШкалаНадбавок.РазмерПрироста1,
ШкалаНадбавок.Ограничение1,
ШкалаНадбавок.РазмерПериода2,
ШкалаНадбавок.РазмерПрироста2,
ШкалаНадбавок.Ограничение2,
РаботникиИСтажи.ДатаРегистрацииСеверногоСтажа,
РаботникиИСтажи.ПериодРаботники,
РаботникиИСтажи.НачальныйПроцентСевернойНадбавки,
РаботникиИСтажи.СеверныйСтажМесяцев,
РаботникиИСтажи.СеверныйСтажДней,
ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(РаботникиИСтажи.ДатаРегистрацииСеверногоСтажа, МЕСЯЦ, -РаботникиИСтажи.СеверныйСтажМесяцев), ДЕНЬ, -РаботникиИСтажи.СеверныйСтажДней) КАК ДатаНачалаОтсчетаСеверногоСтажа,
ШкалаНадбавок.КоличествоМесяцевДляДостиженияВторогоОграничения,
ШкалаНадбавок.КоличествоМесяцевДляДостиженияПервогоОграничения,
ВЫБОР
КОГДА РаботникиИСтажи.НачальныйПроцентСевернойНадбавки >= ШкалаНадбавок.Ограничение2
И ШкалаНадбавок.Ограничение2 > 0
ТОГДА 0
КОГДА РаботникиИСтажи.НачальныйПроцентСевернойНадбавки >= ШкалаНадбавок.Ограничение1
И ШкалаНадбавок.Ограничение2 > 0
ТОГДА ШкалаНадбавок.РазмерПериода2 * (ШкалаНадбавок.Ограничение2 - РаботникиИСтажи.НачальныйПроцентСевернойНадбавки) / ШкалаНадбавок.РазмерПрироста2
КОГДА РаботникиИСтажи.НачальныйПроцентСевернойНадбавки >= 0
ТОГДА ШкалаНадбавок.РазмерПериода1 * (ШкалаНадбавок.Ограничение1 - РаботникиИСтажи.НачальныйПроцентСевернойНадбавки) / ШкалаНадбавок.РазмерПрироста1 + ШкалаНадбавок.КоличествоМесяцевДляДостиженияВторогоОграничения
ИНАЧЕ ШкалаНадбавок.КоличествоМесяцевДляДостиженияВторогоОграничения + ШкалаНадбавок.КоличествоМесяцевДляДостиженияПервогоОграничения
КОНЕЦ КАК РеальноеКоличествоМесяцевДляДостиженияВторогоОграничения,
ВЫБОР
КОГДА РаботникиИСтажи.НачальныйПроцентСевернойНадбавки >= ШкалаНадбавок.Ограничение1
ТОГДА 0
КОГДА РаботникиИСтажи.НачальныйПроцентСевернойНадбавки >= 0
ТОГДА ШкалаНадбавок.РазмерПериода1 * (ШкалаНадбавок.Ограничение1 - РаботникиИСтажи.НачальныйПроцентСевернойНадбавки) / ШкалаНадбавок.РазмерПрироста1
ИНАЧЕ ШкалаНадбавок.КоличествоМесяцевДляДостиженияПервогоОграничения
КОНЕЦ КАК РеальноеКоличествоМесяцевДляДостиженияПервогоОграничения,
ВЫБОР
КОГДА ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(РаботникиИСтажи.ДатаРегистрацииСеверногоСтажа, МЕСЯЦ, -РаботникиИСтажи.СеверныйСтажМесяцев + ШкалаНадбавок.КоличествоМесяцевДляДостиженияПервогоОграничения), ДЕНЬ, -РаботникиИСтажи.СеверныйСтажДней) < РаботникиИСтажи.ПериодРаботники ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ КАК ДостигнутПределПервогоОграничения_Не_используется_0, ВЫБОР КОГДА ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(РаботникиИСтажи.ДатаРегистрацииСеверногоСтажа, МЕСЯЦ, -РаботникиИСтажи.СеверныйСтажМесяцев + ШкалаНадбавок.КоличествоМесяцевДляДостиженияВторогоОграничения + ШкалаНадбавок.КоличествоМесяцевДляДостиженияПервогоОграничения), ДЕНЬ, -РаботникиИСтажи.СеверныйСтажДней) < РаботникиИСтажи.ПериодРаботники ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ КАК ДостигнутПределВторогоОграничения_Не_используется_0 ПОМЕСТИТЬ ДатыДостиженияОграничений ИЗ РаботникиИСтажи КАК РаботникиИСтажи ЛЕВОЕ СОЕДИНЕНИЕ ШкалаНадбавок КАК ШкалаНадбавок ПО РаботникиИСтажи.ПорядокНачисленияСеверныхНадбавок = ШкалаНадбавок.ПорядокНачисления ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ДатыДостиженияОграничений.Физлицо, ВЫБОР КОГДА ДОБАВИТЬКДАТЕ(ДатыДостиженияОграничений.ДатаНачалаОтсчетаСеверногоСтажа, МЕСЯЦ, ДатыДостиженияОграничений.РеальноеКоличествоМесяцевДляДостиженияВторогоОграничения) <= ДатыДостиженияОграничений.ПериодРаботники И ДатыДостиженияОграничений.Ограничение2 > 0
ТОГДА ДатыДостиженияОграничений.Ограничение2
КОГДА ДОБАВИТЬКДАТЕ(ДатыДостиженияОграничений.ДатаНачалаОтсчетаСеверногоСтажа, МЕСЯЦ, ДатыДостиженияОграничений.РеальноеКоличествоМесяцевДляДостиженияПервогоОграничения) <= ДатыДостиженияОграничений.ПериодРаботники И ДатыДостиженияОграничений.Ограничение2 = 0 ТОГДА ДатыДостиженияОграничений.Ограничение1 КОГДА ДОБАВИТЬКДАТЕ(ДатыДостиженияОграничений.ДатаНачалаОтсчетаСеверногоСтажа, МЕСЯЦ, ДатыДостиженияОграничений.РеальноеКоличествоМесяцевДляДостиженияПервогоОграничения) <= ДатыДостиженияОграничений.ПериодРаботники ТОГДА ДатыДостиженияОграничений.Ограничение1 + (ВЫРАЗИТЬ((РАЗНОСТЬДАТ(ДатыДостиженияОграничений.ДатаНачалаОтсчетаСеверногоСтажа, ДатыДостиженияОграничений.ПериодРаботники, МЕСЯЦ) - ДатыДостиженияОграничений.РеальноеКоличествоМесяцевДляДостиженияПервогоОграничения) / ДатыДостиженияОграничений.РазмерПериода2 - 0.5 КАК ЧИСЛО(15, 0))) * ДатыДостиженияОграничений.РазмерПрироста2 КОГДА ДатыДостиженияОграничений.ДатаНачалаОтсчетаСеверногоСтажа > ДатыДостиженияОграничений.ПериодРаботники
ТОГДА 0
ИНАЧЕ ДатыДостиженияОграничений.НачальныйПроцентСевернойНадбавки + (ВЫРАЗИТЬ(РАЗНОСТЬДАТ(ДатыДостиженияОграничений.ДатаНачалаОтсчетаСеверногоСтажа, ДатыДостиженияОграничений.ПериодРаботники, МЕСЯЦ) / ДатыДостиженияОграничений.РазмерПериода1 - 0.5 КАК ЧИСЛО(15, 0))) * ДатыДостиженияОграничений.РазмерПрироста1
КОНЕЦ КАК АктуальныйПроцентСевернойНадбавки
ИЗ
ДатыДостиженияОграничений КАК ДатыДостиженияОграничений
ГДЕ
ДатыДостиженияОграничений.ПорядокНачисления <> ЗНАЧЕНИЕ(Перечисление.ПорядокНачисленияСеверныхНадбавок.ПустаяСсылка)

Запрос тестировался на конфигурации Зарплата и Управление Персоналом, редакция 2.5 (2.5.49.1), и не имеет каких-либо ограничений по встраиванию в какой-либо другой пакет запросов.

Запись опубликована в рубрике Программное обеспечение. Добавьте в закладки постоянную ссылку.

4 комментария на «Пример одного пакета запроса, который вычисляет актуальное значение северной надбавки на заданный момент»

  1. Фиона говорит:

    А каким параметром нужно вывести % северной надбавки? Имеется ввиду в макете какой параметр нужно прописать?

  2. Андрей говорит:

    Запрос работает некорректно: не учитывается граница, при достижении которой процент северной надбавки должен увеличиваться.
    Пример: сотрудник принят на работу 10.04.2013. На 10.04.2013 он имеет начальный процент северной надбавки 10%, северный стаж 5 месяцев 25 дней. Порядок начисления надбавки — Группа 2 обычная.
    До 15.04.2013 включительно процент северной надбавки должен быть 10%, с 16.04.2013 — уже 20%.
    А запрос независимо от даты среза показывает 20%.

    • Программист говорит:

      Вы правы. В самом последнем запросе из моего пакета запросов используется загрубленная конструкция
      РАЗНОСТЬДАТ(ДатыДостиженияОграничений.ДатаНачалаОтсчетаСеверногоСтажа, ДатыДостиженияОграничений.ПериодРаботники, МЕСЯЦ)
      в которой совершенно нивелируется число месяца даты вступления в силу новых границ северного стажа, а анализируется только номер месяца.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.