Работа с датами в 1С:Предприятие — одна из самых частых задач, с которыми сталкиваются разработчики и опытные пользователи. Неправильный формат даты в запросе может привести к ошибкам выполнения, некорректной фильтрации данных или проблемам при интеграции с внешними системами. В этой статье мы разберём все способы изменения формата даты непосредственно в тексте запроса, рассмотрим синтаксические особенности и типичные ошибки, которые допускают даже опытные специалисты.
Особенность работы с датами в 1С заключается в том, что система хранит их в внутреннем формате, но при выводе или сравнении часто требуется привести их к удобочитаемому виду. Например, вместо стандартного 20260515 может понадобиться 15.05.2026 или даже 15 мая 2026 г.. Важно понимать, что изменение формата не влияет на внутреннее представление даты — это чисто визуальная трансформация для отчётов, интерфейсов или экспорта данных.
Статья будет полезна как начинающим разработчикам, так и тем, кто хочет систематизировать свои знания. Мы не будем ограничиваться базовыми примерами, а рассмотрим и неочевидные случаи: работу с параметрами, динамическое форматирование в зависимости от языка интерфейса, а также нюансы при обмене данными через REST или JSON.
Базовый синтаксис изменения формата даты в запросе
Самый простой способ изменить формат даты в запросе 1С — использовать функцию ФОРМАТ. Она позволяет преобразовать значение даты в строку с заданным шаблоном. Основной синтаксис:
ВЫБРАТЬ
ФОРМАТ(ДатаДокумента,"ДФ=dd.MM.yyyy") КАК ОтформатированнаяДата
ИЗ
Документ.ЗаказКлиента
Где ДФ — это директива форматирования даты, а dd.MM.yyyy — шаблон вывода. Рассмотрим основные элементы шаблона:
- 📅
dd— день месяца (01–31) - 📅
MM— месяц (01–12) - 📅
yyyy— год (четырёхзначный) - 📅
yy— год (двухзначный) - 📅
Q— квартал (1–4)
Пример запроса с выводом даты в формате "день.месяц.год":
ВЫБРАТЬ
ФОРМАТ(Дата,"ДФ=dd.MM.yyyy") КАК ДатаЗаказа,
Номер
ИЗ
Документ.РеализацияТоваровУслуг
ГДЕ
Дата МЕЖДУ &НачалоПериода И &КонецПериода
Если вам нужно вывести название месяца прописью (например,"май" вместо"05"), используйте шаблон ДФ='dd MMMM yyyy'. Это особенно полезно для печатных форм документов.
Динамическое форматирование в зависимости от языка системы
В многопользовательских базах или при работе с международными клиентами часто требуется выводить даты в формате, соответствующем языку интерфейса. Для этого в 1С предусмотрена возможность динамического форматирования с учётом региональных настроек.
Синтаксис использования языковых шаблонов:
ВЫБРАТЬ
ФОРМАТ(Дата,"ДЛФ=D") КАК ЛокализованнаяДата
ИЗ
Документ.ПоступлениеТоваров
Где ДЛФ — директива локализованного форматирования, а D — стандартный шаблон даты для текущего языка. Например:
- 🌍 Для русского языка:
15.05.2026 - 🌍 Для английского (США):
05/15/2026 - 🌍 Для немецкого:
15.05.2026(но с другими разделителями в некоторых версиях)
Если требуется явное указание языка, независимо от настроек пользователя, используйте конструкцию:
ФОРМАТ(Дата,"ДЛФ=D; ЯЗЫК=ru_RU")
Работа с параметрами и динамические шаблоны
В реальных задачах часто требуется передавать формат даты как параметр запроса. Это позволяет гибко настраивать вывод без изменения кода. Рассмотрим, как реализовать такой подход.
Пример запроса с параметром формата:
ВЫБРАТЬ
ФОРМАТ(Дата,"ДФ=" + &ФорматДаты) КАК ОтформатированнаяДата
ИЗ
Документ.СчётНаОплату
ГДЕ
Контрагент = &Контрагент
Где &ФорматДаты — параметр типа Строка, который может принимать значения вроде "dd.MM.yyyy" или "yyyy-MM-dd".
Экранировать кавычки в шаблоне|Проверить длину строки шаблона|Убедиться в наличии директивы ДФ или ДЛФ|Тестировать с разными языками интерфейса-->
Для более сложных сценариев можно использовать вложенные функции. Например, комбинацию ФОРМАТ с ВЫРАЗИТЬ для преобразования строки в дату и обратно:
ВЫБРАТЬ
ФОРМАТ(ВЫРАЗИТЬ(&СтрокаДаты КАК ДАТА),"ДФ=dd.MM.yyyy") КАК ПреобразованнаяДата
⚠️ Внимание: При динамическом формировании шаблона следите за тем, чтобы итоговая строка не содержала недопустимых символов. Например, использование ДФ="dd/MM/yy" приведёт к ошибке, если разделитель не соответствует региональным настройкам.
Типичные ошибки и как их избегать
Даже опытные разработчики иногда сталкиваются с проблемами при форматировании дат в запросах. Рассмотрим наиболее распространённые ошибки и способы их решения.
| Ошибка | Причина | Решение |
|---|---|---|
| Ошибка форматирования: неверный шаблон | Опечатка в директиве (например, ДФ=dd-MM-yy вместо ДФ="dd-MM-yy") |
Всегда обрамляйте шаблон кавычками внутри директивы |
| Некорректное отображение месяца | Использование MM вместо MMM для сокращённого названия |
Для"май" используйте MMMM, для"мая" — MMM |
| Ошибка приведение типов | Попытка отформатировать NULL или недопустимое значение |
Используйте ВЫБОР КОГДА Дата ЕСТЬ NULL ТОГДА"" ИНАЧЕ ФОРМАТ(Дата,"ДФ=..") |
| Несоответствие языку интерфейса | Жёстко заданный формат игнорирует региональные настройки | Заменяйте на ДЛФ=D для автоматического подбора формата |
Особого внимания заслуживает работа с пустыми датами. Если в базе есть записи с незаполненным полем даты, прямой вызов ФОРМАТ приведёт к ошибке. Всегда проверяйте значения на NULL:
ВЫБРАТЬ
ВЫБОР
КОГДА ДатаПоступления ЕСТЬ NULL ТОГДА""
ИНАЧЕ ФОРМАТ(ДатаПоступления,"ДФ=dd.MM.yyyy")
КОНЕЦ КАК ДатаПоступленияОтформатированная
Что делать если формат даты не меняется?
Если после применения ФОРМАТ дата всё равно отображается в исходном виде, проверьте:
1. Не перекрывается ли ваш формат настройками отчёта или печатной формы.
2. Не используется ли в конечном выводе функция ПРЕДСТАВЛЕНИЕ, которая может игнорировать ваш шаблон.
3. Убедитесь, что запрос выполняется в контексте, где доступны региональные настройки (например, не в фоновом задании без сеанса пользователя).
Практическое применение: примеры для разных задач
Разберём несколько реальных сценариев, где изменение формата даты критично для корректной работы системы.
1. Экспорт данных в Excel с читаемыми датами
При выгрузке данных в Excel через ЗаписьXML или ТабличныйДокумент даты по умолчанию могут экспортироваться в неудобном формате. Исправляем это прямо в запросе:
ВЫБРАТЬ
ФОРМАТ(ДатаДокумента,"ДФ=yyyy-MM-dd") КАК ДатаДляExcel,
Номер КАК НомерДокумента
ИЗ
Документ.ЗаказПокупателя
Формат yyyy-MM-dd универсально распознаётся Excel как дата, независимо от региональных настроек программы.
2. Фильтрация по диапазону дат с учётом времени
Если в базе хранятся даты с временем (тип ДатаВремя), а фильтр нужно применить только по дате, используйте:
ВЫБРАТЬ
Номер,
ФОРМАТ(Дата,"ДФ=dd.MM.yyyy") КАК ДатаБезВремени
ИЗ
Документ.Оплата
ГДЕ
ДАТАВРЕМЯ(ГОД(Дата), МЕСЯЦ(Дата), ДЕНЬ(Дата), 0, 0, 0) МЕЖДУ &НачалоДня И &КонецДня
3. Вывод даты в печатной форме с названием месяца
Для официальных документов часто требуется формат вида "15 мая 2026 года". Реализуем это:
ВЫБРАТЬ
ФОРМАТ(Дата,"ДФ='dd MMMM yyyy''года'''") КАК ДатаПрописью
ИЗ
Документ.СчётФактура
Обратите внимание на экранирование одинарных кавычек внутри шаблона — они нужны для вывода статичного текста"года".
При работе с печатными формами всегда тестируйте вывод дат на разных языках интерфейса. Например, в английской версии"15th of May 2026" формируется иначе, чем в русской.
Особенности работы с датами в разных версиях 1С
Функциональность форматирования дат эволюционировала вместе с платформой 1С:Предприятие. Рассмотрим ключевые различия между версиями.
В 1С 8.2 и ранних релизах 8.3:
- Отсутствовала директива ДЛФ — приходилось вручную подставлять шаблоны в зависимости от языка.
- Функция ФОРМАТ имела ограниченную поддержку локализации.
- Для вывода названий месяцев прописью требовалось использовать сложные конструкции с ВЫБОР.
Начиная с 1С 8.3.10:
- Появилась полноценная поддержка ДЛФ (директива локализованного форматирования).
- Добавлены шаблоны для кварталов (Q) и недель (w).
- Улучшена работа с NULL-значениями в функциях форматирования.
В последних версиях (8.3.20+):
- Реализована поддержка ISO-формата дат (yyyy-MM-dd) через директиву ДФ=Д.
- Оптимизирована производительность операций форматирования в массовых выборках.
- Добавлены новые параметры для работы с временными зонами.
⚠️ Внимание: При переносе кода между разными версиями платформы всегда проверяйте совместимость используемых директив. Например, шаблон ДФ='dd MMMM yyyy' в 1С 8.2 может работать иначе, чем в 8.3.18, если не учтены региональные настройки сервера.
Интеграция с внешними системами: JSON, REST, SQL
При обмене данными с внешними системами формат даты становится критически важным. Рассмотрим типичные сценарии.
1. Экспорт дат в JSON
Для корректной передачи дат в JSON-формате используйте ISO-стандарт:
ВЫБРАТЬ
ФОРМАТ(Дата,"ДФ=yyyy-MM-ddTHH:mm:ss") КАК ДатаISO
ИЗ
Документ.Заказ
Если время не требуется, упростите до yyyy-MM-dd.
2. Импорт дат из SQL-баз
При чтении дат из внешних SQL-источников (например, PostgreSQL или MS SQL) может потребоваться преобразование строкового представления в дату 1С:
ВЫБРАТЬ
ВЫРАЗИТЬ(ВнешняяДата КАК ДАТА) КАК Дата1С
ИЗ
ВнешнийИсточник
Где ВнешняяДата — строка в формате источника (например, "2026-05-15 14:30:00").
3. Обмен через REST API
Многие REST-сервисы ожидают даты в формате timestamp (количество секунд с 1970 года). Для преобразования:
ДатаВTimestamp = Цел(ДатаНачалоОтсчёта + Дата);
Где ДатаНачалоОтсчёта — это ДАТАВРЕМЯ(1970, 1, 1, 3, 0, 0) (с учётом временной зоны).
Как избежать проблем с временными зонами?
При обмене датами между системами всегда уточняйте:
1. В какой временной зоне хранятся даты в источнике.
2. Требуется ли конвертация во временную зону 1С (настраивается в параметрах информационной базы).
3. Нужно ли учитывать переход на летнее/зимнее время для исторических данных.
Для критичных систем используйте ДАТАВРЕМЯСУЧЁТОМЧАСОВОГОПОЯСА.
FAQ: Частые вопросы по форматированию дат в 1С
Можно ли в одном запросе вывести дату в нескольких форматах?
Да, можно использовать несколько вызовов функции ФОРМАТ с разными шаблонами. Пример:
ВЫБРАТЬ
ФОРМАТ(Дата,"ДФ=dd.MM.yyyy") КАК КороткийФормат,
ФОРМАТ(Дата,"ДФ='dd MMMM yyyy''г.''") КАК ПолныйФормат
ИЗ Документ.Счёт
Почему функция ФОРМАТ возвращает пустую строку для корректной даты?
Наиболее вероятные причины:
- 🔍 В шаблоне отсутствует директива
ДФ=илиДЛФ=. - 🔍 Передано значение
NULL(проверьте черезЕСТЬ NULL). - 🔍 Несоответствие типов (например, попытка отформатировать строку как дату).
Как вывести дату в формате"1 квартал 2026 г."?
Используйте комбинацию функций КВАРТАЛ и ФОРМАТ:
ВЫБРАТЬ
ФОРМАТ(Дата,"ДФ='''Q'Q''квартал'' yyyy''г.'''") КАК КварталПрописью
Где Q — это номер квартала (1–4).
Можно ли изменить формат даты в отчёте безфикации запроса?
Да, в большинстве стандартных отчётов 1С формат даты настраивается через:
- 📊 Параметры отчёта (вкладка"Дополнительно" или"Формат").
- 📊 Настройки конкретного поля в макете (двойной клик по колонке с датой).
- 📊 Пользовательские настройки (если отчёт поддерживает сохранение вариантов).
Однако для сложных форматов (например, с названиями месяцев) всё же потребуется корректировка запроса.
Как отформатировать дату с учётом рабочих/выходных дней?
Для этого нужно комбинировать ФОРМАТ с проверкой дня недели:
ВЫБРАТЬ
ФОРМАТ(Дата,"ДФ=dd.MM.yyyy (dddd)") КАК ДатаСДнёмНедели
ИЗ
Документ.ГрафикРаботы
Где dddd выведет полное название дня недели (например,"понедельник"). Для краткого названия используйте ddd.