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

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

Дата как строка в запросе 1С: способы преобразования

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

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

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

Ниже разобраны все рабочие способы с примерами кода, особенностями поведения на разных СУБД и типичными ошибками, которые приводят к неожиданному результату или падению производительности запроса.

Функция ПРЕДСТАВЛЕНИЕ: самый простой способ

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

ВЫБРАТЬ

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

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

ИЗ

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

Главное ограничение — непредсказуемость формата. На одном сервере результат может быть «15.03.2026 10:30:00», на другом — с другим разделителем или порядком частей. Если строка дальше используется для сравнения, сортировки или выгрузки во внешнюю систему с фиксированным форматом, ПРЕДСТАВЛЕНИЕ не подходит.

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

Сборка строки из частей даты: ГОД, МЕСЯЦ, ДЕНЬ

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

Сложность в том, что месяц и день меньше 10 нужно дополнить ведущим нулём. Стандартный приём — взять ПОДСТРОКА от строки «0» + число, либо использовать условие ВЫБОР. Пример сборки формата «ГГГГ-ММ-ДД»:

ВЫБРАТЬ

ПОДСТРОКА(ПРЕДСТАВЛЕНИЕ(ГОД(Таблица.Дата)), 1, 4)

+ "-"

+ ВЫБОР

КОГДА МЕСЯЦ(Таблица.Дата) < 10

ТОГДА "0" + ПРЕДСТАВЛЕНИЕ(МЕСЯЦ(Таблица.Дата))

ИНАЧЕ ПРЕДСТАВЛЕНИЕ(МЕСЯЦ(Таблица.Дата))

КОНЕЦ

+ "-"

+ ВЫБОР

КОГДА ДЕНЬ(Таблица.Дата) < 10

ТОГДА "0" + ПРЕДСТАВЛЕНИЕ(ДЕНЬ(Таблица.Дата))

ИНАЧЕ ПРЕДСТАВЛЕНИЕ(ДЕНЬ(Таблица.Дата))

КОНЕЦ КАК ДатаСтрокой

ИЗ

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

Такой запрос громоздок, но даёт полностью контролируемый результат, не зависящий от настроек сервера. Формат «ГГГГ-ММ-ДД» к тому же корректно сортируется как строка, что полезно при группировках и объединениях.

Форматирование после запроса во встроенном языке

Часто рациональнее не мучить запрос, а получить дату как есть и отформатировать её функцией Формат() при обходе результата. Это быстрее, читабельнее и даёт все возможности форматной строки:

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

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

ДатаСтрокой = Формат(Выборка.Дата, "ДЛФ=D"); // 15.03.2026

ДатаВремя = Формат(Выборка.Дата, "ДЛФ=DT"); // 15.03.2026 10:30:00

ДатаISO = Формат(Выборка.Дата, "ДФ=yyyy-MM-dd"); // 2026-03-15

КонецЦикла;

Параметр ДФ (для произвольного формата) поддерживает шаблоны yyyy, MM, dd, HH, mm, ss и их комбинации, а ДЛФ — предопределённые локальные форматы. Этот способ предпочтителен, когда строка нужна только на этапе вывода: в печатную форму, файл обмена, сообщение пользователю.

Минус очевиден: если строковая дата нужна внутри самого запроса — для объединения с другой таблицей по строковому ключу или для группировки — форматирование после выполнения не поможет, и придётся использовать приёмы из предыдущих разделов.

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

ПРЕДСТАВЛЕНИЕ в запросе

Быстро писать, подходит для отображения пользователю. Не подходит для сортировки, обмена и фиксированных форматов.

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

Полный контроль формата прямо в запросе. Громоздкий код, требует дополнения нулями, сложнее сопровождать.

Формат() после запроса

Гибкие форматные строки, чистый запрос. Не работает, если строка нужна внутри самого запроса.

Форматирование в СКД

Декларативно, без кода. Применимо только к отчётам на СКД, не к произвольным запросам.

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

Если дата выводится в отчёте на системе компоновки данных, форматировать её лучше средствами самой СКД, оставив в запросе поле типа Дата. Для этого в настройках поля на закладке «Наборы данных» или в пользовательских настройках поля задаётся параметр «Формат» — та же форматная строка, что и во встроенном языке, например ДФ=dd.MM.yyyy.

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

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

Порядок действий для отчёта СКД
  1. 1
    В запросе набора данных оставьте поле даты без преобразований — тип Дата.
  2. 2
    На закладке «Наборы данных» найдите поле даты и в колонке «Формат» укажите, например, ДФ=dd.MM.yyyy.
  3. 3
    Проверьте сортировку и группировку отчёта — они должны работать по исходной дате, а не по строке.
  4. 4
    Если нужны разные форматы, создайте отдельные варианты настроек с разными значениями параметра Формат.

Обратная задача: строка в дату и сравнение с параметром

Часто «дата как строка» встречается в зеркальной ситуации: дата хранится в строковом реквизите (например, при загрузке из Excel или внешних систем), и её нужно сравнить с настоящей датой. Прямого преобразования строки в дату в языке запросов нет — функции ДАТАВРЕМЯ принимает только числовые аргументы: ДАТАВРЕМЯ(2026, 3, 15, 10, 30, 0).

Поэтому сравнение строки с датой в запросе невозможно без предварительной подготовки. Практические варианты: преобразовать строки в даты ещё на этапе загрузки данных во временную таблицу (через функцию Дата() встроенного языка), либо передавать параметр-дату и сравнивать с ней уже настоящие даты, а строковый реквизит не трогать.

Если строковое поле содержит дату в формате «ГГГГММДД», его можно сравнивать со строкой, собранной из частей параметра-даты тем же способом через ГОД/МЕСЯЦ/ДЕНЬ. Это работает, но медленно: по строковому выражению индекс не используется, и на больших таблицах запрос деградирует до полного сканирования.

Типичные ошибки
01
Использование ПРЕДСТАВЛЕНИЕ для сортировки — строки «01.02.2026» и «15.01.2026» сортируются лексикографически, а не хронологически.
02
Сравнение строковой даты с параметром типа Дата — типы не совпадают, условие либо не сработает, либо вызовет ошибку запроса.
03
Забытое дополнение нулями месяца и дня — получается «2026-3-5» вместо «2026-03-05», что ломает обмен и сортировку.
04
Сборка строки из даты в запросе по большой таблице там, где достаточно Формат() при выводе — лишняя нагрузка на СУБД.
05
Ожидание одинакового результата ПРЕДСТАВЛЕНИЕ на файловой базе и на сервере с другими региональными настройками.

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

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

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

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

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

Формат строки
Норма

Длина и разделители одинаковы для всех строк выборки

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

Часть строк короче — значит, не дополнены нулями месяц или день

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

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

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

В выгрузке появляется 01.01.0001

Сортировка
Норма

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

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

Порядок лексикографический — сортировка идёт по строке, а не по дате

Время выполнения
Норма

Запрос с преобразованием работает сопоставимо с запросом без него

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

Резкое замедление — преобразование попало в условие или соединение

FAQ

Можно ли в запросе 1С вызвать функцию Формат()?

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

Как получить из даты только месяц и год строкой «03.2026»?

Соберите строку из МЕСЯЦ и ГОД с дополнением нуля для месяца через ВЫБОР, либо после запроса используйте Формат(Дата, "ДФ=MM.yyyy"). Второй вариант короче и надёжнее.

Почему ПРЕДСТАВЛЕНИЕ возвращает разный формат на разных базах?

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

Как сравнить строковое поле с датой в условии запроса?

Напрямую никак: типы несовместимы. Либо преобразуйте строки в даты при загрузке данных и храните настоящий тип Дата, либо приведите параметр-дату к строке тем же форматом, что и хранимое поле, понимая, что индекс при этом не используется.

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

Обработайте её явно: ВЫБОР КОГДА Таблица.Дата = ДАТАВРЕМЯ(1,1,1) ТОГДА "" ИНАЧЕ ПРЕДСТАВЛЕНИЕ(Таблица.Дата) КОНЕЦ. Иначе в выгрузку попадёт «01.01.0001», что обычно выглядит как ошибка.

Какой формат строки-даты лучше для обмена с внешними системами?

Наиболее безопасен ISO-формат «ГГГГ-ММ-ДД» (и «ГГГГ-ММ-ДДTЧЧ:ММ:СС» для даты-времени): он однозначно читается, корректно сортируется как строка и не зависит от региональных настроек. Собирайте его из частей даты или формируйте функцией Формат с шаблоном ДФ=yyyy-MM-dd.

Итог

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

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