Разработка и Конфигурация · 10 мин
1С: дата как строка — способы преобразования и форматирования
Как в 1С преобразовать дату в строку: Формат(), Строка(), представление в запросах, форматные строки, типичные ошибки и примеры кода для разработчика.
Задача представить дату в виде строки возникает в 1С постоянно: при формировании имени файла выгрузки, выводе сообщения пользователю, обмене данными через XML и JSON, построении текста запроса или печатной формы. Встроенный язык предлагает несколько механизмов преобразования, и у каждого есть особенности, которые влияют на результат.
Главная ловушка — неявное приведение типа. Если просто «склеить» дату со строкой, платформа вызовет стандартное строковое представление, которое зависит от региональных настроек сеанса и почти никогда не совпадает с тем, что нужно для обмена или имени файла. Поэтому в прикладном коде дату в строку преобразуют явно — через функцию Формат() с управляющей форматной строкой.
Как устроено преобразование даты в строку в 1С
Тип «Дата» в 1С хранит момент времени с точностью до секунды (дата и время одновременно), а не текст. Строковое представление — это всегда отдельная операция, результат которой определяется либо настройками сеанса, либо явно заданным шаблоном. Понимание этого различия избавляет от большинства ошибок: одна и та же дата может выглядеть как «01.03.2026 10:30:00», «03/01/2026» или «2026-03-01» в зависимости от способа преобразования.
Доступны четыре основных механизма: функция Формат() с форматной строкой, функция Строка() и неявное приведение, конструкция ПРЕДСТАВЛЕНИЕ() в языке запросов и методы сериализации (ЗаписьXML, ЗаписьJSON), которые сами преобразуют дату в канонический текстовый вид. Выбор зависит от того, где будет использоваться строка: в интерфейсе, в файле обмена или в запросе.
Функция Формат() — основной инструмент
Функция Формат() принимает значение и строку параметров форматирования. Для дат ключевой параметр — ДФ, после знака равенства указывается шаблон. Регистр букв важен: «M» — месяц, а «m» — минуты; смешивание даёт неожиданные результаты, например дату с минутами на месте месяца.
ДатаДокумента = ТекущаяДатаСеанса();
Строка1 = Формат(ДатаДокумента, "ДФ=dd.MM.yyyy"); // 15.03.2026
Строка2 = Формат(ДатаДокумента, "ДФ='dd MMMM yyyy г.'"); // 15 марта 2026 г.
Строка3 = Формат(ДатаДокумента, "ДФ=yyyy-MM-dd"); // 2026-03-15
Строка4 = Формат(ДатаДокумента, "ДФ='yyyy-MM-dd HH:mm:ss'");// 2026-03-15 14:30:00
Литеральные символы внутри шаблона (точки, дефисы, слова) заключаются в одинарные кавычки, если могут быть восприняты как управляющие. Наиболее ходовые шаблоны: dd.MM.yyyy — привычный пользователю вид, yyyy-MM-dd — сортировка и имена файлов, yyyyMMdd_HHmmss — уникальные имена выгрузок без запрещённых символов.
ИмяФайла = "Выгрузка_" + Формат(ТекущаяДатаСеанса(), "ДФ=yyyyMMdd_HHmmss") + ".xml";Локализация и параметр Л
Если в шаблоне используются названия месяцев или дней недели (MMMM, dddd), результат зависит от языка. Параметр Л= позволяет зафиксировать язык независимо от настроек сеанса: Формат(Дата, "Л=en_US; ДФ='MMMM dd, yyyy'"). Это важно при формировании документов для контрагентов на другом языке и при сравнении строк в коде.
Что дают Строка() и неявное приведение
Функция Строка(Дата) и конкатенация вида "Дата: " + Дата используют представление по умолчанию, определяемое региональными настройками информационной базы (или сеанса). На разных серверах одна и та же дата может превратиться в «01.02.2026 0:00:00» или «2/1/2026». Для сообщений пользователю это допустимо, для любой машинной обработки — нет.
Особенно опасно неявное приведение при склейке текста запроса: дата попадает в текст в локальном формате, и запрос либо падает с ошибкой синтаксиса, либо, что хуже, интерпретирует дату неправильно. Для параметров запроса дату всегда передают через УстановитьПараметр(), а не подстановкой строки.
Дата как строка в запросах
В языке запросов функции Формат() нет — там работает оператор ПРЕДСТАВЛЕНИЕ(Поле). Он возвращает строковое представление ссылки или значения, включая дату, но формат результата платформа не гарантирует и настраивать его нельзя. Поэтому ПРЕДСТАВЛЕНИЕ подходит для вывода в отчёты и табличные документы, но не для обмена данными.
Обратная задача — получить дату из строки в запросе — штатно не решается: в языке запросов нет функции преобразования строки в дату. Если в реквизите строкового типа хранятся даты, их придётся обрабатывать в коде после выборки либо на этапе записи данных приводить к настоящему типу «Дата».
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПРЕДСТАВЛЕНИЕ(Реализация.Дата) КАК ДатаСтрокой,
| Реализация.Номер
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| Реализация.Дата МЕЖДУ &Начало И &Конец";
Запрос.УстановитьПараметр("Начало", НачалоМесяца(ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("Конец", КонецМесяца(ТекущаяДатаСеанса()));
Дата в строку для обмена данными: XML, JSON, веб-сервисы
При обмене со сторонними системами стандартом де-факто является формат ISO 8601: «2026-03-15T14:30:00». При сериализации через ЗаписьXML/ЗаписьJSON платформа сама записывает даты в каноническом виде, и ручное форматирование не требуется. Но если дата передаётся как обычная строка в произвольной структуре, шаблон нужно задавать явно и согласовывать с принимающей стороной.
// Формирование строки ISO 8601 вручную
СтрокаISO = Формат(ДатаОтгрузки, "ДФ='yyyy-MM-ddTHH:mm:ss'");
// Обратное преобразование строки в дату
ДатаИзСтроки = Дата(СтрЗаменить(СтрокаISO, "-", "") + "000000");
Для обратного преобразования в коде используется конструктор Дата(Строка), который ожидает строку вида «yyyyMMddHHmmss» (допустимо указывать только часть, например «yyyyMMdd»). Любые разделители из исходной строки предварительно удаляют или переставляют фрагменты функциями Лев(), Сред(), Прав().
Типичные сценарии и готовые решения
Имя файла с датой
В имени файла нельзя использовать двоеточие, а точки и пробелы нежелательны. Рабочий шаблон — ДФ=yyyyMMdd_HHmmss: он даёт уникальность за счёт секунд, корректно сортируется по имени и не содержит запрещённых символов файловых систем.
Дата в сообщении пользователю
Для сообщений и заголовков уместен читаемый формат: Формат(ДатаДокумента, "ДЛФ=D") выводит длинную дату вида «15 марта 2026 г.», а ДЛФ=DD — с днём недели. Параметр ДЛФ (DLF) удобен тем, что учитывает региональные настройки автоматически.
Сравнение дат как строк
Сравнивать даты после преобразования в строку корректно только в формате с годом впереди (yyyy-MM-dd): там лексикографический порядок совпадает с хронологическим. Сравнение строк «01.02.2026» и «15.01.2026» даст неверный результат, поэтому для сравнения всегда используйте исходные значения типа «Дата».
Проверка результата и контрольные точки
После реализации преобразования проверьте результат на граничных значениях: дате с однозначным днём и месяцем (1 января), полуночи (00:00:00) и пустой дате. Пустая дата через Формат() превращается в «01.01.0001 0:00:00» или аналогичную строку — если такое значение попадёт в выгрузку, принимающая система может отвергнуть файл. Перед форматированием стоит явно проверять ЗначениеЗаполнено(Дата).
Как проверить результат
Строка «05.03.2026» с ведущими нулями
«5.3.2026» или «05.00.2026» — шаблон задан неверно
Месяц и минуты на своих местах, разделители корректны
В позиции месяца стоят минуты — перепутаны M и m
Обработана отдельной веткой кода, в выгрузку не попадает
В строке появляется «01.01.0001»
Что важно запомнить
Дату в строку преобразуйте явно: Формат() с шаблоном ДФ для интерфейса и файлов, ISO-шаблон yyyy-MM-dd для обмена, ПРЕДСТАВЛЕНИЕ в запросах. Не используйте неявное приведение и склейку даты в текст запроса, проверяйте пустые даты и помните про разницу между M (месяц) и m (минуты).
Частые вопросы
Как вывести дату без времени?
Используйте шаблон без компонентов времени: Формат(Дата, "ДФ=dd.MM.yyyy") или Формат(Дата, "ДЛФ=D") для длинного локализованного вида. Само значение типа «Дата» при этом не меняется — время в нём остаётся, отсекается только при выводе.
Как преобразовать строку «31.12.2026» обратно в дату?
Разберите строку функциями Лев(), Сред(), Прав() и соберите формат ГГГГММДД: Дата(Прав(Стр,4) + Сред(Стр,4,2) + Лев(Стр,2)). Универсальной функции разбора произвольного формата во встроенном языке нет, поэтому формат исходной строки нужно знать заранее.
Почему на сервере дата строкой выглядит иначе, чем на моём компьютере?
Неявное преобразование и ПРЕДСТАВЛЕНИЕ() зависят от региональных настроек сеанса и операционной системы сервера. Задайте формат явно через Формат() с параметром ДФ — тогда результат будет одинаковым везде.
Как получить строку «2026-03-15T14:30:00» для JSON?
Если используете ЗаписьJSON — платформа сериализует дату сама. При ручном формировании применяйте Формат(Дата, "ДФ='yyyy-MM-ddTHH:mm:ss'"), а при необходимости добавьте смещение часового пояса отдельно, согласовав его с принимающей системой.
Чем отличаются ДФ и ДЛФ в функции Формат()?
ДФ задаёт шаблон посимвольно и полностью контролируется разработчиком. ДЛФ выбирает готовый локализованный формат (D — длинная дата, DD — с днём недели, T/DT — время) и подстраивается под язык сеанса. Для обмена данными используйте только ДФ, ДЛФ — для интерфейса.
Можно ли в запросе отобрать документы по дате, хранящейся строкой?
Штатных функций преобразования строки в дату в языке запросов нет. Варианты: сравнивать строки лексикографически, если они записаны в формате ГГГГММДД, либо обработать выборку в коде. Правильное решение — хранить дату в реквизите типа «Дата», а строковое представление вычислять при выводе.