К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как в 1С определить выходной день

Как в 1С определить выходной день: функция ДеньНедели, производственный календарь, графики работы сотрудников. Примеры кода, проверка результата и частые ошибки.

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

Простейший вариант — функция встроенного языка ДеньНедели(), которая возвращает номер дня недели от 1 (понедельник) до 7 (воскресенье). Более корректный для бухгалтерских и кадровых задач способ — обращение к производственному календарю, где учтены праздники и переносы. Для сотрудников со сменными режимами используются графики работы. Ниже разберём каждый подход с примерами кода и типичными ошибками.

Определение выходного через функцию ДеньНедели

Функция ДеньНедели(<Дата>) — самый быстрый способ, не требующий ни запросов к базе, ни настроенных календарей. Она возвращает число от 1 до 7, где 1 — понедельник, 6 — суббота, 7 — воскресенье. Типовая проверка выходного выглядит так:

Функция ЭтоВыходной(ПроверяемаяДата) Экспорт

НомерДня = ДеньНедели(ПроверяемаяДата);

Возврат (НомерДня = 6 Или НомерДня = 7);

КонецФункции

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

Главное ограничение — функция ничего не знает о праздниках и переносах. 1 января, выпавшее на вторник, она посчитает рабочим днём, а рабочую субботу по переносу — выходным. Для кадрового учёта, расчёта зарплаты и юридически значимых сроков такой способ применять нельзя.

Проверка по производственному календарю

Производственный календарь в типовых конфигурациях (ЗУП, Бухгалтерия, ERP, УТ) хранится в регистре сведений ДанныеПроизводственногоКалендаря. В нём для каждой даты указан вид дня: рабочий, суббота, воскресенье, праздник, предпраздничный. Именно этот источник корректно отражает переносы выходных, утверждённые постановлениями.

Пример запроса, определяющего вид дня для конкретной даты:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ДанныеКалендаря.ВидДня КАК ВидДня

|ИЗ

| РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеКалендаря

|ГДЕ

| ДанныеКалендаря.Дата = &Дата

| И ДанныеКалендаря.ПроизводственныйКалендарь = &Календарь";

Запрос.УстановитьПараметр("Дата", ПроверяемаяДата);

Запрос.УстановитьПараметр("Календарь", ПроизводственныйКалендарь);

Если в запросе ВидДня равен перечислению «Суббота», «Воскресенье» или «Праздник» — день нерабочий. Обратите внимание: предпраздничный день формально рабочий, просто сокращённый на час, поэтому включать его в выходные обычно не нужно.

В конфигурациях с БСП (библиотека стандартных подсистем) есть готовые программные интерфейсы модуля КалендарныеГрафики, которые позволяют получать разность дат по календарю и проверять дни без написания запросов вручную. Перед разработкой проверьте, какие методы доступны в вашей версии конфигурации — это сэкономит время и снизит риск ошибок.

Учёт графиков работы сотрудников

Производственный календарь описывает общероссийскую норму, но сотрудник может работать по графику «два через два», по шестидневке или вахтой. Для него выходной определяется не календарём, а индивидуальным графиком работы. В ЗУП и ERP графики хранятся в справочнике «Графики работы сотрудников» (либо «Режимы работы» в зависимости от конфигурации), а фактические данные — в регистрах графиков.

Типовая логика такова: сначала определяется график, назначенный сотруднику на дату (через кадровые данные или регистр сведений о графиках), затем по регистру графика проверяется, есть ли на дату рабочие часы. Если часов ноль — для этого сотрудника день выходной, даже если по производственному календарю он рабочий.

Для нетиповых задач — например, проверки дежурств или смен в самописной учётной системе — рационально завести собственный регистр сведений «ГрафикиРаботы» с измерениями «Сотрудник» и «Дата» и ресурсом «Часов». Тогда проверка сводится к простому запросу: Часов = 0 означает выходной.

Маршрут решения

Как выбрать способ проверки

Нужна быстрая прикидка без учёта праздников (сдвиг даты, интерфейсная подсветка)Используйте ДеньНедели(Дата) >= 6
Расчёт сроков, оплат, кадровые документы по стандартной пятидневкеПроверяйте вид дня в производственном календаре
Сотрудник работает по сменному или индивидуальному графикуОпределяйте выходной по графику работы сотрудника, а не по календарю
Дата может быть за пределами заполненного календаряДобавьте обработку пустого результата и сообщение о необходимости заполнить календарь

Расчёт рабочих дней между датами

Частая прикладная задача — не просто определить выходной, а посчитать количество рабочих дней между двумя датами: для сроков доставки, оплаты по договору, исполнения заказа. Здесь цикл с проверкой каждого дня через ДеньНедели работает, но даёт неточность из-за праздников.

Корректный вариант — запрос к производственному календарю с группировкой:

"ВЫБРАТЬ

| КОЛИЧЕСТВО(ДанныеКалендаря.Дата) КАК РабочихДней

|ИЗ

| РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеКалендаря

|ГДЕ

| ДанныеКалендаря.Дата МЕЖДУ &Начало И &Конец

| И ДанныеКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)"

В БСП для этого есть функции вида КалендарныеГрафики.РазностьДатПоКалендарю(), принимающие календарь и две даты. Они учитывают и предпраздничные дни, и переносы, поэтому предпочтительнее ручных запросов.

Если нужно наоборот — прибавить N рабочих дней к дате, — логика аналогична: выбираются рабочие даты начиная со следующего дня, и берётся N-я по счёту. Такой приём используется при расчёте плановой даты отгрузки или крайнего срока платежа.

Настройка и заполнение производственного календаря

В типовых конфигурациях производственный календарь заполняется автоматически по кнопке «Заполнить по умолчанию» в справочнике «Производственные календари» (раздел «Администрирование» или «Настройка», зависит от конфигурации). Праздничные дни и переносы при этом подставляются из встроенного макета, который обновляется с релизами конфигурации.

Если организация работает в регионе с собственными праздниками или у компании особый режим, создаётся отдельный календарь, и дни в нём корректируются вручную. После изменения календаря необходимо обновить связанные графики работы — в типовых для этого есть команда заполнения графика по календарю.

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

Порядок действий при настройке проверки выходных
  1. 1
    Определите, что считать выходным в вашей задаче: суббота-воскресенье, нерабочий день по календарю или день по графику сотрудника
  2. 2
    Проверьте, что производственный календарь заполнен на весь нужный период
  3. 3
    Реализуйте проверку выбранным способом: ДеньНедели, запрос к календарю или обращение к графику
  4. 4
    Добавьте обработку случая, когда данных по дате нет
  5. 5
    Протестируйте на датах с переносами: рабочая суббота и праздничный будний день
  6. 6
    Убедитесь, что расчёт рабочих дней даёт ожидаемые значения на контрольном периоде

Типичные ошибки и их последствия

Самая распространённая ошибка — использование ДеньНедели в расчётах зарплаты и отпусков. Программа считает все субботы и воскресенья выходными, не зная о переносах, и норма рабочего времени расходится с данными учёта. Вторая частая проблема — отсутствие проверки заполненности календаря: запрос возвращает пустоту, код интерпретирует её как «рабочий день», и ошибка остаётся незамеченной до конца месяца.

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

Типичные ошибки
01
Проверка выходного только через ДеньНедели в зарплатных расчётах — не учитываются праздники и переносы
02
Отсутствие обработки пустого результата запроса к календарю — незаполненный период даёт неверный ответ без ошибки
03
Использование общего производственного календаря для сменных сотрудников вместо их графиков
04
Учёт предпраздничного дня как полного рабочего при расчёте часов
05
Забытое обновление календаря на новый период — расчёты за январь оказываются неверными

Проверка результата и контрольные точки

После внедрения любого способа определения выходных результат нужно проверить на контрольных датах. Возьмите день, который по производственному календарю является рабочей субботой из-за переноса, и праздничный будний день. Если функция на обеих датах даёт правильный ответ — логика работает корректно.

Дополнительно сверьте расчёт количества рабочих дней за месяц с данными типового отчёта «Табель» или с нормой времени из календаря. Совпадение цифр — признак того, что и календарь заполнен, и запрос построен верно.

Контрольные точки

Как проверить результат

Перенесённая рабочая суббота
Норма

Функция возвращает «рабочий день»

Тревожный признак

Определяется как выходной — используется только ДеньНедели

Праздничный будний день
Норма

Функция возвращает «нерабочий день»

Тревожный признак

Считается рабочим — календарь не заполнен или не используется

Дата за пределами заполненного календаря
Норма

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

Тревожный признак

Молча возвращается значение по умолчанию

Количество рабочих дней за месяц
Норма

Совпадает с нормой по производственному календарю

Тревожный признак

Расхождение на 1–2 дня — проверьте переносы и праздники

Частые вопросы

Чем отличается производственный календарь от графика работы сотрудника?

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

Что вернёт запрос к календарю, если период не заполнен?

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

Можно ли определить выходной без запроса к базе?

Да, функцией ДеньНедели(Дата): значения 6 и 7 соответствуют субботе и воскресенью. Но такой способ не учитывает праздники и переносы, поэтому подходит только для приблизительных расчётов и интерфейсных задач, не влияющих на учётные данные.

Как учесть предпраздничный день при расчёте рабочего времени?

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

Что делать, если в организации свой режим работы, отличающийся от общероссийского?

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

Итог

Что важно запомнить

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