Другое · 10 мин
Как определить рабочий день в 1С
Как в 1С определить рабочий день: производственный календарь, графики работы сотрудников, проверка даты в коде и типичные ошибки при расчёте рабочего времени.
Вопрос «рабочий ли это день» в 1С возникает в двух разных ситуациях: когда бухгалтер или кадровик проверяет конкретную дату по календарю, и когда разработчик пишет код, который должен автоматически определять рабочие и нерабочие дни — например, для расчёта сроков оплаты, доставки или начисления зарплаты. В обоих случаях ответ зависит от того, какой производственный календарь и какие графики работы заведены в базе.
Ключевой момент: в 1С понятие «рабочий день» не вычисляется из дня недели напрямую. Программа опирается на данные производственного календаря и графиков работы сотрудников, которые могут отличаться от стандартной пятидневки. Поэтому суббота может быть рабочим днём, а будний день — праздничным или перенесённым выходным.
Ниже разобраны оба сценария: проверка даты в интерфейсе типовых конфигураций (1С:ЗУП, 1С:Бухгалтерия, 1С:ERP) и программное определение рабочего дня через встроенный язык. Отдельно рассмотрены ситуации со сменными графиками, переносами праздников и типичные ошибки, из-за которых расчёт рабочих дней даёт неверный результат.
От чего зависит, считается ли день рабочим
В типовых конфигурациях 1С «рабочесть» конкретной даты складывается из двух уровней. Первый — производственный календарь, общий для страны или региона. В нём заданы выходные, праздничные и предпраздничные (сокращённые) дни, а также переносы, утверждённые постановлениями правительства. Второй уровень — график работы сотрудника или подразделения, который строится на основе календаря, но может его переопределять: сменные графики «два через два», «сутки через трое», шестидневка и другие.
Из этого следует практический вывод: один и тот же день может быть рабочим для одного сотрудника и выходным для другого. Например, при графике «2/2» сотрудник может работать в воскресенье, а в среду отдыхать. Поэтому вопрос «рабочий ли это день» всегда нужно уточнять: для кого или для чего — для всего предприятия в целом, для конкретного работника или для расчёта сроков по договору.
Как проверить дату в интерфейсе 1С
Самый простой способ — открыть производственный календарь и посмотреть, как помечена нужная дата. В 1С:ЗУП и 1С:ERP путь обычно такой: «Настройка» → «Производственные календари» (в некоторых версиях — «Администрирование» → «Производственные календари»). В 1С:Бухгалтерии календарь находится в разделе «Главное» → «Производственный календарь» или через «Все функции» → «Справочники».
В форме календаря дни подсвечены разными цветами: рабочие, выходные, праздничные и сокращённые предпраздничные дни визуально различаются. Наведите курсор или кликните на дату — программа покажет вид дня и, если день перенесён, основание переноса.
Если нужно понять, рабочий ли день у конкретного сотрудника, смотрите не календарь, а его график. В 1С:ЗУП это справочник «Графики работы сотрудников» («Настройка» → «Графики работы сотрудников»). Откройте график, к которому привязан сотрудник, — в нём видно, какие даты являются рабочими, и какова продолжительность каждой смены.
- 1Откройте «Настройка» → «Производственные календари» и выберите нужный календарь
- 2Найдите дату и посмотрите её вид: рабочий, выходной, праздничный, предпраздничный
- 3Если нужен день конкретного сотрудника — откройте «Графики работы сотрудников» и проверьте его график
- 4Сверьте, что календарь заполнен на нужный год — незаполненный период часто даёт неверный результат
Как определить рабочий день программно
Разработчику для проверки даты в коде нужно обратиться к данным производственного календаря. В конфигурациях на основе БСП (Библиотека стандартных подсистем) — это ЗУП, ERP, УТ, Бухгалтерия — данные хранятся в регистре сведений «ДанныеПроизводственногоКалендаря», а работу с ним обеспечивает общий модуль «КалендарныеГрафики».
Типовой подход — запрос к регистру: по дате и календарю получаем вид дня. Если вид дня «Рабочий» или «Предпраздничный» — день рабочий; «Суббота», «Воскресенье», «Праздник» — нерабочий. Для сдвига даты на N рабочих дней удобнее использовать готовые функции модуля «КалендарныеГрафики», которые принимают календарь, исходную дату и количество дней и возвращают результирующую дату.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Данные.ВидДня КАК ВидДня
|ИЗ
| РегистрСведений.ДанныеПроизводственногоКалендаря КАК Данные
|ГДЕ
| Данные.ПроизводственныйКалендарь = &Календарь
| И Данные.Дата = &Дата";
Запрос.УстановитьПараметр("Календарь", ПроизводственныйКалендарь);
Запрос.УстановитьПараметр("Дата", ПроверяемаяДата);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
РабочийДень = (Выборка.ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий)
Или (Выборка.ВидДня = Перечисления.ВидыДнейПроизводственногоКалендаря.Предпраздничный);
КонецЕсли;Обратите внимание: в коде нельзя просто проверять день недели через ДеньНедели(Дата). Такая проверка не учтёт праздники, переносы выходных и региональные календари. Например, день, выпавший на субботу из-за переноса, может быть рабочим, а будний день в новогодние каникулы — выходным.
Особенности для сменных и индивидуальных графиков
Производственный календарь описывает только «общую» сетку рабочего времени. Сменные графики в 1С строятся иначе: в настройках графика задаётся шаблон — цикл рабочих дней и дней отдыха (например, два рабочих дня по 11 часов, затем два выходных) и дата отсчёта цикла. В этом случае принадлежность даты к рабочим определяется не видом дня в календаре, а позицией даты в цикле графика.
Поэтому для сотрудников на сменных графиках проверять дату нужно по данным именно их графика. В ЗУП фактические и плановые рабочие дни видны в документах табеля и в отчётах по рабочему времени. Программно данные по графику сотрудника получают через механизмы учёта времени конкретной конфигурации — универсального запроса к календарю здесь недостаточно.
Заполнение и обновление календаря
Частая причина ошибок — незаполненный или устаревший производственный календарь. Если календарь не заполнен на нужный год, расчёты нормы времени, отпусков и сроков будут неверными. В типовых конфигурациях календарь заполняется автоматически по умолчанию (кнопка «Заполнить по умолчанию» в форме календаря) — программа расставит выходные по пятидневке и нерабочие праздничные дни, установленные Трудовым кодексом.
Переносы выходных дней, которые каждый год утверждаются постановлением, в базу попадают с обновлением конфигурации или через сервис автоматического обновления календарей. Если обновления не устанавливались, переносы нужно внести вручную: в форме календаря выбрать день и изменить его вид, указав дату-источник переноса.
Типичные ошибки и как их избежать
Первая и самая распространённая ошибка — определение рабочего дня по дню недели в коде или в формулах Excel вместо обращения к календарю. Вторая — использование «не того» календаря: в базе может быть несколько производственных календарей (федеральный и региональные), и графики сотрудников ссылаются на конкретный из них. Третья — забытые ручные правки: если кто-то вручную менял вид дня в календаре, а потом календарь перезаполнили «по умолчанию», ручные изменения могли затереться или, наоборот, остаться незамеченными.
Ещё одна проблемная зона — расчёт сроков в рабочих днях по договорам (оплата, доставка). Если в документах срок считается простым добавлением дней к дате, без учёта календаря, итоговая дата может попасть на выходной или праздник. Для таких расчётов используйте функции работы с календарными графиками, а не арифметику дат.
Как проверить правильность результата
После настройки или изменения календаря и графиков стоит выполнить контрольную проверку. Для интерфейсной проверки откройте календарь и сверьте несколько ключевых дат: новогодние каникулы, майские праздники, известные переносы. В ЗУП дополнительно сформируйте отчёт по норме рабочего времени или табель за месяц и сравните количество рабочих дней с официальным производственным календарём.
Для программного кода проверьте функцию на граничных датах: праздничный будний день, перенесённая рабочая суббота, обычный выходной, предпраздничный сокращённый день. Если на всех контрольных датах результат совпадает с календарём — логика работает верно.
Как проверить результат
Дни помечены как праздничные или выходные
Будние дни января показаны рабочими
Суббота помечена рабочим днём
Суббота осталась выходной
Совпадает с официальным производственным календарём
Расхождение в днях или часах
Итоговая дата — рабочий день
Срок попадает на выходной или праздник
Частые вопросы
Где в 1С:Бухгалтерии посмотреть производственный календарь?
Обычно через раздел «Главное» или через «Все функции» → «Справочники» → «Производственные календари». Если пункт не виден, проверьте права пользователя и включённость соответствующей функциональности в настройках программы.
Почему программа считает рабочий день выходным, хотя это обычный вторник?
Чаще всего причина в том, что день в календаре вручную помечен как нерабочий, либо календарь не обновлён и в нём устаревшие переносы. Откройте производственный календарь, найдите дату и проверьте её вид. Также убедитесь, что сотрудник привязан к правильному календарю и графику.
Как в коде прибавить к дате 10 рабочих дней?
Простое прибавление числа к дате не подходит — нужны функции работы с календарными графиками. В конфигурациях на БСП используйте методы общего модуля «КалендарныеГрафики», которые принимают календарь, исходную дату и количество рабочих дней и возвращают дату с учётом выходных и праздников.
Нужно ли заводить отдельный календарь для шестидневной недели?
Как правило, отдельный календарь не обязателен: достаточно создать график работы с шестью рабочими днями на основе общего производственного календаря. Отдельный календарь имеет смысл при региональных отличиях в праздничных днях.
Что делать, если переносы выходных не появились после обновления?
Проверьте, установлены ли актуальные обновления конфигурации и обновлён ли сервис календарей. Если автоматическое обновление недоступно, внесите переносы вручную в форме производственного календаря, изменив вид соответствующих дней.
Учитывается ли предпраздничный день как рабочий?
Да, предпраздничный день является рабочим, но его продолжительность сокращается на один час. При определении «рабочий/нерабочий» он относится к рабочим, а сокращение учитывается при расчёте нормы времени в часах.
Что важно запомнить
Рабочий день в 1С определяется производственным календарём и графиком сотрудника, а не днём недели. Дату проверяют в справочнике календарей или через регистр «ДанныеПроизводственногоКалендаря», а корректность расчётов зависит от своевременного заполнения календаря и учёта переносов праздников.