Как правильно отформатировать дату и время в 1С с помощью функции Формат?

Программист IT и автоматизация бизнеса
← На главную

При работе с датами в платформе 1С разработчики часто сталкиваются со следующей ситуацией: при попытке вывести дату и время в формате 2018-02-23 09:01:01 с использованием строки "ДФ=гггг-MM-дд ЧЧ:мм:сс" функция Формат() возвращает представление по умолчанию, например 23.02.2018 9:00:00. Проанализируем причину такого поведения и рассмотрим все корректные способы решения этой задачи.

Выясним причину поведения платформы

Синтаксический анализатор платформы 1С использует пробелы и точки с запятой ; в качестве разделителей отдельных параметров внутри форматной строки. Когда параметр ДФ (формат даты) содержит пробел между датой и временем и при этом не заключен в кавычки, платформа воспринимает текст после пробела (ЧЧ:мм:сс) как имя следующего параметра выражении.

Так как ЧЧ:мм:сс не является корректным параметром функции Формат(), платформа не выбивает критическое исключение, а автоматически сбрасывает пользовательские настройки и возвращает стандартное представление даты.

Способ 1. Использование одинарных кавычек внутри форматной строки

Самый простой и читаемый способ устранения ошибки — заключить значение спецификатора ДФ в одинарные кавычки внутри кавычек строки 1С:

ДатаСтрокой = Формат(Заказ.Дата, "ДФ='гггг-MM-дд ЧЧ:мм:сс'");

В этом случае платформа корректно воспринимает всю конструкцию внутри одинарных кавычек как единое значение параметра ДФ.

Способ 2. Использование двойных экранированных кавычек

Альтернативный вариант синтаксиса — экранирование двойных кавычек внутри строки 1С. Каждая кавычка внутри строкового литерала удваивается:

ДатаСтрокой = Формат(Заказ.Дата, "ДФ=""гггг-MM-дд ЧЧ:мм:сс""");

Способ 3. Объединение результатов двух функций Формат()

Если требуется разделить получение даты и времени или обойтись без кавычек внутри строки, можно отформатировать дату и время по отдельности и скомпоновать результат:


ДатаСтрокой = Формат(Заказ.Дата, "ДФ=гггг-MM-дд") + " " + Формат(Заказ.Дата, "ДФ=ЧЧ:мм:сс");

Для удобства повторного использования этот код можно вынести в отдельную функцию:


Функция ТвойФормат(НужнаяДата)
    Возврат Формат(НужнаяДата, "ДФ=гггг-MM-дд") + " " + Формат(НужнаяДата, "ДФ=ЧЧ:мм:сс");
КонецФункции

Способ 4. Использование функции XMLСтрока

Если цель состоит в получении даты в стандартизированном формате ISO, удобно использовать встроенную функцию XMLСтрока(), которая работает быстрее функции Формат():


// Вернет строку вида "2018-02-23T09:01:01"
ДатаСтрокойISO = XMLСтрока(Заказ.Дата);

// Если разделитель "T" нужно заменить на пробел:
ДатаСтрокой = СтрЗаменить(XMLСтрока(Заказ.Дата), "T", " ");

Способ 5. Использование мультиязычной строки НСтр

При разработке конфигураций, поддерживающих локализацию, форматную строку следует передавать через функцию НСтр(). В этом случае кавычки экранируются следующим образом:

ДатаСтрокой = Формат(Заказ.Дата, НСтр("ru='ДФ=''гггг-MM-дд ЧЧ:мм:сс'''"));

Особенности синтаксиса спецификаторов даты

При формировании пользовательского формата ДФ необходимо строго соблюдать регистр букв и правила написания спецификаторов:

  1. Месяц и минуты: Заглавные буквы ММ обозначают порядковый номер месяца с лидирующим нулем (01–12), а строчные буквы мм — минуты (00–59). Ошибка в регистре приведет к подстановке минут вместо месяца.
  2. Формат часов: Заглавные буквы ЧЧ выводят часы в 24-часовом формате (00–23), а строчные чч — в 12-часовом формате.
  3. Языковые раскладки: Можно использовать как русские символы (гггг-ММ-дд ЧЧ:мм:сс), так и английские (yyyy-MM-dd HH:mm:ss). Главное — не смешивать символы из разных раскладок во избежание опечаток.
← На главную