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

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

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

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

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

Функция День() возвращает целое число от 1 до 31 — календарный день месяца. Она работает только со значением типа «Дата»; если передать строку или пустую дату, результат будет ошибкой или нулем. Поэтому перед извлечением дня стоит проверить тип и заполненность значения.

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

Получение дня функцией День() во встроенном языке

Базовый синтаксис предельно прост: функция принимает один параметр — значение типа «Дата» — и возвращает число:

ДатаДокумента = Дата(2026, 3, 15);

ДеньМесяца = День(ДатаДокумента); // результат: 15 (число)

Результат имеет тип «Число», поэтому его можно использовать в арифметике и сравнениях без дополнительных преобразований. Например, проверка, попадает ли дата на последнюю декаду месяца:

Если День(ДатаДокумента) > 20 Тогда

// дата в последней декаде месяца

КонецЕсли;

Частый сценарий — получить день из реквизита документа или из текущей даты сеанса:

ДеньДокумента = День(СсылкаНаДокумент.Дата);

ДеньСегодня = День(ТекущаяДатаСеанса());

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

bsl
ДатаДокумента = Дата(2026, 3, 15);
ДеньМесяца = День(ДатаДокумента); // 15

Получение дня в запросе: функция ДЕНЬ()

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

ВЫБРАТЬ

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

ДЕНЬ(РеализацияТоваров.Дата) КАК ДеньМесяца

ИЗ

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

Поле ДеньМесяца в результате запроса будет иметь тип «Число». Его можно использовать в условиях отбора, группировках и итогах. Например, отбор документов, проведённых первого числа любого месяца:

ГДЕ

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

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

День месяца в СКД и динамических списках

В системе компоновки данных день извлекается тем же выражением ДЕНЬ() в запросе набора данных. Дальше поле можно выводить в отчёт, использовать в ресурсах, группировках и отборах настроек СКД без изменения запроса.

Для динамических списков ситуация похожая: если нужно показать колонку «День» или отбирать по дню, добавьте вычисляемое поле ДЕНЬ(Дата) в текст запроса динамического списка. Пользователь сможет накладывать отбор по этому полю стандартными средствами.

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

День в виде строки: функция Формат()

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

СтрокаДень = Формат(ДатаДокумента, "ДФ=dd");        // "05"

СтрокаПолная = Формат(ДатаДокумента, "ДЛФ=D"); // "15 марта 2026 г."

Разница принципиальна: День(Дата) вернёт число 5, а Формат(Дата, "ДФ=dd") — строку «05». Для сравнений и вычислений нужен первый вариант, для отображения и конкатенации — второй.

Комбинируя элементы форматной строки, можно собрать любое представление: ДФ="dd.MM.yyyy" даст «05.03.2026», ДФ="dd MMMM" — «05 марта». Полный список шаблонов описан в синтакс-помощнике по функции Формат().

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

День(Дата) в коде

Возвращает число. Подходит для вычислений и сравнений, но не работает внутри запроса.

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

Выполняется на уровне СУБД, можно использовать в отборах и группировках. Минус — отбор по функции не использует индекс.

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

Возвращает строку с ведущим нулём. Только для отображения и строковых операций, не для арифметики.

Обработка пустых и некорректных дат

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

Если ЗначениеЗаполнено(ДатаДокумента) Тогда

ДеньМесяца = День(ДатаДокумента);

Иначе

ДеньМесяца = 0; // или Неопределено — по логике задачи

КонецЕсли;

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

Если ТипЗнч(Значение) = Тип("Дата") Тогда

ДеньМесяца = День(Значение);

КонецЕсли;

В запросах пустая дата даст ДЕНЬ() = 1 по той же причине. Если такие записи нужно исключить, добавьте условие Дата <> ДАТАВРЕМЯ(1,1,1) или НЕ Дата ЕСТЬ NULL для необязательных соединений.

Типичные ошибки и как их избежать

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

Вторая ошибка — путаница между День() и ДеньНедели(). Проверка «дата выпадает на выходной» через День(Дата) > 5 бессмысленна: правильно ДеньНедели(Дата) >= 6.

Третья ошибка — использование дня месяца для сравнения периодов. Условие «день текущей даты больше дня документа» некорректно сравнивает даты из разных месяцев. Для сравнения дат используйте сами значения типа «Дата» — они сравниваются напрямую операторами >, <, =.

Типичные ошибки
01
Вызов День() для строки — ошибка времени выполнения; сначала преобразуйте строку в дату.
02
Проверка заполненности через День() — пустая дата возвращает 1, а не 0.
03
Сравнение дат по дню месяца без учёта месяца и года — логические ошибки в отборах.
04
Отбор ДЕНЬ(Дата) = N в запросе по большой таблице без ограничения периода — полное сканирование и долгое выполнение.

Проверка результата

Быстрый способ убедиться, что код работает, — вывести результат в сообщение или в консоль кода на управляемой форме:

Сообщить("День: " + День(ДатаДокумента));

Для запроса проверку удобно выполнить в консоли запросов: выберите несколько документов с известными датами и сверьте значения колонки ДеньМесяца с реальными датами документов.

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

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

Тип возвращаемого значения
Норма

День() и ДЕНЬ() возвращают число от 1 до 31

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

Строка или Неопределено — значит, использован не тот подход

Поведение на пустой дате
Норма

Пустая дата отсекается проверкой ЗначениеЗаполнено() до вызова

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

Для незаполненных документов выводится день 1

Скорость запроса с отбором по ДЕНЬ()
Норма

Дополнительно задан отбор по периоду, запрос выполняется быстро

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

Запрос сканирует всю таблицу документов

FAQ: частые вопросы

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

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

Как получить день из даты в виде «05», а не «5»?

Используйте Формат(Дата, "ДФ=dd") — функция вернёт строку из двух символов с ведущим нулём. Сама функция День() всегда возвращает число, и числа в 1С не хранят ведущие нули.

Можно ли извлечь день из даты в СКД без изменения запроса?

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

Почему День() возвращает 1 для незаполненного реквизита?

Потому что пустая дата в 1С — это значение 01.01.0001, и её день формально равен 1. Это не ошибка платформы: перед извлечением дня проверяйте дату через ЗначениеЗаполнено() или сравнение с '00010101'.

Как в запросе отобрать документы за конкретный день месяца?

Добавьте условие ДЕНЬ(Таблица.Дата) = &День и передайте параметр типа «Число». Чтобы запрос не сканировал всю таблицу, дополнительно ограничьте выборку периодом: Таблица.Дата МЕЖДУ &Начало И &Конец.

Работает ли День() с датой и временем?

Да. Тип «Дата» в 1С включает время, но функция День() учитывает только календарную часть и возвращает день месяца независимо от времени. Если нужно отбросить время полностью, используйте НачалоДня(Дата).

Итог

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

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