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

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

При настройке графиков работы в программе 1С:Зарплата и Управление Персоналом 3.1 пользователи часто сталкиваются с ситуацией, когда система игнорирует заданные настройки выходных дней. Типичный пример: в графике установлена пятидневная рабочая неделя (ПН–ПТ), а флаг «При заполнении учитывать праздничные дни» снят. Казалось бы, программа должна жестко ставить 8 часов с понедельника по пятницу и 0 часов в субботу и воскресенье. Однако при заполнении календаря на 2023 год (или аналогичные периоды с переносами) на 1 и 8 января, которые являются воскресеньями, система упорно ставит рабочие часы.

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

Разбор причины: почему 1 января становится рабочим днем

Рассмотрим ситуацию с точки зрения производственного календаря. В 2023 году Постановлением Правительства РФ были утверждены переносы выходных дней: с воскресенья 1 января на пятницу 24 февраля и с воскресенья 8 января на понедельник 8 мая. Когда мы настраиваем график «по неделям» без учета праздников, мы ожидаем, что программа будет смотреть только на день недели. Воскресенье всегда должно быть выходным.

Однако в коде конфигурации (особенно в релизах ветки 3.1.23) алгоритм работает иначе. Программа анализирует каждый день через производственный календарь. Выясним причину: система видит, что 1 января — это не просто воскресенье, а день, с которого осуществлен перенос. В логике конфигурации заложено, что если день перенесен, то его свойства (количество рабочих часов) заимствуются из того дня, на который был сделан перенос.

Поскольку 1 января перенесено на 24 февраля (пятницу), алгоритм ошибочно полагает, что в это воскресенье нужно поставить столько же часов, сколько обычно стоит в пятницу по графику. Так в графике на 1 января появляется 8 рабочих часов. Это явная программная ошибка, которая была официально признана разработчиками 1С (код ошибки 20172775).

Способ 1: Обновление конфигурации до актуального релиза

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

  1. Если вы используете ветку 3.1.23, вам необходимо обновиться до версии 3.1.23.458 или выше.
  2. Если ваша информационная база находится на ветке 3.1.24, корректное заполнение реализовано начиная с релиза 3.1.24.308.

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

Способ 2: Использование официальных патчей (исправлений)

Если по каким-то причинам оперативное обновление всей конфигурации невозможно (например, база сильно доработана или находится в процессе закрытия месяца), можно воспользоваться механизмом расширений. Фирма 1С для таких случаев выпускает микро-исправления, называемые патчами.

Для ошибки с заполнением графиков был выпущен патч с идентификатором EF_20172775. Проверим, установлен ли он у вас. Перейдите в раздел Администрирование — Обслуживание — Обновление программы — Установленные исправления (патчи). Если патча в списке нет, его можно загрузить автоматически (при наличии договора ИТС и настроенной интернет-поддержки) или скачать с портала техподдержки 1С и установить вручную.

Способ 3: Программная доработка (создание собственного расширения)

Проанализируем программный код, который отвечает за эту логику. Проблема локализована в модуле объекта справочника ГрафикиРаботыСотрудников, в процедуре ЗаполнитьДанныеГрафика. Разберем фрагмент кода, который приводит к ошибке:


Если СпособЗаполнения = Перечисления.СпособыЗаполненияГрафиковРаботыСотрудников.ПоНеделям Тогда
    Если ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Суббота Тогда
        ЧасовЗаДень = ЧасыПоДнямЦикла[6];
    ИначеЕсли ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Воскресенье Тогда
        ЧасовЗаДень = ЧасыПоДнямЦикла[7];
    ИначеЕсли ДатаПереноса <> '00010101' Тогда
        // ОШИБКА ЗДЕСЬ: программа берет часы дня, на который перенесли праздник
        ЧасовЗаДень = ЧасыПоДнямЦикла[ДеньНедели(ДатаПереноса)];    
    Иначе
        ЧасовЗаДень = ЧасыПоДнямЦикла[НомерДняЦикла];
    КонецЕсли;
КонецЕсли;

Для исправления ситуации нам нужно добавить условие, которое будет принудительно возвращать заполнение по циклу недели, если флаг УчитыватьПраздники выключен. Посмотрим на пример доработки, которую можно внедрить через расширение (используя аннотацию &После или &Вместо):


// В процедуре ЗаполнитьДанныеГрафика после основного расчета часов
Если НЕ УчитыватьПраздники Тогда
    // Игнорируем все переносы и берем часы строго по дню недели (номеру дня цикла)
    ЧасовЗаДень = ЧасыПоДнямЦикла[НомерДняЦикла];
КонецЕсли;

Этот код гарантирует, что если пользователь указал в настройках графика «не учитывать праздники», то программа не будет смотреть на поле ДатаПереноса производственного календаря, а просто возьмет значение для текущего дня недели (например, для воскресенья — 0 часов).

Способ 4: Ручная корректировка графика

Рассмотрим вариант, когда конфигуратор недоступен, а обновить программу нельзя «прямо сейчас». В этом случае остается только ручное вмешательство в таблицу графика. Посмотрим, как это сделать правильно:

  1. Откройте форму настройки графика работы.
  2. Нажмите кнопку «Заполнить».
  3. В появившемся календаре на текущий год найдите 1 и 8 января.
  4. Вручную исправьте 8 часов на 0.
  5. Обратите внимание на дни, на которые были перенесены праздники (в 2023 году это 24 февраля и 8 мая). Из-за той же ошибки система может поставить там 0 часов (выходной), хотя при снятой галке «Учитывать праздники» там должно быть 8 часов. Проверьте эти даты и при необходимости проставьте рабочие часы вручную.
  6. Нажмите «Записать и закрыть».

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

Последствия для учета

Выясним, на что влияет эта ошибка, если её оставить без внимания. Прежде всего, это искажение нормы рабочего времени за месяц и за год. Для сотрудников на суммированном учете это критично, так как норма времени для них определяется именно по их графику. Если в графике появятся лишние рабочие дни (1 и 8 января), норма будет завышена, что приведет к некорректному расчету переработок и оплаты праздничных дней.

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

← На главную