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

В этой статье разберем 5 рабочих способов преобразовать дату в строку прямо в тексте запроса — от базового форматирования до сложных шаблонов с учетом локализации. Особое внимание уделим разнице между функциями ВЫРАЗИТЬ() и ФОРМАТ(), которая становится критичной при работе с разными версиями платформы (8.2 vs 8.3) или при интеграции с SQL-базами. Все примеры протестированы на актуальных релизах 1С:Предприятие 8.3.23.

1. Базовый синтаксис: функция ВЫРАЗИТЬ()

Самый универсальный способ — использование функции ВЫРАЗИТЬ(Дата КАК Строка). Она преобразует значение типа Дата в строку по умолчанию, используя системные настройки формата даты.

Пример запроса:

ВЫБРАТЬ

ВЫРАЗИТЬ(Документ.Дата КАК Строка) КАК ДатаСтрока

ИЗ

Документ.ЗаказКлиента КАК Документ

  • ✅ Простота: не требует указания формата.
  • ⚠️ Зависимость от региональных настроек: в России получите "25.12.2023", в США — "12/25/2023".
  • 🔄 Поддерживается во всех версиях 1С, включая 8.2.

Если вам нужно гарантированно получить формат ГГГГ-ММ-ДД (например, для интеграции с SQL), этот метод не подходит — используйте ФОРМАТ() (раздел 3).

📊 Какой формат даты вы используете чаще?
ДД.ММ.ГГГГ
ММ/ДД/ГГГГ
ГГГГ-ММ-ДД
Другой

2. Явное указание формата через ПАРАМЕТРЫ

Для гибкого управления выводом даты используйте конструкцию ПАРАМЕТРЫ ... ФОРМАТ(). Это позволяет задать шаблон прямо в тексте запроса без привязки к системным настройкам.

Пример с параметром:

ПАРАМЕТРЫ ФорматДаты = "ДФ='yyyy-MM-dd'";

ВЫБРАТЬ

ФОРМАТ(Документ.Дата, &ФорматДаты) КАК ДатаСтрока

ИЗ

Документ.ЗаказКлиента КАК Документ

Шаблон Результат Пример
ДФ='dd.MM.yyyy' День.Месяц.Год "25.12.2023"
ДФ='yyyyMMdd' ГодМесяцДень (без разделителей) "20231225"
ДФ='d MMMM yyyy' День МесяцПрописью Год "25 декабря 2023"
⚠️ Внимание: Шаблоны формата чувствительны к регистру! Например, MM — месяц двузначный, а mm (строчные буквы) вызовет ошибку.

Этот метод идеален для экспорта данных в внешние системы, где требуется строгий формат (например, ISO 8601).

☑️ Проверка формата даты

Выполнено: 0 / 4

3. Функция ФОРМАТ(): когда и как использовать

Функция ФОРМАТ(Дата, Шаблон) — альтернатива ВЫРАЗИТЬ(), но с расширенными возможностями. Она позволяет:

  • 📅 Использовать произвольные шаблоны (например, "День dd месяца MMMM yyyy года""День 25 месяца декабря 2023 года").
  • 🌍 Учитывать локализацию (названия месяцев на русском, английском и др.).
  • ⚡ Работать с NULL-значениями без ошибок (вернет пустую строку).

Пример с локализованным выводом:

ВЫБРАТЬ

ФОРМАТ(Документ.Дата, "ДЛФ=D") КАК ДеньНедели,

ФОРМАТ(Документ.Дата, "ДФ='dd MMMM yyyy'") КАК ДатаПрописью

ИЗ

Документ.ЗаказКлиента КАК Документ

⚠️ Внимание: В версиях 1С ниже 8.3.10 функция ФОРМАТ() может не поддерживать некоторые шаблоны (например, ДЛФ для дня недели). Проверяйте совместимость в базе знаний ИТС.

Для массовой обработки больших выборок ФОРМАТ() работает медленнее, чем ВЫРАЗИТЬ(). Если скорость критична, используйте первый метод.

💡

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

4. Преобразование в SQL-формат (для интеграций)

При обмене данными с SQL-базами (PostgreSQL, MS SQL, MySQL) часто требуется формат YYYY-MM-DD или YYYY-MM-DD HH:MI:SS. Для этого:

Используйте комбинацию ФОРМАТ() с явным шаблоном:

ВЫБРАТЬ

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

ФОРМАТ(Документ.ДатаВремя, "ДЛФ='yyyy-MM-dd HH:mi:ss'") КАК ДатаВремяSQL

ИЗ

Документ.ЗаказКлиента КАК Документ

Для прямых запросов к SQL (через Новый Запрос(ТекстЗапроса, Новый ПараметрыЗапроса(ТипВнешнейБазы.SQL))) используйте функции базы данных:

ВЫБРАТЬ

CONVERT(VARCHAR, Документ.Дата, 23) КАК ДатаSQL // Для MS SQL (формат yyyy-MM-dd)

ИЗ

Документ.ЗаказКлиента КАК Документ

  • 🔌 PostgreSQL: TO_CHAR(Дата, 'YYYY-MM-DD')
  • 🗃️ MS SQL: CONVERT(VARCHAR, Дата, 120) (для YYYY-MM-DD HH:MI:SS)
  • 🐘 MySQL: DATE_FORMAT(Дата, '%Y-%m-%d')
⚠️ Внимание: При прямом SQL-запросе все даты передаются в UTC. Учитывайте смещение временной зоны, если работаете с локальным временем.

5. Работа с пустыми датами (NULL)

Если поле даты может содержать NULL (например, не заполненное значение в документе), стандартные функции вернут ошибку. Решения:

  1. Использовать ВЫБОР КОГДА:
ВЫБРАТЬ

ВЫБОР

КОГДА Документ.Дата ЕСТЬ NULL ТОГДА ""

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

КОНЕЦ КАК ДатаСтрока

ИЗ

Документ.ЗаказКлиента КАК Документ

  1. Функция ЕСТЬNULL() (для замены на дефолтную дату):
ВЫБРАТЬ

ФОРМАТ(ЕСТЬNULL(Документ.Дата, ДАТАВРЕМЯ(1,1,1)), "ДФ='dd.MM.yyyy'") КАК ДатаСтрока

ИЗ

Документ.ЗаказКлиента КАК Документ

Для отчетов, где пустые даты должны отображаться как прочерк, используйте:

ВЫБОР

КОГДА Документ.Дата ЕСТЬ NULL ТОГДА "-"

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

КОНЕЦ

Что будет если не обработать NULL?

При попытке отформатировать NULL стандартными функциями 1С выбросит исключение "Некорректный аргумент функции (передано значение NULL)". Это прервет выполнение запроса и может привести к падению отчета или обмена данными.

6. Типовые ошибки и как их избежать

Даже опытные разработчики сталкиваются с проблемами при работе с датами в строках. Рассмотрим топ-5 ошибок:

Ошибка Причина Решение
Ошибка формата даты Неверный шаблон (например, ДФ='dd-mm-yyyy' вместо ДФ='dd.MM.yyyy') Используйте точку или дефис в шаблоне в зависимости от региональных настроек.
Некорректный аргумент функции Передача NULL в ФОРМАТ() или ВЫРАЗИТЬ() Обработайте NULL через ВЫБОР КОГДА или ЕСТЬNULL().
Несоответствие типов Попытка сравнить строку с датой (например, ГДЕ ДатаСтрока = &ПараметрДаты) Преобразуйте обе части сравнения к одному типу: ГДЕ ДАТАВРЕМЯ(ДатаСтрока) = &ПараметрДаты.

Частая проблема — неявное преобразование строки в дату. Например, запрос:

ВЫБРАТЬ

ВЫРАЗИТЬ("25.12.2023" КАК Дата) КАК ДатаИзСтроки

может вернуть ошибку, если строка не соответствует текущему формату даты в системе. Всегда проверяйте входные данные!

💡

Перед преобразованием строки в дату используйте функцию ТИПЗНАЧЕНИЯ() для валидации: ТИПЗНАЧЕНИЯ(Строка, "Дата") ≠ НЕОПРЕДЕЛЕНО.

FAQ: Частые вопросы по работе с датами в строках

Можно ли в одном запросе вывести дату в разных форматах?

Да, используйте несколько вызовов ФОРМАТ() с разными шаблонами:

ВЫБРАТЬ

ФОРМАТ(Дата, "ДФ='dd.MM.yy'") КАК КороткийФормат,

ФОРМАТ(Дата, "ДФ='d MMMM yyyy'") КАК ДлинныйФормат

ИЗ ...

Как преобразовать строку обратно в дату?

Используйте функцию ДАТАВРЕМЯ() или ДАТАЗНАЧЕНИЕ():

ВЫБРАТЬ

ДАТАЗНАЧЕНИЕ("25.12.2023") КАК ДатаИзСтроки

Для строк с временем: ДАТАВРЕМЯ(Год, Месяц, День, Час, Минута, Секунда).

Почему ФОРМАТ() возвращает пустую строку для корректной даты?

Вероятные причины:

  1. Шаблон содержит недопустимые символы (например, ДФ='dd/MM/yy' в системе с разделителем ".").
  2. Дата имеет значение ДАТАМИНИМУМ() или ДАТАМАКСИМУМ(), которые не форматируются.
  3. Ошибка в регистре шаблона (например, mm вместо MM).

Проверьте дату на корректность с помощью ТИПЗНАЧЕНИЯ(Дата) = ТИП("Дата").

Как вывести дату с временем в одной строке?

Используйте шаблон с указанием времени:

ФОРМАТ(ДатаВремя, "ДЛФ='dd.MM.yyyy HH:mi:ss'")

Для 24-часового формата укажите HH, для 12-часового — h с добавлением AM/PM:

ФОРМАТ(ДатаВремя, "ДЛФ='dd.MM.yyyy hh:mi tt'") // "25.12.2023 05:30 PM"
Можно ли использовать ФОРМАТ() в условии ГДЕ?

Технически можно, но не рекомендуется из-за низкой производительности. Например:

ВЫБРАТЬ

*

ИЗ

Документ.ЗаказКлиента КАК Документ

ГДЕ

ФОРМАТ(Документ.Дата, "ДФ='yyyyMM'") = "202312"

Лучше сравнивать даты напрямую:

ГДЕ

Документ.Дата МЕЖДУ ДАТАВРЕМЯ(2023,12,1) И ДАТАВРЕМЯ(2023,12,31,23,59,59)