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

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

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

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

Задача преобразовать дату в строку в запросе 1С возникает регулярно: при выгрузке данных в сторонние системы, формировании текстовых полей для печатных форм, склейке реквизитов в одно представление. Главная сложность в том, что язык запросов 1С не содержит прямой функции форматирования даты в произвольный строковый шаблон — в отличие от встроенного языка, где есть Формат(). Поэтому разработчику приходится выбирать между ограниченным приведением типов и переносом форматирования на этап обхода результата запроса.

В этой статье разобраны все рабочие способы: приведение даты к строке через ВЫРАЗИТЬ, использование функции ПРЕДСТАВЛЕНИЕ, форматирование после выполнения запроса через Формат(), а также построение нужного формата вручную через функции ГОД, МЕСЯЦ, ДЕНЬ. Для каждого варианта указаны ограничения, типичные ошибки и способы проверить, что результат получился именно таким, как ожидалось.

Почему ВЫРАЗИТЬ дату как строку напрямую нельзя

Конструкция ВЫРАЗИТЬ(Поле КАК Строка(50)) в языке запросов 1С предназначена для приведения типов в ограниченном наборе случаев: сужение составного типа, преобразование числа в строку и обратно в поддерживаемых сочетаниях. Преобразование даты в строку через ВЫРАЗИТЬ в стандартном синтаксисе запросов не поддерживается — попытка выполнить такой запрос завершится ошибкой вида «Несовместимые типы ВЫРАЗИТЬ» или подобной, в зависимости от версии платформы.

Это осознанное ограничение платформы: строковое представление даты зависит от региональных настроек, локали и требуемого шаблона, а запрос должен давать детерминированный результат на уровне СУБД. Поэтому вместо одной универсальной функции разработчику предлагается несколько обходных путей, каждый со своими границами применения.

Способ 1. Функция ПРЕДСТАВЛЕНИЕ — быстрый читаемый вид

Функция ПРЕДСТАВЛЕНИЕ возвращает строковое представление значения, аналогичное тому, что пользователь видит в интерфейсе. Для даты это будет строка вида «15.03.2026» или с учётом настроек по умолчанию. Синтаксис прост:

ВЫБРАТЬ

ПРЕДСТАВЛЕНИЕ(РеализацияТоваровУслуг.Дата) КАК ДатаСтрокой,

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

ИЗ

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

Главное преимущество — работает в чистом запросе, не требует постобработки. Главные ограничения: формат представления нельзя настроить (нельзя получить «2026-03-15» или «15 марта»), и результат зависит от региональных установок информационной базы или сеанса. Для обменов со строгим форматом, например ISO 8601, этот способ не подходит.

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

Способ 2. Сборка формата из функций ГОД, МЕСЯЦ, ДЕНЬ

Когда нужен строго определённый формат прямо в запросе (например, «ГГГГ-ММ-ДД» для выгрузки), строку можно собрать вручную из функций извлечения частей даты: ГОД(), МЕСЯЦ(), ДЕНЬ(), ЧАС(), МИНУТА(), СЕКУНДА(). Эти функции возвращают числа, которые приводятся к строке и конкатенируются.

ВЫБРАТЬ

ВЫРАЗИТЬ(ГОД(Заказы.Дата) КАК Строка(4)) + "-"

+ ПОДСТРОКА("0" + ВЫРАЗИТЬ(МЕСЯЦ(Заказы.Дата) КАК Строка(2)),

ДЛИНАСТРОКИ(ВЫРАЗИТЬ(МЕСЯЦ(Заказы.Дата) КАК Строка(2))), 2) + "-"

+ ПОДСТРОКА("0" + ВЫРАЗИТЬ(ДЕНЬ(Заказы.Дата) КАК Строка(2)),

ДЛИНАСТРОКИ(ВЫРАЗИТЬ(ДЕНЬ(Заказы.Дата) КАК Строка(2))), 2) КАК ДатаISO

ИЗ

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

Приём с ПОДСТРОКА("0" + ...) нужен, чтобы дополнить месяц и день ведущим нулём: «3» превращается в «03». Это громоздко, но даёт полный контроль над шаблоном и выполняется целиком на стороне СУБД, что важно при выгрузках больших объёмов без обхода выборки в коде.

Типичные ошибки
01
Забыть ведущий ноль: месяц 3 превращается в «3» вместо «03», и формат ломается для систем-потребителей
02
Использовать конкатенацию с NULL: если дата пустая (01.01.0001) или поле NULL, части выражения могут дать неожиданный результат — добавляйте ЕСТЬNULL или проверку
03
Писать ВЫРАЗИТЬ(Дата КАК Строка) и ожидать форматирование — запрос упадёт с ошибкой несовместимых типов

Способ 3. Форматирование после запроса через Формат()

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

Запрос = Новый Запрос;

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

"ВЫБРАТЬ

| Реализация.Дата КАК Дата,

| Реализация.Номер

|ИЗ

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

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

ДатаСтрокой = Формат(Выборка.Дата, "ДФ=yyyy-MM-dd");

ДатаПрописью = Формат(Выборка.Дата, "ДЛФ=D");

КонецЦикла;

Конструкция ДФ=yyyy-MM-dd задаёт точный шаблон, ДЛФ=D — длинный формат даты по региональным настройкам («15 марта 2026 г.»). Также доступны параметры локали через Л=, что важно для многоязычных выгрузок. Этот способ снимает все ограничения запроса, но требует обхода результата в коде — для пакетной выгрузки миллионов строк это дополнительные накладные расходы, хотя обычно несущественные.

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

ПРЕДСТАВЛЕНИЕ(Дата)

Подходит для отчётов и быстрых выборок, где формат не критичен. Не подходит для обменов с фиксированным шаблоном

Сборка из ГОД/МЕСЯЦ/ДЕНЬ

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

Формат() при обходе выборки

Наиболее гибкий вариант, любые шаблоны и локали. Минус — требуется код обхода результата, не работает внутри СКД-выражений на уровне запроса

Особый случай: дата в СКД и в параметрах виртуальных таблиц

В схеме компоновки данных (СКД) форматирование даты обычно не делают в тексте запроса вообще. Вместо этого поле оставляют типом «Дата», а представление настраивают через оформление поля на закладке «Наборы данных» (параметр «Формат») или программно через элементы оформления. Это правильный путь: СКД сама применит нужный шаблон при выводе, а запрос останется чистым и быстрым.

Отдельная ситуация — передача даты строкой в параметр. Так делать не следует: параметры виртуальных таблиц и условия отбора должны получать значение типа «Дата», а не её строковое представление. Передача строки приведёт либо к ошибке, либо к неявному преобразованию, зависящему от настроек, что является источником трудно отлавливаемых ошибок в отчётах.

Проверка результата и границы применения

После внедрения любого из способов результат стоит проверить на граничных случаях: пустая дата (01.01.0001), NULL в необязательных полях, январь и первые числа месяца (проверка ведущих нулей), даты с временем, когда время должно быть отброшено или наоборот сохранено. Для функции ПРЕДСТАВЛЕНИЕ дополнительно проверьте, как результат выглядит при других региональных настройках сеанса, если база используется в разных локалях.

Если строковая дата участвует в соединениях или сравнениях — это тревожный признак. Сравнение дат как строк («2026-03-15» > «2026-12-01» может дать неверный результат при другом шаблоне) почти всегда является ошибкой проектирования. Сравнивайте и соединяйте даты как даты, а в строку преобразуйте только на финальном этапе вывода или выгрузки.

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

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

Месяц и день меньше 10
Норма

Выводится «03», «07» с ведущим нулём

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

Выводится «3», «7» — формат нарушен

Пустая дата или NULL
Норма

Получается предсказуемое значение (пустая строка или «01.01.0001» по ТЗ)

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

Ошибка запроса или строка из нулей, ломающая выгрузку

Дата со временем
Норма

Время отброшено или включено по требованию формата

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

Время «прилипает» к строке неожиданно, например «15.03.2026 0:00:00»

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

Можно ли в запросе 1С получить дату в формате «ГГГГММДД» без разделителей?

Да, через сборку из функций ГОД, МЕСЯЦ, ДЕНЬ с дополнением ведущих нулей приёмом ПОДСТРОКА("0" + ...). Либо проще — выбрать дату как есть и применить Формат(Дата, "ДФ=yyyyMMdd") при обходе результата.

Почему запрос с ВЫРАЗИТЬ(Дата КАК Строка) падает с ошибкой?

Потому что приведение даты к строке через ВЫРАЗИТЬ не входит в список поддерживаемых преобразований типов в языке запросов. Платформа сообщает о несовместимых типах. Используйте ПРЕДСТАВЛЕНИЕ или форматирование на стороне встроенного языка.

Чем ПРЕДСТАВЛЕНИЕ отличается от Формат()?

ПРЕДСТАВЛЕНИЕ работает внутри запроса, но не позволяет задать шаблон — вид зависит от настроек. Формат() работает только во встроенном языке после выполнения запроса, зато даёт полный контроль над шаблоном и локалью.

Как вывести дату прописью, например «15 марта 2026 г.»?

В запросе это невозможно. Выберите дату обычным полем и при обходе выборки примените Формат(Дата, "ДЛФ=D") — длинный формат даты по региональным настройкам.

Влияет ли преобразование даты в строку на скорость запроса?

Да. И ПРЕДСТАВЛЕНИЕ, и сложная сборка из функций выполняются для каждой строки и мешают оптимизатору СУБД. На больших выборках предпочтительнее выбирать дату как дату и форматировать при обходе результата.

Можно ли отформатировать дату в отчёте на СКД без изменения запроса?

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

Итог

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

Прямого ВЫРАЗИТЬ(Дата КАК Строка) в запросах 1С нет. Используйте ПРЕДСТАВЛЕНИЕ для простого отображения, сборку из ГОД/МЕСЯЦ/ДЕНЬ для жёсткого формата внутри запроса и Формат() при обходе выборки для полного контроля. Даты сравнивайте и соединяйте только как даты, в строку переводите на финальном этапе.