Как в 1С:ЗУП 3.1 рассчитать начисление по норме другого графика работы?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом
← На главную

В программе «1С:Зарплата и управление персоналом» (редакция 3.1) стандартные системные показатели, такие как СтоимостьДняЧаса, НормаЧасов или НормаДней, ориентируются на основной график сотрудника, его индивидуальный график или производственный календарь. Однако на практике возникают ситуации, когда оплату дней или часов по тарифной ставке необходимо пересчитать исходя из нормы времени совсем другого графика.

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

Ограничения механизма формул и системных показателей

Попытка передать конкретный график работы прямо в формулу начисления упирается в архитектуру платформы 1С:ЗУП 3.1:

  1. Невозможность передачи ссылочных параметров: Вычислительный механизм формул не поддерживает передачу ссылок на объекты (например, конкретный элемент справочника Графики работы сотрудников) в качестве аргументов функций.
  2. Фиксированный расчет показателя СтоимостьДняЧаса: Алгоритм расчета стоимости часа/дня зашит в программном коде базовых модулей программы (в частности, в обработке МенеджерРасчетаЗарплаты и модулях группы РасчетЗарплатыРасширенный). Этот показатель рассчитывается исходя из совокупной тарифной ставки и нормы времени по текущему графику сотрудника или по производственному календарю.

Вариант 1. Настройка показателя для организации (без доработки)

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

Разберем настройку по шагам:

  1. Создание показателя:

    Перейдем в раздел Настройка — Показатели расчета зарплаты и создадим новый показатель (например, НормаЧасовАльтернативная).

    В настройках укажем:

    • Назначение показателя: Для организации;
    • Тип показателя: Числовой;
    • Порядок ввода: Вводится ежемесячно перед расчетом зарплаты.
  2. Настройка шаблона ввода данных:

    Перейдем в раздел Настройка — Шаблоны ввода данных для расчета зарплаты. Создадим новый шаблон и отметим в нем созданный показатель НормаЧасовАльтернативная.

  3. Ежемесячный ввод нормы:

    В начале расчетного периода расчетчик заполняет документ Данные для расчета зарплаты (раздел Зарплата). В документе вводится всего одна цифра — количество рабочих часов за месяц по требуемому альтернативному графику.

  4. Настройка формулы в начислении:

    В виде начисления задаем формулу расчета. Вместо системного показателя СтоимостьДняЧаса или НормаЧасов используем наш новый показатель:

    Оклад * ВремяВЧасах / НормаЧасовАльтернативная

    Или при использовании часовой тарифной ставки:

    ТарифнаяСтавкаЧасовая * ВремяВЧасах

Вариант 2. Программная доработка через Расширение конфигурации

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

Проанализируем порядок программной реализации:

  1. Для сохранения конфигурации на типовой поддержке все доработки следует выполнять через Расширение конфигурации.
  2. Алгоритмы расчета предопределенных показателей и таблиц времени находятся в серверных модулях управления расчетом зарплаты (в частности, Обработка.МенеджерРасчетаЗарплаты, а также РасчетЗарплатыРасширенный).
  3. В расширении перед выполнением расчета перехватывается процедура формирования показателей зарплаты. Программно выбирается нужный элемент справочника Графики работы сотрудников, по нему рассчитывается объем рабочего времени за текущий период и подставляется в расчетную таблицу.

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


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

Итоги и рекомендации

При выборе решения учитывайте объем ручной работы и сложность сопровождения системы:

← На главную