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