В процессе разработки в системе 1С:Предприятие часто возникает задача представления даты в строгом соответствии с юридическими требованиями. Одним из самых распространенных запросов является вывод даты первой декады месяца с так называемым «лидирующим нулем». Например, вместо стандартного «8 октября 2020 г.» необходимо получить «08 октября 2020 г.». Начинающие разработчики часто сталкиваются с ситуацией, когда настройки, заданные в визуальном конструкторе ячейки табличного документа, работают корректно, а аналогичный код в программном модуле выдает ошибку или не применяет форматирование. В этой статье мы подробно разберем, как правильно использовать функцию Формат, почему возникают сложности с экранированием и какие альтернативные способы существуют.
Давайте проанализируем ситуацию: основным инструментом для преобразования типов в 1С является функция Формат. Она принимает два основных параметра: саму переменную (в нашем случае типа Дата) и форматную строку. Рассмотрим подробнее, из чего состоит форматная строка для даты. Для работы именно с датами обязательно используется префикс ДФ= (Дата-Формат). Если вы настраиваете формат в свойствах поля формы или ячейки макета через конструктор, платформа может подставить этот префикс автоматически. Однако при написании кода мы должны указывать его явно.
Разберем по шагам ключевые символы форматирования дня:
d (или д) — выводит день месяца без лидирующего нуля для чисел от 1 до 9.dd (или дд) — всегда выводит две цифры, добавляя 0 перед числами меньше 10. Именно этот вариант нам и нужен.MMMM (или ММММ) — выводит полное название месяца в родительном падеже (если стоит после дня).yyyy (или гггг) — выводит четырехзначный год.Следовательно, базовая конструкция форматной строки должна выглядеть как 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» (Восьмое) октября), можно воспользоваться методом «неизящным», но надежным — ручной сборкой строки. Для получения лидирующего нуля мы можем использовать функцию Прав.
Рассмотрим, как это работает:
День().Пример реализации через СтрШаблон (доступно в версиях платформы 8.3.6 и выше):
ДеньСНулем = Прав("0" + День(ТекущаяДата()), 2);
МесяцПрописью = Формат(ТекущаяДата(), "ДФ='MMMM'");
ГодСтрокой = Формат(ТекущаяДата(), "ДФ='yyyy'");
ПолнаяСтрока = СтрШаблон("%1 %2 %3 г.", ДеньСНулем, МесяцПрописью, ГодСтрокой);
Этот метод дает полный контроль над каждым элементом строки, хотя и требует большего объема кода. Важный нюанс: при использовании MMMM отдельно от dd, месяц может вывестись в именительном падеже («Октябрь»). Чтобы получить родительный падеж («октября»), лучше все же использовать единую форматную строку в функции Формат.
Если вы выводите отчет, форматирование лучше перенести на уровень настроек СКД. Разберем, как это сделать правильно:
Важно: в конструкторе СКД вам не нужно удваивать кавычки или писать ДФ=. Визуальный редактор сам сформирует правильное XML-описание. Если же вы прописываете формат вручную в поле «Выражение» или «Параметры редактирования», следуйте правилам программного кода, описанным выше.
Подводя итог, можно сказать, что решение проблемы «лидирующего нуля» в 1С всегда кроется в двойной букве dd в форматной строке и строгом соблюдении правил экранирования символов при написании кода. Надеемся, эти примеры помогут вам быстро и изящно решать задачи по оформлению документов.