Разработка и Конфигурация · 12 мин
1С запрос: как выразить дату как строку
Как в запросе 1С преобразовать дату в строку: функция ФОРМАТ, ВЫРАЗИТЬ, форматы вывода, типичные ошибки и примеры готового кода для разработчиков.
Задача преобразовать дату в строку в запросе 1С возникает часто: при формировании представлений периодов в отчётах, при выгрузке данных во внешние системы, при группировке по месяцам или годам в текстовом виде. В языке запросов 1С нет отдельной функции «ДатаВСтроку», поэтому используются два основных механизма — функция ФОРМАТ и оператор ВЫРАЗИТЬ, каждый со своими ограничениями.
Ключевая разница между ними: ФОРМАТ позволяет задать произвольный шаблон представления даты (например, «ДД.ММ.ГГГГ» или только месяц и год), а ВЫРАЗИТЬ(... КАК Строка(...)) выполняет приведение типа и возвращает стандартное строковое представление даты без управления форматом. Выбор зависит от того, нужен ли вам конкретный вид строки или достаточно технического преобразования.
Ниже разобраны синтаксис обоих способов, готовые примеры запросов, ограничения каждого подхода, типичные ошибки и альтернативы на случай, когда запрос не даёт нужного результата.
Функция ФОРМАТ: основной способ преобразования даты в строку
Функция ФОРМАТ в языке запросов 1С принимает два аргумента: значение (в нашем случае — поле типа «Дата») и строку формата. Результатом всегда является строка, что и требуется при выгрузке, объединении с другими текстовыми полями или выводе в отчёт.
Форматная строка задаётся через параметр ДФ (для даты) с использованием шаблонных символов: Д — день, М — месяц, Г — год, Ч — часы, м — минуты, с — секунды. Количество повторений символа определяет длину компонента: ГГ — две цифры года, ГГГГ — четыре.
ВЫБРАТЬ
ФОРМАТ(Документ.Дата, "ДФ=dd.MM.yyyy") КАК ДатаСтрокой,
ФОРМАТ(Документ.Дата, "ДФ='MMMM yyyy'") КАК МесяцГод,
ФОРМАТ(Документ.Дата, "ДФ=yyyy-MM-dd") КАК ДатаДляВыгрузки
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
Обратите внимание: в русской локали конфигуратора допустимы и русские обозначения (ДФ=ДД.ММ.ГГГГ), но англоязычные шаблоны (dd.MM.yyyy) работают стабильнее при переносе кода между базами с разными региональными настройками. Для выгрузок в обменные форматы (XML, JSON, CSV) чаще всего используют ISO-подобный вид yyyy-MM-dd, поскольку он однозначно читается любыми системами.
Оператор ВЫРАЗИТЬ: приведение даты к строковому типу
Оператор ВЫРАЗИТЬ в языке запросов предназначен для приведения типов. Синтаксис для даты выглядит так: ВЫРАЗИТЬ(Поле КАК Строка(19)). Длина строки указывается с запасом — стандартное представление даты со временем занимает 19 символов (ДД.ММ.ГГГГ ЧЧ:ММ:СС).
ВЫБРАТЬ
ВЫРАЗИТЬ(Документ.Дата КАК Строка(19)) КАК ДатаСтрокой
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
Главное ограничение способа — вы не управляете форматом. Платформа вернёт представление даты в соответствии с региональными настройками сеанса, обычно «ДД.ММ.ГГГГ Ч:ММ:СС». Если задача — получить «2026-03» или «1 квартал», ВЫРАЗИТЬ здесь не поможет.
На практике ВЫРАЗИТЬ к дате применяют редко: чаще его используют для приведения составных полей к конкретному типу или для чисел и булево. Если вам нужна именно строка из даты с контролируемым видом — берите ФОРМАТ.
Сравнение вариантов
Полный контроль над шаблоном вывода: любой порядок компонентов, разделители, названия месяцев. Подходит для отчётов, выгрузок, представлений. Недостаток — результат всегда строка, дальнейшие вычисления с датой невозможны.
Простое приведение типа без настройки формата. Подходит для технических задач, когда вид строки неважен. Не позволяет задать шаблон — результат зависит от региональных настроек сеанса.
Запрос возвращает дату как есть, а строка формируется средствами встроенного языка через Формат() или Строка(). Подходит, когда формат зависит от логики, которую сложно выразить в запросе. Требует обхода выборки в коде.
Популярные шаблоны форматов даты
Ниже — шаблоны, которые закрывают большинство практических задач. Их можно копировать в запрос напрямую, подставив своё поле вместо Дата.
| Шаблон формата | Пример результата | Где применяется |
|---|---|---|
ДФ=dd.MM.yyyy | 15.03.2026 | Печатные формы, отчёты для пользователей |
ДФ=yyyy-MM-dd | 2026-03-15 | Выгрузки в обменные форматы, сортировка как строки |
ДФ='MM.yyyy' | 03.2026 | Группировка по месяцам в отчётах |
ДФ=yyyy | 2026 | Группировка по годам |
ДФ='dd.MM.yyyy HH:mm:ss' | 15.03.2026 14:30:05 | Журналы, технические выгрузки со временем |
ДФ='MMMM yyyy' | Март 2026 | Человекочитаемые представления периодов |
При группировке по месяцу или году помните о ловушке: строки вида «03.2026» и «11.2023» сортируются лексикографически, то есть «11.2023» окажется раньше «03.2026». Для правильного порядка либо используйте формат yyyy-MM, либо добавьте в запрос отдельное поле с исходной датой и сортируйте по нему.
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(Продажи.Период, МЕСЯЦ) КАК Месяц,
ФОРМАТ(НАЧАЛОПЕРИОДА(Продажи.Период, МЕСЯЦ), "ДФ='yyyy-MM'") КАК МесяцСтрокой,
СУММА(Продажи.СуммаОборот) КАК Сумма
ИЗ
РегистрНакопления.Продажи.Обороты КАК Продажи
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(Продажи.Период, МЕСЯЦ)
УПОРЯДОЧИТЬ ПО
МесяцГруппировка и сортировка по дате, представленной строкой
Типовой сценарий — сводный отчёт по месяцам, где колонка периода должна быть строкой. Правильный приём: группировать по результату НАЧАЛОПЕРИОДА(Период, МЕСЯЦ) как по дате, а строковое представление получать через ФОРМАТ от того же выражения. Сортировку выполнять по полю-дате, а не по строке.
Если сгруппировать сразу по строковому полю ФОРМАТ(...), группировка технически сработает, но вы потеряете возможность корректной хронологической сортировки и соединения с другими таблицами по периоду. Особенно это критично в СКД, где порядок группировок влияет на итоги.
В СКД есть альтернатива: оставить в запросе поле типа «Дата», а строковое представление настроить через вычисляемое поле или оформление поля в настройках отчёта. Так отчёт сохранит корректную сортировку и итоги по периодам, а пользователь увидит нужный формат.
- 1Добавьте в запрос поле НАЧАЛОПЕРИОДА(Период, МЕСЯЦ) — это дата для группировки и сортировки
- 2Добавьте второе поле ФОРМАТ(НАЧАЛОПЕРИОДА(Период, МЕСЯЦ), "ДФ='yyyy-MM'") — строка для отображения
- 3Сгруппируйте запрос по полю с датой начала месяца
- 4В УПОРЯДОЧИТЬ ПО укажите поле-дату, а не строковое поле
- 5Проверьте результат: месяцы должны идти в хронологическом порядке, суммы — сходиться с отчётом без группировки
Типичные ошибки и ограничения
Самая частая ошибка — попытка применить ВЫРАЗИТЬ с шаблоном формата. Оператор ВЫРАЗИТЬ не принимает форматную строку: конструкция вида ВЫРАЗИТЬ(Дата КАК Строка(19), "ДФ=...") синтаксически невозможна. Формат задаётся только через ФОРМАТ.
Вторая ошибка — слишком маленькая длина в ВЫРАЗИТЬ(... КАК Строка(10)) для даты со временем: значение обрежется, и время потеряется. Для полной даты-времени указывайте минимум 19 символов.
Третья проблема — пустые даты. Для пустой даты (01.01.0001) ФОРМАТ вернёт строку с этим значением, а не пустую строку. Если в отчёте такие строки недопустимы, обработайте их через ВЫБОР КОГДА Дата = ДАТАВРЕМЯ(1,1,1) ТОГДА "" ИНАЧЕ ФОРМАТ(...) КОНЕЦ.
Ещё одно ограничение: функция ФОРМАТ в запросе не поддерживает все возможности одноимённой функции встроенного языка. Например, параметры локального представления и некоторые расширенные шаблоны могут отличаться — проверяйте результат на реальных данных, а не только в консоли запросов с единичной записью.
Альтернатива: преобразование в коде после запроса
Если формат строки зависит от условий, которые сложно выразить в запросе (разные шаблоны для разных строк, настройки пользователя, локализация), разумнее вернуть из запроса дату как есть, а строку формировать при обходе выборки:
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ДатаСтрокой = Формат(Выборка.Дата, "ДФ=dd.MM.yyyy");
// дальнейшая обработка
КонецЦикла;
Функция Формат() встроенного языка мощнее своего аналога в запросе: поддерживает параметры локали, форматные строки по умолчанию из настроек информационной базы (Л=), а также вариант Строка(Дата) для быстрого технического преобразования.
Минус подхода — строка появляется только после выполнения запроса, поэтому её нельзя использовать в соединениях, группировках и отборах внутри самого запроса. Для СКД-отчётов вместо кода используйте вычисляемые поля или настройку оформления.
Как выбрать способ
Проверка результата
После внедрения преобразования проверьте запрос на реальных данных. Убедитесь, что формат соответствует ожиданиям во всех строках, включая граничные случаи: пустые даты, даты без времени, даты на границах периодов.
Дополнительно сверьте итоги: если запрос с группировкой по строковому представлению периода даёт другие суммы, чем тот же запрос с группировкой по дате, — значит, в данных есть записи, которые строковое представление объединило или разъединило некорректно (например, из-за разного времени внутри дня).
Как проверить результат
Все строки соответствуют заданному шаблону, разделители и порядок компонентов верны
Часть строк в другом формате или обрезана — проверьте шаблон и длину при ВЫРАЗИТЬ
Периоды идут в хронологическом порядке
Месяцы или годы перемешаны — сортировка идёт по строке, замените на сортировку по полю-дате
Пустые даты показаны пустой строкой или осознанно выведены как 01.01.0001
В отчёте неожиданные строки 01.01.0001 — добавьте обработку через ВЫБОР
Итоги совпадают с контрольным запросом без преобразования
Суммы расходятся — проверьте, не группируете ли вы по строке вместо даты
Часто задаваемые вопросы
Можно ли в запросе 1С получить только год или месяц из даты числом?
Да, для этого есть отдельные функции: ГОД(Дата), МЕСЯЦ(Дата), ДЕНЬ(Дата), ЧАС(Дата), МИНУТА(Дата), СЕКУНДА(Дата). Они возвращают числа, а не строки. Если число нужно именно как текст, дополнительно примените ФОРМАТ к результату или используйте ФОРМАТ(Дата, "ДФ=yyyy") сразу.
Почему ФОРМАТ в запросе возвращает дату в другом виде, чем Формат() в коде?
Функции в запросе и во встроенном языке — разные реализации с разным набором поддерживаемых параметров. Запросная ФОРМАТ ограничена возможностями языка запросов и не поддерживает часть параметров локализации. Всегда проверяйте результат именно в том контексте, где функция будет выполняться.
Как вывести дату в виде «1 квартал 2026» в запросе?
Готового шаблона для квартала нет. Используйте конструкцию ВЫБОР с функцией КВАРТАЛ(Дата): ВЫБОР КОГДА КВАРТАЛ(Дата) = 1 ТОГДА "1 квартал " И Т.Д., а год добавьте через ФОРМАТ(Дата, "ДФ=yyyy"). Строки соединяются оператором «+» (конкатенация) в языке запросов.
Работает ли ВЫРАЗИТЬ(Дата КАК Строка) во всех СУБД, которые поддерживает 1С?
Да, приведение даты к строке через ВЫРАЗИТЬ и функция ФОРМАТ реализованы платформой и транслируются в корректные конструкции для всех поддерживаемых СУБД (MS SQL, PostgreSQL, Oracle, IBM DB2, файловый вариант). Однако точный вид строки при ВЫРАЗИТЬ может зависеть от региональных настроек — для переносимых решений надёжнее ФОРМАТ с явным шаблоном.
Как соединить таблицы по месяцу, если в одной дата, а в другой строка вида «03.2026»?
Приводите обе стороны к одному типу и формату: либо обе к строке через одинаковый ФОРМАТ-шаблон, либо строку обратно к дате. Второй вариант предпочтительнее: ДАТАВРЕМЯ не принимает строку в запросе напрямую, поэтому надёжнее сравнивать через НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА по диапазону месяца, чем через строковое равенство.
Что важно запомнить
Для преобразования даты в строку в запросе 1С используйте ФОРМАТ с шаблоном ДФ — это единственный способ управлять видом результата. ВЫРАЗИТЬ(... КАК Строка(19)) пригоден только для технического приведения типа. Группировку и сортировку выполняйте по полю-дате, а строковое представление добавляйте отдельным полем. Не забывайте обрабатывать пустые даты и проверять итоги на реальных данных.