Почему доплата пропорционально отработанному времени не видит отпуск в 1С:УПП 1.3 и как это исправить?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При расчете заработной платы в конфигурации «1С:Управление производственным предприятием 1.3» (архитектура расчета которой аналогична «1С:Зарплата и управление персоналом 2.5») часто возникает ситуация, когда созданное пользователем начисление (например, надбавка или доплата пропорционально отработанному времени) рассчитывается в полном объеме, игнорируя периоды отпусков, больничных или других отклонений. В результате сотруднику начисляется и отпуск, и доплата за одни и те же календарные дни.

В этой статье мы подробно разберем, почему возникает эта проблема, как работает внутренний механизм платформы «1С:Предприятие 8» по расчету времени, и как правильно настроить программу, чтобы расчет производился корректно.

---

Анализ проблемы: почему доплата «не видит» отпуск?

Выясним причину такого поведения системы. Как отмечает автор в одном из сообщений: «на вкладке прочее ничего нет, никакие начисления не настроены». Это и есть ключевой фактор.

В платформе «1С:Предприятие 8» расчет фактически отработанного времени для любого начисления базируется на механизме вытеснения по периоду действия. Если для нашей доплаты не настроены приоритеты (вытеснения), система считает, что у данного начисления нет «конкурентов» за время в расчетном периоде. В результате:

---

Как вычисляются показатели в функции ПолучитьДанныеДляРасчета

Проанализируем программную сторону вопроса. В УПП 1.3 сбор данных для расчета выполняется в общем модуле специализированной функцией ПолучитьДанныеДляРасчета. Типичный вызов этой функции выглядит следующим образом:


ИсходныеДанные = ПолучитьДанныеДляРасчета(
    ИмяРегистра, 
    ВыборкаКатегорий.КатегорияРасчета, 
    НеобходимыеДанные, 
    Регистратор, 
    ГоловнаяОрганизация, 
    ПериодРегистрации, , 
    Физлица, 
    КомментироватьРасчет
);

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

  1. Анализ формулы расчета: На основе настроенного способа расчета (например, «По месячной тарифной ставке по дням») система определяет структуру необходимых показателей. Если в формуле присутствуют показатели времени, они добавляются в массив НеобходимыеДанные.
  2. Определение фактического периода действия: Платформа автоматически рассчитывает виртуальную таблицу ФактическийПериодДействия для каждой записи регистра расчета. Расчет выполняется по следующей формуле:

    ФактическийПериодДействия = ПериодДействия - Периоды Действия Вытесняющих Записей

    Если на вкладке «Прочее» в списке вытесняющих начислений пусто, то вычитаемая часть равна нулю. Следовательно, фактический период действия доплаты полностью совпадает с периодом ее действия (весь месяц).
  3. Получение данных из графиков работы: Функция выполняет сложный запрос к регистру сведений ГрафикиРаботыПоВидамВремени (или аналогичным таблицам в зависимости от настроек).
    • Норма времени рассчитывается за весь ПериодДействия записи (как правило, норма за полный месяц).
    • Фактическое время (отработанное) рассчитывается путем наложения ФактическогоПериодаДействия записи на график работы сотрудника.
  4. Результат: Поскольку фактический период действия не был уменьшен отпуском, функция возвращает количество дней/часов, равное полной норме за месяц. Соответственно, доплата начисляется за весь месяц без уменьшения.

---

Пошаговое решение проблемы в интерфейсе 1С:УПП 1.3

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

Шаг 1. Переход к настройкам начисления

Откроем список основных начислений организаций. Для этого перейдем по меню: Расчет зарплаты по организациям → Настройка расчета зарплаты → Основные начисления организаций.

Шаг 2. Проверка базовых настроек вида расчета

Найдем в списке наше начисление (доплату) и откроем его форму. Нам необходимо убедиться в двух моментах:

Шаг 3. Настройка вытеснения на вкладке «Прочее»

Перейдем на вкладку «Прочее». В левой части формы расположена табличная часть «Вытесняющие начисления». Именно она управляет тем, какие виды расчета должны «забирать» время у нашей доплаты.

Выполним следующие действия:

  1. Нажмем кнопку «Подбор» под табличной частью вытесняющих начислений.
  2. В открывшемся списке выберем все виды расчетов, которые характеризуют неявку сотрудника на работу. В обязательном порядке необходимо добавить следующие начисления:
    • Оплата отпуска по календарным дням (основной ежегодный отпуск);
    • Оплата отпуска по шестидневке;
    • Оплата больничных листов (все виды пособий по временной нетрудоспособности);
    • Отпуск по беременности и родам;
    • Командировка (если доплата не должна начисляться за время командировок);
    • Отпуск без сохранения заработной платы (все виды административных отпусков);
    • Отсутствие по невыясненной причине / Прогулы.
  3. Нажмем «ОК» для переноса выбранных видов расчета в таблицу и сохраним изменения в форме начисления, нажав «Записать и закрыть».

Шаг 4. Перерасчет документов в информационной базе

Важно помнить: простое изменение настроек вида расчета в справочнике не приводит к автоматическому перерасчету уже проведенных документов в базе данных. Платформа должна физически перезаписать движения в регистрах расчета.

Выполним перерасчет за проблемный период:

  1. Откроем документ НачислениеЗарплатыСотрудникамОрганизаций за тот месяц, в котором у сотрудника пересекались отпуск и доплата.
  2. Перейдем на вкладку «Основные начисления».
  3. Найдем строку с расчетом данного сотрудника.
  4. Выделим сотрудника в списке, нажмем кнопку «Рассчитать» и выберем пункт «Рассчитать (полный расчет)».
  5. Обратим внимание на результат: теперь в колонке отработанного времени количество дней и часов должно уменьшиться на период проведения отпуска, а сумма доплаты пересчитается пропорционально.
  6. Проведем и закроем документ.

---

Как проверить правильность работы механизма вытеснения в коде?

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

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


ВЫБРАТЬ
    Регистр.Сотрудник,
    Регистр.ВидРасчета,
    Регистр.ПериодДействияНачало,
    Регистр.ПериодДействияКонец,
    Регистр.Регистратор,
    ДанныеВремени.ДнейОтработано
ИЗ
    РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций КАК Регистр
    // Соединяем с таблицей фактического периода действия для получения реальных дней
    ...

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

← На главную