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

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

Как из даты выбрать только день в 1С

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

Задача выделить из даты только число месяца встречается в 1С постоянно: при формировании печатных форм, группировке отчётов по дням, проверке условий вроде «если день месяца больше 25 — срок оплаты наступил». Встроенный язык 1С даёт для этого несколько инструментов, и выбор зависит от того, где обрабатывается дата — в коде модуля, в запросе или при выводе на экран.

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

Ниже разобраны все рабочие варианты с примерами кода, ограничениями и проверкой результата. Примеры подходят для платформы 1С:Предприятие 8.3 в управляемых и обычных формах.

Получение дня функцией День() в коде

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

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

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

// Практический пример: проверка условия

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

Сообщить("Приближается конец месяца, проверьте закрывающие документы");

КонецЕсли;

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

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

НомерДня = День(ДокументОбъект.Дата); // день из даты документа

ДеньОплаты = День(ДокументОбъект.ДатаОплаты); // день из произвольного реквизита

Выбор дня в запросе оператором ДЕНЬ()

Когда данные обрабатываются запросом — например, для отчёта или выборки документов — день извлекается прямо в тексте запроса. Это эффективнее, чем перебирать выборку и вычислять день в цикле, потому что операция выполняется на стороне СУБД.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

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

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

|ИЗ

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

|ГДЕ

| РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода

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

| ДЕНЬ(РеализацияТоваровУслуг.Дата)";

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

|ГДЕ

| ДЕНЬ(РеализацияТоваровУслуг.Дата) <= 10

Вывод дня строкой через Формат()

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

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

ДеньСтрокой = Формат(ДатаДокумента, "ДФ=dd"); // "05" — два знака с нулём

ДеньБезНуля = Формат(ДатаДокумента, "ДФ=d"); // "5" — как есть

Формат ДФ=dd особенно полезен при формировании имён файлов, номеров документов и строк для обмена с внешними системами, где требуется фиксированная длина. Полная дата в таком стиле собирается так:

// "05.03.2026"

СтрокаДаты = Формат(ДатаДокумента, "ДЛФ=D");

// "05 марта 2026 г." — с учётом локали

СтрокаДаты = Формат(ДатаДокумента, "ДЛФ=DD");

Сравнение вариантов

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

Возвращает число 1–31. Подходит для условий и расчётов. Не даёт ведущий ноль.

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

Число на стороне СУБД. Лучший выбор для группировок и отборов в отчётах. Не работает со строковыми полями.

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

Строка вида «05» для вывода, имён файлов и обменов. Не подходит для арифметики без преобразования в число.

Отбор документов по конкретному дню месяца

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

Первый — условие в запросе с оператором ДЕНЬ():

Запрос.Текст =

"ВЫБРАТЬ

| Счет.Ссылка,

| Счет.Дата

|ИЗ

| Документ.СчетНаОплатуПокупателю КАК Счет

|ГДЕ

| ДЕНЬ(Счет.Дата) = &ИскомыйДень";

Запрос.УстановитьПараметр("ИскомыйДень", 15);

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

Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(ИскомаяДата));

Запрос.УстановитьПараметр("КонецПериода", КонецДня(ИскомаяДата));

// В запросе: ГДЕ Счет.Дата МЕЖДУ &НачалоПериода И &КонецПериода

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

Типичные ошибки при работе с днём даты

Типичные ошибки
01
Передача строки в День() — функция ожидает тип «Дата», строка «15.03.2026» вызовет ошибку. Сначала преобразуйте значение или проверьте тип.
02
Сравнение результата День() со строкой: День(Дата) = "15" всегда ложно, потому что слева число. Сравнивайте с числом 15.
03
Использование День() на пустой дате '00010101' — ошибки не будет, но результат 1 может исказить отчёт. Проверяйте заполненность даты заранее.
04
Ожидание ведущего нуля от День() — функция вернёт 5, а не «05». Для строки с нулём используйте Формат() с ДФ=dd.

Отдельного внимания заслуживает работа с датами, полученными из внешних источников — файлов Excel, CSV, веб-сервисов. Там дата почти всегда приходит строкой, и перед извлечением дня её нужно преобразовать. Универсального преобразователя «строка в дату» в платформе нет, поэтому строку разбирают вручную или через известный формат:

// Разбор строки формата "15.03.2026"

Части = СтрРазделить(СтрокаИзФайла, ".");

Если Части.Количество() = 3 Тогда

ДатаИзСтроки = Дата(Число(Части[2]), Число(Части[1]), Число(Части[0]));

НомерДня = День(ДатаИзСтроки); // 15

КонецЕсли;

Проверка результата и граничные случаи

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

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

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

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

День() и ДЕНЬ() возвращают число, Формат() — строку

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

Сравнение числа со строкой без преобразования

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

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

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

День('00010101') возвращает 1 и попадает в отчёт

Формат вывода
Норма

«05» через ДФ=dd, «5» через День() — соответствует задаче

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

В имени файла смешаны «5» и «05», сортировка ломается

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

Итог

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

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

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

Как получить день недели, а не день месяца?

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

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

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

Почему ДЕНЬ() в запросе возвращает NULL?

NULL появляется, если поле имеет составной тип и в конкретной записи содержит не дату, либо если значение даты не заполнено в NULL-записи соединения таблиц. Проверьте тип поля в конфигураторе и добавьте условие НЕ Поле ЕСТЬ NULL или оберните значение в ЕСТЬNULL().

Как получить последний день месяца из даты?

Функции «последний день месяца» в платформе нет, но он вычисляется выражением: День(КонецМесяца(Дата)). Сначала КонецМесяца() возвращает дату-время конца месяца, затем День() извлекает из неё число — 28, 29, 30 или 31 в зависимости от месяца и года.

Работает ли День() на клиенте в управляемых формах?

Да, функция доступна в клиентском контексте, включая тонкий и веб-клиент, и не требует серверного вызова. Это делает её удобной для проверок «на лету» при вводе даты пользователем, например в обработчике ПриИзменении поля формы.

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

Это функции с разным назначением. День(Дата) возвращает число — порядковый день месяца. НачалоДня(Дата) возвращает дату-время, соответствующее 00:00:00 того же дня, и применяется для отсечения времени при сравнении дат и задании границ периодов.