При разработке на платформе 1С часто возникает задача преобразовать дату в специфический строковый формат. Например, для формирования штрихкодов, артикулов, имен файлов или интеграции со сторонними системами может потребоваться получить из даты формата 14.02.2019 строку вида 1402 (только день и месяц без разделителей). Давайте подробно разберем, как правильно решить эту задачу и каких ошибок следует избегать.
Рассмотрим классическую ошибку. Пытаясь получить нужный результат, разработчики часто пишут следующий код:
СтрокаДаты = Формат(Объект.Дата, "ДЛФ=ddMM");
На первый взгляд, маска ddMM (или ддММ) выглядит логично. Однако при таком подходе вместо "1402" система может вернуть строку, в которой месяц написан прописью (например, "14 февраля"). Выясним причину такого поведения.
В 1С существует два основных параметра для работы с форматом даты:
ДЛФ — локальный формат даты. Этот параметр жестко привязан к региональным настройкам и понимает только базовые значения: Д (короткая дата), ДД (длинная дата с месяцем прописью), В (время).ДФ — произвольный формат даты. Именно он предназначен для создания любых пользовательских масок.Когда мы передаем в параметр ДЛФ строку ddMM, система игнорирует произвольную маску, видит внутри сочетание букв "Д" и интерпретирует это как команду ДД (длинная дата). Именно поэтому месяц выводится словом.
Для того чтобы получить жестко структурированную строку без разделителей и игнорировать региональные настройки пользователя операционной системы, необходимо применять параметр ДФ. Посмотрим на правильный вариант кода:
СтрокаДаты = Формат(Объект.Дата, "ДФ=ddMM");
// Или в русской нотации:
СтрокаДаты = Формат(Объект.Дата, "ДФ=ддММ");
Разберем по шагам эту форматную строку:
ДФ= указывает платформе 1С, что мы задаем произвольный формат.dd (или дд) возвращает день месяца, добавляя лидирующий ноль для чисел от 1 до 9.MM (или ММ) возвращает номер месяца с лидирующим нулем. Обратите внимание: чтобы получить номер, а не слово, используются две буквы. Если указать MMMM, месяц выведется прописью.При работе с датами мы не должны забывать о ситуации, когда дата не заполнена (пустая дата в 1С равна 01.01.0001). Если применить наш формат к пустой дате, система честно преобразует её в строку 0101. Это может стать причиной серьезной логической ошибки в учете.
Чтобы избежать этого, дополним нашу форматную строку специальным параметром ДП (представление пустой даты), который укажет системе выводить пустую строку, если дата не задана:
СтрокаДаты = Формат(Объект.Дата, "ДФ=ddMM; ДП=''");
Иногда разработчики, не зная возможностей форматной строки, начинают строить громоздкие конструкции (так называемые "велосипеды"). Проанализируем пример из практики:
СтрокаДаты = Строка(День(Объект.Дата)) + ?(СтрДлина(Строка(Месяц(Объект.Дата))) = 1, "0", "") + Строка(Месяц(Объект.Дата));
Этот код программно вытаскивает день, потом месяц, затем проверяет длину строки месяца и при необходимости добавляет лидирующий ноль. Такой подход крайне неэффективен, труден для чтения и замедляет работу системы. Использовать его не рекомендуется.
Другой, более приемлемый альтернативный способ, который можно встретить в коде — это удаление разделителей через замену подстроки:
СтрокаДаты = СтрЗаменить(Формат(Объект.Дата, "ДФ=dd.MM"), ".", "");
Этот метод рабочий, но он все еще проигрывает прямому указанию формата ДФ=ddMM как по лаконичности, так и по производительности. Рекомендуем всегда использовать встроенные возможности функции Формат или встроенный в платформу 1С визуальный конструктор форматной строки, который поможет собрать правильное выражение без ошибок.