Разработка и Конфигурация · 8 мин
Как в 1С получить день недели из даты
Как в 1С получить день недели из даты: функция ДеньНедели, форматная строка, название дня на русском языке, примеры кода и типичные ошибки разработчика.
Задача определить день недели по дате возникает в 1С постоянно: при расчёте графиков работы, проверке попадания даты на выходные, формировании отчётов по дням недели и настройке расписаний обменов. Встроенный язык платформы предоставляет для этого несколько инструментов — от простой функции до гибкого форматирования.
Выбор способа зависит от того, что нужно получить: числовой номер дня для логики программы, текстовое название для вывода пользователю или признак выходного дня. Ниже разобраны все рабочие варианты с готовыми примерами кода, которые можно переносить в конфигурацию без доработки.
Функция ДеньНедели — базовый способ
Основной инструмент — встроенная функция ДеньНедели(<Дата>). Она принимает значение типа Дата и возвращает целое число от 1 до 7, где 1 — понедельник, а 7 — воскресенье. Нумерация соответствует стандарту ISO 8601, что важно учитывать при обмене данными с внешними системами.
Пример использования:
ТекущаяДата = ТекущаяДатаСеанса();
НомерДня = ДеньНедели(ТекущаяДата); // например, 3 для среды
Если НомерДня >= 6 Тогда
Сообщить("Сегодня выходной день");
КонецЕсли;
Функция работает одинаково в тонком, толстом и веб-клиенте, а также на сервере. Она доступна во всех версиях платформы 1С:Предприятие 8 и не требует подключения общих модулей.
Как получить название дня недели текстом
Через функцию Формат
Для вывода названия дня пользователю удобнее функция Формат() с форматной строкой. Параметр ДФ=dddd возвращает полное название дня, а ДФ=ddd — сокращённое:
Дата = ТекущаяДатаСеанса();
ПолноеНазвание = Формат(Дата, "ДФ=dddd"); // "среда"
КраткоеНазвание = Формат(Дата, "ДФ=ddd"); // "ср"
Язык вывода зависит от региональных настроек сеанса. Если требуется фиксированный язык независимо от настроек пользователя, укажите его явно через параметр локализации: Формат(Дата, "ДФ=dddd; Л=ru_RU").
Через собственную функцию
Когда форматная строка недоступна (например, внутри выражения запроса или при особых требованиях к регистру букв), название получают сопоставлением номера дня:
Функция НазваниеДняНедели(Дата) Экспорт
Номера = Новый Соответствие;
Номера.Вставить(1, "Понедельник");
Номера.Вставить(2, "Вторник");
Номера.Вставить(3, "Среда");
Номера.Вставить(4, "Четверг");
Номера.Вставить(5, "Пятница");
Номера.Вставить(6, "Суббота");
Номера.Вставить(7, "Воскресенье");
Возврат Номера[ДеньНедели(Дата)];
КонецФункции
Такой подход даёт полный контроль над регистром и написанием, но требует поддержки кода при изменении требований.
День недели в запросе 1С
В языке запросов функции ДеньНедели нет. Для выборки по дням недели используют функцию ДЕНЬНЕДЕЛИ(<Дата>) — она доступна в запросах и возвращает тот же числовой номер от 1 до 7:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДЕНЬНЕДЕЛИ(Продажи.Период) КАК НомерДня,
| СУММА(Продажи.СуммаОборот) КАК Сумма
|ИЗ
| РегистрНакопления.Продажи.Обороты КАК Продажи
|СГРУППИРОВАТЬ ПО
| ДЕНЬНЕДЕЛИ(Продажи.Период)";
Функцию ДЕНЬНЕДЕЛИ можно применять и в условии ГДЕ, например чтобы отобрать только будние дни: ГДЕ ДЕНЬНЕДЕЛИ(Период) <= 5. Это удобно для аналитики продаж по будням и выходным.
Учтите: текстовое название дня в запросе получить нельзя — его формируют уже при выводе результата, например в схеме компоновки данных через вычисляемое поле или формат.
Проверка на выходной день
Числовой номер дня позволяет легко определить выходной: суббота и воскресенье — это значения 6 и 7. Простейшая проверка выглядит так:
Функция ЭтоВыходной(Дата) Экспорт
Возврат ДеньНедели(Дата) >= 6;
КонецФункции
Однако такая проверка учитывает только календарные выходные. Производственный календарь с переносами праздничных дней она не учитывает. Если в конфигурации ведётся регистр сведений «РегламентированныйПроизводственныйКалендарь» (в типовых решениях) или справочник «ПроизводственныеКалендари», вид дня корректнее брать оттуда — иначе расчёт зарплаты, отпусков или графиков даст ошибку на праздниках.
Практические сценарии использования
Перенос даты на ближайший рабочий день
Типовая задача — если дата попадает на выходные, сдвинуть её на понедельник. Реализация через ДеньНедели:
Функция БлижайшийРабочийДень(Дата) Экспорт
НомерДня = ДеньНедели(Дата);
Если НомерДня = 6 Тогда
Возврат Дата + 2 * 86400; // суббота -> понедельник
ИначеЕсли НомерДня = 7 Тогда
Возврат Дата + 86400; // воскресенье -> понедельник
КонецЕсли;
Возврат Дата;
КонецФункции
Число 86400 — количество секунд в сутках; даты в 1С складываются именно в секундах.
День недели в печатной форме
В макетах и печатных формах название дня выводят через форматную строку прямо в параметре области: Область.Параметры.ДеньНедели = Формат(ДатаДокумента, "ДФ=dddd"). Если нужна дата вида «понедельник, 12 марта», используйте составную строку: ДФ="dddd, d MMMM".
- 1Определите, что нужно: число для логики или текст для вывода
- 2Для числа вызовите ДеньНедели(Дата), для текста — Формат(Дата, "ДФ=dddd")
- 3В запросе замените вызов на ДЕНЬНЕДЕЛИ(ПолеДаты)
- 4Если важны праздники — сверьтесь с производственным календарём
- 5Проверьте результат на известных датах: понедельник должен давать 1, воскресенье — 7
Проверка результата и границы применения
Простейший способ убедиться в корректности — вывести значение для заведомо известной даты. Например, 1 января 2026 года — понедельник, поэтому ДеньНедели('20260101') обязан вернуть 1. Проверяйте и граничный случай: воскресенье должно давать 7, а не 0, как в некоторых других языках программирования.
Ограничения, о которых стоит помнить: функция работает только с типом Дата — при передаче строки или числа возникнет ошибка. Пустая дата (01.01.0001) вернёт 1, что формально корректно, но обычно означает незаполненное значение; такие случаи обрабатывайте отдельной проверкой ЗначениеЗаполнено(Дата).
Как проверить результат
Возвращает 1 (понедельник)
Возвращает 0, 2 или ошибку типа
Название дня на языке сеанса
Пустая строка или название на другом языке
Запрос выполняется, номера от 1 до 7
Ошибка «Поле не найдено» или синтаксиса
Частые вопросы
Можно ли получить день недели от строки с датой?
Напрямую нет — строку сначала преобразуют в тип Дата функцией Дата() или через XMLЗначение, и только потом применяют ДеньНедели. Передача строки вызовет ошибку несоответствия типов.
Почему воскресенье — это 7, а не 0?
Платформа 1С следует стандарту ISO 8601, где неделя начинается с понедельника. Ноль для воскресенья используется, например, в JavaScript — при интеграции с внешними системами это расхождение нужно учитывать и при необходимости пересчитывать.
Как вывести день недели в СКД?
В схеме компоновки данных добавьте вычисляемое поле с выражением ДеньНедели(ПолеДаты) — оно вернёт номер. Для текстового названия задайте полю формат ДФ=dddd на закладке настроек или используйте выражение представления.
Учитывает ли ДеньНедели часовой пояс?
Функция работает с переданным значением даты как есть и сама ничего не пересчитывает. Разница возникает на этапе получения даты: ТекущаяДатаСеанса() учитывает часовой пояс сеанса, а ТекущаяДата() на клиенте — локальное время рабочей станции.
Как определить день недели в запросе к табличной части?
Функция ДЕНЬНЕДЕЛИ применима к любому полю типа Дата в запросе, включая поля табличных частей: ДЕНЬНЕДЕЛИ(Док.Товары.ДатаПоставки). Ограничений по источнику поля нет.
Чем отличается ДеньНедели от НеделяГода?
ДеньНедели возвращает порядковый номер дня внутри недели (1–7), а НеделяГода — номер недели в году (1–53). Это разные функции для разных задач, подменять одну другой нельзя.
Что важно запомнить
Номер дня недели даёт ДеньНедели(Дата) — 1 это понедельник, 7 воскресенье. Текстовое название получают через Формат с ДФ=dddd, в запросах используется ДЕНЬНЕДЕЛИ. Для учёта праздников применяйте производственный календарь, а не простую проверку на выходные.