Расчет аванса по точному календарному количеству дней в ЗУП 2.5

28.12.15

Разработка - Механизмы типовых конфигураций

В ЗУП принята методика расчета аванса за первую половину месяца, при которой используется норма рабочего времени за месяц, которая делится пополам. Но это ведет к неправильному расчету аванса, т.к. не всегда первая половина месяца равна второй по количеству рабочих часов. Иногда это критично для клиента, поэтому требуются доработки.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
(только для физ. лиц)
down.zip
.zip 12,06Kb
2 1 850 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Доработки получаются не слишком сложными, нужно просто разобраться, где вставить заплатки. Рассмотрим пример, где рабочее время и его норма измеряется в часах.

Собственный алгоритм вычисления нормы за месяц

Норма рабочего времени за месяц вычисляется в модуле ПроведениеРасчетовПереопределямый, найти можно по идентификатору НормаВремениЗаМесяц.

В типовом коде норма вычисляется как ДанныеГрафика.ОсновноеЗначениеНормаПериодДействия. При пользовании отладчиком видно, что период действия - с 1 по 15 число, но норма считается за месяц. Это связано с тем, что период действия всегда расширяется до периодичности регистра расчета, а в данном случае это месяц. Это довольно неявно и непрозрачно, но ничего не поделаешь.

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

Текст заплатки получается довольно объемным, ее нужно вставить сразу перед выполнением запроса в процедуре ПолучитьДанныеДляРасчета:

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

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

Обратите внимание на НАЧАЛОПЕРИОДА(Основной.ПериодДействияНачало, МЕСЯЦ) – так надо писать, чтобы для принятых не с начала месяца сотрудников норма считалась с начала месяца, а не с периода действия, который равен дате приема сотрудника на работу.

Расчет планового аванса

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

Сохранять значения нужно в процедуре РассчитатьЗаписиНабора модуля ПроведениеРасчетовПереопределямый в конце цикла по переменной НаборЗаписейРегистра:

Если СтрокаТабличнойЧасти <> Неопределено Тогда
    
    Попытка
        СтрокаТабличнойЧасти.НормаВремениЗаМесяц = ИсходныеДанные.НормаВремениЗаМесяцПоПолумесяцу;
    Исключение
    КонецПопытки;;
    Попытка
        СтрокаТабличнойЧасти.НормаВремениЗаМесяцПоПолумесяцу = ИсходныеДанные.НормаВремениЗаМесяц;
    Исключение
    КонецПопытки;;
    
КонецЕсли;

Округление до рубля в меньшую сторону

Пожелание клиента было в округлении расчета аванса в меньшую сторону, в конец процедуры РасчитатьВсе модуля документа НачислениеЗарплатыСотрудникамОрганизации вставляем код:

Если ПериодНачисления = Перечисления.ПериодНачисленияЗарплаты.ПерваяПоловинаТекущегоМесяца Тогда
    Для Каждого Строка ИЗ Начисления Цикл
        Строка.Результат = ОКР(Строка.Результат, 0); //Округление
    КонецЦикла;
КонецЕсли;

 

Удаление ненужных начислений

Практика показала, что ЗУП пытается впихнуть в аванс лишние начисления, вроде оплаты питания и т.п.

Их можно удалить, вставив код в конец процедуры ВыполнитьАвтозаполнение модуля документа НачислениеЗарплатыСотрудникамОрганизации:

//Чистим ненужные начисления для расчета аванса
Если ПериодНачисления = Перечисления.ПериодНачисленияЗарплаты.ПерваяПоловинаТекущегоМесяца Тогда
    Всего = Начисления.Количество();
    Для Инд = 1 ПО Всего Цикл
        Строка = Начисления[Всего - Инд];
        //Удаляем дополнительные первичные
        Если Строка.ВидРасчета.ВидВремени = Перечисления.ВидыВремени.ДополнительноОплачиваемоеВПределахНормы И Строка.ВидРасчета.КатегорияРасчета = Справочники.КатегорииРасчетов.Первичное Тогда
            //Удаляем
            Начисления.Удалить(Строка);
        КонецЕсли;
    КонецЦикла;
КонецЕсли;

Отчет по авансам

Соответственно, прилагаю отчет по начислениям, который вычисляет также плановый аванс.

Он делает запрос по проведенным документам начисления авансов за первую половину. Информацию берет из начислений по окладу и дополнительных увеличений начисления оклада.

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

Вступайте в нашу телеграмм-группу Инфостарт

ЗУП аванс за первую половину месяца

См. также

Механизмы типовых конфигураций Программист 1С v8.3 Бесплатно (free)

Каждый, кто работал с кадровыми отчетами в ЗУП, ERP или УХ, сталкивался с механизмом представлений – странным кодом запроса, где поля отображаются пустыми ссылками, а в названии временной таблицы есть слово «Представление». В статье разберем, что такое представления и как ими пользоваться. Больше не нужно ломать голову над тем, откуда и как правильно получать данные. Механизм представлений сделает это за вас.

08.07.2025    2850    user2012581    44    

46

Механизмы типовых конфигураций Программист Стажер 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Бесплатно (free)

В типовых решениях типа УТ, КА, ERP при вводе строк в поля ввода осуществляется поиск по первым символам. С помощью небольшой доработки (делается через расширение) можно организовать поиск по вхождению.

02.06.2025    612    lkey    0    

5

Работа с интерфейсом БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Программист 1С v8.3 1C:ERP Бесплатно (free)

В этой статье я расскажу, как в конфигурации 1С:ERP 2.5 при начале работы системы настроить открытие своих нетиповых форм (в том числе и из внешних обработок). Данную методику можно использовать как на тонком клиенте, так и на мобильном или веб-клиенте, а также в мобильном приложении.

12.05.2025    2467    PROSTO-1C    1    

16

Механизмы типовых конфигураций Программист 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

В этой статье расскажу, как можно добавлять свои отборы в типовую обработку формирования заказов по потребностям с минимальными доработками.

27.02.2025    1064    PROSTO-1C    1    

6
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. DangerWulf 15.01.16 19:45 Сейчас в теме
Округление до рубля в меньшую сторону
Строка.Результат = ?(ОКР(Строка.Результат, 0)>Строка.Результат,ОКР(Строка.Результат, 0)-1,ОКР(Строка.Результат, 0)); //Округление
2. fixin 4291 15.01.16 23:40 Сейчас в теме
(1) Да, вместо Окр надо использовать Цел, этот нюанс я у себя уже обнаружил и поправил.
Оставьте свое сообщение