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

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

Как изменить формат даты в запросе 1С

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

В языке запросов 1С дата хранится в едином внутреннем формате, и «изменить формат» в запросе означает одно из двух: либо преобразовать дату в строку нужного вида прямо в тексте запроса, либо получить дату как есть и отформатировать её уже в коде модуля. Для первого сценария служит функция ФОРМАТ, для второго — функция Формат() встроенного языка.

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

Если же дата нужна для дальнейших вычислений, правильнее оставить в запросе исходный тип и применить средства оформления: параметр «Формат» в схеме компоновки данных, свойство «Формат» у поля динамического списка или таблицы формы. Это сохраняет сортировку и отборы по дате.

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

Функция ФОРМАТ доступна в языке запросов начиная с платформы 8.3.6 и работает с датами, числами, булево и ссылками. Общий синтаксис: ФОРМАТ(Выражение, "СтрокаФормата"). Строка формата — это обычная форматная строка встроенного языка, такая же, как в функции Формат().

Пример запроса, выводящего дату документа в привычном виде «дд.мм.гггг»:

ВЫБРАТЬ

Реализация.Номер КАК Номер,

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

ИЗ

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

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

Основные форматные коды для даты

Форматная строка для даты задаётся параметром ДФ (или DF для английского синтаксиса). Внутри него используются коды фрагментов даты и времени. Регистр кодов значим: MM — месяц, mm — минуты.

КодЗначениеПример вывода
ddДень месяца, 2 цифры05
MMМесяц, 2 цифры03
yyyyГод, 4 цифры2026
yyГод, 2 цифры24
HHЧасы, 24-часовой формат14
mmМинуты07
ssСекунды59
MMMMНазвание месяцамарт
ddddНазвание дня неделипятница

Комбинируя коды, получают нужные представления: «ДФ=dd.MM.yyyy HH:mm:ss» для полной метки времени, «ДФ='MMMM yyyy'» для подписи периода в отчёте, «ДФ=yyyy-MM-dd» для выгрузки в системы, ожидающие ISO-подобный порядок. Литеральные символы внутри форматной строки, совпадающие с кодами, заключают в одинарные кавычки.

Дополнительно доступен параметр ДЛФ — локализованный формат. Например, "ДЛФ=D" даст длинный формат даты по региональным настройкам, а "ДЛФ=DD" — прописью с названием месяца и дня недели. Это удобно для печатных форм, где требуется дата вида «15 марта 2026 г.».

Типовые сценарии форматирования

Дата и время для журнала событий

Когда в выборке нужна метка времени целиком, используют полную форматную строку: ФОРМАТ(Регистр.Период, "ДФ='dd.MM.yyyy HH:mm:ss'"). Такой вариант подходит для выгрузки логов и сверки операций, где важны секунды.

Месяц и год для группировки в отчёте

Для подписи периода часто применяют ФОРМАТ(НачалоПериода(Продажи.Период, МЕСЯЦ), "ДФ='MMMM yyyy'"). Однако для самой группировки правильнее использовать функцию периодичности (НАЧАЛОПЕРИОДА или итоги по периодам), а ФОРМАТ применять только к уже сгруппированному полю. Иначе группировка пойдёт по строке, и сортировка месяцев станет алфавитной, а не хронологической.

Дата прописью для печатной формы

Для документов, где дата должна быть «человеческой», подходит ФОРМАТ(Док.Дата, "ДЛФ=DD"). Результат зависит от региональных настроек сеанса, поэтому на сервере с английской локалью вывод может отличаться от ожидаемого — проверяйте на целевой среде.

Порядок действий
  1. 1
    Определите, нужна ли дата для вычислений или только для показа пользователю
  2. 2
    Если только для показа — добавьте в запрос ФОРМАТ(ПолеДаты, "ДФ=нужный_формат")
  3. 3
    Выполните запрос в консоли и проверьте тип и значение поля результата
  4. 4
    Если дата нужна для отборов и сортировки — уберите ФОРМАТ и задайте формат в настройках СКД или поля формы

Альтернатива: форматирование вне запроса

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

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

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

СтрокаДаты = Формат(Выборка.Дата, "ДФ=dd.MM.yyyy");

КонецЦикла;

В отчётах на СКД формат задаётся декларативно: на закладке «Наборы данных» у поля есть параметр «Оформление» → «Формат», либо формат указывается в настройках отчёта для выбранного поля. При этом в ресурсах и отборах поле остаётся настоящей датой — сортировка, группировки по периодам и отборы «с ... по ...» работают корректно.

Для динамических списков формат настраивается через свойства элемента формы (поле таблицы) — свойство «Формат» в палитре свойств. Это самый безопасный путь: запрос не меняется, а меняется только представление.

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

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

Подходит для выгрузок и простых отчётов, где поле сразу выводится. Минус: теряется тип «Дата», ломаются отборы и сортировка по дате.

Формат() в коде модуля

Гибкий вариант при построчной обработке результата. Требует написания кода, не работает для чисто декларативных отчётов.

Оформление поля в СКД или форме

Рекомендуемый способ для отчётов и списков: тип даты сохраняется, формат меняется без правки запроса. Не применимо вне механизмов отображения.

Типичные ошибки и ограничения

Самая частая ошибка — путаница MM и mm. Строка «ДФ=dd.mm.yyyy» выведет вместо месяца минуты, и пользователь увидит «15.00.2026». Всегда проверяйте регистр кодов: месяц — заглавные MM, минуты — строчные mm.

Вторая типичная проблема — попытка сравнить отформатированное поле с параметром даты: условие вида ГДЕ ФОРМАТ(Дата, "ДФ=yyyyMMdd") = &Период не сработает, если параметр имеет тип «Дата». Сравнивать нужно либо исходные даты, либо строку со строкой.

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

Типичные ошибки
01
Написать mm вместо MM — вместо месяца выводятся минуты
02
Сравнивать отформатированную строку с параметром типа «Дата» — условие никогда не выполняется
03
Форматировать поле, по которому нужна сортировка — даты сортируются как строки
04
Забыть удвоить кавычки форматной строки в тексте запроса внутри модуля — синтаксическая ошибка
05
Использовать ФОРМАТ на платформе ниже 8.3.6 — запрос не выполняется

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

Быстрее всего отладить формат в консоли запросов: выполните запрос с одной строкой и посмотрите фактическое значение поля. Убедитесь, что день, месяц и год стоят на своих местах, а время не обрезано, если оно нужно.

Проверьте тип поля результата: если дальше по коду поле передаётся в функции работы с датами, тип должен остаться «Дата». Признак того, что форматирование применено слишком рано, — ошибки вида «Несоответствие типов» при сравнении или попытке вычесть даты.

Для отчётов на СКД дополнительно проверьте сортировку: отсортируйте отчёт по полю даты. Если порядок хронологический — тип сохранён; если строки идут в алфавитном порядке чисел — поле уже строка.

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

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

Значение поля в консоли запросов
Норма

Дата выведена в заданном виде, месяц на месте месяца

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

Вместо месяца минуты или нули — перепутаны MM и mm

Тип поля результата
Норма

«Дата», если поле участвует в отборах и вычислениях

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

«Строка» там, где нужны сравнения дат

Сортировка по полю в отчёте
Норма

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

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

Алфавитный порядок строк

Записи с пустой датой в соединениях
Норма

Пустые значения обработаны через ЕСТЬNULL

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

Пропавшие строки или пустые подписи

Часто задаваемые вопросы

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

Да: ФОРМАТ(НАЧАЛОПЕРИОДА(ПолеДаты, МЕСЯЦ), "ДФ='MM.yyyy'") или с названием месяца — "ДФ='MMMM yyyy'". Для группировки при этом используйте само выражение НАЧАЛОПЕРИОДА, а форматированное поле оставьте только для вывода.

Почему ФОРМАТ возвращает минуты вместо месяца?

Коды чувствительны к регистру: MM — месяц, mm — минуты. Замените строчные mm на заглавные MM в форматной строке, и значение станет корректным.

Работает ли функция ФОРМАТ во всех версиях платформы?

Нет, она доступна начиная с платформы 8.3.6. На более ранних версиях форматируйте дату в коде модуля функцией Формат() после выполнения запроса.

Как вывести дату в виде «2026-03-15» для обмена с внешней системой?

Используйте ФОРМАТ(ПолеДаты, "ДФ=yyyy-MM-dd"). Перед выгрузкой уточните у принимающей стороны, нужны ли время и часовой пояс — при необходимости добавьте «HH:mm:ss».

Можно ли отформатировать дату в отчёте СКД, не меняя запрос?

Да. В настройках поля набора данных или в пользовательских настройках отчёта у поля есть оформление с параметром «Формат». Тип даты при этом сохраняется, и отборы с сортировкой продолжают работать.

Что делать, если дата в соединении может быть пустой?

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

Итог

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

Для вывода даты строкой в запросе используйте ФОРМАТ с форматной строкой ДФ, следя за регистром кодов MM и mm. Если дата нужна для отборов, сортировки или вычислений — не форматируйте её в запросе, а задайте формат в настройках СКД, поля формы или через Формат() в коде.