Разработка и Конфигурация · 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" не только зависит от региональных настроек, но и отключает использование индекса по полю даты: СУБД вынуждена вычислять представление для каждой строки таблицы. Отборы по дате задавайте только через сравнение самих дат или через периоды.
Третья ошибка — забыть про составные поля. Если реквизит имеет составной тип, включающий дату и другие типы, ПРЕДСТАВЛЕНИЕ вернёт представление фактического значения, а сборка через ГОД()/МЕСЯЦ() может дать неожиданный результат для недатовых значений. Перед обработкой уточните тип через ВЫРАЗИТЬ к типу Дата или проверьте значение функцией ТИПЗНАЧЕНИЯ.
Проверка результата
Быстрее всего проверить поведение конструкции в консоли запросов: выполните запрос на небольшой таблице и посмотрите фактический вид строки. Особенно важно проверить результат ПРЕДСТАВЛЕНИЕ, если решение будет работать в базах с разными региональными настройками.
Для строк, собранных вручную, проверьте граничные случаи: январь (месяц 1), первые числа месяца, даты со временем 00:00:00. Именно на них проявляется проблема ведущих нулей. Если строка участвует в обмене, сверьте результат со спецификацией формата принимающей системы.
Как проверить результат
Дата читаема и соответствует ожиданиям пользователей
Формат отличается в разных базах — строка используется для обмена
Для всех дат одинаковая длина, например 10 символов для ГГГГ-ММ-ДД
Длина «плавает» — не хватает ведущих нулей
Время выполнения сопоставимо с запросом без форматирования
Запрос заметно замедлился — стоит вынести форматирование в код
FAQ
Можно ли в запросе 1С получить дату в формате «ГГГГ-ММ-ДД» одной функцией?
Нет, в языке запросов нет функции форматирования даты по шаблону. Либо собирайте строку из ГОД(), МЕСЯЦ(), ДЕНЬ() с добавлением ведущих нулей через ВЫБОР, либо выбирайте дату как есть и применяйте Формат(Дата, "ДФ=yyyy-MM-dd") в коде после выполнения запроса.
Чем ПРЕДСТАВЛЕНИЕ отличается от ВЫРАЗИТЬ?
ВЫРАЗИТЬ приводит значение к указанному типу (усечение строки, уточнение составного типа) и не форматирует даты. ПРЕДСТАВЛЕНИЕ возвращает строковое представление значения любого типа в формате платформы по умолчанию. Для превращения даты в строку используется именно ПРЕДСТАВЛЕНИЕ.
Почему ПРЕДСТАВЛЕНИЕ(Дата) в разных базах даёт разный вид строки?
Формат представления зависит от региональных настроек информационной базы и сеанса. Поэтому результат ПРЕДСТАВЛЕНИЕ нельзя использовать в сценариях, где требуется строго фиксированный шаблон, — для этого подходит только функция Формат() с явной форматной строкой.
Как отобрать документы по дате, если дата хранится в строковом реквизите?
Правильный путь — не сравнивать строки, а хранить дату в реквизите типа Дата. Если переделать структуру нельзя, приводите строку к дате на этапе обработки данных или сравнивайте строки только при гарантированно фиксированном формате вида «ГГГГММДД», где лексикографический порядок совпадает с хронологическим.
Работает ли ПРЕДСТАВЛЕНИЕ с полем типа Дата в СКД?
Да, функция доступна в выражениях СКД и часто применяется для вычисляемых полей-подписей. Учитывайте, что представление вычисляется для каждой строки результата, поэтому на объёмных отчётах лучше форматировать дату ресурсами СКД или в макете, а не в запросе набора данных.
Можно ли соединить дату и произвольный текст в одном поле запроса?
Да: оберните дату в ПРЕДСТАВЛЕНИЕ и соедините с текстовыми литералами оператором конкатенации «+», например ПРЕДСТАВЛЕНИЕ(Документ.Дата) + " — " + Документ.Комментарий. Все операнды должны быть строками, числовые части даты предварительно оборачивайте в ПРЕДСТАВЛЕНИЕ.
Что важно запомнить
ВЫРАЗИТЬ не форматирует даты — для строкового представления используйте ПРЕДСТАВЛЕНИЕ (для отображения) или функцию Формат() после выполнения запроса (для обмена и строгих шаблонов). Сортировку и отборы всегда выполняйте по исходному полю даты, а не по его строковому представлению.