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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки в системе 1С:Предприятие часто возникает задача представления даты в строгом соответствии с юридическими требованиями. Одним из самых распространенных запросов является вывод даты первой декады месяца с так называемым «лидирующим нулем». Например, вместо стандартного «8 октября 2020 г.» необходимо получить «08 октября 2020 г.». Начинающие разработчики часто сталкиваются с ситуацией, когда настройки, заданные в визуальном конструкторе ячейки табличного документа, работают корректно, а аналогичный код в программном модуле выдает ошибку или не применяет форматирование. В этой статье мы подробно разберем, как правильно использовать функцию Формат, почему возникают сложности с экранированием и какие альтернативные способы существуют.

Разбор функции Формат() и использование префикса ДФ

Давайте проанализируем ситуацию: основным инструментом для преобразования типов в 1С является функция Формат. Она принимает два основных параметра: саму переменную (в нашем случае типа Дата) и форматную строку. Рассмотрим подробнее, из чего состоит форматная строка для даты. Для работы именно с датами обязательно используется префикс ДФ= (Дата-Формат). Если вы настраиваете формат в свойствах поля формы или ячейки макета через конструктор, платформа может подставить этот префикс автоматически. Однако при написании кода мы должны указывать его явно.

Разберем по шагам ключевые символы форматирования дня:

Следовательно, базовая конструкция форматной строки должна выглядеть как dd MMMM yyyy. Но здесь мы сталкиваемся с первой серьезной проблемой программного исполнения — добавлением текста «г.» в конец строки.

Проблема экранирования кавычек в программном коде

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

Посмотрим на пример правильного написания кода:


// Правильное экранирование кавычек для программного вывода
МояДата = '20201008'; // 8 октября 2020 года
ТекстДаты = Формат(МояДата, "ДФ='dd MMMM yyyy ""г."" '");
// Результат: 08 октября 2020 г.

Обратите внимание на конструкцию ""г."". Внутри общей строки, ограниченной двойными кавычками, мы используем двойные двойные кавычки для экранирования. Если этого не сделать, компилятор 1С выдаст ошибку или неправильно распознает конец строки. Это критически важный момент, который отличает настройку «в ячейке» от настройки «в коде».

Влияние региональных настроек и параметра локализации

Проанализируем ситуацию, когда даже при правильной форматной строке результат может отличаться на разных серверах. Функция Формат по умолчанию ориентируется на настройки операционной системы. Если на сервере установлена англоязычная локаль, MMMM может вернуть «October» вместо «октября».

Чтобы гарантировать результат «юридического» качества, мы рекомендуем использовать третий параметр функции Формат — код локализации. Рассмотрим пример:


// Принудительное использование российской локализации
ДатаДляЮристов = Формат(ВыбДата, "ДФ='dd MMMM yyyy ""г."" '", "ru_RU");

Использование "ru_RU" гарантирует, что месяц будет выведен на русском языке и в правильном падеже, независимо от того, где выполняется код — на локальном компьютере пользователя или на Linux-сервере.

Проверка типа данных перед форматированием

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


Если ТипЗнч(НужнаяДата) = Тип("Дата") Тогда
    Результат = Формат(НужнаяДата, "ДФ='dd MMMM yyyy ""г."" '");
Иначе
    // Если это строка, возможно, её нужно сначала преобразовать в Дату
    Попытка
        Результат = Формат(Дата(НужнаяДата), "ДФ='dd MMMM yyyy ""г."" '");
    Исключение
        Сообщить("Неверный тип данных для форматирования!");
    КонецПопытки;
КонецЕсли;

Альтернативный способ: «Ручная» сборка через СтрШаблон

Если задача кажется слишком сложной для функции Формат или вам нужно собрать сложную юридическую формулировку (например, «08» (Восьмое) октября), можно воспользоваться методом «неизящным», но надежным — ручной сборкой строки. Для получения лидирующего нуля мы можем использовать функцию Прав.

Рассмотрим, как это работает:

  1. Берем число дня через функцию День().
  2. Добавляем слева «0».
  3. Обрезаем строку справа, оставляя только 2 символа.

Пример реализации через СтрШаблон (доступно в версиях платформы 8.3.6 и выше):


ДеньСНулем = Прав("0" + День(ТекущаяДата()), 2);
МесяцПрописью = Формат(ТекущаяДата(), "ДФ='MMMM'");
ГодСтрокой = Формат(ТекущаяДата(), "ДФ='yyyy'");

ПолнаяСтрока = СтрШаблон("%1 %2 %3 г.", ДеньСНулем, МесяцПрописью, ГодСтрокой);

Этот метод дает полный контроль над каждым элементом строки, хотя и требует большего объема кода. Важный нюанс: при использовании MMMM отдельно от dd, месяц может вывестись в именительном падеже («Октябрь»). Чтобы получить родительный падеж («октября»), лучше все же использовать единую форматную строку в функции Формат.

Особенности работы в Системе компоновки данных (СКД)

Если вы выводите отчет, форматирование лучше перенести на уровень настроек СКД. Разберем, как это сделать правильно:

  1. Откройте схему компоновки данных.
  2. Перейдите на вкладку «Наборы данных».
  3. Найдите нужное поле даты и в колонке «Оформление» нажмите на многоточие.
  4. В поле «Формат» откройте конструктор.

Важно: в конструкторе СКД вам не нужно удваивать кавычки или писать ДФ=. Визуальный редактор сам сформирует правильное XML-описание. Если же вы прописываете формат вручную в поле «Выражение» или «Параметры редактирования», следуйте правилам программного кода, описанным выше.

Подводя итог, можно сказать, что решение проблемы «лидирующего нуля» в 1С всегда кроется в двойной букве dd в форматной строке и строгом соблюдении правил экранирования символов при написании кода. Надеемся, эти примеры помогут вам быстро и изящно решать задачи по оформлению документов.

← На главную