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

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

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

Как в запросе 1С преобразовать дату в строку: функция ПРЕДСТАВЛЕНИЕ, ограничения ВЫРАЗИТЬ, форматирование через Формат() и типичные ошибки разработчиков.

Задача преобразовать дату в строку в запросе 1С возникает регулярно: при формировании подписей в отчётах, при объединении даты с другими строковыми полями, при выгрузке данных во внешние системы. Проблема в том, что язык запросов 1С не содержит прямого аналога функции FORMAT или CONVERT с указанием шаблона даты, а оператор ВЫРАЗИТЬ работает с датой иначе, чем ожидают начинающие разработчики.

Ключевой момент: ВЫРАЗИТЬ(Поле КАК СТРОКА(10)) не преобразует дату в строку в нужном формате — такая конструкция либо вернёт пустую строку, либо вызовет ошибку, потому что ВЫРАЗИТЬ предназначен для приведения типов составных полей и усечения строк, а не для форматирования. Для представления даты строкой в запросе существует отдельный механизм.

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

Почему ВЫРАЗИТЬ не преобразует дату в строку

Оператор ВЫРАЗИТЬ в языке запросов 1С выполняет приведение типа значения, но с важным ограничением: он не умеет преобразовывать примитивные типы между собой произвольно. Допустимые сценарии — усечение строки до указанной длины, уточнение типа составного поля (например, привести составной реквизит к конкретному ссылочному типу), преобразование числа к нужной разрядности.

Попытка написать ВЫРАЗИТЬ(Документ.Дата КАК СТРОКА(19)) не даст строку с датой. В зависимости от версии платформы и контекста запрос либо не пройдёт проверку, либо вернёт пустое значение. Это одна из самых частых ошибок у разработчиков, пришедших из SQL, где CAST и CONVERT действительно форматируют даты.

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

Способ 1. Функция ПРЕДСТАВЛЕНИЕ

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

ВЫБРАТЬ

ПРЕДСТАВЛЕНИЕ(Документ.Дата) КАК ДатаСтрокой

ИЗ

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

Результат — строка с датой в формате, который платформа использует по умолчанию для текущих региональных настроек информационной базы. Обычно это вид вида «01.03.2026 10:30:00» для даты со временем. Точный вид зависит от настроек, поэтому полагаться на конкретный шаблон при переносе решения между базами не стоит.

У ПРЕДСТАВЛЕНИЕ есть важная особенность: для ссылочных типов функция возвращает представление объекта, которое формируется платформой (например, «Реализация товаров и услуг 0000-000123 от 01.03.2026»). Это удобно для отчётов, но делает результат непригодным для машинной обработки и обмена данными.

Когда ПРЕДСТАВЛЕНИЕ подходит

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

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

Способ 2. Сборка строки из частей даты

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

ВЫБРАТЬ

ПРЕДСТАВЛЕНИЕ(ГОД(Документ.Дата)) + "-" +

ПРЕДСТАВЛЕНИЕ(МЕСЯЦ(Документ.Дата)) + "-" +

ПРЕДСТАВЛЕНИЕ(ДЕНЬ(Документ.Дата)) КАК ДатаСтрокой

ИЗ

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

Проблема этого подхода — отсутствие ведущих нулей: функция МЕСЯЦ() для марта вернёт число 3, и строка получится вида «2026-3-1» вместо «2026-03-01». Для выгрузок, где формат строго фиксирован, это критично. Обходной путь — конструкция ВЫБОР с добавлением нуля для значений меньше 10, но запрос заметно разрастается:

ВЫБОР

КОГДА МЕСЯЦ(Документ.Дата) < 10

ТОГДА "0" + ПРЕДСТАВЛЕНИЕ(МЕСЯЦ(Документ.Дата))

ИНАЧЕ ПРЕДСТАВЛЕНИЕ(МЕСЯЦ(Документ.Дата))

КОНЕЦ

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

Способ 3. Форматирование после выполнения запроса

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

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

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

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

// ДатаСтрокой = "2026-03-01"

КонецЦикла;

Полезные конструкции форматной строки для дат: ДФ=dd.MM.yyyy — классический вид «дд.ММ.гггг», ДФ="dd MMMM yyyy" — дата с названием месяца, ДЛФ=D — длинный формат даты по региональным настройкам, ДЛФ=DT — дата со временем. Параметр ДЛФ удобен для интерфейсных строк, ДФ — для обмена данными, где нужен точный шаблон.

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

Сравнение способов

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

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

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

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

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

Максимальная гибкость и предсказуемый результат, но требует программной обработки выборки.

Сравнение способов и критерии выбора

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

СпособФормат контролируетсяРаботает без кодаПодходит для обмена
ПРЕДСТАВЛЕНИЕНетДаНет
ГОД/МЕСЯЦ/ДЕНЬ + конкатенацияДаДаДа, с оговорками
Формат() после запросаДаНетДа

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

Маршрут решения

Как выбрать способ

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

Типичные ошибки и их последствия

Первая ошибка — попытка сортировать или сравнивать даты, уже преобразованные в строки. Строка «01.03.2026» при лексикографическом сравнении окажется «меньше» строки «02.01.2026», хотя хронологически всё наоборот. Всегда сортируйте по исходному полю даты, а строковое представление добавляйте отдельной колонкой.

Вторая ошибка — использование ПРЕДСТАВЛЕНИЕ в условии отбора. Конструкция ГДЕ ПРЕДСТАВЛЕНИЕ(Дата) = "01.03.2026" не только зависит от региональных настроек, но и отключает использование индекса по полю даты: СУБД вынуждена вычислять представление для каждой строки таблицы. Отборы по дате задавайте только через сравнение самих дат или через периоды.

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

Типичные ошибки
01
ВЫРАЗИТЬ(Дата КАК СТРОКА) — не форматирует дату, результат пустой или ошибка запроса
02
Сортировка по строковому представлению даты — нарушается хронологический порядок
03
Отбор ГДЕ ПРЕДСТАВЛЕНИЕ(Дата) = ... — теряется индекс и ломается производительность
04
Конкатенация чисел из МЕСЯЦ() без ПРЕДСТАВЛЕНИЕ — ошибка несовместимости типов
05
Отсутствие ведущих нулей при ручной сборке — строка «2026-3-1» не пройдёт валидацию формата

Проверка результата

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

Для строк, собранных вручную, проверьте граничные случаи: январь (месяц 1), первые числа месяца, даты со временем 00:00:00. Именно на них проявляется проблема ведущих нулей. Если строка участвует в обмене, сверьте результат со спецификацией формата принимающей системы.

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

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

Вид строки из ПРЕДСТАВЛЕНИЕ
Норма

Дата читаема и соответствует ожиданиям пользователей

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

Формат отличается в разных базах — строка используется для обмена

Длина строки при ручной сборке
Норма

Для всех дат одинаковая длина, например 10 символов для ГГГГ-ММ-ДД

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

Длина «плавает» — не хватает ведущих нулей

Скорость запроса на большой таблице
Норма

Время выполнения сопоставимо с запросом без форматирования

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

Запрос заметно замедлился — стоит вынести форматирование в код

FAQ

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

Нет, в языке запросов нет функции форматирования даты по шаблону. Либо собирайте строку из ГОД(), МЕСЯЦ(), ДЕНЬ() с добавлением ведущих нулей через ВЫБОР, либо выбирайте дату как есть и применяйте Формат(Дата, "ДФ=yyyy-MM-dd") в коде после выполнения запроса.

Чем ПРЕДСТАВЛЕНИЕ отличается от ВЫРАЗИТЬ?

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

Почему ПРЕДСТАВЛЕНИЕ(Дата) в разных базах даёт разный вид строки?

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

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

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

Работает ли ПРЕДСТАВЛЕНИЕ с полем типа Дата в СКД?

Да, функция доступна в выражениях СКД и часто применяется для вычисляемых полей-подписей. Учитывайте, что представление вычисляется для каждой строки результата, поэтому на объёмных отчётах лучше форматировать дату ресурсами СКД или в макете, а не в запросе набора данных.

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

Да: оберните дату в ПРЕДСТАВЛЕНИЕ и соедините с текстовыми литералами оператором конкатенации «+», например ПРЕДСТАВЛЕНИЕ(Документ.Дата) + " — " + Документ.Комментарий. Все операнды должны быть строками, числовые части даты предварительно оборачивайте в ПРЕДСТАВЛЕНИЕ.

Итог

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

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