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

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

Как определить день недели в 1С

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

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

Функция ДеньНедели() считает понедельник первым днём недели, а воскресенье — седьмым. Это соответствует российскому стандарту, но отличается от американской нумерации, где неделя начинается с воскресенья. Если код переносится из других языков или сравнивается с внешними системами, это различие нужно учитывать явно.

Ниже разобраны рабочие примеры кода для тонкого и управляемого приложений, способы получить название дня недели строкой, вариант с запросом, а также типичные ошибки, из-за которых проверка «сегодня выходной?» работает неправильно.

Функция ДеньНедели(): базовый способ

Основной инструмент — встроенная функция ДеньНедели(Дата). Она принимает значение типа Дата и возвращает целое число от 1 до 7. Понедельник соответствует 1, вторник — 2, и так далее до воскресенья, которое равно 7.

ДатаПроверки = ТекущаяДатаСеанса();

НомерДня = ДеньНедели(ДатаПроверки); // например, 3 — среда

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

Сообщить("Это выходной день");

КонецЕсли;

Если передать строку или число, платформа вызовет ошибку преобразования типов. Перед вызовом при необходимости преобразуйте данные через Дата() или убедитесь, что реквизит объекта имеет тип «Дата».

Если дата содержит время, это не влияет на результат: ДеньНедели() анализирует только календарную составляющую. Однако при сравнении дат из разных часовых поясов учитывайте, что ТекущаяДатаСеанса() возвращает дату сеанса, а не сервера или клиента.

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

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

ДатаПроверки = Дата(2026, 3, 15);

ПолноеНазвание = Формат(ДатаПроверки, "ДФ=дддд"); // "пятница"

КраткоеНазвание = Формат(ДатаПроверки, "ДФ=ддд"); // "пт"

ДатаСДнем = Формат(ДатаПроверки, "ДЛФ=D"); // "15 марта 2026 г." с днём недели

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

Альтернативный вариант — собственный массив названий. Он даёт полный контроль над регистром и падежом, что полезно в шаблонах документов:

НазванияДней = Новый Массив;

НазванияДней.Добавить("понедельник");

НазванияДней.Добавить("вторник");

НазванияДней.Добавить("среда");

НазванияДней.Добавить("четверг");

НазванияДней.Добавить("пятница");

НазванияДней.Добавить("суббота");

НазванияДней.Добавить("воскресенье");

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

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

Когда день недели нужен для отбора или группировки большого объёма данных, вычислять его в цикле по выборке неэффективно. Язык запросов 1С поддерживает функцию ДЕНЬНЕДЕЛИ(), которая выполняется на стороне СУБД:

ВЫБРАТЬ

РеализацияТоваров.Дата КАК Дата,

ДЕНЬНЕДЕЛИ(РеализацияТоваров.Дата) КАК НомерДняНедели,

СУММА(РеализацияТоваров.СуммаДокумента) КАК Сумма

ИЗ

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

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

РеализацияТоваров.Дата

Функция возвращает те же значения, что и ДеньНедели() во встроенном языке: 1 — понедельник, 7 — воскресенье. Это позволяет, например, построить отчёт по продажам с разбивкой по дням недели или отобрать документы, проведённые в выходные, для контроля.

Для отбора только рабочих дней добавьте условие в секцию ГДЕ:

ГДЕ

ДЕНЬНЕДЕЛИ(РеализацияТоваров.Дата) <= 5

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

Сравнение способов

ДеньНедели() в коде

Подходит для проверок и ветвления логики. Возвращает число 1–7, требует тип «Дата».

Формат() с ДФ=дддд

Подходит для вывода пользователю и печатных форм. Результат зависит от региональных настроек.

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

Подходит для отборов и группировок по большим данным. Может замедлять запрос на больших таблицах.

Свой массив названий

Подходит, когда нужен конкретный регистр, падеж или нестандартное сокращение.

Проверка на выходной и производственный календарь

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

// Упрощённая проверка без учёта праздников

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

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

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

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

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

Типичные ошибки и их устранение

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

Вторая ошибка — передача в функцию строки вроде "15.03.2026". Платформа не выполняет неявное преобразование строки в дату для этой функции, и возникает ошибка. Строку нужно сначала преобразовать, например через Дата() с явным разбором или при вводе пользователем через поле с типом «Дата».

Третья ошибка — сравнение названия дня, полученного через Формат(), с жёстко заданной строкой. Если региональные настройки базы изменятся, слово «пятница» превратится в «Friday», и сравнение перестанет работать. Для логики используйте числовое значение ДеньНедели(), а строковое представление оставьте только для отображения.

Типичные ошибки
01
Ожидание нуля для воскресенья — ДеньНедели() возвращает 7, нуля не бывает
02
Передача строки вместо даты — ошибка преобразования типов при выполнении
03
Сравнение строкового названия дня с константой — ломается при смене региональных настроек
04
Проверка выходного без производственного календаря — праздники и переносы не учитываются
05
Обращение к массиву названий без вычитания единицы — смещение всех дней на один

Проверка результата и готовый порядок действий

После внедрения кода проверьте его на контрольных датах, день недели которых известен заранее. Удобно взять несколько дат из календаря, включая понедельник, середину недели и воскресенье, и сверить возвращаемое число с фактическим днём.

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

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

FAQ

Какой номер у воскресенья в функции ДеньНедели()?

Воскресенье имеет номер 7. Нумерация начинается с понедельника (1) и заканчивается воскресеньем (7). Нулевого значения функция не возвращает.

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

В модуле формирования печатной формы используйте Формат(ДатаДокумента, "ДФ=дддд") и подставьте результат в параметр макета. Для полной даты с днём недели подойдёт форматная строка "ДЛФ=D".

Можно ли определить день недели для даты, введённой строкой?

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

Почему Формат() выводит название дня на английском языке?

Название зависит от региональных настроек информационной базы или сеанса. Проверьте параметр «Язык и региональные стандарты» в свойствах базы и настройки локализации сеанса.

Как учесть праздничные дни при определении выходного?

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

Работает ли ДЕНЬНЕДЕЛИ() в СКД и динамических списках?

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

Итог

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

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