Разработка и Конфигурация · 10 мин
Как в запросе 1С выразить дату как строку
Как в запросе 1С преобразовать дату в строку: функция ПРЕДСТАВЛЕНИЕ, форматирование через ФОРМАТ, подстановка в текст запроса и типичные ошибки разработчика.
В языке запросов 1С нет прямого аналога функции CONVERT или TO_CHAR, как в классических SQL-диалектах, поэтому задача «выразить дату как строку» решается несколькими обходными путями. Выбор способа зависит от того, где нужен результат: в самом запросе, в СКД, в динамическом списке или при программной сборке текста запроса.
Чаще всего разработчику требуется получить строковое представление даты для объединения с другими полями, вывода в отчёт в заданном формате или сравнения с текстовым реквизитом. Каждый сценарий имеет свои ограничения: например, функция ПРЕДСТАВЛЕНИЕ возвращает строку, но не позволяет управлять форматом, а явное приведение типов через ВЫРАЗИТЬ к строке для дат не поддерживается.
Важно понимать, что преобразование даты в строку в запросе почти всегда ведёт к потере возможности индексного поиска и корректной сортировки. Поэтому такое преобразование стоит выполнять на финальном этапе выборки, а не в условиях соединений и отборов.
Функция ПРЕДСТАВЛЕНИЕ — основной способ
Единственный штатный способ получить строковое представление даты непосредственно в тексте запроса — функция ПРЕДСТАВЛЕНИЕ(). Она принимает выражение любого типа и возвращает его строковое представление так, как оно было бы показано пользователю.
ВЫБРАТЬ
Документ.Дата КАК Дата,
ПРЕДСТАВЛЕНИЕ(Документ.Дата) КАК ДатаСтрокой
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
Для поля типа «Дата» функция вернёт строку вида «01.01.2026 0:00:00» — с учётом региональных настроек информационной базы. Это значит, что на разных базах формат может отличаться, и полагаться на фиксированный вид строки в прикладной логике нельзя.
У ПРЕДСТАВЛЕНИЕ есть важное ограничение: результат нельзя использовать в дальнейших вычислениях по датам, сортировка по такому полю идёт как по строке (лексикографически), а не по хронологии. Если нужна и дата для сортировки, и строка для отображения — выбирайте оба поля.
Почему ВЫРАЗИТЬ к строке не работает
Частая попытка — использовать оператор ВЫРАЗИТЬ(Документ.Дата КАК СТРОКА(19)). Для дат это не сработает: приведение типа «Дата» к «Строка» через ВЫРАЗИТЬ в языке запросов не поддерживается, и конструктор запроса либо выдаст ошибку, либо вернёт пустое значение в зависимости от контекста.
Оператор ВЫРАЗИТЬ предназначен для сужения составного типа (например, привести ссылку к конкретному типу документа) и для округления чисел и строк, но не для конверсии между несовместимыми типами. Дата и строка — как раз несовместимые типы.
Если требуется получить компоненты даты как числа (год, месяц, день), используйте функции ГОД(), МЕСЯЦ(), ДЕНЬ(), ЧАС(), МИНУТА(), СЕКУНДА(). Их результат можно складывать со строками через конкатенацию, предварительно приведя числа к строке — но и здесь ВЫРАЗИТЬ к строке не поможет, поэтому на практике сборку форматированной строки делают в коде.
Форматирование даты после выборки
Самый управляемый вариант — выбрать дату в запросе как есть и отформатировать её в коде функцией Формат(). Это даёт полный контроль над видом строки и не зависит от региональных настроек.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Документ.Дата КАК Дата
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Документ";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ДатаСтрокой = Формат(Выборка.Дата, "ДЛФ=D"); // 01.01.2026
ДатаВремя = Формат(Выборка.Дата, "ДФ='dd.MM.yyyy HH:mm:ss'");
КонецЦикла;
Функция Формат поддерживает параметры ДЛФ (локальный формат даты) и ДФ (произвольная строка формата), а также БЛ (локальное представление). Через ДФ можно задать любой шаблон: «yyyy-MM-dd» для обмена с внешними системами, «dd MMMM yyyy» для печатных форм и т.д.
Этот подход также единственно правильный, когда строка даты нужна для обмена данными: XML, JSON и веб-сервисы ожидают строго определённые форматы (например, ISO 8601), которые в запросе получить невозможно.
ДатаСтрокой = Формат(Выборка.Дата, "ДФ=yyyy-MM-dd"); // ISO-формат для обменаДата как строка в СКД и динамических списках
В системе компоновки данных форматирование поля даты выполняется на закладке «Наборы данных» — в свойствах поля доступен пункт «Оформление», где задаётся форматная строка. При этом в источнике данных поле остаётся датой, что сохраняет корректную группировку и сортировку.
Если в СКД всё же нужно вычислить строковое поле, используйте вычисляемое поле с выражением на языке выражений СКД: там доступна функция Формат. Но помните, что вычисляемые поля не участвуют в индексной фильтрации на уровне СУБД.
В динамических списках произвольный запрос с ПРЕДСТАВЛЕНИЕ(Дата) работает, но ухудшает производительность списка: представление вычисляется для каждой отображаемой строки. Если цель — только красивый вывод, правильнее настроить формат колонки в свойствах таблицы формы, не меняя запрос.
Как выбрать способ
Подстановка даты строкой в текст запроса
Обратная задача — вставить дату в текст запроса в виде строкового литерала, например при динамической сборке запроса. Для этого существует формат литерала даты: ДАТАВРЕМЯ(2026, 1, 15, 10, 30, 0). Строку для подстановки формируют в коде:
ТекстЗапроса = "ВЫБРАТЬ * ИЗ Документ.Заказ ГДЕ Дата >= ДАТАВРЕМЯ("
+ Формат(Год(Период), "ЧГ=") + ","
+ Месяц(Период) + ","
+ День(Период) + ",0,0,0)";
Однако такой подход следует считать крайней мерой. Правильный способ передать дату в запрос — параметр: Запрос.УстановитьПараметр("Период", Период) и условие ГДЕ Дата >= &Период. Параметры исключают ошибки форматирования, проблемы с типами и риск некорректной интерпретации строки.
Типичные ошибки и их последствия
Первая распространённая ошибка — сравнение даты со строкой в условии запроса, например ГДЕ ПРЕДСТАВЛЕНИЕ(Дата) = "01.01.2026 0:00:00". Такое условие зависит от региональных настроек, не использует индексы и приводит к полному сканированию таблицы. Для отбора по дате всегда передавайте параметр типа «Дата».
Вторая ошибка — сортировка по строковому представлению. Строка «02.01.2026» при лексикографической сортировке окажется раньше «10.01.2023», что даёт неверный порядок в отчётах. Сортируйте по исходному полю даты, а строку выводите дополнительно.
Третья ошибка — попытка получить из ПРЕДСТАВЛЕНИЕ форматированную дату для обмена. Формат представления не гарантирован платформой и может измениться, поэтому для интеграций применяйте только Формат с явным шаблоном в коде.
Проверка результата
После применения любого из способов проверьте результат в консоли запросов: убедитесь, что тип поля в выборке — «Строка», а содержимое соответствует ожидаемому формату. Для ПРЕДСТАВЛЕНИЕ сверьте строку с тем, как дата отображается в форме списка документа.
Для форматирования в коде проверьте граничные случаи: пустая дата (01.01.0001) через Формат вернёт строку по шаблону, и её часто нужно обрабатывать отдельно — например, предварительно проверяя ЗначениеЗаполнено(Дата), чтобы не выводить «01.01.0001» в отчётах.
Как проверить результат
Строка при ПРЕДСТАВЛЕНИЕ, Дата при обычной выборке
Ожидали строку, а получили дату — функция не применена
Соответствует заданному шаблону Формат()
Формат «плывёт» между сеансами — использовано ПРЕДСТАВЛЕНИЕ вместо Формат
Хронологическая сортировка по полю даты
Строки перемешаны — сортировка идёт по строковому представлению
Частые вопросы
Можно ли в запросе получить дату в формате «ГГГГ-ММ-ДД»?
Напрямую в запросе — нет, язык запросов не имеет функции форматирования дат. Выберите дату обычным полем и примените в коде Формат(Дата, "ДФ=yyyy-MM-dd"). Либо соберите строку из ГОД(), МЕСЯЦ(), ДЕНЬ() в вычисляемом поле СКД, но это громоздко и медленнее.
Чем ПРЕДСТАВЛЕНИЕ отличается от ПРЕДСТАВЛЕНИЕССЫЛКИ?
ПРЕДСТАВЛЕНИЕССЫЛКИ работает только со ссылочными типами и возвращает представление объекта (например, «Реализация № 123 от 01.01.2026»). Для примитивных типов, включая дату, применяется обычное ПРЕДСТАВЛЕНИЕ.
Почему ПРЕДСТАВЛЕНИЕ(Дата) выдаёт разный формат на разных базах?
Представление формируется с учётом региональных настроек сеанса и информационной базы. Если нужен стабильный формат, не зависящий от настроек, используйте функцию Формат с явным шаблоном в коде.
Как отобрать документы за день, если дата хранится со временем?
Не преобразуйте дату в строку. Передайте два параметра — начало и конец дня — и используйте условие Дата МЕЖДУ &НачалоДня И &КонецДня, либо сравнение с НАЧАЛОПЕРИОДА(Дата, ДЕНЬ). Это сохраняет использование индексов.
Можно ли объединить дату и строку в одном поле запроса?
Да, через конкатенацию с ПРЕДСТАВЛЕНИЕ: например, "Заказ от " + ПРЕДСТАВЛЕНИЕ(Дата). Учтите, что оператор «+» в запросах 1С работает как для чисел, так и для строк, поэтому оба операнда должны быть строками.
Что делать с пустой датой при выводе строкой?
Пустая дата (01.01.0001) преобразуется в строку как обычная дата и в отчёте выглядит как «01.01.0001 0:00:00». Обрабатывайте её в коде через ЗначениеЗаполнено() или в запросе через ВЫБОР КОГДА Дата = ДАТАВРЕМЯ(1,1,1) ТОГДА "" ИНАЧЕ ПРЕДСТАВЛЕНИЕ(Дата) КОНЕЦ.
Что важно запомнить
В запросе 1С дату в строку преобразует только ПРЕДСТАВЛЕНИЕ, но её формат зависит от настроек сеанса. Для контролируемого формата используйте Формат() в коде после выборки. Не преобразуйте даты в строки в условиях отбора и сортировки — это ломает индексы и порядок.