Разработка и Конфигурация · 9 мин
Как получить день из даты в 1С
Как получить день из даты в 1С: функция День() во встроенном языке, ДЕНЬ() в запросах, Формат() для строки. Примеры кода, ошибки и проверка результата.
Извлечь день из значения типа «Дата» в 1С можно тремя основными способами: функцией День() во встроенном языке, функцией ДЕНЬ() в языке запросов и функцией Формат(), если нужен день в виде строки с ведущим нулём. Выбор зависит от того, где выполняется код — на сервере, в запросе к базе или при формировании представления для пользователя.
Функция День() возвращает целое число от 1 до 31 — календарный день месяца. Она работает только со значением типа «Дата»; если передать строку или пустую дату, результат будет ошибкой или нулем. Поэтому перед извлечением дня стоит проверить тип и заполненность значения.
Ниже разобраны все практические сценарии: получение дня в коде, в запросе, в СКД, форматирование в строку, обработка пустых дат и типичные ошибки начинающих разработчиков.
Получение дня функцией День() во встроенном языке
Базовый синтаксис предельно прост: функция принимает один параметр — значение типа «Дата» — и возвращает число:
ДатаДокумента = Дата(2026, 3, 15);
ДеньМесяца = День(ДатаДокумента); // результат: 15 (число)
Результат имеет тип «Число», поэтому его можно использовать в арифметике и сравнениях без дополнительных преобразований. Например, проверка, попадает ли дата на последнюю декаду месяца:
Если День(ДатаДокумента) > 20 Тогда
// дата в последней декаде месяца
КонецЕсли;
Частый сценарий — получить день из реквизита документа или из текущей даты сеанса:
ДеньДокумента = День(СсылкаНаДокумент.Дата);
ДеньСегодня = День(ТекущаяДатаСеанса());
Для работы с текущей датой предпочтительна ТекущаяДатаСеанса(), а не устаревшая ТекущаяДата(): она корректно учитывает часовой пояс сеанса и не создаёт проблем при разнице времени между клиентом и сервером.
ДатаДокумента = Дата(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 марта». Полный список шаблонов описан в синтакс-помощнике по функции Формат().
Сравнение способов
Возвращает число. Подходит для вычислений и сравнений, но не работает внутри запроса.
Выполняется на уровне СУБД, можно использовать в отборах и группировках. Минус — отбор по функции не использует индекс.
Возвращает строку с ведущим нулём. Только для отображения и строковых операций, не для арифметики.
Обработка пустых и некорректных дат
Пустая дата в 1С — это значение '00010101' (1 января года 1). Вызов День('00010101') вернёт 1, что может быть неожиданным: формально ошибки нет, но семантически дата не заполнена. Перед извлечением дня проверяйте заполненность:
Если ЗначениеЗаполнено(ДатаДокумента) Тогда
ДеньМесяца = День(ДатаДокумента);
Иначе
ДеньМесяца = 0; // или Неопределено — по логике задачи
КонецЕсли;
Если в функцию День() передать значение не типа «Дата» — строку, число или Неопределено — возникнет ошибка времени выполнения. В нетиповых обработках, где тип реквизита не гарантирован, используйте проверку:
Если ТипЗнч(Значение) = Тип("Дата") Тогда
ДеньМесяца = День(Значение);
КонецЕсли;
В запросах пустая дата даст ДЕНЬ() = 1 по той же причине. Если такие записи нужно исключить, добавьте условие Дата <> ДАТАВРЕМЯ(1,1,1) или НЕ Дата ЕСТЬ NULL для необязательных соединений.
Типичные ошибки и как их избежать
Первая распространённая ошибка — попытка получить день из строки. Если дата хранится как строка (например, при загрузке из Excel или CSV), её нужно сначала преобразовать в тип «Дата» через Дата() с разбором частей или через функции работы со строками. Прямой вызов День("15.03.2026") завершится ошибкой.
Вторая ошибка — путаница между День() и ДеньНедели(). Проверка «дата выпадает на выходной» через День(Дата) > 5 бессмысленна: правильно ДеньНедели(Дата) >= 6.
Третья ошибка — использование дня месяца для сравнения периодов. Условие «день текущей даты больше дня документа» некорректно сравнивает даты из разных месяцев. Для сравнения дат используйте сами значения типа «Дата» — они сравниваются напрямую операторами >, <, =.
Проверка результата
Быстрый способ убедиться, что код работает, — вывести результат в сообщение или в консоль кода на управляемой форме:
Сообщить("День: " + День(ДатаДокумента));
Для запроса проверку удобно выполнить в консоли запросов: выберите несколько документов с известными датами и сверьте значения колонки ДеньМесяца с реальными датами документов.
Как проверить результат
День() и ДЕНЬ() возвращают число от 1 до 31
Строка или Неопределено — значит, использован не тот подход
Пустая дата отсекается проверкой ЗначениеЗаполнено() до вызова
Для незаполненных документов выводится день 1
Дополнительно задан отбор по периоду, запрос выполняется быстро
Запрос сканирует всю таблицу документов
FAQ: частые вопросы
Чем отличается День() от ДеньНедели()?
День() возвращает порядковый номер дня в месяце (1–31), а ДеньНедели() — номер дня недели (1 — понедельник, 7 — воскресенье). Это разные характеристики: первая нужна для календарной позиции в месяце, вторая — для определения будней и выходных.
Как получить день из даты в виде «05», а не «5»?
Используйте Формат(Дата, "ДФ=dd") — функция вернёт строку из двух символов с ведущим нулём. Сама функция День() всегда возвращает число, и числа в 1С не хранят ведущие нули.
Можно ли извлечь день из даты в СКД без изменения запроса?
Нет, вычисляемое поле с функцией ДЕНЬ(Дата) нужно добавить в запрос набора данных или создать вычисляемое поле СКД с выражением на языке выражений компоновки. В настройках отчёта извлечь день из готового поля даты нельзя.
Почему День() возвращает 1 для незаполненного реквизита?
Потому что пустая дата в 1С — это значение 01.01.0001, и её день формально равен 1. Это не ошибка платформы: перед извлечением дня проверяйте дату через ЗначениеЗаполнено() или сравнение с '00010101'.
Как в запросе отобрать документы за конкретный день месяца?
Добавьте условие ДЕНЬ(Таблица.Дата) = &День и передайте параметр типа «Число». Чтобы запрос не сканировал всю таблицу, дополнительно ограничьте выборку периодом: Таблица.Дата МЕЖДУ &Начало И &Конец.
Работает ли День() с датой и временем?
Да. Тип «Дата» в 1С включает время, но функция День() учитывает только календарную часть и возвращает день месяца независимо от времени. Если нужно отбросить время полностью, используйте НачалоДня(Дата).
Что важно запомнить
День из даты получают функцией День() в коде и ДЕНЬ() в запросе — обе возвращают число от 1 до 31. Для строки с ведущим нулём используйте Формат(Дата, "ДФ=dd"). Всегда проверяйте заполненность даты до извлечения дня и не стройте отборы по ДЕНЬ() на больших таблицах без ограничения периода.