Разработка и Конфигурация · 12 мин
Как в запросе 1С выразить дату как строку
Как в запросе 1С преобразовать дату в строку: функция ПРЕДСТАВЛЕНИЕ, ограничения, работа с Формат() в коде, типичные ошибки и проверка результата.
Задача преобразовать дату в строку прямо в тексте запроса 1С возникает часто: при формировании подписей в отчётах, при объединении периодов в одно поле, при выгрузке данных, где формат даты должен быть задан заранее. Проблема в том, что язык запросов 1С не содержит функции форматирования даты по произвольному шаблону — такой, как Формат() во встроенном языке. Поэтому разработчику приходится выбирать между ограниченными средствами запроса и постобработкой результата в коде.
Основной инструмент внутри запроса — функция ПРЕДСТАВЛЕНИЕ(). Она возвращает строковое представление значения, в том числе даты, но формат этого представления зависит от региональных настроек сеанса и не управляется разработчиком. Это ключевое ограничение, которое определяет всю тактику решения: там, где нужен строго заданный формат (например, «2026-01-31» или «31.01.2026 15:30»), запрос alone не справится, и потребуется обработка результата в коде или вычисляемые поля СКД.
Ниже разобраны все рабочие способы: ПРЕДСТАВЛЕНИЕ в запросе, разбор даты на компоненты функциями ДЕНЬ, МЕСЯЦ, ГОД с последующей сборкой строки, форматирование через Формат() при обходе выборки, а также вариант с вычисляемыми полями в СКД. Для каждого способа указаны условия применимости и типичные ошибки.
Функция ПРЕДСТАВЛЕНИЕ: базовый способ внутри запроса
Функция ПРЕДСТАВЛЕНИЕ() принимает выражение практически любого типа и возвращает его строковое представление. Для даты результат будет содержать дату и время в формате, определяемом настройками сеанса (обычно соответствующими региональным установкам информационной базы).
ВЫБРАТЬ
ПРЕДСТАВЛЕНИЕ(РеализацияТоваровУслуг.Дата) КАК ДатаСтрокой,
РеализацияТоваровУслуг.Номер КАК Номер
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
Такой запрос вернёт поле типа «Строка», с которым можно выполнять строковые операции: объединять с другими полями через оператор «+», использовать в ПОДОБНО, выводить в отчёт. Типичный сценарий — склейка номера и даты документа в одну колонку для печатной формы или выгрузки.
Важно понимать: ПРЕДСТАВЛЕНИЕ — это не форматирование, а приведение к строке «как есть». Вы не можете указать шаблон, убрать время, изменить разделитель или порядок день-месяц-год. Если документ хранит дату со временем, время тоже попадёт в строку, и отсечь его средствами запроса через ПРЕДСТАВЛЕНИЕ нельзя.
Ограничения ПРЕДСТАВЛЕНИЕ и когда оно не подходит
Первое ограничение — непредсказуемость формата. На разных серверах и в разных сеансах региональные настройки могут отличаться, и одна и та же дата превратится в «31.01.2026 10:15:00» либо в другой вариант записи. Для отчётов, которые смотрят люди, это допустимо; для машинной обработки (обмены, выгрузки, сопоставление строк) — нет.
Второе ограничение — производительность. ПРЕДСТАВЛЕНИЕ по ссылочным полям заставляет платформу получать представление объекта, что при больших выборках замедляет запрос. Для полей типа Дата это менее критично, чем для ссылок, но на миллионах строк разница заметна. Если строка нужна только для вывода в СКД, часто выгоднее оставить дату как есть и задать формат в настройках отчёта.
Третье ограничение — невозможность обрезать время или переупорядочить компоненты. Дата с временем 00:00:00 всё равно вернёт строку с «0:00:00» в конце. Если требуется только «31.01.2026», придётся либо собирать строку из компонентов, либо обрабатывать результат в коде.
Сборка строки из компонентов даты: ГОД, МЕСЯЦ, ДЕНЬ
Когда нужен контролируемый формат прямо в запросе, дату разбирают на части встроенными функциями ГОД(), МЕСЯЦ(), ДЕНЬ(), ЧАС(), МИНУТА(), СЕКУНДА() и складывают как строки. Поскольку эти функции возвращают числа, их нужно привести к строке — и здесь снова используется ПРЕДСТАВЛЕНИЕ, но уже для чисел, где формат предсказуем.
ВЫБРАТЬ
ПРЕДСТАВЛЕНИЕ(ГОД(Док.Дата)) + ""."" +
ПРЕДСТАВЛЕНИЕ(МЕСЯЦ(Док.Дата)) + ""."" +
ПРЕДСТАВЛЕНИЕ(ДЕНЬ(Док.Дата)) КАК ДатаСтрокой
ИЗ
Документ.РеализацияТоваровУслуг КАК Док
Главная проблема этого способа — отсутствие ведущих нулей: январь даст «1», а не «01», и строка примет вид «2026.1.5». Выровнять длину средствами запроса сложно: приходится строить конструкции через ВЫБОР с проверкой диапазона (если месяц меньше 10, добавить «0»). Это работает, но делает текст запроса громоздким и трудно читаемым.
Практическая рекомендация: сборку из компонентов применяйте, только когда результат обрабатывается человеком и нестрогий формат допустим, либо когда вы готовы сопровождать конструкцию ВЫБОР. Для обменов с фиксированным форматом надёжнее форматировать в коде.
Форматирование даты в коде через Формат()
Самый гибкий и предсказуемый способ — получить из запроса поле типа Дата и отформатировать его при обходе выборки функцией Формат(). Функция принимает строку формата, например «ДФ=yyyy-MM-dd» или «ДФ='dd.MM.yyyy HH:mm:ss'», и возвращает строку строго по шаблону, независимо от региональных настроек.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Док.Дата КАК Дата,
| Док.Номер КАК Номер
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Док";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ДатаСтрокой = Формат(Выборка.Дата, "ДФ=yyyy-MM-dd");
// дальнейшая обработка
КонецЦикла;
Этот подход снимает все ограничения: доступны любые шаблоны, включая названия месяцев, дни недели, произвольные разделители. Параметр «ДЛФ» позволяет получить локализованные представления (длинная дата, короткая дата) без ручного шаблона. Дополнительно можно передать второй параметр — код локализации, чтобы зафиксировать язык представления.
Цена способа — постобработка: строка появляется только после выполнения запроса, поэтому использовать её в условиях, соединениях и группировках самого запроса нельзя. Для отчётов на СКД аналогичную роль играют вычисляемые поля или оформление поля.
- 1Определите, где нужна строка: внутри запроса (для склейки полей) или на выходе (для отчёта, файла, сообщения).
- 2Если на выходе — оставьте в запросе поле типа Дата и форматируйте его функцией Формат() при обходе выборки с нужным шаблоном ДФ.
- 3Если строка нужна в самом запросе и формат не критичен — примените ПРЕДСТАВЛЕНИЕ(Дата).
- 4Если в запросе нужен конкретный порядок компонентов — соберите строку из ГОД(), МЕСЯЦ(), ДЕНЬ() с конструкцией ВЫБОР для ведущих нулей.
- 5Проверьте результат на датах с однозначными днём и месяцем (например, 05.01) и на дате с ненулевым временем.
Отчёты на СКД: формат без изменения запроса
В системе компоновки данных форматировать дату в тексте запроса обычно не нужно вовсе. Поле типа Дата выводится в отчёт, а его представление настраивается через оформление: в настройках поля задаётся форматная строка, аналогичная параметру функции Формат(). Так отчёт получает нужный вид «31.01.2026» или «Январь 2026» без потери типа даты.
Сохранение типа Дата даёт преимущества: корректная сортировка, возможность группировки по периодам (день, месяц, квартал) через стандартные поля-периоды, фильтрация по диапазону. Если бы дата была преобразована в строку запросом, все эти возможности пришлось бы восстанавливать вручную.
Если строковое представление всё же нужно как отдельное поле (например, для объединения нескольких колонок в одну), используйте вычисляемое поле СКД с выражением на языке выражений компоновки. Там доступны функции форматирования, и результат будет построен уже на этапе формирования отчёта, не нагружая запрос к базе.
Сравнение вариантов
Подходит для быстрой склейки полей и вывода в простые отчёты. Ограничение: формат зависит от региональных настроек, шаблон задать нельзя.
Подходит, когда нужен контроль порядка компонентов внутри запроса. Ограничение: нет ведущих нулей без громоздкого ВЫБОР, текст запроса разрастается.
Подходит для выгрузок, файлов, сообщений — любой шаблон, полная предсказуемость. Ограничение: строка недоступна внутри самого запроса.
Подходит для отчётов: тип даты сохраняется, формат задаётся в настройках. Ограничение: применимо только в отчётах на СКД.
Проверка результата и границы применения
Проверять преобразование следует на контрольном наборе дат, а не на одной. Минимальный набор: дата с однозначным днём и месяцем (05.01), дата с нулевым временем, дата с ненулевым временем (14:37:09), граница года (31.12 и 01.01). На этом наборе сразу видны проблемы ведущих нулей, лишнего времени и порядка компонентов.
Для проверки в консоли запросов выведите рядом исходное поле даты и строковое поле — расхождения видны визуально. Если строка собирается из компонентов, дополнительно проверьте длину результата: у дат с однозначными числами она будет меньше, что критично для фиксированных форматов обмена.
Отдельно проверьте поведение на пустых датах. Пустая дата (01.01.0001) через ПРЕДСТАВЛЕНИЕ вернёт строку с этим значением, а не пустую строку. Если в данных возможны незаполненные даты, добавьте обработку через ВЫБОР: для пустой даты выводить пустую строку или признак «не указано».
Как проверить результат
Строка содержит ведущие нули там, где они нужны формату: «05.01.2026»
Получено «5.1.2026» — теряется выравнивание и ломается сортировка строк
Время либо корректно отсечено, либо присутствует по требованиям формата
Неожиданный хвост «0:00:00» или обрезанное значение времени
Выводится пустая строка или явный признак отсутствия даты
В отчёт попадает «01.01.0001 0:00:00» как содержательное значение
Порядок строк хронологический
Порядок нарушен — значит, сортировка идёт по строковому полю
Частые вопросы
Можно ли в запросе 1С задать произвольный формат даты, как Формат() в коде?
Нет, в языке запросов нет аналога функции Формат() с шаблоном. Доступны только ПРЕДСТАВЛЕНИЕ (формат зависит от настроек сеанса) и ручная сборка из ГОД(), МЕСЯЦ(), ДЕНЬ(). Произвольный шаблон реализуется в коде при обходе результата или через оформление полей в СКД.
Почему ПРЕДСТАВЛЕНИЕ(Дата) возвращает время, хотя нужна только дата?
Потому что тип Дата в 1С всегда содержит время, и ПРЕДСТАВЛЕНИЕ выводит значение целиком. Отсечь время внутри запроса можно функцией НАЧАЛОПЕРИОДА(Дата, ДЕНЬ) — время станет 00:00:00, но в строке всё равно появится. Надёжнее форматировать в коде с шаблоном без времени.
Как получить строку вида «2026-01-31» для выгрузки в файл?
Самый надёжный путь — оставить в запросе поле типа Дата и при обходе выборки применить Формат(Дата, "ДФ=yyyy-MM-dd"). Сборка в запросе из компонентов потребует конструкций ВЫБОР для ведущих нулей и всё равно будет менее читаемой.
Влияет ли ПРЕДСТАВЛЕНИЕ на производительность запроса?
Да, особенно на больших выборках и при применении к ссылочным полям, где платформа получает представление объекта. Для дат накладные расходы меньше, но на больших объёмах заметны. Если строка нужна только для отображения, лучше перенести форматирование на этап вывода.
Можно ли сортировать результат запроса по строковому представлению даты?
Технически можно, но результат будет неправильным: строки сравниваются посимвольно, поэтому «05.01.2026» окажется после «31.12.2023». Сортировать нужно исходное поле типа Дата, а строковое поле использовать только для отображения.
Что вернёт ПРЕДСТАВЛЕНИЕ для пустой даты?
Строку со значением пустой даты — «01.01.0001 0:00:00» в типичном региональном формате, а не пустую строку. Если незаполненные даты должны отображаться пустыми, добавьте обработку через ВЫБОР с проверкой на значение ДАТАВРЕМЯ(1,1,1).
Что важно запомнить
В запросе 1С дату в строку преобразует ПРЕДСТАВЛЕНИЕ, но без управления форматом. Для строгого шаблона используйте Формат() в коде или оформление полей в СКД, а сортировку и сравнение всегда выполняйте по исходному полю типа Дата.