Разработка и Конфигурация · 10 мин
1С: как преобразовать дату в строку
Как в 1С преобразовать дату в строку: функция Формат(), шаблоны ДП, Строка() и особенности. Примеры кода, типичные ошибки и ответы на вопросы.
Преобразование даты в строку — одна из самых частых задач во встроенном языке 1С: она возникает при формировании печатных форм, выгрузке данных в файлы, логировании и передаче значений во внешние системы. Прямое присвоение даты строковой переменной невозможно из-за строгой типизации, поэтому платформа предоставляет несколько способов явного преобразования.
Основной инструмент — функция Формат(), которая позволяет задать точный шаблон представления даты: от простого «ДД.ММ.ГГГГ» до форматов с названием месяца, временем и локализацией. Кроме неё существуют функция Строка(), методы работы с XML и форматирование в запросах, каждое со своими ограничениями.
Ниже разобраны рабочие способы преобразования, синтаксис форматных строк, типичные ошибки и критерии выбора подходящего варианта для конкретной задачи.
Функция Формат() — основной способ преобразования
Функция Формат() принимает значение и строку параметров форматирования, возвращая строковое представление. Для дат ключевые параметры — ДФ (формат даты) и ДЛФ (локальный формат даты). Вызов выглядит так:
ДатаДокумента = ТекущаяДатаСеанса();
СтрокаДаты = Формат(ДатаДокумента, "ДФ=dd.MM.yyyy");
// Результат: "15.03.2026"
Если не указать форматную строку, Формат() вернёт представление даты по умолчанию согласно региональным настройкам сеанса. Это удобно для быстрого вывода, но непредсказуемо при переносе кода между базами с разными настройками, поэтому в прикладном коде формат лучше указывать явно.
Обратите внимание на регистр символов в шаблоне: MM — месяц, а mm — минуты. Путаница между ними — одна из самых распространённых ошибок, приводящая к строкам вида «15.30.2026», где вместо месяца подставлены минуты.
Шаблоны форматирования даты и времени
Форматная строка ДФ строится из подстановочных символов. Основные из них: d / dd — день, MM / MMM / MMMM — месяц (числом, сокращённо, полностью), yy / yyyy — год, HH — часы, mm — минуты, ss — секунды. Разделители (точки, пробелы, слова) вставляются в шаблон как обычные символы.
| Шаблон | Пример результата | Где применяется |
|---|---|---|
| ДФ=dd.MM.yyyy | 15.03.2026 | Печатные формы, документы |
| ДФ="dd MMMM yyyy 'г.'" | 15 марта 2026 г. | Тексты договоров, писем |
| ДФ=yyyy-MM-dd | 2026-03-15 | Обмен данными, имена файлов |
| ДФ="dd.MM.yyyy HH:mm:ss" | 15.03.2026 14:30:00 | Журналы, логи, метки времени |
| ДЛФ=D | 15 марта 2026 г. | Локализованный длинный формат |
| ДЛФ=DD | 15 марта 2026 г. (с днём недели) | Отчёты для пользователя |
Параметр ДЛФ использует региональные настройки и сам подставляет название месяца на языке текущего сеанса. Варианты: D — длинная дата, DD — длинная дата с днём недели, T — время, DT — дата и время.
Литеральный текст внутри шаблона заключается в одинарные кавычки, как в примере "dd MMMM yyyy 'г.'". Без кавычек буква «г» может быть интерпретирована как часть шаблона в некоторых контекстах, поэтому явное выделение литералов — надёжная практика.
Преобразование через Строка() и его ограничения
Функция Строка(Дата) также возвращает текстовое представление даты, но без возможности управления форматом — результат зависит от настроек сеанса. Тот же эффект даёт неявное преобразование при конкатенации: "Дата: " + ДатаДокумента автоматически приведёт дату к строке.
Такой способ допустим только для отладочных сообщений и служебного вывода, где внешний вид значения не важен. В печатных формах, обменах и файлах использовать Строка() для дат не рекомендуется: при смене региональных настроек информационной базы формат вывода изменится, что может сломать разбор строки на принимающей стороне.
Дата в строку для обмена данными и файлов
При передаче дат во внешние системы — веб-сервисы, JSON, XML — требуется строгий машиночитаемый формат. Стандартом де-факто является ISO 8601: 2026-03-15T14:30:00. В 1С его можно получить двумя путями.
Первый — явное форматирование: Формат(Дата, "ДФ=yyyy-MM-ddTHH:mm:ss"). Второй — встроенная сериализация: функции ЗаписатьДатуJSON() и запись в XML через XMLСтрока(Дата) автоматически выдают каноническое представление, корректно разбираемое обратно функциями ПрочитатьДатуJSON() и XMLЗначение().
// Дата в строку ISO 8601 для JSON
СтрокаJSON = ЗаписатьДатуJSON(ТекущаяДатаСеанса(), ФорматДатыJSON.ISO);
// Результат: "2026-03-15T14:30:00"
// Обратное преобразование
Дата = ПрочитатьДатуJSON(СтрокаJSON, ФорматДатыJSON.ISO);
// Через XML
СтрокаXML = XMLСтрока(ТекущаяДатаСеанса()); // "2026-03-15T14:30:00"
ДатаНазад = XMLЗначение(Тип("Дата"), СтрокаXML);Для имён файлов дату форматируют без запрещённых символов: Формат(Дата, "ДФ=yyyyMMdd_HHmmss") даёт строку вида «20260315_143000», безопасную для любой файловой системы и удобную для сортировки по имени.
Пустая дата и особые случаи
Пустая дата в 1С — это значение '00010101' (1 января года 1). При форматировании она превращается в строку «01.01.0001», что в печатной форме выглядит как ошибка данных. Перед выводом дату следует проверять:
Если ЗначениеЗаполнено(ДатаОтгрузки) Тогда
ТекстДаты = Формат(ДатаОтгрузки, "ДФ=dd.MM.yyyy");
Иначе
ТекстДаты = "";
КонецЕсли;
Ещё один нюанс — состав даты. Если значение содержит только дату без времени, шаблон с HH:mm:ss выведет нули: «15.03.2026 00:00:00». Если время в данных не хранится, не включайте его в шаблон — иначе пользователь может решить, что событие произошло ровно в полночь.
Для реквизитов с составом «дата и время» при выводе только даты используйте НачалоДня() или просто шаблон без времени — обрезка произойдёт на уровне форматирования, само значение не изменится.
Форматирование даты в запросах и СКД
В языке запросов 1С функции Формат() нет, но есть функция ПРЕДСТАВЛЕНИЕ(), возвращающая строковое представление ссылки или значения. Для дат она даёт представление по умолчанию, без настройки шаблона, поэтому для произвольного формата дату выбирают в запросе как есть, а форматируют уже в коде при обходе результата.
В СКД (системе компоновки данных) формат поля даты задаётся декларативно: в настройках поля на закладке «Наборы данных» или в пользовательских настройках отчёта есть свойство «Формат», куда вписывается та же форматная строка, например ДФ=dd.MM.yyyy. Это правильное место для оформления — запрос возвращает настоящие даты, а представление настраивается отдельно.
Тот же принцип действует для макетов табличных документов: в ячейке с параметром даты в свойстве «Формат» указывается шаблон, и платформа сама форматирует значение при выводе, без преобразования в строку в коде.
Как выбрать способ
Проверка результата и обратное преобразование
После преобразования полезно убедиться, что строка соответствует ожиданиям: выведите её в сообщение или журнал и сверьте порядок дня, месяца и года. Особенно внимательно проверяйте шаблоны, скопированные из примеров для других языков, — в них вместо dd может использоваться DD с иным смыслом.
Обратное преобразование строки в дату выполняется функцией Дата() только для строк в каноническом виде «ГГГГММДДччммсс». Для произвольных форматов строку разбирают вручную через СтрРазделить() или используют ПрочитатьДатуJSON(), если строка в формате ISO. Поэтому при проектировании обмена выгоднее сразу выгружать даты в каноническом виде — это исключает двусмысленность при разборе.
Что важно запомнить
Основной инструмент — Формат() с параметрами ДФ и ДЛФ. Для обмена данными используйте ISO 8601 через ЗаписатьДатуJSON() или XMLСтроку(). Проверяйте пустые даты перед выводом, не путайте MM и mm и не полагайтесь на Строка() там, где важен точный формат.
Частые вопросы
Как вывести дату с названием месяца, например «15 марта 2026 г.»?
Используйте шаблон Формат(Дата, "ДФ='dd MMMM yyyy ''г.'''") или локализованный вариант Формат(Дата, "ДЛФ=D"). Параметр ДЛФ предпочтительнее, если отчёт может открываться под разными языками интерфейса — название месяца подстроится автоматически.
Почему Формат() возвращает дату в неожиданном виде?
Чаще всего форматная строка не применилась из-за опечатки в имени параметра (например, «ДФ» написано латиницей-кириллицей вперемешку) или шаблон указан в неверном регистре. Проверьте также, не переопределяет ли формат региональная настройка при использовании пустой форматной строки.
Как преобразовать дату в строку «ГГГГММДД» для обмена с банком?
Вызовите Формат(Дата, "ДФ=yyyyMMdd"). Этот формат без разделителей однозначно разбирается обратно функцией Дата(Строка), что удобно для двустороннего обмена.
Можно ли сравнивать даты, преобразованные в строки?
Технически можно, но только если строки в формате с убывающей значимостью частей — «ГГГГММДД» или ISO 8601. Строки вида «ДД.ММ.ГГГГ» сравниваются лексикографически и дают неверный порядок. Надёжнее сравнивать исходные значения типа Дата до преобразования.
Как убрать время из даты при выводе в строку?
Достаточно не включать время в шаблон: Формат(Дата, "ДФ=dd.MM.yyyy") отбросит часы, минуты и секунды при выводе. Само значение даты при этом не изменяется; если нужно изменить и значение, используйте НачалоДня(Дата).
Работает ли Формат() в тонком и веб-клиенте?
Да, функция доступна во всех клиентах и на сервере, включая внешние соединения. Различия возможны только в результате форматирования по умолчанию (без явного шаблона), так как региональные настройки клиента и сервера могут отличаться — ещё один аргумент всегда указывать формат явно.