При настройке графиков работы в программе 1С:Зарплата и Управление Персоналом 3.1 пользователи часто сталкиваются с ситуацией, когда система игнорирует заданные настройки выходных дней. Типичный пример: в графике установлена пятидневная рабочая неделя (ПН–ПТ), а флаг «При заполнении учитывать праздничные дни» снят. Казалось бы, программа должна жестко ставить 8 часов с понедельника по пятницу и 0 часов в субботу и воскресенье. Однако при заполнении календаря на 2023 год (или аналогичные периоды с переносами) на 1 и 8 января, которые являются воскресеньями, система упорно ставит рабочие часы.
В этой статье мы подробно разберем, почему возникает такая коллизия, проанализируем внутреннюю логику программного кода и рассмотрим несколько способов решения проблемы: от простого обновления до программной правки через расширение.
Рассмотрим ситуацию с точки зрения производственного календаря. В 2023 году Постановлением Правительства РФ были утверждены переносы выходных дней: с воскресенья 1 января на пятницу 24 февраля и с воскресенья 8 января на понедельник 8 мая. Когда мы настраиваем график «по неделям» без учета праздников, мы ожидаем, что программа будет смотреть только на день недели. Воскресенье всегда должно быть выходным.
Однако в коде конфигурации (особенно в релизах ветки 3.1.23) алгоритм работает иначе. Программа анализирует каждый день через производственный календарь. Выясним причину: система видит, что 1 января — это не просто воскресенье, а день, с которого осуществлен перенос. В логике конфигурации заложено, что если день перенесен, то его свойства (количество рабочих часов) заимствуются из того дня, на который был сделан перенос.
Поскольку 1 января перенесено на 24 февраля (пятницу), алгоритм ошибочно полагает, что в это воскресенье нужно поставить столько же часов, сколько обычно стоит в пятницу по графику. Так в графике на 1 января появляется 8 рабочих часов. Это явная программная ошибка, которая была официально признана разработчиками 1С (код ошибки 20172775).
Самый правильный и безопасный метод решения любой системной ошибки — обновление программы. Разработчики оперативно исправили данную проблему в последующих версиях. Рассмотрим, какие релизы содержат исправление:
3.1.23.458 или выше.3.1.24.308.После обновления конфигурации необходимо зайти в справочник ГрафикиРаботыСотрудников, открыть проблемный график и нажать кнопку «Заполнить». Программа пересчитает данные за год с учетом исправленного алгоритма, и праздничные дни, выпадающие на воскресенье, станут выходными, как и положено по циклу недели.
Если по каким-то причинам оперативное обновление всей конфигурации невозможно (например, база сильно доработана или находится в процессе закрытия месяца), можно воспользоваться механизмом расширений. Фирма 1С для таких случаев выпускает микро-исправления, называемые патчами.
Для ошибки с заполнением графиков был выпущен патч с идентификатором EF_20172775. Проверим, установлен ли он у вас. Перейдите в раздел Администрирование — Обслуживание — Обновление программы — Установленные исправления (патчи). Если патча в списке нет, его можно загрузить автоматически (при наличии договора ИТС и настроенной интернет-поддержки) или скачать с портала техподдержки 1С и установить вручную.
Проанализируем программный код, который отвечает за эту логику. Проблема локализована в модуле объекта справочника ГрафикиРаботыСотрудников, в процедуре ЗаполнитьДанныеГрафика. Разберем фрагмент кода, который приводит к ошибке:
Если СпособЗаполнения = Перечисления.СпособыЗаполненияГрафиковРаботыСотрудников.ПоНеделям Тогда
Если ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Суббота Тогда
ЧасовЗаДень = ЧасыПоДнямЦикла[6];
ИначеЕсли ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Воскресенье Тогда
ЧасовЗаДень = ЧасыПоДнямЦикла[7];
ИначеЕсли ДатаПереноса <> '00010101' Тогда
// ОШИБКА ЗДЕСЬ: программа берет часы дня, на который перенесли праздник
ЧасовЗаДень = ЧасыПоДнямЦикла[ДеньНедели(ДатаПереноса)];
Иначе
ЧасовЗаДень = ЧасыПоДнямЦикла[НомерДняЦикла];
КонецЕсли;
КонецЕсли;
Для исправления ситуации нам нужно добавить условие, которое будет принудительно возвращать заполнение по циклу недели, если флаг УчитыватьПраздники выключен. Посмотрим на пример доработки, которую можно внедрить через расширение (используя аннотацию &После или &Вместо):
// В процедуре ЗаполнитьДанныеГрафика после основного расчета часов
Если НЕ УчитыватьПраздники Тогда
// Игнорируем все переносы и берем часы строго по дню недели (номеру дня цикла)
ЧасовЗаДень = ЧасыПоДнямЦикла[НомерДняЦикла];
КонецЕсли;
Этот код гарантирует, что если пользователь указал в настройках графика «не учитывать праздники», то программа не будет смотреть на поле ДатаПереноса производственного календаря, а просто возьмет значение для текущего дня недели (например, для воскресенья — 0 часов).
Рассмотрим вариант, когда конфигуратор недоступен, а обновить программу нельзя «прямо сейчас». В этом случае остается только ручное вмешательство в таблицу графика. Посмотрим, как это сделать правильно:
Важно: помните, что при любом случайном нажатии на кнопку «Заполнить» в будущем, ваши ручные правки будут затерты ошибочными данными системы. Поэтому программное решение или обновление всегда предпочтительнее.
Выясним, на что влияет эта ошибка, если её оставить без внимания. Прежде всего, это искажение нормы рабочего времени за месяц и за год. Для сотрудников на суммированном учете это критично, так как норма времени для них определяется именно по их графику. Если в графике появятся лишние рабочие дни (1 и 8 января), норма будет завышена, что приведет к некорректному расчету переработок и оплаты праздничных дней.
Также это может повлиять на автоматическое заполнение документов Табель и расчет среднего заработка для отпусков и больничных в будущем. Поэтому мы настоятельно рекомендуем проверить ваши графики на 2023 и последующие годы, особенно если в них используется режим «без учета праздничных дней».