Разработка и Конфигурация · 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 — воскресенье. Функция доступна и на клиенте, и на сервере, не требует обращения к базе данных.
ДатаКонцаГода = Дата(2026, 12, 31);
НомерДня = ДеньНедели(ДатаКонцаГода); // 4 — четверг
НазванияДней = Новый Массив;
НазванияДней.Добавить("Понедельник");
НазванияДней.Добавить("Вторник");
НазванияДней.Добавить("Среда");
НазванияДней.Добавить("Четверг");
НазванияДней.Добавить("Пятница");
НазванияДней.Добавить("Суббота");
НазванияДней.Добавить("Воскресенье");
Сообщить(НазванияДней[НомерДня - 1]); // "Четверг"Если нужно сразу получить строковое представление, используйте форматирование: Формат(ДатаКонцаГода, "ДФ=dddd") вернёт полное название дня недели с учётом региональных настроек, а "ДФ=ddd" — сокращённое. Это удобно для печатных форм и отчётов, где числовой код нечитаем.
Для проверки «рабочий это день или выходной» по календарю, а не по номеру дня, сравнивайте результат ДеньНедели() с 6 и 7 — так определяются суббота и воскресенье. Но помните об ограничении: переносы праздничных дней этот метод не учитывает.
Расчёт дня недели для 31 декабря на 10 лет вперёд одной процедурой
Если нужно сформировать таблицу на произвольный горизонт, достаточно цикла с функцией ДобавитьМесяц() или простым смещением года. Ниже — готовый фрагмент, который выводит день недели 31 декабря для каждого года начиная с текущего.
ТекущийГод = Год(ТекущаяДатаСеанса());
Для Смещение = 0 По 9 Цикл
ГодРасчета = ТекущийГод + Смещение;
Дата31 = Дата(ГодРасчета, 12, 31);
Сообщить(СтрШаблон("31.12.%1 — %2",
Формат(ГодРасчета, "ЧГ="),
Формат(Дата31, "ДФ=dddd")));
КонецЦикла;Такой код можно выполнить во внешней обработке, в консоли кода или в фоновом задании. Результат не зависит от данных информационной базы, поэтому его безопасно запускать в любой копии и даже в пустой конфигурации.
- 1Откройте внешнюю обработку или консоль кода в режиме предприятия
- 2Вставьте фрагмент с циклом и выполните его
- 3Сверьте выведенные названия дней с таблицей из статьи
- 4Проверьте граничный случай — високосный год (2028 или 2032)
День недели в запросе 1С
В запросах нет прямого аналога функции ДеньНедели(), поэтому используют вычисляемое выражение через РАЗНОСТЬДАТ() от опорной даты с известным днём недели. Классический приём — отсчёт от понедельника 1 января 0001 года или от любой другой фиксированной даты с взятием остатка от деления на 7.
Альтернатива — функция ДЕНЬНЕДЕЛИ() в языке запросов доступна начиная с современных версий платформы: она возвращает тот же числовой код 1–7. Перед использованием убедитесь, что версия платформы поддерживает эту функцию, иначе запрос выдаст ошибку при выполнении.
Практический сценарий: выбрать все документы, проведённые в выходные, для контроля. В запросе добавляется условие ГДЕ ДЕНЬНЕДЕЛИ(Документ.Дата) В (6, 7). Это быстрее, чем выгружать данные и фильтровать их в коде, особенно на больших объёмах.
Как определить, рабочий ли это день по производственному календарю
В типовых конфигурациях (БП, ЗУП, ERP) графики работы хранятся в регистрах сведений, например «Данные производственного календаря» или «Графики работы сотрудников». Чтобы узнать статус 31 декабря конкретного года, делается запрос к этому регистру с отбором по дате и календарю.
Если производственный календарь не заполнен на нужный год, запрос вернёт пустой результат — это типичная причина ошибок в расчёте отпусков и больничных на стыке лет. Перед плановыми расчётами декабря проверяйте, что календарь заполнен минимум до конца следующего года.
Типичные ошибки при работе с датами и днями недели
Частая проблема — сравнение даты со временем. Значение Дата(2026,12,31) — это полночь, а дата документа содержит время. Сравнение «равно» не сработает; используйте НачалоДня() и КонецДня() для диапазонов.
Вторая ошибка — ожидание, что ДеньНедели() вернёт воскресенье первым днём. В 1С неделя начинается с понедельника (1), и перенос логики из систем, где воскресенье равно 1 или 0, приводит к смещению всех результатов на день.
Где это применяется на практике
Знание дня недели 31 декабря нужно при планировании закрытия года: инвентаризаций, сверок, последних платежей поставщикам. Если 31 декабря выпадает на выходной (как в 2028, 2033 и 2034 годах), банковские операции последнего дня года фактически смещаются на предыдущий рабочий день, и это нужно учитывать в платёжном календаре.
В кадровом учёте от дня недели зависят графики сменности и расчёт новогодних «каникул» для сменных графиков. В разработке — автоматические напоминания, регламентные задания, которые не должны запускаться в выходные, и отчёты с группировкой по дням недели.
Что важно запомнить
День недели любой даты в 1С возвращает функция ДеньНедели() (1 — понедельник, 7 — воскресенье). 31 декабря в 2026–2035 годах выпадает на дни от четверга до понедельника по таблице выше. Статус «рабочий/выходной» проверяйте по производственному календарю, а не по номеру дня.
Частые вопросы
Что возвращает функция ДеньНедели() в 1С?
Число от 1 до 7, где 1 — понедельник, 7 — воскресенье. Функция принимает значение типа «Дата» и работает как на клиенте, так и на сервере без обращения к базе данных.
Как получить название дня недели строкой, а не числом?
Используйте Формат(Дата, "ДФ=dddd") для полного названия («четверг») или "ДФ=ddd" для сокращённого. Результат зависит от региональных настроек сеанса.
31 декабря выпало на выходной — значит ли это, что день нерабочий?
Не обязательно. Постановления о переносе выходных могут сделать выходной день рабочим и наоборот. Точный статус смотрите в производственном календаре вашей конфигурации.
Почему запрос с ДЕНЬНЕДЕЛИ() выдаёт ошибку?
Функция ДЕНЬНЕДЕЛИ в языке запросов появилась не в первых версиях платформы. На старых релизах используйте вычисление через РАЗНОСТЬДАТ от опорной даты или выполняйте фильтрацию в коде после выборки.
Как учесть время при сравнении с 31 декабря?
Дата документа содержит время, поэтому сравнивайте через диапазон: ДатаДокумента >= НачалоДня(Дата(Год,12,31)) и ДатаДокумента <= КонецДня(Дата(Год,12,31)).