Разработка и Конфигурация · 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Определите, нужна ли дата для вычислений или только для показа пользователю
- 2Если только для показа — добавьте в запрос ФОРМАТ(ПолеДаты, "ДФ=нужный_формат")
- 3Выполните запрос в консоли и проверьте тип и значение поля результата
- 4Если дата нужна для отборов и сортировки — уберите ФОРМАТ и задайте формат в настройках СКД или поля формы
Альтернатива: форматирование вне запроса
Если результат запроса обрабатывается в коде, форматировать дату в самом запросе не обязательно и часто вредно. Оставьте поле типа «Дата» и примените функцию встроенного языка при выводе:
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СтрокаДаты = Формат(Выборка.Дата, "ДФ=dd.MM.yyyy");
КонецЦикла;
В отчётах на СКД формат задаётся декларативно: на закладке «Наборы данных» у поля есть параметр «Оформление» → «Формат», либо формат указывается в настройках отчёта для выбранного поля. При этом в ресурсах и отборах поле остаётся настоящей датой — сортировка, группировки по периодам и отборы «с ... по ...» работают корректно.
Для динамических списков формат настраивается через свойства элемента формы (поле таблицы) — свойство «Формат» в палитре свойств. Это самый безопасный путь: запрос не меняется, а меняется только представление.
Сравнение вариантов
Подходит для выгрузок и простых отчётов, где поле сразу выводится. Минус: теряется тип «Дата», ломаются отборы и сортировка по дате.
Гибкий вариант при построчной обработке результата. Требует написания кода, не работает для чисто декларативных отчётов.
Рекомендуемый способ для отчётов и списков: тип даты сохраняется, формат меняется без правки запроса. Не применимо вне механизмов отображения.
Типичные ошибки и ограничения
Самая частая ошибка — путаница MM и mm. Строка «ДФ=dd.mm.yyyy» выведет вместо месяца минуты, и пользователь увидит «15.00.2026». Всегда проверяйте регистр кодов: месяц — заглавные MM, минуты — строчные mm.
Вторая типичная проблема — попытка сравнить отформатированное поле с параметром даты: условие вида ГДЕ ФОРМАТ(Дата, "ДФ=yyyyMMdd") = &Период не сработает, если параметр имеет тип «Дата». Сравнивать нужно либо исходные даты, либо строку со строкой.
Третья ошибка — применение ФОРМАТ к значению NULL. В левых соединениях, где дата может отсутствовать, функция вернёт пустую строку или NULL в зависимости от контекста, что ломает последующую конкатенацию. Оборачивайте такие поля в ЕСТЬNULL с подходящим значением по умолчанию.
Как проверить результат
Быстрее всего отладить формат в консоли запросов: выполните запрос с одной строкой и посмотрите фактическое значение поля. Убедитесь, что день, месяц и год стоят на своих местах, а время не обрезано, если оно нужно.
Проверьте тип поля результата: если дальше по коду поле передаётся в функции работы с датами, тип должен остаться «Дата». Признак того, что форматирование применено слишком рано, — ошибки вида «Несоответствие типов» при сравнении или попытке вычесть даты.
Для отчётов на СКД дополнительно проверьте сортировку: отсортируйте отчёт по полю даты. Если порядок хронологический — тип сохранён; если строки идут в алфавитном порядке чисел — поле уже строка.
Как проверить результат
Дата выведена в заданном виде, месяц на месте месяца
Вместо месяца минуты или нули — перепутаны 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. Если дата нужна для отборов, сортировки или вычислений — не форматируйте её в запросе, а задайте формат в настройках СКД, поля формы или через Формат() в коде.