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

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

Дата как строка в запросе 1С 8: функция ФОРМАТ и альтернативы

Как преобразовать дату в строку в запросе 1С 8: функция ФОРМАТ, шаблоны форматирования, сравнение с Представление(), типичные ошибки и примеры кода.

Задача получить дату в виде строки прямо в запросе возникает постоянно: при формировании текстовых представлений для отчётов, при объединении даты с другими полями, при выгрузке данных и при группировке по периодам в текстовом виде. В языке запросов 1С 8 для этого существует функция ФОРМАТ, которая работает аналогично одноимённой функции встроенного языка.

Важно понимать ограничение: язык запросов — это не полноценный язык программирования, и многие привычные приёмы вроде конкатенации произвольных типов или вызова методов объекта там недоступны. Поэтому преобразование даты в строку делается либо через ФОРМАТ, либо уже после выполнения запроса — при обходе выборки средствами встроенного языка.

Ниже разобраны синтаксис функции, рабочие шаблоны форматирования, сравнение с альтернативными подходами, типичные ошибки и способы проверить результат до того, как запрос попадёт в рабочую базу.

Как работает функция ФОРМАТ в языке запросов

Функция ФОРМАТ принимает два аргумента: выражение (поле даты, числа, булево или строки) и строку формата. Для дат строка формата строится по тем же правилам, что и параметр функции Формат() встроенного языка, — с использованием подстрок-параметров ДФ (формат даты) и ДЛФ (локальный формат даты).

Пример простейшего запроса, который возвращает дату документа в виде строки:

ВЫБРАТЬ

РеализацияТоваровУслуг.Номер КАК Номер,

ФОРМАТ(РеализацияТоваровУслуг.Дата, "ДФ=dd.MM.yyyy") КАК ДатаСтрокой

ИЗ

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

Результатом будет строка вида «15.03.2026». Обратите внимание: тип поля в результате запроса становится Строка, поэтому сортировать или сравнивать такое поле как дату уже нельзя — сравнение пойдёт по алфавиту. Если сортировка по дате нужна, выведите исходное поле даты отдельно и упорядочьте по нему.

Шаблоны форматирования даты

Параметр ДФ задаёт произвольный шаблон, где буквенные коды заменяются на компоненты даты. Регистр букв в шаблоне значения не имеет, но принято писать в нижнем. Основные коды:

  • дд — день месяца двумя цифрами;
  • ММ — номер месяца двумя цифрами;
  • гггг — год четырьмя цифрами;
  • чч, мм, сс — часы, минуты, секунды;
  • ддд — сокращённое название дня недели, дддд — полное;
  • МММ — сокращённое название месяца, ММММ — полное.

Примеры шаблонов и результата для даты 05.03.2026 14:30:00:

ШаблонРезультат
ДФ=dd.MM.yyyy05.03.2026
ДФ='dd.MM.yyyy HH:mm:ss'05.03.2026 14:30:00
ДФ=yyyy-MM-dd2026-03-05
ДФ='MMMM yyyy'март 2026
ДЛФ=D05.03.2026 (длинный формат даты по региональным настройкам)
ДЛФ=DD5 марта 2026 г.

Параметр ДЛФ удобен, когда представление должно зависеть от региональных настроек сеанса пользователя, а не быть жёстко зашитым в код. Для обменных форматов, наоборот, предпочтителен фиксированный шаблон вроде yyyy-MM-dd, не зависящий от локали.

bsl
ФОРМАТ(Документ.Дата, "ДФ='yyyy-MM-dd'")

Когда ФОРМАТ не подходит: альтернативы

Функция ФОРМАТ — не единственный способ получить строку из даты, и не всегда оптимальный. Выбор зависит от того, где именно нужна строка и насколько сложна логика её формирования.

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

Второй вариант — не преобразовывать дату в запросе вовсе, а сделать это при обходе выборки:

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

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

СтрокаДаты = Формат(Выборка.Дата, "ДЛФ=DD");

// дальнейшая обработка

КонецЦикла;

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

Сравнение вариантов

ФОРМАТ в запросе

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

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

Быстро, без шаблона. Ограничение: вид представления не контролируется и зависит от платформы.

Формат() при обходе выборки

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

Оформление СКД / макета

Дата остаётся датой, формат задаётся в настройках. Подходит только когда результат выводится через СКД или табличный документ.

Группировка и сравнение по строковому представлению даты

Частая практическая задача — сгруппировать данные по месяцу или году в текстовом виде, например для сводной таблицы, где колонки должны называться «январь 2026», «февраль 2026» и так далее. Здесь ФОРМАТ применяется в секции группировки:

ВЫБРАТЬ

ФОРМАТ(Продажи.Период, "ДФ='MMMM yyyy'") КАК МесяцСтрокой,

СУММА(Продажи.СуммаОборот) КАК Сумма

ИЗ

РегистрНакопления.Продажи.Обороты КАК Продажи

СГРУППИРОВАТЬ ПО

ФОРМАТ(Продажи.Период, "ДФ='MMMM yyyy'")

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

Для сравнения дат в условиях ГДЕ преобразование в строку использовать не следует вообще. Сравнивайте даты как даты: через параметры типа Дата, функции НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА. Строковое сравнение дат — источник трудноуловимых ошибок, особенно при разных форматах.

Обработка пустых и незаполненных дат

Пустая дата в 1С — это 01.01.0001 00:00:00. ФОРМАТ от такой даты вернёт строку «01.01.0001», что в отчёте выглядит как мусор. Поэтому для полей, которые могут быть не заполнены (дата оплаты, дата отгрузки, дата закрытия), преобразование оборачивают в ВЫБОР:

ВЫБОР

КОГДА Документ.ДатаОплаты = ДАТАВРЕМЯ(1, 1, 1)

ТОГДА ""

ИНАЧЕ ФОРМАТ(Документ.ДатаОплаты, "ДФ=dd.MM.yyyy")

КОНЕЦ КАК ДатаОплатыСтрокой

Тот же приём нужен при соединении таблиц: если дата приходит из левого соединения и может быть NULL, сначала обработайте NULL через ЕСТЬNULL с подстановкой пустой даты, и только потом форматируйте. Поведение ФОРМАТ от NULL зависит от контекста, и надёжнее не допускать NULL на входе функции.

Порядок действий
  1. 1
    Определите, где нужна строка: в самом запросе или при обработке результата.
  2. 2
    Если в запросе — напишите ФОРМАТ(Поле, "ДФ=шаблон") и проверьте шаблон на консоли запросов.
  3. 3
    Добавьте обработку пустой даты через ВЫБОР и ДАТАВРЕМЯ(1,1,1).
  4. 4
    Если поле участвует в сортировке — выведите исходную дату отдельной колонкой и упорядочьте по ней.
  5. 5
    Проверьте результат на данных с пустыми датами, NULL из соединений и граничными периодами.

Типичные ошибки и как их избежать

Первая ошибка — кавычки внутри шаблона. Шаблон с пробелами или литеральным текстом требует одинарных кавычек внутри строки формата: "ДФ='dd MMMM yyyy'". В тексте запроса, который сам собирается строкой в коде, кавычки придётся удваивать, что легко упустить и получить синтаксическую ошибку.

Вторая ошибка — ожидание, что ФОРМАТ учтёт часовой пояс. Функция работает с тем значением даты, которое хранится в базе; пересчётом часовых поясов она не занимается. Если в базе сеансовые даты, а отчёт строится по московскому времени, корректировку выполняйте до форматирования.

Третья ошибка — использование строкового поля даты в дальнейших соединениях и условиях. После ФОРМАТ поле пригодно только для вывода. Любая логика должна строиться на исходном поле типа Дата.

Типичные ошибки
01
Сортировка по полю после ФОРМАТ — получается алфавитный, а не хронологический порядок.
02
Фильтрация периода через строковое сравнение — границы интервала определяются неверно.
03
Отсутствие обработки пустой даты — в отчёте появляется «01.01.0001».
04
NULL из левого соединения попадает в ФОРМАТ без ЕСТЬNULL — непредсказуемый результат.
05
Удвоение кавычек забыто при сборке текста запроса в коде — синтаксическая ошибка при выполнении.

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

Прежде чем встраивать запрос в рабочий код, прогоните его в консоли запросов на реальных данных. Контролируйте три вещи: вид строки соответствует шаблону, пустые даты не превращаются в «01.01.0001», итоговая сортировка остаётся хронологической.

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

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

Вид строки даты
Норма

Совпадает с шаблоном, например 05.03.2026

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

Лишние символы, время там, где его не ждали, или пустая строка

Записи с незаполненной датой
Норма

Пустая строка или осмысленная подстановка

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

Строка «01.01.0001» в отчёте

Порядок строк
Норма

Хронологический

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

Алфавитный по строковому представлению

Данные из соединений
Норма

NULL заменён и обработан

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

Пропавшие или пустые значения там, где дата должна быть

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

Итог

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

Дата преобразуется в строку функцией ФОРМАТ(Поле, "ДФ=шаблон") прямо в запросе. Результат — строка: сортировку и сравнение выполняйте по исходному полю даты. Пустые даты и NULL обрабатывайте через ВЫБОР и ЕСТЬNULL. Сложную логику формирования строк выносите в обход выборки встроенным языком.

Частые вопросы

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

Да, оператор «+» в языке запросов поддерживает конкатенацию строк: "Документ от " + ФОРМАТ(Документ.Дата, "ДФ=dd.MM.yyyy"). Оба операнда должны быть строками, поэтому дату предварительно преобразуют через ФОРМАТ или ПРЕДСТАВЛЕНИЕ.

Чем ФОРМАТ отличается от ПРЕДСТАВЛЕНИЕ?

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

Как вывести дату в формате ISO (гггг-мм-дд) для выгрузки?

Используйте шаблон "ДФ=yyyy-MM-dd". Для даты со временем — "ДФ='yyyy-MM-dd HH:mm:ss'". Такой формат не зависит от региональных настроек и корректно сортируется даже как строка.

Почему ФОРМАТ возвращает пустую строку?

Чаще всего на входе NULL — например, поле пришло из левого соединения, где записи не нашлось. Оберните поле в ЕСТЬNULL(Поле, ДАТАВРЕМЯ(1,1,1)) и обработайте пустую дату через ВЫБОР. Также проверьте, что шаблон написан корректно и в нужных кавычках.

Можно ли использовать ФОРМАТ в параметрах виртуальной таблицы?

Нет, параметры виртуальных таблиц (период, условия) принимают значения соответствующих типов, и дата там должна оставаться датой. ФОРМАТ применяется только к полям выборки, группировки и упорядочивания основного запроса.

Влияет ли ФОРМАТ на производительность запроса?

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