Разработка и Конфигурация · 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. Подходит для условий и расчётов. Не даёт ведущий ноль.
Число на стороне СУБД. Лучший выбор для группировок и отборов в отчётах. Не работает со строковыми полями.
Строка вида «05» для вывода, имён файлов и обменов. Не подходит для арифметики без преобразования в число.
Отбор документов по конкретному дню месяца
Практическая задача: найти все документы, у которых день даты совпадает с заданным — например, все счета, выставленные 15-го числа любого месяца. Здесь два рабочих подхода.
Первый — условие в запросе с оператором ДЕНЬ():
Запрос.Текст =
"ВЫБРАТЬ
| Счет.Ссылка,
| Счет.Дата
|ИЗ
| Документ.СчетНаОплатуПокупателю КАК Счет
|ГДЕ
| ДЕНЬ(Счет.Дата) = &ИскомыйДень";
Запрос.УстановитьПараметр("ИскомыйДень", 15);
Второй — если нужен конкретный день конкретного месяца, проще задать диапазон дат через параметры НачалоДня() и КонецДня(). Такой запрос обычно выполняется быстрее, потому что использует индекс по полю даты, а не вычисляет функцию для каждой строки:
Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(ИскомаяДата));
Запрос.УстановитьПараметр("КонецПериода", КонецДня(ИскомаяДата));
// В запросе: ГДЕ Счет.Дата МЕЖДУ &НачалоПериода И &КонецПериода
Отбор вида ДЕНЬ(Дата) = 15 удобен, но заставляет СУБД вычислять функцию для каждой записи таблицы. На больших документооборотах (сотни тысяч документов) такие запросы заметно медленнее отбора по диапазону дат. Для тяжёлых отчётов предпочитайте МЕЖДУ с конкретными границами периода.
Типичные ошибки при работе с днём даты
Отдельного внимания заслуживает работа с датами, полученными из внешних источников — файлов 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 того же дня, и применяется для отсечения времени при сравнении дат и задании границ периодов.