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

Разработка и Конфигурация · 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. Это удобно для аналитики продаж по будням и выходным.

Учтите: текстовое название дня в запросе получить нельзя — его формируют уже при выводе результата, например в схеме компоновки данных через вычисляемое поле или формат.

Типичные ошибки
01
Попытка вызвать ДеньНедели в тексте запроса — в запросах используется ДЕНЬНЕДЕЛИ, иначе будет ошибка компиляции
02
Сравнение результата Формат() с текстом без учёта регистра и локали — сравнение ломается при смене языка сеанса
03
Использование ТекущаяДата() на клиенте вместо ТекущаяДатаСеанса() — даты разойдутся при разнице часовых поясов клиента и сервера

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

Числовой номер дня позволяет легко определить выходной: суббота и воскресенье — это значения 6 и 7. Простейшая проверка выглядит так:

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

Возврат ДеньНедели(Дата) >= 6;

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

Однако такая проверка учитывает только календарные выходные. Производственный календарь с переносами праздничных дней она не учитывает. Если в конфигурации ведётся регистр сведений «РегламентированныйПроизводственныйКалендарь» (в типовых решениях) или справочник «ПроизводственныеКалендари», вид дня корректнее брать оттуда — иначе расчёт зарплаты, отпусков или графиков даст ошибку на праздниках.

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

Перенос даты на ближайший рабочий день

Типовая задача — если дата попадает на выходные, сдвинуть её на понедельник. Реализация через ДеньНедели:

Функция БлижайшийРабочийДень(Дата) Экспорт

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

Если НомерДня = 6 Тогда

Возврат Дата + 2 * 86400; // суббота -> понедельник

ИначеЕсли НомерДня = 7 Тогда

Возврат Дата + 86400; // воскресенье -> понедельник

КонецЕсли;

Возврат Дата;

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

Число 86400 — количество секунд в сутках; даты в 1С складываются именно в секундах.

День недели в печатной форме

В макетах и печатных формах название дня выводят через форматную строку прямо в параметре области: Область.Параметры.ДеньНедели = Формат(ДатаДокумента, "ДФ=dddd"). Если нужна дата вида «понедельник, 12 марта», используйте составную строку: ДФ="dddd, d MMMM".

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

Проверка результата и границы применения

Простейший способ убедиться в корректности — вывести значение для заведомо известной даты. Например, 1 января 2026 года — понедельник, поэтому ДеньНедели('20260101') обязан вернуть 1. Проверяйте и граничный случай: воскресенье должно давать 7, а не 0, как в некоторых других языках программирования.

Ограничения, о которых стоит помнить: функция работает только с типом Дата — при передаче строки или числа возникнет ошибка. Пустая дата (01.01.0001) вернёт 1, что формально корректно, но обычно означает незаполненное значение; такие случаи обрабатывайте отдельной проверкой ЗначениеЗаполнено(Дата).

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

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

ДеньНедели('20260101')
Норма

Возвращает 1 (понедельник)

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

Возвращает 0, 2 или ошибку типа

Формат(Дата, "ДФ=dddd")
Норма

Название дня на языке сеанса

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

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

ДЕНЬНЕДЕЛИ в запросе
Норма

Запрос выполняется, номера от 1 до 7

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

Ошибка «Поле не найдено» или синтаксиса

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

Можно ли получить день недели от строки с датой?

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

Почему воскресенье — это 7, а не 0?

Платформа 1С следует стандарту ISO 8601, где неделя начинается с понедельника. Ноль для воскресенья используется, например, в JavaScript — при интеграции с внешними системами это расхождение нужно учитывать и при необходимости пересчитывать.

Как вывести день недели в СКД?

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

Учитывает ли ДеньНедели часовой пояс?

Функция работает с переданным значением даты как есть и сама ничего не пересчитывает. Разница возникает на этапе получения даты: ТекущаяДатаСеанса() учитывает часовой пояс сеанса, а ТекущаяДата() на клиенте — локальное время рабочей станции.

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

Функция ДЕНЬНЕДЕЛИ применима к любому полю типа Дата в запросе, включая поля табличных частей: ДЕНЬНЕДЕЛИ(Док.Товары.ДатаПоставки). Ограничений по источнику поля нет.

Чем отличается ДеньНедели от НеделяГода?

ДеньНедели возвращает порядковый номер дня внутри недели (1–7), а НеделяГода — номер недели в году (1–53). Это разные функции для разных задач, подменять одну другой нельзя.

Итог

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

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