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

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

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

Давайте вместе разберемся, почему так происходит, как работает этот механизм изнутри и какие способы существуют для решения данной задачи.

Природа показателя КоличествоДнейОтпуска

Для начала проанализируем, что представляет собой показатель КоличествоДнейОтпуска. Многие начинающие разработчики и расчетчики воспринимают его как некую функцию, которая должна «сходить» в базу данных, найти там документы Отпуск по конкретному сотруднику за указанный период и вернуть сумму дней. Однако в архитектуре 1С:ЗУП 3.1 этот показатель работает иначе.

Показатель КоличествоДнейОтпуска является контекстным. Это означает, что его значение определяется непосредственно из текущего документа, в котором происходит расчет. Когда вы создаете Разовое начисление и указываете в нем период (например, с 1 по 31 октября), система берет этот временной интервал и вычисляет количество календарных дней внутри него, исключая праздничные дни согласно производственному календарю.

Посмотрим на алгоритм расчета, который использует программа:

Результат = ДатаОкончанияПериода - ДатаНачалаПериода + 1 - КоличествоПраздничныхДней

В октябре, как известно, государственных праздников в РФ нет. Поэтому, если в документе Разовое начисление выбран период «Октябрь», система видит интервал с 01.10 по 31.10 и честно возвращает 31 день. Она «не знает», что вы хотите доначислить что-то именно за те 3 дня, когда сотрудник был в отпуске, если эти даты не ограничены в самом документе разового начисления.

Почему в ноябре результат может быть другим?

Разберем интересную особенность, связанную с праздничными днями. Если мы проведем аналогичный расчет за ноябрь, то при указании полного месяца (с 1 по 30 ноября) показатель КоличествоДнейОтпуска вернет 29 дней. Это происходит потому, что 4 ноября — государственный праздник. Согласно законодательству, праздничные дни не включаются в число календарных дней отпуска и не оплачиваются. Система автоматически вычитает этот день из периода, подтверждая свою «отпускную» логику, но по-прежнему ограничиваясь рамками дат в документе.

Влияние настроек вида расчета на результат

Рассмотрим подробнее настройки самого начисления. Чтобы показатель КоличествоДнейОтпуска корректно отрабатывал именно как «отпускной» (т. е. вычитал праздники), программа анализирует вкладку Учет времени в настройках начисления.

Выясним важные нюансы:

  1. Если в поле Вид времени выбран «Отпуск основной» или другой вид времени, относящийся к категории отпусков, система применяет логику производственного календаря для отпусков.
  2. Если же в настройках указано, что это «Дополнительная оплата за уже оплаченное время» или вид времени «Явка», то использование показателя КоличествоДнейОтпуска может привести к ошибкам или игнорированию праздничных дней в зависимости от версии релиза.

Вариант решения №1: Ограничение периода в документе

Самый простой и очевидный способ заставить систему увидеть нужные 3 дня — это указать их непосредственно в документе Разовое начисление. Если сотрудник был в отпуске с 10 по 12 октября, вам необходимо в поле «Период» указать именно эти даты.

Проанализируем ситуацию: в этом случае формула КоличествоДнейОтпуска рассчитает интервал между 10 и 12 числом и выдаст искомый результат — 3. Это решение подходит, если начисление разовое и вам не нужно автоматизировать процесс для большого количества сотрудников.

Вариант решения №2: Использование пользовательского показателя

Если вам неудобно менять даты периода (например, потому что начисление должно относиться к месяцу в целом), мы рекомендуем создать собственный показатель. Это даст вам полный контроль над вводимыми данными.

Разберем по шагам, как это сделать:

  1. Зайдите в меню Настройка — Показатели расчета зарплаты.
  2. Создайте новый показатель, назовите его, например, ДниДляДоплаты.
  3. Установите назначение показателя: «Для сотрудника».
  4. Тип показателя: «Числовой».
  5. В поле «Использование показателя» выберите «Вводится только в документе, в котором используется (разовый ввод)».
  6. Замените в формуле вашего начисления КоличествоДнейОтпуска на ваш новый показатель ДниДляДоплаты.

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

Вариант решения №3: Настройка автоматического начисления через вид времени

Если ваша задача — чтобы программа сама «видела» факт отпуска и делала доплату, разовое начисление может быть не лучшим инструментом. Рассмотрим более автоматизированный подход.

Выясним, как настроить автоматическую доплату:

  1. Создайте новое начисление.
  2. На вкладке Основное укажите, что начисление выполняется «Ежемесячно» или «Только если введен вид учета времени» (выбрав «Отпуск основной»).
  3. В формуле используйте стандартный показатель ВремяВКалендарныхДнях.
  4. В настройках на вкладке Приоритет убедитесь, что это начисление не вытесняется основным отпуском, а, наоборот, работает вместе с ним.

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

Важные последствия для расчета среднего заработка

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

Обратите внимание:

Если вы создаете разовое начисление с этим показателем, система может классифицировать эту сумму как «Оплату отпуска». В регистре Данные о времени для расчета среднего (общий) могут появиться записи, которые задублируют время или неверно распределят суммы. Это приведет к тому, что при расчете следующего отпуска средний заработок будет завышен или занижен.

Если ваша цель — просто выплатить премию, привязанную к дням отпуска, лучше использовать пользовательский показатель (Вариант №2), чтобы не вносить путаницу в предопределенные механизмы 1С.

Резюме

Мы выяснили, что причина ошибки кроется в непонимании контекстной работы показателя. КоличествоДнейОтпуска — это удобный инструмент, но он жестко привязан к датам того документа, где он используется.

Для исправления ситуации мы рекомендуем:

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

← На главную