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

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

Как узнать день недели в 1С

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

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

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

Функция ДеньНедели: синтаксис и результат

Функция вызывается с одним параметром — значением типа «Дата». Синтаксис:

Результат = ДеньНедели(НекаяДата);

Возвращаемое значение — целое число в диапазоне от 1 до 7. Нумерация начинается с понедельника: понедельник — 1, вторник — 2, среда — 3, четверг — 4, пятница — 5, суббота — 6, воскресенье — 7. Такая нумерация соответствует стандарту ISO 8601 и привычному для российского пользователя порядку.

Пример проверки в коде:

Если ДеньНедели(ТекущаяДата()) = 6 Тогда

Сообщить("Сегодня суббота");

КонецЕсли;

Обратите внимание: функция работает только с типом «Дата». Если передать строку или число, платформа выдаст ошибку преобразования типов. Перед вызовом убедитесь, что переменная содержит именно дату, либо выполните явное преобразование.

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

Числовое значение удобно для сравнений, но для вывода пользователю часто нужно словесное обозначение: «понедельник», «вторник» и так далее. Самый простой способ — функция Формат() с форматной строкой:

НазваниеДня = Формат(ТекущаяДата(), "ДФ=dddd");

Форматная строка ДФ=dddd возвращает полное название дня недели на языке, заданном в региональных настройках сеанса. Сокращённый вариант — ДФ=ddd — вернёт «Пн», «Вт» и т.д.

Альтернатива — собственное сопоставление числа и названия через конструкцию «Если…ИначеЕсли» или соответствие. Это оправдано, когда нужны нестандартные подписи (например, с большой буквы вне зависимости от настроек) или когда результат должен быть независим от языка сеанса:

НомераДней = Новый Соответствие;

НомераДней.Вставить(1, "Понедельник");

НомераДней.Вставить(2, "Вторник");

// и так далее

НазваниеДня = НомераДней[ДеньНедели(НекаяДата)];

Определение дня недели в запросе

Когда данные нужно отобрать или сгруппировать по дню недели на уровне запроса, используется функция языка запросов ДЕНЬНЕДЕЛИ(). Она работает аналогично встроенной функции и возвращает число от 1 до 7:

ВЫБРАТЬ

ДЕНЬНЕДЕЛИ(Продажи.Дата) КАК НомерДня,

СУММА(Продажи.Сумма) КАК Сумма

ИЗ

Документ.РеализацияТоваровУслуг КАК Продажи

СГРУППИРОВАТЬ ПО

ДЕНЬНЕДЕЛИ(Продажи.Дата)

Такой запрос позволяет построить аналитику продаж по дням недели без постобработки в коде. Функцию можно использовать и в условии ГДЕ — например, отобрать только документы, созданные в выходные:

ГДЕ

ДЕНЬНЕДЕЛИ(Продажи.Дата) В (6, 7)

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

Проверка на выходной день

Частая практическая задача — определить, попадает ли дата на выходной. Простейшая проверка через ДеньНедели учитывает только субботу и воскресенье:

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

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

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

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

Однако этот подход не учитывает праздничные дни и переносы выходных, которые ежегодно устанавливаются производственным календарём. Для расчётов, связанных с зарплатой, кадрами и сроками оплаты, полагаться только на ДеньНедели нельзя.

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

Практические сценарии использования

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

Задача: прибавить к дате N рабочих дней. Без производственного календаря базовый вариант выглядит так — в цикле прибавляем по одному дню и пропускаем субботу с воскресеньем:

Функция ПрибавитьРабочиеДни(НачальнаяДата, КоличествоДней)

Результат = НачальнаяДата;

Добавлено = 0;

Пока Добавлено < КоличествоДней Цикл

Результат = Результат + 86400; // один день в секундах

Если ДеньНедели(Результат) < 6 Тогда

Добавлено = Добавлено + 1;

КонецЕсли;

КонецЦикла;

Возврат Результат;

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

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

Вывод дня недели в печатной форме

В макетах печатных форм день недели обычно выводят рядом с датой документа. Достаточно в параметр макета передать отформатированную строку:

Параметры.ДатаСДнемНедели = Формат(Шапка.Дата, "ДЛФ=D") 

+ " (" + Формат(Шапка.Дата, "ДФ=dddd") + ")";

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

Если регламентное задание должно выполняться только в определённые дни недели, это настраивается в расписании задания через консоль заданий или программно — объект РасписаниеРегламентногоЗадания имеет свойство для дней недели. Проверка ДеньНедели внутри тела задания нужна только для дополнительной логики, не покрываемой расписанием.

Порядок действий
  1. 1
    Определите, где нужен день недели: в коде, в запросе или в печатной форме
  2. 2
    В коде используйте ДеньНедели(Дата) для числа или Формат(Дата, "ДФ=dddd") для названия
  3. 3
    В запросе примените ДЕНЬНЕДЕЛИ(ПолеДаты)
  4. 4
    Для расчётов с выходными подключите производственный календарь
  5. 5
    Проверьте результат на граничных датах: понедельник и воскресенье

Типичные ошибки и ограничения

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

Вторая ошибка — передача в функцию пустой даты или значения другого типа. ДеньНедели('00010101') вернёт корректное число для минимальной даты, но логически такой результат обычно бессмыслен. Перед вызовом проверяйте заполненность даты через ЗначениеЗаполнено().

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

Типичные ошибки
01
Считать, что 1 — это воскресенье: в 1С нумерация начинается с понедельника, сравнение даст сбой на один день
02
Вызывать ДеньНедели для строки или незаполненной даты — ошибка типов или бессмысленный результат
03
Использовать проверку на субботу/воскресенье вместо производственного календаря в расчётах зарплаты и сроков
04
Ожидать от Формат() русское название при английском языке сеанса — результат зависит от локали
Контрольные точки

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

Номер дня для известной даты
Норма

Понедельник возвращает 1, воскресенье — 7

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

Смещение на единицу — проверьте логику сравнения

Название дня через Формат()
Норма

Название на языке сеанса, совпадает с календарём

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

Название на другом языке — проверьте локаль сеанса

Расчёт выходных
Норма

Суббота и воскресенье определяются как 6 и 7

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

Праздничный будний день считается рабочим — нужен производственный календарь

Часто задаваемые вопросы

Какой день недели считается первым в 1С?

Понедельник. Функция ДеньНедели возвращает 1 для понедельника и 7 для воскресенья. Это соответствует стандарту ISO 8601 и отличается от некоторых других систем, где первым днём считается воскресенье.

Как получить день недели в запросе 1С?

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

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

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

Как вывести название дня недели на русском независимо от настроек сеанса?

Создайте соответствие, где ключи — числа от 1 до 7, а значения — русские названия дней, и получайте название по результату ДеньНедели(Дата). Форматная строка Формат(Дата, "ДФ=dddd") зависит от языка сеанса и может вернуть название на другом языке.

Работает ли ДеньНедели с датой без времени и с датой-временем?

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

Итог

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

Функция ДеньНедели(Дата) возвращает число от 1 (понедельник) до 7 (воскресенье). Название дня получают через Формат(Дата, "ДФ=dddd") или собственное соответствие. В запросах используется ДЕНЬНЕДЕЛИ(). Для расчётов с праздниками и переносами применяйте производственный календарь, а не простую проверку на субботу и воскресенье.