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

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

Как в запросе 1С отформатировать дату

Как отформатировать дату в запросе 1С: функция ФОРМАТ, форматные строки, примеры кода, типичные ошибки и способы проверки результата в консоли запросов.

Задача отформатировать дату прямо в тексте запроса возникает, когда результат нужно сразу вывести в отчёт, печатную форму или на форму без дополнительной обработки в коде. В языке запросов 1С для этого предназначена функция ФОРМАТ, которая преобразует значение в строку по заданной форматной строке. Она работает на управляемых и обычных формах, в тонком и толстом клиенте, и не требует выгрузки данных в таблицу значений.

Важно понимать ограничение: функция ФОРМАТ возвращает строку, а не дату. Это значит, что результат нельзя сравнивать как дату, сортировать хронологически или использовать в арифметике дат. Если дата нужна для дальнейших вычислений, форматировать её следует уже после выполнения запроса — средствами встроенного языка через одноимённую функцию Формат().

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

Синтаксис функции ФОРМАТ в языке запросов

Функция вызывается в секции ВЫБРАТЬ и принимает два аргумента: форматируемое выражение и форматную строку. Форматная строка задаётся в одинарных кавычках внутри текста запроса, поэтому в исходном коде модуля её пишут с удвоенными кавычками или через конкатенацию строк.

Общий вид вызова:

ВЫБРАТЬ

ФОРМАТ(РеализацияТоваров.Дата, "ДЛФ=D") КАК ДатаСтрокой

ИЗ

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

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

Форматная строка чувствительна к регистру параметров и к языку: в русской конфигурации используются параметры вида ДЛФ (дата локальный формат), в английской — DLF. Платформа понимает оба варианта, но в тексте запроса принято писать русские обозначения, чтобы запрос оставался читаемым для русскоязычной команды.

Основные форматные строки для даты

Чаще всего в запросах используются четыре варианта. Они покрывают практически все задачи отчётности и печатных форм.

Форматная строкаРезультатКогда применять
ДЛФ=D12.03.2026Только дата без времени, короткий формат
ДЛФ=DT12.03.2026 14:35:07Дата со временем, журналы и логи
ДЛФ=DD12 марта 2026 г.Печатные формы, договоры, приказы
ДФ=dd.MM.yyyy12.03.2026Явный шаблон с разделителями

Параметр ДФ (дата формат) позволяет собрать произвольный шаблон из компонентов: дд — день, ММ — месяц, гггг — год, ЧЧ — часы, мм — минуты, сс — секунды. Например, ФОРМАТ(Дата, "ДФ=yyyy-MM-dd") даст строку в стиле ISO, удобную для обмена с внешними системами.

Комбинировать параметры можно через пробел или точку с запятой: ФОРМАТ(Дата, "ДФ='dd.MM.yyyy HH:mm:ss'"). Внутри шаблона литеральный текст берётся в одинарные кавычки — например, ДФ='год yyyy' выведет «год 2026».

bsl
ВЫБРАТЬ
	ФОРМАТ(Док.Дата, "ДЛФ=DD") КАК ДатаПрописью,
	ФОРМАТ(Док.Дата, "ДФ=yyyy-MM-dd") КАК ДатаISO
ИЗ
	Документ.СчетНаОплатуПокупателю КАК Док

Как убрать время из даты в запросе

Документы в 1С хранят дату с точностью до секунды, поэтому прямое форматирование часто выводит лишнее время. Есть два подхода в зависимости от того, что нужно дальше делать с результатом.

Если нужна строка для вывода — достаточно ФОРМАТ(Дата, "ДЛФ=D"): время просто не попадёт в результат. Если нужна дата как значение для группировки или соединения — используйте функции НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) или ДАТАВРЕМЯ с извлечёнными компонентами. НАЧАЛОПЕРИОДА сохраняет тип «Дата» и корректно работает в группировках и соединениях.

Типовой пример группировки продаж по дням без потери типа:

ВЫБРАТЬ

НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ) КАК День,

СУММА(Продажи.СуммаОборот) КАК Сумма

ИЗ

РегистрНакопления.Продажи.Обороты КАК Продажи

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

НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ)

УПОРЯДОЧИТЬ ПО

День

Такой запрос сортируется хронологически, потому что День остаётся датой. Если бы вместо этого группировка шла по ФОРМАТ(Период, "ДЛФ=D"), сортировка стала бы лексикографической: «01.02.2026» оказалось бы раньше «02.01.2026».

Вывод даты прописью и локализованные форматы

Для печатных форм — договоров, доверенностей, приказов — требуется дата вида «12 марта 2026 г.». В запросе её даёт форматная строка ДЛФ=DD. Название месяца подставляется в родительном падеже согласно региональным настройкам информационной базы, поэтому дополнительной обработки склонений не требуется.

Если нужен только месяц и год («март 2026»), подходит шаблон ДФ='MMMM yyyy'. Для квартальной отчётности удобен вариант ДФ='к квартал yyyy', который выведет «1 квартал 2026». Символ к в шаблоне означает номер квартала.

Учитывайте, что локализованные форматы зависят от настроек сеанса: на сервере с английской региональной установкой ДЛФ=DD может вернуть «March 12, 2026». Если отчёт должен выглядеть одинаково независимо от сервера, надёжнее задавать явный шаблон через ДФ, а не полагаться на локаль.

Форматирование даты в консоли запросов и СКД

При отладке в консоли запросов форматную строку пишут как есть, в одинарных кавычках внутри текста: ФОРМАТ(Дата, "ДЛФ=D"). В модуле объекта тот же запрос оформляется строковым литералом, где кавычки удваиваются:

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

"ВЫБРАТЬ

| ФОРМАТ(Док.Дата, ""ДЛФ=D"") КАК ДатаСтрокой

|ИЗ

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

В схеме компоновки данных функция доступна на вкладке «Наборы данных» прямо в тексте запроса. Альтернатива — вычисляемое поле на вкладке «Вычисляемые поля» с выражением на языке выражений СКД, где тоже есть функция Формат(). Разница в том, что вычисляемое поле считается на этапе формирования отчёта, а не на сервере СУБД, что иногда удобнее для сложных шаблонов.

Для полей ресурсов и группировок в СКД есть ещё один путь: оставить поле датой в запросе, а формат задать на вкладке «Настройки» через «Оформление» → «Формат» для конкретного поля. Так отчёт сохраняет корректную сортировку и итоги по периодам, а пользователь видит красивую строку.

Порядок действий
  1. 1
    Определите, нужен результат как строка или как дата для дальнейших вычислений
  2. 2
    Для строки добавьте в секцию ВЫБРАТЬ выражение ФОРМАТ(Поле, "ДЛФ=D") с нужным шаблоном
  3. 3
    Для даты без времени используйте НАЧАЛОПЕРИОДА(Поле, ДЕНЬ)
  4. 4
    Выполните запрос в консоли и проверьте тип и вид колонки результата
  5. 5
    Проверьте сортировку: даты должны идти в хронологическом порядке

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

Самая частая ошибка — сортировка по отформатированной строке. Запрос выполняется без ошибок, но строки отчёта идут вразнобой. Признак: даты в колонке упорядочены как текст («01.01», «01.02», «02.01»). Лечение — сортировать по исходному полю даты, а форматированную колонку использовать только для показа.

Вторая ошибка — применение ФОРМАТ к полю составного типа, где кроме даты может лежать NULL или строка. Для NULL функция вернёт пустую строку, и пользователь увидит пропуски. Перед форматированием такие поля стоит обернуть в ЕСТЬNULL или отфильтровать условием ГДЕ Поле ССЫЛКА ... / Поле ЕСТЬ НЕ NULL.

Третья группа проблем — неверный шаблон: перепутанные регистры мм (минуты) и ММ (месяц), лишние пробелы в параметре ДЛФ, кавычки внутри шаблона без экранирования. Запрос с ошибочным параметром ДЛФ обычно падает с сообщением о неверном формате, а ошибка внутри ДФ может молча дать неожиданный текст. Поэтому шаблон всегда проверяют на одном известном значении.

Типичные ошибки
01
Сортировка по строке из ФОРМАТ — хронологический порядок ломается без сообщений об ошибке
02
Форматирование поля, где встречается NULL — в результате появляются пустые строки
03
Путаница мм и ММ в шаблоне ДФ — вместо месяца выводятся минуты
04
Использование строки из ФОРМАТ в соединении таблиц — соединение не срабатывает или работает медленно
05
Ожидание, что ФОРМАТ изменит тип поля в итоговой таблице — функция всегда возвращает строку

Как проверить результат перед переносом в отчёт

Перед тем как встраивать форматирование в рабочий отчёт, выполните запрос в консоли запросов на реальных данных и сверьте три вещи: вид строки, поведение на граничных значениях и сортировку. Граничные значения — это пустая дата (01.01.0001), NULL в необязательных полях и даты с ненулевым временем.

Пустая дата при форматировании ДЛФ=D возвращает «01.01.0001» или пустую строку в зависимости от контекста — если такие записи возможны, добавьте обработку через ВЫБОР КОГДА Дата = ДАТАВРЕМЯ(1,1,1) ТОГДА "" ИНАЧЕ ФОРМАТ(...) КОНЕЦ. Это избавит печатную форму от странных значений.

Для финальной проверки полезно вывести рядом исходную дату и отформатированную строку и убедиться, что они соответствуют друг другу на нескольких разных документах, включая документы за разные месяцы и годы.

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

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

Тип колонки результата
Норма

Строка — если колонка только для показа; Дата — если нужна сортировка и группировка

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

Строка используется в сортировке или соединении

Значение на документе с временем
Норма

При ДЛФ=D время не выводится

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

В строке присутствует 0:00:00 или другое время

Записи с пустой датой или NULL
Норма

Пустая строка или осмысленная замена через ВЫБОР/ЕСТЬNULL

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

Значение 01.01.0001 попадает в отчёт

Порядок строк
Норма

Даты идут хронологически

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

Порядок лексикографический: 01.02 раньше 02.01

Если отчёт строится на СКД, предпочтительнее оставить в запросе исходную дату, а формат задать в настройках оформления поля. Тогда группировки по периодам, итоги и сортировка работают корректно, а представление меняется без правки запроса.
ПЗ
Практическое замечание

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

Можно ли в запросе 1С получить только месяц и год из даты?

Да. Для строки используйте ФОРМАТ(Дата, "ДФ='MMMM yyyy'") — получится «март 2026». Если нужен результат для группировки, примените НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ) — тип останется «Дата», и итоги по месяцам будут корректными.

Почему ФОРМАТ возвращает пустую строку для части записей?

Скорее всего, в поле встречается значение NULL — например, после левого соединения или в необязательном реквизите. Проверьте данные условием Поле ЕСТЬ NULL и обработайте такие случаи через ЕСТЬNULL или конструкцию ВЫБОР КОГДА ... ТОГДА ... КОНЕЦ.

Как вывести дату в формате ГГГГ-ММ-ДД для выгрузки в другую систему?

Используйте явный шаблон: ФОРМАТ(Дата, "ДФ=yyyy-MM-dd"). Такой формат не зависит от региональных настроек сервера и одинаково читается на любой базе, что важно для обмена данными.

Чем ФОРМАТ в запросе отличается от Формат() в коде?

Обе функции используют одинаковые форматные строки и дают строку. Разница в месте выполнения: ФОРМАТ в запросе выполняется при выборке данных, а Формат() в коде — после, при обходе результата. Если дата нужна ещё и для вычислений, форматируйте в коде, а в запросе оставляйте исходное значение.

Можно ли отформатировать дату в параметре виртуальной таблицы?

Нет, параметры виртуальных таблиц (например, период в Оборотах регистра накопления) принимают значения типа «Дата», а не строки. Форматирование там не нужно — передайте дату через &Период, а строку для показа формируйте уже в секции ВЫБРАТЬ.

Как избавиться от времени, но сохранить возможность сортировки?

Примените НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) — значение останется датой с нулевым временем, сортировка и группировка будут работать правильно. Функцию ФОРМАТ для этой цели использовать не стоит, так как она возвращает строку.

Итог

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

Функция ФОРМАТ(Поле, "ДЛФ=D") преобразует дату в строку прямо в запросе; для даты со временем используйте ДЛФ=DT, для даты прописью — ДЛФ=DD, для произвольного шаблона — ДФ. Результат всегда строка: сортировку, группировку и соединения делайте по исходной дате или по НАЧАЛОПЕРИОДА, а форматированную колонку оставляйте только для вывода.