Разработка и Конфигурация · 13 мин
Как задать формат даты в запросе 1С
Как задать формат даты в запросе 1С: функция Формат(), строка ДФ, получение периодов, работа с датами в СКД. Примеры, ошибки и способы проверки результата.
Задача преобразовать дату в нужный вид возникает в запросах 1С постоянно: при выводе периодов в отчёт, при группировке по месяцам, при сравнении дат в регистрах. Язык запросов 1С не имеет отдельной функции «отформатировать дату» напрямую в виде строки произвольного вида, но предоставляет несколько рабочих инструментов: функцию Формат() (в новых версиях платформы), специальные функции извлечения частей даты (Месяц, Год, НачалоПериода) и механизм представлений. Выбор зависит от того, что именно нужно получить — строку для вывода, период для группировки или сравнение дат.
Важно понимать разницу между двумя подходами. Первый — получить из запроса само значение типа «Дата» и отформатировать его средствами встроенного языка через Формат(Дата, "ДФ=dd.MM.yyyy") после выполнения запроса. Второй — выполнить преобразование прямо в тексте запроса, чтобы получить строку или период уже на выходе. Оба варианта корректны, но у них разные ограничения по производительности и применимости в СКД и динамических списках.
Где именно нужно форматировать дату: в запросе или после него
Первое решение, которое нужно принять, — место преобразования. Если дата нужна для вывода пользователю в табличном документе, отчёте СКД или на форме, часто рациональнее вернуть из запроса чистое значение типа «Дата» и применить форматирование в коде или в настройках поля. Значение даты корректно сортируется, участвует в сравнениях и не теряет тип, а формат можно поменять в любой момент без переписывания запроса.
Форматирование внутри запроса оправдано в трёх случаях: когда результат запроса сразу уходит в выгрузку (например, в текстовый файл или обмен), когда нужна группировка по строковому представлению периода, и когда запрос используется в динамическом списке или СКД, где нет возможности вмешаться в постобработку. В остальных ситуациях преобразование даты в строку в запросе — лишняя работа, которая ещё и мешает индексному поиску при использовании в условиях.
Как выбрать место форматирования
Функция Формат() в тексте запроса
Начиная с платформы 8.3.6, в языке запросов доступна функция Формат(Значение, ФорматнаяСтрока), которая работает аналогично одноимённой функции встроенного языка. Для даты она принимает вторым параметром строку с описанием формата, где ключевой параметр — ДФ (формат даты) и ДЛФ (локальный формат даты).
Пример запроса, возвращающего дату документа в привычном российском виде «дд.мм.гггг»:
ВЫБРАТЬ
Реализация.Номер КАК Номер,
Формат(Реализация.Дата, "ДФ=dd.MM.yyyy") КАК ДатаСтрокой
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
Форматная строка строится из подстановок: dd — день двумя цифрами, MM — месяц двумя цифрами, yyyy — год четырьмя цифрами, yy — год двумя цифрами, HH, mm, ss — часы, минуты, секунды, MMMM — полное название месяца. Например, "ДФ='dd MMMM yyyy'" даст «15 января 2026», а "ДФ='yyyy-MM-dd'" — вид, принятый для обменов и сортировки строк. Обратите внимание: если форматная строка содержит пробелы или буквенные части, её целиком удобно заключать в одинарные кавычки внутри двойных кавычек параметра.
Для локализованных представлений вместо ДФ используется ДЛФ: Формат(Дата, "ДЛФ=D") вернёт длинный формат даты согласно региональным настройкам, "ДЛФ=DD" — полный формат с днём недели. Это удобно для печатных форм, где вид даты должен соответствовать региональным стандартам пользователя.
ВЫБРАТЬ Формат(Док.Дата, "ДФ=dd.MM.yyyy") КАК ДатаКратко, Формат(Док.Дата, "ДФ='yyyy-MM-dd HH:mm:ss'") КАК ДатаДляОбмена, Формат(Док.Дата, "ДЛФ=D") КАК ДатаЛокальная ИЗ Документ.РеализацияТоваровУслуг КАК ДокФорматы даты: какие подстановки использовать
Ниже собраны наиболее востребованные сочетания подстановок параметра ДФ и результат, который они дают. Точный вид зависит от региональных настроек сеанса, но порядок элементов сохраняется заданным.
| Форматная строка | Пример результата | Где применять |
|---|---|---|
ДФ=dd.MM.yyyy | 15.01.2026 | Стандартный российский вид для отчётов и печати |
ДФ=dd.MM.yy | 15.01.24 | Компактные таблицы, узкие колонки |
ДФ=yyyy-MM-dd | 2026-01-15 | Обмены, выгрузки, строковая сортировка по дате |
ДФ='dd MMMM yyyy' | 15 января 2026 | Печатные формы, приказы, договоры |
ДФ='MMMM yyyy' | январь 2026 | Заголовки периодов в отчётах |
ДФ='HH:mm:ss' | 14:30:05 | Вывод только времени |
ДФ='yyyy-MM-dd HH:mm:ss' | 2026-01-15 14:30:05 | Логи, технические выгрузки |
Два практических момента. Во-первых, регистр букв в подстановках значим: MM — это месяц, а mm — минуты, их перепутывание — одна из самых частых причин «странных» значений в выгрузках. Во-вторых, если в форматной строке нужен текст, который совпадает с буквами подстановок (например, буква «г» после года), такие фрагменты экранируются одинарными кавычками внутри строки.
Функции периодов: НачалоПериода, КонецПериода, Год, Месяц
Когда цель форматирования — не красивый вывод, а группировка или аналитика по периодам, строковое представление не нужно вовсе. Язык запросов предоставляет функции НачалоПериода(Дата, Период) и КонецПериода(Дата, Период), где период задаётся ключевым словом: День, Неделя, Месяц, Квартал, Год, Декада. Результат — значение типа «Дата», приведённое к началу или концу периода.
ВЫБРАТЬ
НачалоПериода(Продажи.Период, Месяц) КАК Месяц,
Сумма(Продажи.СуммаОборот) КАК Сумма
ИЗ
РегистрНакопления.Продажи.Обороты КАК Продажи
СГРУППИРОВАТЬ ПО
НачалоПериода(Продажи.Период, Месяц)
УПОРЯДОЧИТЬ ПО
Месяц
Такой запрос корректно сортируется по времени, чего строковый формат «ММ.гггг» не обеспечит — строки будут упорядочиваться лексикографически, и «02.2026» окажется раньше «10.2023». Если затем нужно показать период словами, примените Формат() уже к результату группировки, сохранив исходное поле даты для сортировки.
Для извлечения отдельных компонентов есть функции Год(Дата), Месяц(Дата), День(Дата), Час(Дата), Минута(Дата), Секунда(Дата), ДеньГода(Дата), ДеньНедели(Дата), НеделяГода(Дата). Они возвращают числа, что удобно для расчётов: например, для отбора документов понедельников или построения матрицы «месяц × год».
Форматирование даты в СКД и динамических списках
В системе компоновки данных формат даты обычно задаётся не в тексте запроса, а в настройках поля. В конструкторе СКД на закладке «Наборы данных» у поля есть свойство «Оформление», а на закладке «Настройки» для выбранного поля можно задать параметр «Формат» — туда вписывается та же строка вида ДФ=dd.MM.yyyy или ДЛФ=D. Преимущество подхода: формат можно менять в пользовательских настройках без изменения схемы.
Для динамических списков с произвольным запросом действует то же правило: если поле имеет тип «Дата», его отображение настраивается свойством «Формат» колонки таблицы формы. Преобразование даты в строку в запросе динамического списка — плохая практика: строковое поле ломает стандартную сортировку, отборы по периоду и группировку в списке.
Отдельный случай — вычисляемые поля СКД. Если нужна колонка с периодом словами, добавьте вычисляемое поле с выражением на языке выражений СКД, где доступна функция Формат(), либо вычислите строку в запросе набора данных. Первый вариант гибче, второй проще для выгрузки результата программно.
- 1Откройте схему компоновки данных, перейдите на закладку «Настройки»
- 2Выберите нужное поле даты в списке выбранных полей
- 3Откройте оформление поля и найдите параметр «Формат»
- 4Впишите строку вида ДФ=dd.MM.yyyy или ДЛФ=D
- 5Сформируйте отчёт и проверьте отображение и сортировку
Форматирование даты после выполнения запроса
Когда запрос возвращает значение типа «Дата», преобразование в строку выполняется в коде встроенного языка функцией Формат() с теми же параметрами. Это самый гибкий путь для печатных форм и обработок: запрос остаётся простым, а представление собирается в момент вывода.
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ДатаСтрокой = Формат(Выборка.Дата, "ДФ=dd.MM.yyyy");
ПериодСловами = Формат(Выборка.Дата, "ДФ='MMMM yyyy'");
КонецЦикла;
Здесь же уместно упомянуть обратную задачу — передачу даты в запрос параметром. В параметры всегда передаётся значение типа «Дата», а не строка: Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(ТекущаяДата)). Попытка передать дату строкой «01.01.2026» приведёт либо к ошибке сравнения типов, либо к пустому результату, потому что строковое и датовое значения никогда не равны.
Проверка результата и ограничения
После написания запроса проверьте три вещи. Первое — тип поля в результате: в консоли запросов или через ТипЗнч() убедитесь, что получили то, что ожидали (строку после Формат() или дату после НачалоПериода()). Второе — сортировку: прокрутите результат на границах периодов, например на переходе года. Третье — пустые и незаполненные даты: значение «0001-01-01» после форматирования превратится в «01.01.0001», что в отчёте выглядит как мусор; такие случаи отсекайте условием ВЫБОР КОГДА Дата = ДатаВремя(1,1,1) ТОГДА "" ИНАЧЕ Формат(...) КОНЕЦ.
Из ограничений стоит помнить: функция Формат() в запросах недоступна на платформах ниже 8.3.6 — там придётся форматировать в коде после выборки или через соединение с календарными таблицами. В запросах к внешним источникам данных и в пакетных запросах с временными таблицами поведение функции стоит проверять отдельно. Также результат Формат() зависит от региональных настроек сеанса: названия месяцев и разделители могут отличаться у разных пользователей, что критично для машиночитаемых выгрузок — для них фиксируйте нейтральный формат вида yyyy-MM-dd.
Как проверить результат
Строка после Формат(), Дата после НачалоПериода()
Ожидали дату, получили строку — сломаются отборы и сортировка
Добавлено упорядочивание по исходному полю даты
«02.2026» стоит раньше «10.2023» — сортировка идёт по строке
Пустые даты заменены заглушкой через ВЫБОР
В отчёте видны значения вида 01.01.0001
Используется фиксированный формат yyyy-MM-dd
Формат зависит от региональных настроек сеанса
Что важно запомнить
Для строкового представления даты в запросе используйте Формат(Поле, "ДФ=..."), для группировок — НачалоПериода(), для отчётов СКД — свойство Формат поля. Не форматируйте даты в условиях и соединениях, не передавайте даты строками в параметры и всегда проверяйте сортировку и пустые значения.
Частые вопросы
Как вывести в запросе только месяц и год, например «Январь 2026»?
Используйте Формат(Поле, "ДФ='MMMM yyyy'"). Если нужна сортировка по времени, добавьте в запрос также НачалоПериода(Поле, Месяц) и упорядочивайте по нему, а строковое поле оставьте для отображения.
Почему запрос с функцией Формат() выдаёт ошибку синтаксиса?
Наиболее вероятные причины: платформа ниже версии 8.3.6, где функция в запросах не поддерживается, либо неправильное оформление кавычек — форматная строка должна быть строковым литералом запроса в двойных кавычках, а внутренние фрагменты с пробелами дополнительно браться в одинарные кавычки.
Как сравнить дату документа с конкретным днём, игнорируя время?
Передавайте в параметры границы дня: НачалоДня(Дата) и КонецДня(Дата), а в условии пишите Поле МЕЖДУ &Начало И &Конец. Альтернатива внутри запроса — НачалоПериода(Поле, День) = &Дата, но вариант с параметрами лучше использует индексы.
Можно ли задать формат даты для параметра-строки в запросе?
Нет, и не нужно: параметры даты всегда передаются значением типа «Дата». Если у вас дата в виде строки, сначала преобразуйте её в коде через Дата() или разбор строки, затем передавайте как параметр.
Почему после форматирования в запросе сломалась сортировка в отчёте?
Потому что форматированная дата — это строка, и сортировка стала лексикографической. Верните в набор данных исходное поле типа «Дата», добавьте его в упорядочивание, а строковое представление используйте только для вывода.
Как вывести дату в формате, принятом у пользователя, без ручной строки ДФ?
Используйте параметр ДЛФ: Формат(Дата, "ДЛФ=D") даст длинный локальный формат, "ДЛФ=DD" — полный с днём недели. Представление подстроится под региональные настройки сеанса пользователя.