Как в 1С получить из даты строку без точек в формате "ДДММ" (например, "1402")?

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

При разработке на платформе 1С часто возникает задача преобразовать дату в специфический строковый формат. Например, для формирования штрихкодов, артикулов, имен файлов или интеграции со сторонними системами может потребоваться получить из даты формата 14.02.2019 строку вида 1402 (только день и месяц без разделителей). Давайте подробно разберем, как правильно решить эту задачу и каких ошибок следует избегать.

Анализ ситуации и частая ошибка разработчиков

Рассмотрим классическую ошибку. Пытаясь получить нужный результат, разработчики часто пишут следующий код:

СтрокаДаты = Формат(Объект.Дата, "ДЛФ=ddMM");

На первый взгляд, маска ddMM (или ддММ) выглядит логично. Однако при таком подходе вместо "1402" система может вернуть строку, в которой месяц написан прописью (например, "14 февраля"). Выясним причину такого поведения.

В 1С существует два основных параметра для работы с форматом даты:

  1. ДЛФ — локальный формат даты. Этот параметр жестко привязан к региональным настройкам и понимает только базовые значения: Д (короткая дата), ДД (длинная дата с месяцем прописью), В (время).
  2. ДФ — произвольный формат даты. Именно он предназначен для создания любых пользовательских масок.

Когда мы передаем в параметр ДЛФ строку ddMM, система игнорирует произвольную маску, видит внутри сочетание букв "Д" и интерпретирует это как команду ДД (длинная дата). Именно поэтому месяц выводится словом.

Правильное решение: использование параметра ДФ

Для того чтобы получить жестко структурированную строку без разделителей и игнорировать региональные настройки пользователя операционной системы, необходимо применять параметр ДФ. Посмотрим на правильный вариант кода:


СтрокаДаты = Формат(Объект.Дата, "ДФ=ddMM");
// Или в русской нотации:
СтрокаДаты = Формат(Объект.Дата, "ДФ=ддММ");

Разберем по шагам эту форматную строку:

  1. ДФ= указывает платформе 1С, что мы задаем произвольный формат.
  2. dd (или дд) возвращает день месяца, добавляя лидирующий ноль для чисел от 1 до 9.
  3. MM (или ММ) возвращает номер месяца с лидирующим нулем. Обратите внимание: чтобы получить номер, а не слово, используются две буквы. Если указать MMMM, месяц выведется прописью.

Важный нюанс: обработка пустой даты

При работе с датами мы не должны забывать о ситуации, когда дата не заполнена (пустая дата в 1С равна 01.01.0001). Если применить наш формат к пустой дате, система честно преобразует её в строку 0101. Это может стать причиной серьезной логической ошибки в учете.

Чтобы избежать этого, дополним нашу форматную строку специальным параметром ДП (представление пустой даты), который укажет системе выводить пустую строку, если дата не задана:

СтрокаДаты = Формат(Объект.Дата, "ДФ=ddMM; ДП=''");

Альтернативные и "велосипедные" способы решения

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


СтрокаДаты = Строка(День(Объект.Дата)) + ?(СтрДлина(Строка(Месяц(Объект.Дата))) = 1, "0", "") + Строка(Месяц(Объект.Дата));

Этот код программно вытаскивает день, потом месяц, затем проверяет длину строки месяца и при необходимости добавляет лидирующий ноль. Такой подход крайне неэффективен, труден для чтения и замедляет работу системы. Использовать его не рекомендуется.

Другой, более приемлемый альтернативный способ, который можно встретить в коде — это удаление разделителей через замену подстроки:

СтрокаДаты = СтрЗаменить(Формат(Объект.Дата, "ДФ=dd.MM"), ".", "");

Этот метод рабочий, но он все еще проигрывает прямому указанию формата ДФ=ddMM как по лаконичности, так и по производительности. Рекомендуем всегда использовать встроенные возможности функции Формат или встроенный в платформу 1С визуальный конструктор форматной строки, который поможет собрать правильное выражение без ошибок.

← На главную