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

28.12.15

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

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

Скачать файл

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

См. также

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

Расчет себестоимости в типовых конфигурациях 1С – для многих «черный ящик», работающий по жестко зашитым в него алгоритмам. Реализация этого «черного ящика» может меняться в зависимости от конкретной конфигурации – УПП, БП 3.0, ERP. Но принцип работы везде одинаковый. Расскажем о том, как устроен расчет себестоимости, как его дорабатывать, и какие методы могут быть эффективны и без доработок.

27.12.2024    11740    Begemoth80    32    

85

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

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    2500    PROSTO-1C    0    

21

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

Эта ошибка была обнаружена мной в типовой конфигурации 1С:Комплексная автоматизация 2 (2.5.16.115), БСП версия 3.1.9.302. Возникает она после того, как вы добавляете в расширение бизнес-процесс или задачу, выполняете обновление идентификаторов метаданных расширений, но ошибка при записи любого элемента справочника "Профили групп доступа" всё равно остаётся.

01.07.2024    2614    Vidz    0    

12

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

Очень часто в написании кода требуется обращаться к предопределённым значениям. Если идёт обращение к типовым предопределённым значениям, то проблем не возникает.

24.06.2024    1443    olja-ljaaa    0    

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