Индексация в период отпуска

Если индексация прошла до начала отпуска, то документ "Начисление отпуска работникам организаций" производит расчет верно. Если индексация произошла в период отпуска, то индексация не учитывается. Расчетчики попросили, чтобы в период до индексации средний заработок рассчитывался без учета индексации, а после — с индексацией. На форуме 8-ки написано, что данный вопрос можно решить только редактированием конфигурации.

Предыдущая версия публикации некорректно отрабатывала ситуации, когда есть дополнительный отпуск, но нет основного. Данная ошибка устранена.

Предлагаю свой вариант решения проблемы.

Необходимо в процедуру Рассчитать() модуля документа «Начисление отпуска работникам организаций», перед комментарием

// перепишем записи основных начислений в документ

вставить следующий код:

 

//определим была ли индексация в период основного отпуска
ЗапросИндексация = Новый Запрос;
ЗапросИндексация.УстановитьПараметр(«Организация», Ссылка.Организация);
ЗапросИндексация.УстановитьПараметр(«Сотрудник», Ссылка.Сотрудник);
ЗапросИндексация.УстановитьПараметр(«ДатаНачалаОсновногоОтпуска», Ссылка.ДатаНачалаСобытия);
ЗапросИндексация.УстановитьПараметр(«ДатаОкончанияОсновногоОтпуска», Ссылка.ДатаОкончанияОсновногоОтпуска);
//
ЗапросИндексация.УстановитьПараметр(«ДатаНачалаДополнительногоОтпуска», Ссылка.ДатаНачалаДополнительногоОтпуска);
//
ЗапросИндексация.УстановитьПараметр(«ДатаОкончанияДопОтпуска», Ссылка.ДатаОкончанияДополнительногоОтпуска);
ЗапросИндексация.Текст = «ВЫБРАТЬ
                                 |    КоэффициентИндексацииЗаработка.Период КАК Период,
                                 |    КоэффициентИндексацииЗаработка.Сотрудник,
                                 |    КоэффициентИндексацииЗаработка.Организация,
                                 |    КоэффициентИндексацииЗаработка.Коэффициент
                                 |ИЗ
                                 |    РегистрСведений.КоэффициентИндексацииЗаработка КАК КоэффициентИндексацииЗаработка
                                 |ГДЕ
                                 |    КоэффициентИндексацииЗаработка.Организация = &Организация
                                 |    И КоэффициентИндексацииЗаработка.Сотрудник = &Сотрудник
                                 |    И (КоэффициентИндексацииЗаработка.Период > &ДатаНачалаОсновногоОтпуска
                                 |                И КоэффициентИндексацииЗаработка.Период                                  |            ИЛИ КоэффициентИндексацииЗаработка.Период >= &ДатаНачалаДополнительногоОтпуска
                                 |                И КоэффициентИндексацииЗаработка.Период                                  |
                                 |УПОРЯДОЧИТЬ ПО
                                 |    Период»;
ВыборкаИндексация = ЗапросИндексация.Выполнить().Выбрать();
   
Если ВыборкаИндексация.Следующий() Тогда
    ТЗСреднийСИндексацией = НаборРасчетСреднего.Выгрузить();
       
    //меняем коэффициенты индексации в индексируемых видах расчета
    Для Каждого СтрокаСреднего Из ТЗСреднийСИндексацией Цикл
        Если СтрокаСреднего.ВидРасчета = ПланыВидовРасчета.СреднийЗаработок.ПоГодовойПремииИндексируемые ИЛИ
            СтрокаСреднего.ВидРасчета = ПланыВидовРасчета.СреднийЗаработок.ПоЗаработкуИндексируемые ИЛИ
            СтрокаСреднего.ВидРасчета = ПланыВидовРасчета.СреднийЗаработок.ПоПремиямИндексируемые Тогда
                   
            МесяцИндексации = Месяц(ВыборкаИндексация.Период);
            ГодИндексации = Год(ВыборкаИндексация.Период);
            МесяцТекущегоПериода = Месяц(СтрокаСреднего.БазовыйПериодНачало);
            ГодТекущегоПериода = Год(СтрокаСреднего.БазовыйПериодНачало);
                   
            //индексация действует только на предшествующие 12 месяцев
            Если (ГодИндексации * 12 + МесяцИндексации — 1) — (ГодТекущегоПериода * 12 + МесяцТекущегоПериода — 1)                 СтрокаСреднего.КоэффициентИндексации = СтрокаСреднего.КоэффициентИндексации * ВыборкаИндексация.Коэффициент;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
       
    //определим размер среднего заработка с учетом индексации
    ЗапросСреднийЗаработок = Новый Запрос;
    ЗапросСреднийЗаработок.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
   
    ПоПремиям = Новый Массив(2);
    ПоПремиям[0] = ПланыВидовРасчета.СреднийЗаработок.ПоПремиямИндексируемые;
    ПоПремиям[1] = ПланыВидовРасчета.СреднийЗаработок.ПоГодовойПремииИндексируемые;
    ПоФиксПремиямНеИндексируемые = Новый Массив(2);
    ПоФиксПремиямНеИндексируемые[0] = ПланыВидовРасчета.СреднийЗаработок.ПоФиксГодовойПремииНеИндексируемые;
    ПоФиксПремиямНеИндексируемые[1] = ПланыВидовРасчета.СреднийЗаработок.ПоФиксПремиямНеИндексируемые;
   
    ЗапросСреднийЗаработок.УстановитьПараметр(«ПоПремиям»,                        ПоПремиям);  // Премии полностью учитываемые, индексируемые
    ЗапросСреднийЗаработок.УстановитьПараметр(«ПоФиксПремиямНеИндексируемые»,    ПоФиксПремиямНеИндексируемые); // Премии учитываемые частично, не индексируемые
    ЗапросСреднийЗаработок.УстановитьПараметр(«ТаблицаСреднего»,                ТЗСреднийСИндексацией);
    ЗапросСреднийЗаработок.УстановитьПараметр(«ПериодРасчетаСреднегоЗаработка»,    12);
    ЗапросСреднийЗаработок.УстановитьПараметр(«Начало»,                            Ссылка.ПериодРасчетаСреднегоЗаработкаНачало); 
    ЗапросСреднийЗаработок.УстановитьПараметр(«Окончание»,                        КонецДня(Ссылка.ПериодРасчетаСреднегоЗаработкаОкончание)); 
   
    ЗапросСреднийЗаработок.Текст =
            «ВЫБРАТЬ
            |    РасчетСреднегоЗаработка.ВидРасчета,
            |    РасчетСреднегоЗаработка.Результат,
            |    РасчетСреднегоЗаработка.ОтработаноДней,
            |    РасчетСреднегоЗаработка.НормаПоПятидневке,
            |    РасчетСреднегоЗаработка.ОтработаноПоПятидневке,
            |    РасчетСреднегоЗаработка.ЧислоМесяцев,
            |    РасчетСреднегоЗаработка.КоэффициентИндексации,
            |    РасчетСреднегоЗаработка.БазовыйПериодНачало,
            |    РасчетСреднегоЗаработка.БазовыйПериодКонец
            |ПОМЕСТИТЬ ВТРасчетСреднегоЗаработка
            |ИЗ
            |    &ТаблицаСреднего КАК РасчетСреднегоЗаработка»;
    ЗапросСреднийЗаработок.Выполнить();
           
    ЗапросСреднийЗаработок.Текст =
            «ВЫБРАТЬ
            |    СУММА(ВЫБОР
            |            КОГДА РасчетСреднегоЗаработка.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.СреднийЗаработок.ПоЗаработкуИндексируемые)
            |                ТОГДА РасчетСреднегоЗаработка.Результат * ВЫБОР
            |                        КОГДА РасчетСреднегоЗаработка.КоэффициентИндексации < 1
            |                            ТОГДА 1
            |                        ИНАЧЕ РасчетСреднегоЗаработка.КоэффициентИндексации
            |                    КОНЕЦ
            |            КОГДА РасчетСреднегоЗаработка.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.СреднийЗаработок.ПоЗаработкуНеИндексируемые)
            |                ТОГДА РасчетСреднегоЗаработка.Результат
            |            КОГДА РасчетСреднегоЗаработка.ЧислоМесяцев = 0
            |                ТОГДА 0
            |            ИНАЧЕ ВЫБОР
            |                    КОГДА РасчетСреднегоЗаработка.ВидРасчета В (&ПоПремиям)
            |                        ТОГДА РасчетСреднегоЗаработка.Результат * ВЫБОР
            |                                КОГДА РасчетСреднегоЗаработка.КоэффициентИндексации < 1
            |                                    ТОГДА 1
            |                                ИНАЧЕ РасчетСреднегоЗаработка.КоэффициентИндексации
            |                            КОНЕЦ
            |                    КОГДА РасчетСреднегоЗаработка.ВидРасчета В (&ПоФиксПремиямНеИндексируемые)
            |                        ТОГДА РасчетСреднегоЗаработка.Результат * ВЫБОР
            |                                КОГДА РасчетСреднегоЗаработка.НормаПоПятидневке = 0
            |                                    ТОГДА 0
            |                                ИНАЧЕ РасчетСреднегоЗаработка.ОтработаноПоПятидневке / РасчетСреднегоЗаработка.НормаПоПятидневке
            |                            КОНЕЦ
            |                    ИНАЧЕ РасчетСреднегоЗаработка.Результат
            |                КОНЕЦ * ВЫБОР
            |                    КОГДА РасчетСреднегоЗаработка.ЧислоМесяцев > &ПериодРасчетаСреднегоЗаработка
            |                        ТОГДА &ПериодРасчетаСреднегоЗаработка / РасчетСреднегоЗаработка.ЧислоМесяцев
            |                    ИНАЧЕ 1
            |                КОНЕЦ
            |        КОНЕЦ) КАК СреднийЗаработок,
            |    СУММА(ВЫБОР
            |            КОГДА РасчетСреднегоЗаработка.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.СреднийЗаработок.ПоЗаработкуИндексируемые)
            |                    ИЛИ РасчетСреднегоЗаработка.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.СреднийЗаработок.ПоЗаработкуНеИндексируемые)
            |                ТОГДА РасчетСреднегоЗаработка.ОтработаноДней
            |            ИНАЧЕ 0
            |        КОНЕЦ) КАК ОтработаноДней
            |ИЗ
            |    ВТРасчетСреднегоЗаработка КАК РасчетСреднегоЗаработка
            |ГДЕ
            |    РасчетСреднегоЗаработка.БазовыйПериодНачало МЕЖДУ &Начало И &Окончание»;   
    ВыборкаСреднийЗаработок = ЗапросСреднийЗаработок.Выполнить().Выбрать();
   
    Если ВыборкаСреднийЗаработок.Следующий()
    Тогда
        СреднедневнойЗаработок = ?(Не ЗначениеЗаполнено(ВыборкаСреднийЗаработок.ОтработаноДней), 0, Окр(ВыборкаСреднийЗаработок.СреднийЗаработок / ВыборкаСреднийЗаработок.ОтработаноДней,2));
    Иначе
        СреднедневнойЗаработок = 0;
    КонецЕсли;
       
    //пересчитаем начисления отпускных, к которым должна быть применена индексация
    Для Каждого СтрокаНачисления Из НаборОсновныеНачисления Цикл
        Если НЕ СтрокаНачисления.Сторно И СтрокаНачисления.ПериодДействияНачало >= ВыборкаИндексация.Период Тогда
            СтрокаНачисления.ДополнительныеДанные = СреднедневнойЗаработок;
            СтрокаНачисления.Результат = СреднедневнойЗаработок * СтрокаНачисления.ОплаченоДнейЧасов;
        КонецЕсли;
    КонецЦикла;
           
КонецЕсли;

19 Comments

  1. Boroda

    Спасибо! Попробуем этот вариант расчёта. Обычно мы просто вручную пересчитывали отпуск сотрудникам, уже гуляющим, и выплачивали разницу.

    А после этой автоматизации, очевидно, надо просто пересчитать отпуск этим ребятам, и разница определится сама?

    Reply ↓
  2. scientist

    Не забудьте только ввести документ «Индексация заработка». Тогда перерасчет должен пройти правильно.

    Reply ↓
  3. Boroda

    (2) Ну, это ж естественно! Но, кстати, он и так введётся после индексации в Кадровом перемещении». Так что останется только пересчитать.

    Reply ↓
  4. scientist

    Зачем через кадровое перемещение вводить? У вас индексация не в начале месяца идет?

    Reply ↓
  5. delta

    Спасибо огромное!!! Вот расчетчики обрадуются!!!

    Reply ↓
  6. GTV

    Очень полезно и своевременно! Спасибо!

    Reply ↓
  7. ryabov_d

    а в других расчетах по среднему, например командировках или льготных днях родителей, такую правку тоже надо делать?

    Reply ↓
  8. scientist

    Для командировок тоже надо будет редактировать конфигурацию.

    Reply ↓
  9. Katish7

    Это что за код такой:

    //индексация действует только на предшествующие 12 месяцев

    Если (ГодИндексации * 12 + МесяцИндексации — 1) — (ГодТекущегоПериода * 12 + МесяцТекущегоПериода — 1) СтрокаСреднего.КоэффициентИндексации = СтрокаСреднего.КоэффициентИндексации * ВыборкаИндексация.Коэффициент;

    КонецЕсли;

    ???

    Reply ↓
  10. scientist

    Вы видите искаженный кусок кода. На самом деле он выглядит так:

    Если (ГодИндексации * 12 + МесяцИндексации — 1) — (ГодТекущегоПериода * 12 + МесяцТекущегоПериода — 1) <= 12 Тогда

    СтрокаСреднего.КоэффициентИндексации = СтрокаСреднего.КоэффициентИндексации * ВыборкаИндексация.Коэффициент;

    КонецЕсли;

    Т.е. если человек взял отпуск с 29 марта, то период среднего будет март прошлого года по февраль нынешнего. Если 1 апреля т.г. прошла индексация, то она должна примениться только к периодам начиная с апреля прошлого года.

    P.S. Это моя первая публикация здесь, в следующий раз положу код в текстовый файл.

    Reply ↓
  11. lissa707

    Пробовала добавить код в документ Начисление отпуска…Что-то много разных ошибок выдаёт. Так-как не профессионал — грешу на себя, в первую очередь.

    Вот одна из них, выпала уже при отладке-пробовала перерасчитать начисленный отпуск.

    {Документ.НачислениеОтпускаРаботникамОрганизаций.МодульОбъекта(248)}: Ошибка при вызове метода контекста (Выполнить)

    ВыборкаИндексация = ЗапросИндексация.Выполнить().Выбрать();

    по причине:

    по причине:

    {(12, 16)}: Неверные параметры «И»

    И <<?>>КоэффициентИндексацииЗаработка.Период

    Уважаемый автор, подскажите!!!!

    Reply ↓
  12. scientist

    Можно скриншот окна конфигуратора, в котором виден проблемный запрос?

    Reply ↓
  13. scientist

    (11) lissa707, скорее всего у вас неверно набран текст указанного запроса. между «И» и «КоэффициентИндексацииЗаработка.Период» должен быть только пробел. а у вас, скорее всего, поставлен еще «&»

    Reply ↓
  14. lissa707

    Да нет, «&» там нет. Код копировала с публикации, не набирала. Скрин приложила.

    Reply ↓
  15. scientist

    (14) lissa707, текст запроса должен быть таким:

    ЗапросИндексация.Текст = «ВЫБРАТЬ

    | КоэффициентИндексацииЗаработка.Период КАК Период,

    | КоэффициентИндексацииЗаработка.Сотрудник,

    | КоэффициентИндексацииЗаработка.Организация,

    | КоэффициентИндексацииЗаработка.Коэффициент

    |ИЗ

    | РегистрСведений.КоэффициентИндексацииЗаработка КАК КоэффициентИндексацииЗаработка

    |ГДЕ

    | КоэффициентИндексацииЗаработка.Организация = &Организация

    | И КоэффициентИндексацииЗаработка.Сотрудник = &Сотрудник

    | И (КоэффициентИндексацииЗаработка.Период > &ДатаНачалаОсновногоОтпуска

    | И КоэффициентИндексацииЗаработка.Период <= &ДатаОкончанияОсновногоОтпуска

    | ИЛИ КоэффициентИндексацииЗаработка.Период >= &ДатаНачалаДополнительногоОтпуска

    | И КоэффициентИндексацииЗаработка.Период <= &ДатаОкончанияДопОтпуска)

    |

    |УПОРЯДОЧИТЬ ПО

    | Период»;

    Reply ↓
  16. lissa707

    (15) а можно весь код в текстовый файл положить? может там еще что-то потерялось?

    Reply ↓
  17. lissa707

    А вообще, все получилось. Большое спасибо!

    Reply ↓
  18. bme

    Большое спасибо! Статья до сих пор актуальная 🙂

    Reply ↓
  19. NetKat

    Спасибо, помого!. Доработка не учитывает двойной индексации, например у сотрудника отпуск с 05.08. 2013 по 01.10.2013 был начислен в августе. Коэф. индексации с 01.09.2013 =1,14, коэф. индексации с 01.10.13 =1,065. Период отпуска с 05.08.2013 по 31.08.13 должен посчитаться без индексации, период с 01.09.13 по 30.09.13 с коэф= 1,14, а один день 01.10.13 должен посчитаться с коэф. индексации=1,065*1,14=1,2141. При такой настройке период с с 01.09.13 по 01.10.13 посчитается с коэф=1,14.

    Reply ↓

Leave a Comment

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