Работа с датами в запросах 1С:Предприятие 8.3 — одна из самых частых задач, с которыми сталкиваются разработчики и администраторы. Неправильно заданный формат может привести к ошибкам выполнения, некорректной фильтрации данных или проблемам при обмене с внешними системами. В этой статье разберём все актуальные способы установки формата даты — от базового синтаксиса до продвинутых приёмов с использованием функций ФОРМАТ(), ДАТАВРЕМЯ() и параметров виртуальных таблиц.
Особое внимание уделим типичным ошибкам, которые допускают даже опытные специалисты: например, confusion между локальным и универсальным форматом или игнорирование настроек региональных параметров. Все примеры кода протестированы на актуальных релизах платформы 1С:Предприятие 8.3.23 и выше. Если вы работаете со старыми версиями (ниже 8.3.10), некоторые функции могут вести себя иначе — в запросах до версии 8.3.8 отсутствует поддержка параметра "LD" для вывода даты без разделителей.
1. Базовый синтаксис формата даты в запросах 1С
По умолчанию платформа 1С использует формат даты, заданный в региональных настройках информационной базы. Однако в тексте запроса вы можете явно указать нужный формат с помощью функции ФОРМАТ(). Основные правила:
- 📅 Краткий формат:
ФОРМАТ(Дата, "Д")— выведет дату в видеДД.ММ.ГГГГ(например,15.05.2026). - 🕒 Дата + время:
ФОРМАТ(Дата, "ДЛФ=ДТ")— форматДД.ММ.ГГГГ ЧЧ:ММ:СС. - 🌍 Универсальный формат:
ФОРМАТ(Дата, "ДЛФ=ДУ")— дата в формате ISO (ГГГГ-ММ-ДД), независимо от региональных настроек. - 🔢 Без разделителей:
ФОРМАТ(Дата, "ДЛФ=LD")— вывод в видеДДММГГГГ(актуально для обмена данными).
Пример запроса с явным указанием формата:
ВЫБРАТЬ
ФОРМАТ(Документ.Дата, "ДЛФ=ДУ") КАК ДатаISO,
ФОРМАТ(Документ.Дата, "Д") КАК ДатаКраткая
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
⚠️ Внимание: Если в запросе используется виртуальная таблица (например, Документ.РеализацияТоваровУслуг.Обороты), формат даты для полей периода настраивается отдельно через параметры виртуальной таблицы, а не через ФОРМАТ().
2. Использование параметров виртуальных таблиц для дат
При работе с виртуальными таблицами (например, обороты, остатки, регистры) формат даты часто зависит от параметров, передаваемых в конструктор таблицы. Например, для таблицы оборотов можно указать:
- 📊 Период:
ПериодС = ДАТАВРЕМЯ(2026, 1, 1, 0, 0, 0)— начало периода. - 📅 Формат даты: через параметр
ФорматДат(доступен не во всех виртуальных таблицах). - 🔄 Группировка: если дата используется как измерение, её формат влияет на результат группировки.
Пример с настройкой периода и формата:
ВЫБРАТЬ
Обороты.Период КАК ДатаОтчета
ИЗ
РегистрНакопления.Продажи.Обороты(
&ПериодС,
&ПериодПо,
Периодичность = День,
ФорматДат = "ДЛФ=ДУ"
) КАК Обороты
| Параметр виртуальной таблицы | Описание | Пример значения |
|---|---|---|
ПериодС |
Начальная дата периода | ДАТАВРЕМЯ(2026, 1, 1) |
ПериодПо |
Конечная дата периода | КОНЕЦДНЯ(ТЕКУЩАЯДАТА()) |
Периодичность |
Группировка по дням/неделям/месяцам | День, Месяц |
ФорматДат |
Формат вывода даты (не все таблицы поддерживают) | "ДЛФ=ДУ" (ISO) |
3. Функция ДАТАВРЕМЯ() и её роль в формате
Функция ДАТАВРЕМЯ() не только создаёт значение типа Дата, но и может использоваться для приведения строки к дате с заданным форматом. Это полезно при работе с внешними источниками данных, где даты приходят в нестандартном виде.
Синтаксис:
ДАТАВРЕМЯ(Год, Месяц, День[, Час, Минута, Секунда])
// или для строки:
ДАТАВРЕМЯ(СтрокаДата, "Формат")
Примеры:
// 1. Создание даты из чисел
ДатаНачала = ДАТАВРЕМЯ(2026, 5, 15);
// 2. Преобразование строки в дату (формат "ГГГГ-ММ-ДД")
ДатаИзСтроки = ДАТАВРЕМЯ("2026-05-15", "ДФ=ДУ");
// 3. Нестандартный формат (например, из Excel)
ДатаИзExcel = ДАТАВРЕМЯ("15/05/2026", "ДФ=ДМГ");
⚠️ Внимание: При преобразовании строки в дату с помощью ДАТАВРЕМЯ() платформа 1С использует региональные настройки для интерпретации неявных форматов. Например, строка"05/06/2026"в российских настройках будет воспринята как5 июня, а в американских — как6 мая. Всегда явно указывайте формат!
Если вам нужно получить текущую дату в универсальном формате ISO без времени, используйте комбинацию: ФОРМАТ(НАЧАЛОДНЯ(ТЕКУЩАЯДАТА()), "ДЛФ=ДУ"). Это гарантированно вернёт строку вида 2026-05-15 независимо от региональных настроек.
4. Работа с датами в параметрах запроса
При передаче дат в запрос через параметры (например, из формы отчёта) формат даты определяется автоматически, но его можно контролировать. Рассмотрим два подхода:
- Явное преобразование в запросе:
ВЫБРАТЬФОРМАТ(&ДатаНачала, "ДЛФ=ДУ") КАК ДатаISO
ИЗ
Справочник.Номенклатура КАК Номенклатура
- Настройка формата на стороне клиента:
Перед передачей параметра в запрос приведите его к нужному формату с помощью встроенных функций 1С:
ПараметрыЗапроса.Установить("ДатаНачала",ФОРМАТ(ДатаНачала, "ДЛФ=ДУ"));
В таких случаях рекомендуется всегда явно указывать формат.
Явно указан формат даты в запросе или параметре|Проверены региональные настройки сервера|Тестирование проведено с разными форматами ввода|Учтёны особенности фоновых задач-->
5. Типичные ошибки и как их избежать
Даже опытные разработчики 1С иногда сталкиваются с проблемами при работе с датами в запросах. Вот наиболее распространённые ошибки и способы их решения:
- ❌ Игнорирование региональных настроек:
Если не указать явный формат, запрос может вернуть даты в неожиданном виде (например,
ММ/ДД/ГГГГвместоДД.ММ.ГГГГ). Решение: всегда используйте параметрДЛФв функции ФОРМАТ(). - ❌ Несоответствие форматов при сравнении:
Сравнение даты в формате
ДД.ММ.ГГГГсо строкой"2026-05-15"приведёт к ошибке. Решение: приводите обе части сравнения к одному типу (либо обе к Дата, либо обе к Строка с одинаковым форматом). - ❌ Проблемы с временной зоной:
При обмене данными с внешними системами (например, через REST API) даты могут сдвигаться на несколько часов. Решение: используйте
ДЛФ=ДУ(UTC) или явно указывайте временную зону.
Пример ошибочного сравнения:
// ❌ Некорректно (сравнение даты и строки)
ВЫБРАТЬ
Документ.Дата
ИЗ
Документ.ЗаказПокупателя КАК Документ
ГДЕ
Документ.Дата = "15.05.2026" // Ошибка!
Правильный вариант:
// ✅ Корректно (оба операнда — даты)
ВЫБРАТЬ
Документ.Дата
ИЗ
Документ.ЗаказПокупателя КАК Документ
ГДЕ
Документ.Дата = ДАТАВРЕМЯ(2026, 5, 15)
Почему функция ТЕКУЩАЯДАТА() может возвращать разные значения?
В фоновых заданиях, регламентных задачах или на сервере 1С:Предприятие функция ТЕКУЩАЯДАТА() возвращает дату сервера, которая может отличаться от даты клиентского компьютера. Это важно учитывать при разработке распределённых систем или интеграций. Чтобы получить дату клиента, используйте параметр сеанса или передавайте дату явно.
6. Продвинутые приёмы: пользовательские форматы и обмен данными
В некоторых сценариях стандартных форматов 1С недостаточно. Например, при обмене с 1С:EDT, SQL-базами или JSON-API может потребоваться кастомный формат. Рассмотрим несколько нетривиальных решений:
- 🔧 Пользовательский формат через ЗАМЕНИТЬ():
Если нужно вывести дату в виде
15 мая 2026 г., используйте комбинацию функций:ФОРМАТ(Дата, "ДЛФ=Д") КАК СтандартныйФормат,ЗАМЕНИТЬ(
ЗАМЕНИТЬ(
ФОРМАТ(Дата, "ДЛФ='DD MMMM YYYY г.'"),
".", ""
),
" ", " "
) КАК ПользовательскийФормат
- 📤 Экспорт в JSON с корректными датами:
При формировании JSON для REST API даты должны быть в формате ISO. Используйте:
Запрос = Новый Запрос;Запрос.Текст =
"ВЫБРАТЬ
| ФОРМАТ(Документ.Дата, ""ДЛФ=ДУТ"") КАК ДатаISO
|ИЗ
| Документ.ЗаказПокупателя КАК Документ";
Результат = Запрос.Выполнить().Выгрузить();
- 🗃️ Работа с историческими данными:
При анализе данных за несколько лет удобно выводить дату в формате
МММ ГГГГ(например,май 2026):ФОРМАТ(Дата, "ДЛФ=МГ")
⚠️ Внимание: При обмене данными с внешними системами (например, через HTTP-Сервисы или RabbitMQ) убедитесь, что формат даты соответствует ожиданиям принимающей стороны. Например, некоторые SQL-базы (например, PostgreSQL) требуют форматYYYY-MM-DD, а Oracle может использоватьDD-MON-YYYY.
Для обмена данными между разными системами всегда используйте универсальный формат ISO (ДЛФ=ДУ или ДЛФ=ДУТ с временем). Это минимизирует риски ошибок при парсинге дат.
FAQ: Частые вопросы по формату даты в 1С
Как вывести дату в формате "15.05.2026 (понедельник)" с днём недели?
Используйте комбинацию функций ФОРМАТ() и ДЕНЬНЕДЕЛИ():
ФОРМАТ(Дата, "Д") + " (" +
ВЫБРАТЬ
КОГДА ДЕНЬНЕДЕЛИ(Дата) = 1 ТОГДА "понедельник"
КОГДА ДЕНЬНЕДЕЛИ(Дата) = 2 ТОГДА "вторник"
//.. остальные дни
КОНЕЦ КАК ДеньНедели
+ ")"
Или проще — через формат ДЛФ='DD.MM.YYYY (dddd)', если ваша версия платформы поддерживает расширенные форматы.
Почему функция ФОРМАТ() возвращает пустую строку для даты?
Это происходит в трёх случаях:
- Передана пустая дата (
ДАТАВРЕМЯ(1, 1, 1)). - Неправильно указан формат (например, опечатка в параметре
ДЛФ). - Региональные настройки сервера конфликтуют с запрашиваемым форматом.
Проверьте исходное значение даты с помощью ЕСТЬNULL(Дата, ДАТАВРЕМЯ(1,1,1)).
Как в запросе получить только год или месяц из даты?
Используйте функции ГОД(), МЕСЯЦ() или форматирование:
// Вариант 1: отдельные функции
ГОД(Документ.Дата) КАК Год,
МЕСЯЦ(Документ.Дата) КАК Месяц
// Вариант 2: форматирование
ФОРМАТ(Документ.Дата, "ДЛФ=Г") КАК ГодСтрока, // "2026"
ФОРМАТ(Документ.Дата, "ДЛФ=М") КАК МесяцСтрока // "05"
Можно ли в запросе сравнивать даты без учёта времени?
Да, для этого используйте функцию НАЧАЛОДНЯ():
ВЫБРАТЬ
Документ.Ссылка
ИЗ
Документ.ЗаказПокупателя КАК Документ
ГДЕ
НАЧАЛОДНЯ(Документ.Дата) = НАЧАЛОДНЯ(&ПараметрДата)
Это сравнит только даты, игнорируя время.
Как конвертировать строку "20260515" в дату?
Используйте функцию ДАТАВРЕМЯ() с явным указанием формата:
ДатаИзСтроки = ДАТАВРЕМЯ("20260515", "ДФ=ДЛГ");
Где ДЛГ — формат ДДММГГГГ без разделителей.