Работа с датами в запросах 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).
☑️ Проверка формата даты
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 (например, не заполненное значение в документе), стандартные функции вернут ошибку. Решения:
- Использовать ВЫБОР КОГДА:
ВЫБРАТЬ
ВЫБОР
КОГДА Документ.Дата ЕСТЬ NULL ТОГДА ""
ИНАЧЕ ФОРМАТ(Документ.Дата, "ДФ='dd.MM.yyyy'")
КОНЕЦ КАК ДатаСтрока
ИЗ
Документ.ЗаказКлиента КАК Документ
- Функция ЕСТЬ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") КАК ДатаИзСтроки
Для строк с временем: ДАТАВРЕМЯ(Год, Месяц, День, Час, Минута, Секунда).
Почему ФОРМАТ() возвращает пустую строку для корректной даты?
Вероятные причины:
- Шаблон содержит недопустимые символы (например,
ДФ='dd/MM/yy'в системе с разделителем "."). - Дата имеет значение
ДАТАМИНИМУМ()илиДАТАМАКСИМУМ(), которые не форматируются. - Ошибка в регистре шаблона (например,
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)