Разработка и Конфигурация · 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 — только время. Эти варианты зависят от региональных настроек сеанса, поэтому на разных информационных базах вид строки может отличаться.
Конструкция ДФ позволяет собрать произвольный шаблон: д — день, М — месяц, г — год, ч — час, м — минута, с — секунда. Количество символов задаёт длину компоненты: «дд» — двузначный день, «ММММ» — полное название месяца.
| Форматная строка | Пример результата | Когда применять |
|---|---|---|
| ДЛФ=D | 01.03.2026 | Привычный короткий вид для отчётов |
| ДЛФ=DD | 1 марта 2026 г. | Печатные формы, приказы, письма |
| ДЛФ=DT | 01.03.2026 14:25:30 | Дата со временем для журналов |
| ДФ=yyyy-MM-dd | 2026-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Определите цель: вывод строки, группировка или отбор по дате
- 2Для вывода и группировки добавьте ФОРМАТ(ПолеДаты, "ДЛФ=D") или шаблон ДФ в список полей
- 3Для отбора используйте Период МЕЖДУ &Начало И &Конец с КОНЕЦПЕРИОДА для правой границы
- 4Обработайте пустые даты через ВЫБОР КОГДА Дата = ДАТАВРЕМЯ(1,1,1)
- 5Проверьте результат в консоли запросов: тип поля, вид строки, корректность границ периода
Проверка результата и типичные ошибки
После изменения запроса проверьте три вещи: тип поля в результате (строка или дата), вид строки на реальных данных с неоднозначными датами (например, 05.06 — день и месяц легко перепутать) и поведение на пустых и NULL-значениях. Удобнее всего это делать в консоли запросов с выгрузкой в таблицу значений.
Самая частая ошибка — сортировка по строковому представлению даты в формате «дд.ММ.гггг». Записи выстраиваются по алфавиту, а не по хронологии. Решение — сортировать по исходному полю даты, а строковое представление выводить только для показа, либо использовать шаблон yyyy-MM-dd.
Вторая типичная проблема — применение ФОРМАТ в секции ГДЕ или в условии соединения. Это отключает индексы и резко замедляет запрос на больших таблицах. Третья — ожидание, что ФОРМАТ вернёт пустую строку для NULL: на самом деле возвращается NULL, и конкатенация с 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) — это и есть пустая дата в языке запросов, сравнение с ней надёжно отсекает незаполненные значения.