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

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

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

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

В языке запросов 1С нет привычной функции преобразования типов вроде CAST в SQL, поэтому задача «выразить дату как строку» решается иначе — чаще всего через функцию ФОРМАТ. Она принимает значение и строку форматирования и возвращает текстовое представление даты в нужном виде: «01.03.2026», «март 2026» или «2026-03-01».

Важно понимать контекст задачи. Если дата нужна как строка для вывода в отчёт, печатную форму или наименование — ФОРМАТ подходит идеально. Если же цель — сравнить дату со строкой или отобрать записи по части даты, преобразование в строку обычно не нужно вовсе: правильнее работать с датой как с датой через НАЧАЛОПЕРИОДА, КОНЕЦПЕРИОДА и ГОД/МЕСЯЦ/ДЕНЬ.

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

Функция ФОРМАТ: основной способ преобразования даты в строку

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

ВЫБРАТЬ

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

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

ИЗ

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

Результатом будет строка вида «01.03.2026». Тип поля в выборке — Строка, что легко проверить в консоли запросов или через выгрузку в таблицу значений. Если передать в ФОРМАТ значение NULL, результат тоже будет NULL, а не пустая строка — это важно учитывать при соединениях и левых объединениях.

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

Форматные строки для даты: ДЛФ и ДФ

Конструкция ДЛФ (дата локального формата) даёт предопределённые варианты представления. Основные значения: D — краткая дата «01.03.2026», DD — длинная дата «1 марта 2026 г.», DT — дата со временем, T — только время. Эти варианты зависят от региональных настроек сеанса, поэтому на разных информационных базах вид строки может отличаться.

Конструкция ДФ позволяет собрать произвольный шаблон: д — день, М — месяц, г — год, ч — час, м — минута, с — секунда. Количество символов задаёт длину компоненты: «дд» — двузначный день, «ММММ» — полное название месяца.

Форматная строкаПример результатаКогда применять
ДЛФ=D01.03.2026Привычный короткий вид для отчётов
ДЛФ=DD1 марта 2026 г.Печатные формы, приказы, письма
ДЛФ=DT01.03.2026 14:25:30Дата со временем для журналов
ДФ=yyyy-MM-dd2026-03-01Обмен данными, выгрузки, сортировка как строка
ДФ="ММММ yyyy"март 2026Группировка и подписи по месяцам
ДФ="дд.ММ.гггг чч:мм"01.03.2026 14:25Метки времени без секунд

Шаблон ДФ=yyyy-MM-dd особенно полезен, когда строковое представление будет участвовать в сортировке или сравнении: лексикографический порядок таких строк совпадает с хронологическим. Формат «дд.ММ.гггг» этим свойством не обладает — строка «02.01.2026» окажется «больше», чем «15.12.2023».

Когда строка не нужна: отборы и сравнения по дате

Частая ошибка — преобразовывать дату в строку, чтобы потом сравнить её с другой строкой или отобрать записи. Такой подход ломает использование индексов, замедляет запрос и порождает ошибки сравнения из-за форматов. Для отборов по периоду в языке запросов есть прямые инструменты.

ВЫБРАТЬ

Продажи.Регистратор КАК Документ

ИЗ

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

ГДЕ

Продажи.Период МЕЖДУ &НачалоПериода И &КонецПериода

Если границы периода заданы датами без времени, корректнее использовать НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА: КОНЕЦПЕРИОДА(&Дата, ДЕНЬ) вернёт 23:59:59 указанного дня, и документы, проведённые в течение дня, не выпадут из выборки.

Для отбора по году, месяцу или дню применяются одноимённые функции: ГОД(Период) = 2026, МЕСЯЦ(Период) = 3. Они возвращают числа, а не строки, что тоже избавляет от преобразования типов и сохраняет возможность оптимизации запроса.

Получение частей даты: числа и составные строки

Функции ГОД, МЕСЯЦ, ДЕНЬ, ЧАС, МИНУТА, СЕКУНДА, ДЕНЬНЕДЕЛИ, ДЕНЬГОДА, НЕДЕЛЯГОДА и КВАРТАЛ извлекают из даты числовые компоненты. Если нужна строка — например, «2026-03» для группировки по месяцам — есть два пути: ФОРМАТ с шаблоном или конкатенация числовых частей.

ВЫБРАТЬ

ФОРМАТ(Продажи.Период, "ДФ=yyyy-MM") КАК МесяцСтрокой,

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

ИЗ

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

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

ФОРМАТ(Продажи.Период, "ДФ=yyyy-MM")

Вариант с ФОРМАТ компактнее и надёжнее конкатенации: при склейке ГОД(Период) + "-" + МЕСЯЦ(Период) пришлось бы дополнять месяц нулём слева и приводить числа к строке, что в запросе делается громоздко. Кроме того, в схеме компоновки данных и в построителе отчёта ФОРМАТ работает без дополнительных вычисляемых полей.

Для представления периода в отчётах на СКД часто удобнее вообще не преобразовывать дату в запросе, а использовать стандартные поля-периоды (ПериодМесяц, ПериодНеделя) в таблицах оборотов и виртуальных таблицах регистров — платформа сама сформирует корректные даты начала периодов.

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

ФОРМАТ(Дата, шаблон)

Универсально, любой вид строки. Подходит для вывода и группировок. Не подходит для отборов — теряется индексация.

НАЧАЛОПЕРИОДА / КОНЕЦПЕРИОДА

Для границ отборов и приведения даты к началу дня, месяца, квартала. Возвращает дату, а не строку.

ГОД, МЕСЯЦ, ДЕНЬ

Числовые компоненты даты для условий и вычислений. Строку не дают, но и не требуют преобразования типов.

Представление() во встроенном языке

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

Практические сценарии

Дата в наименовании или комментарии

Когда строковое представление даты нужно включить в текстовое поле — например, сформировать комментарий «Отгрузка от 01.03.2026» — ФОРМАТ применяется прямо в списке полей, а результат склеивается оператором конкатенации «+»:

ВЫБРАТЬ

"Отгрузка от " + ФОРМАТ(Заказ.ДатаОтгрузки, "ДЛФ=D") КАК Описание

ИЗ

Документ.ЗаказКлиента КАК Заказ

Дата в параметре виртуальной таблицы

В параметрах виртуальных таблиц (Остатки, Обороты, СрезПоследних) даты передаются как даты, а не строки. Если на входе оказалась строка, преобразуйте её в дату во встроенном языке через Дата() до передачи в запрос — в самом языке запросов обратного преобразования строки в дату не существует.

Пустая дата

Пустая дата в 1С — это 01.01.0001 00:00:00. ФОРМАТ от неё вернёт «01.01.0001», что в отчёте выглядит как мусор. Обрабатывайте такие случаи через ВЫБОР: если дата равна ДАТАВРЕМЯ(1,1,1), выводите пустую строку или прочерк.

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

Проверка результата и типичные ошибки

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

Самая частая ошибка — сортировка по строковому представлению даты в формате «дд.ММ.гггг». Записи выстраиваются по алфавиту, а не по хронологии. Решение — сортировать по исходному полю даты, а строковое представление выводить только для показа, либо использовать шаблон yyyy-MM-dd.

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

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

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

Тип поля в результате запроса
Норма

Строка с ожидаемым видом даты

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

Дата без форматирования или NULL там, где ожидалась строка

Сортировка результата
Норма

Записи идут в хронологическом порядке

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

Порядок алфавитный: 02.01 раньше 15.12

Записи с незаполненной датой
Норма

Пустая строка или прочерк

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

Строка 01.01.0001 в отчёте

Скорость выполнения
Норма

Запрос отрабатывает быстро на рабочем объёме данных

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

Резкое замедление после добавления ФОРМАТ в условие — перенесите его в список полей

Ограничения и альтернативы

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

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

Наконец, помните про различие тонкостей СУБД: запрос с ФОРМАТ выполняется на сервере СУБД, и строковые операции над большими выборками стоят дороже, чем работа с датами. Если строка нужна только для финального вывода пользователю, разумно форматировать дату на этапе обработки результата, а не в самом запросе.

Итог

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

Дата в строку — функция ФОРМАТ с шаблонами ДЛФ и ДФ. Отборы и сравнения — только через даты: МЕЖДУ, НАЧАЛОПЕРИОДА, КОНЕЦПЕРИОДА, ГОД, МЕСЯЦ, ДЕНЬ. Не применяйте ФОРМАТ в условиях, обрабатывайте пустую дату 01.01.0001 и сортируйте по исходному полю, а не по строке.

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

Как вывести дату в виде «2026-03-01» для выгрузки в файл?

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

Можно ли в запросе преобразовать строку обратно в дату?

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

Почему ФОРМАТ возвращает NULL вместо строки?

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

Как сгруппировать данные по месяцам и вывести месяц строкой?

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

Чем отличаются ДЛФ и ДФ в форматной строке?

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

Как убрать «01.01.0001» для незаполненных дат?

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