При работе с датами в платформе 1С разработчики часто сталкиваются со следующей ситуацией: при попытке вывести дату и время в формате 2018-02-23 09:01:01 с использованием строки "ДФ=гггг-MM-дд ЧЧ:мм:сс" функция Формат() возвращает представление по умолчанию, например 23.02.2018 9:00:00. Проанализируем причину такого поведения и рассмотрим все корректные способы решения этой задачи.
Синтаксический анализатор платформы 1С использует пробелы и точки с запятой ; в качестве разделителей отдельных параметров внутри форматной строки. Когда параметр ДФ (формат даты) содержит пробел между датой и временем и при этом не заключен в кавычки, платформа воспринимает текст после пробела (ЧЧ:мм:сс) как имя следующего параметра выражении.
Так как ЧЧ:мм:сс не является корректным параметром функции Формат(), платформа не выбивает критическое исключение, а автоматически сбрасывает пользовательские настройки и возвращает стандартное представление даты.
Самый простой и читаемый способ устранения ошибки — заключить значение спецификатора ДФ в одинарные кавычки внутри кавычек строки 1С:
ДатаСтрокой = Формат(Заказ.Дата, "ДФ='гггг-MM-дд ЧЧ:мм:сс'");
В этом случае платформа корректно воспринимает всю конструкцию внутри одинарных кавычек как единое значение параметра ДФ.
Альтернативный вариант синтаксиса — экранирование двойных кавычек внутри строки 1С. Каждая кавычка внутри строкового литерала удваивается:
ДатаСтрокой = Формат(Заказ.Дата, "ДФ=""гггг-MM-дд ЧЧ:мм:сс""");
Если требуется разделить получение даты и времени или обойтись без кавычек внутри строки, можно отформатировать дату и время по отдельности и скомпоновать результат:
ДатаСтрокой = Формат(Заказ.Дата, "ДФ=гггг-MM-дд") + " " + Формат(Заказ.Дата, "ДФ=ЧЧ:мм:сс");
Для удобства повторного использования этот код можно вынести в отдельную функцию:
Функция ТвойФормат(НужнаяДата)
Возврат Формат(НужнаяДата, "ДФ=гггг-MM-дд") + " " + Формат(НужнаяДата, "ДФ=ЧЧ:мм:сс");
КонецФункции
Если цель состоит в получении даты в стандартизированном формате ISO, удобно использовать встроенную функцию XMLСтрока(), которая работает быстрее функции Формат():
// Вернет строку вида "2018-02-23T09:01:01"
ДатаСтрокойISO = XMLСтрока(Заказ.Дата);
// Если разделитель "T" нужно заменить на пробел:
ДатаСтрокой = СтрЗаменить(XMLСтрока(Заказ.Дата), "T", " ");
При разработке конфигураций, поддерживающих локализацию, форматную строку следует передавать через функцию НСтр(). В этом случае кавычки экранируются следующим образом:
ДатаСтрокой = Формат(Заказ.Дата, НСтр("ru='ДФ=''гггг-MM-дд ЧЧ:мм:сс'''"));
При формировании пользовательского формата ДФ необходимо строго соблюдать регистр букв и правила написания спецификаторов:
ММ обозначают порядковый номер месяца с лидирующим нулем (01–12), а строчные буквы мм — минуты (00–59). Ошибка в регистре приведет к подстановке минут вместо месяца.ЧЧ выводят часы в 24-часовом формате (00–23), а строчные чч — в 12-часовом формате.гггг-ММ-дд ЧЧ:мм:сс), так и английские (yyyy-MM-dd HH:mm:ss). Главное — не смешивать символы из разных раскладок во избежание опечаток.