Разработка и Конфигурация · 10 мин
1С запрос: как преобразовать дату в строку
Как преобразовать дату в строку в запросе 1С: функции ПРЕДСТАВЛЕНИЕ и ФОРМАТ, форматные строки, типичные ошибки, примеры кода и способы проверки результата.
Преобразование даты в строку — одна из самых частых задач при написании запросов в 1С: дату нужно вывести в отчёт в читаемом виде, сгруппировать данные по месяцу или году, сформировать подпись для печатной формы. В языке запросов 1С нет привычной функции форматирования вроде Format() из встроенного языка, поэтому задача решается другими средствами — функциями ПРЕДСТАВЛЕНИЕ, ФОРМАТ, а также приёмами с извлечением частей даты.
Выбор способа зависит от цели. Если нужно просто показать дату пользователю в привычном виде «ДД.ММ.ГГГГ», достаточно ПРЕДСТАВЛЕНИЕ. Если требуется произвольный шаблон — например, «2026-03» для группировки или «15 марта» для текста документа, — применяется ФОРМАТ с форматной строкой или комбинация функций ГОД, МЕСЯЦ, ДЕНЬ. Важно понимать ограничения каждого подхода: некоторые функции недоступны в определённых СУБД, а результат ПРЕДСТАВЛЕНИЕ зависит от региональных настроек сервера.
Ниже разобраны рабочие приёмы с примерами кода, условия выбора между ними, способы проверки результата и типичные ошибки, которые приводят к пустым строкам, неожиданным форматам и падению производительности запроса.
Функция ПРЕДСТАВЛЕНИЕ — базовый способ
Функция ПРЕДСТАВЛЕНИЕ принимает значение любого типа и возвращает его строковое представление. Для даты это строка вида «15.03.2026» — формат соответствует стандартному представлению даты в текущих региональных настройках информационной базы.
ВЫБРАТЬ
ПРЕДСТАВЛЕНИЕ(РеализацияТоваровУслуг.Дата) КАК ДатаСтрокой,
РеализацияТоваровУслуг.Ссылка КАК Документ
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
Результат — строка с датой без времени, если речь о поле типа «дата». Если поле имеет состав «дата и время», представление будет включать и время, например «15.03.2026 14:30:00». Это важно учитывать, когда строка дальше используется для сравнения или группировки: «15.03.2026» и «15.03.2026 0:00:00» — разные строки.
Ограничение способа — зависимость от настроек сервера. На сервере с английской локалью представление может отличаться от ожидаемого «ДД.ММ.ГГГГ». Если строка участвует в интеграционном обмене или сравнивается с фиксированным шаблоном, ПРЕДСТАВЛЕНИЕ использовать небезопасно — лучше формировать строку явно через ФОРМАТ или конкатенацию частей даты.
Функция ФОРМАТ и форматные строки
Функция ФОРМАТ в языке запросов работает аналогично одноимённой функции встроенного языка: первый параметр — значение, второй — форматная строка. Для дат основные ключи: ДФ (дата и время в заданном шаблоне) и ДЛФ (локализованный формат даты).
ВЫБРАТЬ
ФОРМАТ(Заказ.Дата, "ДФ=yyyy-MM-dd") КАК ДатаISO,
ФОРМАТ(Заказ.Дата, "ДФ='dd.MM.yyyy HH:mm:ss'") КАК ДатаВремя,
ФОРМАТ(Заказ.Дата, "ДЛФ=DD") КАК ДатаПолная
ИЗ
Документ.ЗаказПокупателя КАК Заказ
Ключ ДФ позволяет собрать произвольный шаблон: yyyy — год четырьмя цифрами, MM — месяц, dd — день, HH — часы, mm — минуты, ss — секунды. Так, ДФ=yyyyMMdd вернёт «20260315» — удобно для имён файлов и отборов строками. Ключ ДЛФ=DD даёт длинный локализованный вид с названием месяца и дня недели, например «15 марта 2026 г.» — подходит для печатных форм, но зависит от локали.
Обратите внимание на регистр символов в форматной строке: MM — месяц, mm — минуты. Путаница между ними — одна из самых частых причин «странных» результатов, когда вместо месяца в строке появляются минуты и дата для всех документов выглядит одинаково.
Доступность ФОРМАТ в запросах зависит от используемой СУБД и версии платформы. В файловом варианте и на большинстве поддерживаемых СУБД функция работает, но при переносе запроса между разными базами стоит проверить результат на тестовых данных.
ВЫБРАТЬ
ФОРМАТ(Документ.Дата, "ДФ=yyyy-MM-dd") КАК ДатаСтрокой
ИЗ
Документ.ПриходнаяНакладная КАК ДокументСтрока из частей даты: ГОД, МЕСЯЦ, ДЕНЬ
Когда нужен полный контроль над результатом независимо от локали, строку собирают из числовых частей даты. Функции ГОД, МЕСЯЦ, ДЕНЬ, ЧАС, МИНУТА, СЕКУНДА извлекают компоненты даты как числа, которые затем преобразуются в строки и соединяются оператором конкатенации (+).
ВЫБРАТЬ
ПРЕДСТАВЛЕНИЕ(ГОД(Док.Дата)) + "-" +
ПРЕДСТАВЛЕНИЕ(МЕСЯЦ(Док.Дата)) + "-" +
ПРЕДСТАВЛЕНИЕ(ДЕНЬ(Док.Дата)) КАК ДатаСтрокой
ИЗ
Документ.СчетФактура КАК Док
Недостаток приёма очевиден: МЕСЯЦ вернёт «3», а не «03», поэтому строка получится «2026-3-15» вместо «2026-03-15». Дополнение ведущим нулём в языке запросов делается громоздко — через ВЫБОР с проверкой диапазона. На практике такой ручной способ оправдан только тогда, когда ФОРМАТ недоступна или её поведение на конкретной СУБД непредсказуемо.
Для группировки по периодам с выводом строки удобнее связка НАЧАЛОПЕРИОДА и ФОРМАТ: сначала дата приводится к началу месяца, затем форматируется как «yyyy-MM». Получается аккуратный ключ группировки, который одновременно читаемо отображается в отчёте и корректно сортируется как строка.
ВЫБРАТЬ
ФОРМАТ(НАЧАЛОПЕРИОДА(Продажи.Период, МЕСЯЦ), "ДФ=yyyy-MM") КАК МесяцСтрокой,
СУММА(Продажи.СуммаОборот) КАК Сумма
ИЗ
РегистрНакопления.Продажи.Обороты КАК Продажи
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(Продажи.Период, МЕСЯЦ)
Преобразование даты в строку вне запроса
Часто правильнее не преобразовывать дату в строку в самом запросе, а получить поле типа «дата» и отформатировать его уже в коде встроенного языка при обходе выборки. Это снимает ограничения языка запросов и даёт доступ к полной мощности функции Формат().
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ДатаСтрокой = Формат(Выборка.Дата, "ДЛФ=DD");
// дальнейшая обработка
КонецЦикла;
Такой подход предпочтителен, когда строка нужна только для вывода пользователю: запрос остаётся проще, СУБД не тратит ресурсы на строковые операции, а сортировка и сравнение выполняются по настоящим датам, а не по их текстовым представлениям. Сортировка по строке «ДД.ММ.ГГГГ» даёт неверный порядок («01.02.2026» окажется раньше «02.01.2026»), тогда как сортировка по дате всегда корректна.
Если запрос используется в динамическом списке, СКД или консоли отчётов, где обработки результата кодом нет, преобразование придётся делать в самом запросе. В СКД дополнительно доступны вычисляемые поля и форматирование на уровне настроек отчёта — часто это лучшее место для преобразования вместо текста запроса.
Как выбрать способ
Производительность и типичные ошибки
Преобразование даты в строку в запросе — недорогая операция сама по себе, но она становится проблемой, когда используется в условиях отбора. Конструкция вида ГДЕ ФОРМАТ(Дата, "ДФ=yyyyMM") = "202603" отключает использование индекса по полю даты и заставляет СУБД вычислять функцию для каждой строки таблицы. На больших таблицах это превращает мгновенный запрос в многоминутный.
Правильная альтернатива — отбор по диапазону дат: ГДЕ Дата МЕЖДУ &НачалоМесяца И &КонецМесяца. Параметры вычисляются в коде до выполнения запроса, индекс работает, результат тот же. Преобразование в строку оставляйте только для выводимых полей и группировок, где без него не обойтись.
Ещё одна частая ошибка — попытка сложить строку с датой напрямую: "Дата: " + Док.Дата. Язык запросов не выполняет неявного преобразования типов, такой запрос завершится ошибкой. Сначала дату нужно явно привести к строке через ПРЕДСТАВЛЕНИЕ или ФОРМАТ, и только потом конкатенировать.
Проверка результата
Быстрее всего проверить преобразование в консоли запросов: выполните запрос на реальных данных и посмотрите тип и значение колонки. Поле после ПРЕДСТАВЛЕНИЕ или ФОРМАТ должно иметь тип «Строка», а значения — соответствовать ожидаемому шаблону. Если колонка пустая или содержит NULL, проверьте, не является ли само исходное поле даты NULL — функции корректно вернут NULL, и это нормальное поведение, а не ошибка.
Для проверки в коде используйте ТипЗнч() над значением выборки и сравнение с эталонной строкой на контрольном документе с известной датой. Особое внимание уделите граничным случаям: первое января, документы с временем 00:00:00, даты до 1000 года в перенесённых данных — именно на них всплывают расхождения форматов.
Как проверить результат
Строка
Остался тип «Дата» — преобразование не применилось к нужному полю
«15.03.2026» или строка по заданному шаблону
Пустая строка, NULL или другой порядок дня и месяца
Отбор по параметрам-датам, запрос выполняется быстро
ФОРМАТ в условии ГДЕ, заметная задержка на больших таблицах
Частые вопросы
Можно ли в запросе 1С получить дату в формате «ГГГГ-ММ-ДД»?
Да, через ФОРМАТ(Дата, "ДФ=yyyy-MM-dd"). Этот формат дополнительно удобен тем, что строковая сортировка по нему совпадает с хронологической. Если функция ФОРМАТ недоступна, строку собирают конкатенацией ГОД, МЕСЯЦ и ДЕНЬ с ручным дополнением нулями через ВЫБОР.
Почему ПРЕДСТАВЛЕНИЕ возвращает дату вместе со временем?
Поле имеет состав «дата и время», и представление включает обе части. Если время не нужно, примените ФОРМАТ с ключом ДФ=dd.MM.yyyy или предварительно отсеките время функцией НАЧАЛОПЕРИОДА(Дата, ДЕНЬ).
Как сгруппировать документы по месяцу и вывести месяц строкой?
Группируйте по НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ), а в списке полей выведите ФОРМАТ(НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ), "ДФ=yyyy-MM"). Группировка идёт по настоящей дате, поэтому порядок и итоги корректны, а подпись остаётся читаемой.
Чем опасно сравнение дат как строк в условии запроса?
Двумя проблемами: строковое сравнение не совпадает с хронологическим для форматов вроде «ДД.ММ.ГГГГ», а применение функции к полю в условии ГДЕ отключает индекс. Отбирайте всегда по значениям дат через параметры, а в строку переводите только поля выборки.
Работает ли ФОРМАТ в запросах на всех СУБД?
На распространённых связках платформы с поддерживаемыми СУБД функция работает, но поведение в редких конфигурациях может отличаться. Перед промышленным использованием проверьте запрос в консоли на целевой базе и убедитесь, что формат результата совпадает с ожидаемым.
Что важно запомнить
Для вывода даты строкой в запросе 1С используйте ПРЕДСТАВЛЕНИЕ (простой вид, зависит от локали) или ФОРМАТ с ключом ДФ (точный шаблон). Группировку по периодам делайте через НАЧАЛОПЕРИОДА. Никогда не применяйте эти функции в условии ГДЕ — отбирайте по параметрам-датам, иначе потеряете индекс и скорость.