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

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

На какой день недели выпадает 31 декабря в ближайшие 10 лет: расчёт в 1С

Узнайте, на какой день недели выпадает 31 декабря в ближайшие 10 лет, и как рассчитать день недели любой даты в 1С с помощью функции ДеньНедели().

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

Ниже приведена готовая таблица на ближайшие десять лет, а также практические способы получить день недели любой даты встроенным языком 1С — через запрос, в модуле и в пользовательском режиме. Отдельно разобраны типичные ошибки с типом «Дата» и региональными настройками.

Таблица: день недели 31 декабря на 10 лет вперёд

Данные рассчитаны по григорианскому календарю, который используется в 1С и в производственных календарях России. Високосные годы в этом диапазоне — 2028 и 2032, поэтому смещение дня недели после них происходит на два дня вперёд, а не на один.

ГодДень недели 31 декабряОсобенность
2026ЧетвергОбычный год
2027ПятницаОбычный год
2028ВоскресеньеВисокосный год
2029ПонедельникОбычный год
2030ВторникОбычный год
2031СредаОбычный год
2032ПятницаВисокосный год
2033СубботаОбычный год
2034ВоскресеньеОбычный год
2035ПонедельникОбычный год

Обратите внимание: сама таблица показывает только календарный день недели. Является ли конкретное 31 декабря рабочим или выходным днём, определяет производственный календарь и постановления о переносе выходных. Например, суббота 31 декабря 2033 года может быть объявлена рабочим днём с переносом выходного на январь.

Как получить день недели даты в коде 1С

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

bsl
ДатаКонцаГода = Дата(2026, 12, 31);
НомерДня = ДеньНедели(ДатаКонцаГода); // 4 — четверг

НазванияДней = Новый Массив;
НазванияДней.Добавить("Понедельник");
НазванияДней.Добавить("Вторник");
НазванияДней.Добавить("Среда");
НазванияДней.Добавить("Четверг");
НазванияДней.Добавить("Пятница");
НазванияДней.Добавить("Суббота");
НазванияДней.Добавить("Воскресенье");

Сообщить(НазванияДней[НомерДня - 1]); // "Четверг"

Если нужно сразу получить строковое представление, используйте форматирование: Формат(ДатаКонцаГода, "ДФ=dddd") вернёт полное название дня недели с учётом региональных настроек, а "ДФ=ddd" — сокращённое. Это удобно для печатных форм и отчётов, где числовой код нечитаем.

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

Расчёт дня недели для 31 декабря на 10 лет вперёд одной процедурой

Если нужно сформировать таблицу на произвольный горизонт, достаточно цикла с функцией ДобавитьМесяц() или простым смещением года. Ниже — готовый фрагмент, который выводит день недели 31 декабря для каждого года начиная с текущего.

bsl
ТекущийГод = Год(ТекущаяДатаСеанса());

Для Смещение = 0 По 9 Цикл
    ГодРасчета = ТекущийГод + Смещение;
    Дата31 = Дата(ГодРасчета, 12, 31);
    Сообщить(СтрШаблон("31.12.%1 — %2",
        Формат(ГодРасчета, "ЧГ="),
        Формат(Дата31, "ДФ=dddd")));
КонецЦикла;

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

Как проверить расчёт вручную
  1. 1
    Откройте внешнюю обработку или консоль кода в режиме предприятия
  2. 2
    Вставьте фрагмент с циклом и выполните его
  3. 3
    Сверьте выведенные названия дней с таблицей из статьи
  4. 4
    Проверьте граничный случай — високосный год (2028 или 2032)

День недели в запросе 1С

В запросах нет прямого аналога функции ДеньНедели(), поэтому используют вычисляемое выражение через РАЗНОСТЬДАТ() от опорной даты с известным днём недели. Классический приём — отсчёт от понедельника 1 января 0001 года или от любой другой фиксированной даты с взятием остатка от деления на 7.

Альтернатива — функция ДЕНЬНЕДЕЛИ() в языке запросов доступна начиная с современных версий платформы: она возвращает тот же числовой код 1–7. Перед использованием убедитесь, что версия платформы поддерживает эту функцию, иначе запрос выдаст ошибку при выполнении.

Практический сценарий: выбрать все документы, проведённые в выходные, для контроля. В запросе добавляется условие ГДЕ ДЕНЬНЕДЕЛИ(Документ.Дата) В (6, 7). Это быстрее, чем выгружать данные и фильтровать их в коде, особенно на больших объёмах.

Как определить, рабочий ли это день по производственному календарю

В типовых конфигурациях (БП, ЗУП, ERP) графики работы хранятся в регистрах сведений, например «Данные производственного календаря» или «Графики работы сотрудников». Чтобы узнать статус 31 декабря конкретного года, делается запрос к этому регистру с отбором по дате и календарю.

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

Типичные ошибки при работе с датами и днями недели

Частая проблема — сравнение даты со временем. Значение Дата(2026,12,31) — это полночь, а дата документа содержит время. Сравнение «равно» не сработает; используйте НачалоДня() и КонецДня() для диапазонов.

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

Типичные ошибки
01
Сравнение даты документа с Дата(Год,12,31) без учёта времени — условие не срабатывает
02
Ожидание, что воскресенье = 1: в 1С воскресенье = 7, понедельник = 1
03
Определение выходного только по дню недели без учёта переносов праздников
04
Использование ДЕНЬНЕДЕЛИ() в запросе на старой платформе, где функция недоступна

Где это применяется на практике

Знание дня недели 31 декабря нужно при планировании закрытия года: инвентаризаций, сверок, последних платежей поставщикам. Если 31 декабря выпадает на выходной (как в 2028, 2033 и 2034 годах), банковские операции последнего дня года фактически смещаются на предыдущий рабочий день, и это нужно учитывать в платёжном календаре.

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

Итог

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

День недели любой даты в 1С возвращает функция ДеньНедели() (1 — понедельник, 7 — воскресенье). 31 декабря в 2026–2035 годах выпадает на дни от четверга до понедельника по таблице выше. Статус «рабочий/выходной» проверяйте по производственному календарю, а не по номеру дня.

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

Что возвращает функция ДеньНедели() в 1С?

Число от 1 до 7, где 1 — понедельник, 7 — воскресенье. Функция принимает значение типа «Дата» и работает как на клиенте, так и на сервере без обращения к базе данных.

Как получить название дня недели строкой, а не числом?

Используйте Формат(Дата, "ДФ=dddd") для полного названия («четверг») или "ДФ=ddd" для сокращённого. Результат зависит от региональных настроек сеанса.

31 декабря выпало на выходной — значит ли это, что день нерабочий?

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

Почему запрос с ДЕНЬНЕДЕЛИ() выдаёт ошибку?

Функция ДЕНЬНЕДЕЛИ в языке запросов появилась не в первых версиях платформы. На старых релизах используйте вычисление через РАЗНОСТЬДАТ от опорной даты или выполняйте фильтрацию в коде после выборки.

Как учесть время при сравнении с 31 декабря?

Дата документа содержит время, поэтому сравнивайте через диапазон: ДатаДокумента >= НачалоДня(Дата(Год,12,31)) и ДатаДокумента <= КонецДня(Дата(Год,12,31)).