При разработке интерфейсов или печатных форм в 1С часто возникает задача вывести дату в специфическом виде, который отличается от стандартного системного представления. Одной из наиболее частых задач является вывод даты с сокращенным названием месяца, например: "20 апр 21". В этой статье мы подробно разберем, как реализовать подобное форматирование, какие нюансы при этом возникают и как избежать типичных ошибок начинающих разработчиков.
Для преобразования даты в строку по определенным правилам в языке 1С используется встроенная функция Формат(). Рассмотрим ее синтаксис: первым параметром передается сама дата, вторым — строка форматирования, определяющая внешний вид результата.
Для решения поставленной задачи (вывод дня, сокращенного месяца и двух цифр года) нам потребуется параметр ДФ (Дата-Формат). Давайте разберем по шагам, из чего состоит нужная нам строка:
дд — день месяца (две цифры с ведущим нулем);MMM — сокращенное название месяца (три заглавные буквы "М");гг — последние две цифры года.Посмотрим на пример кода, который решает базовую задачу:
НужнаяДата = Дата("20210420"); // 20 апреля 2021 года
Результат = Формат(НужнаяДата, "ДФ='дд MMM гг'");
Сообщить(Результат); // Выведет: 20 апр. 21
Как мы заметили в примере выше, стандартный российский региональный формат при использовании кода MMM автоматически добавляет точку после названия месяца (например, "апр."). Это обусловлено правилами русского языка и настройками локали в системе. Если же по дизайну или требованиям заказчика точка категорически не нужна ("20 апр 21"), стандартными средствами строки формата ДФ убрать ее не получится.
В такой ситуации мы проанализируем ситуацию и применим программный обходной путь. Самый простой способ — использовать функцию СтрЗаменить(). Давайте разберем этот метод:
ДатаДляФормата = ТекущаяДата();
СтрокаСТочкой = Формат(ДатаДляФормата, "ДФ='дд MMM гг'");
// Удаляем точку, если она есть
ИтоговаяСтрока = СтрЗаменить(СтрокаСТочкой, ".", "");
Сообщить(ИтоговаяСтрока);
Важно: этот метод подходит только в том случае, если точка не может встретиться в других частях строки (например, в качестве разделителя). Если вы используете формат с точками между цифрами, такой подход может повредить данные.
При работе с полным названием месяца (ММММ) 1С проявляет определенную интеллектуальность в зависимости от контекста. Разберем, как это работает:
д), система выводит месяц в родительном падеже. Например, формат ДФ='д ММММ' даст результат "20 апреля".ДФ='ММММ гггг' выдаст "Апрель 2021".Если нам необходимо принудительно изменить регистр первой буквы (например, вывести "апреля" со строчной буквы в середине предложения), нам придется использовать функции работы со строками, такие как НРег() (нижний регистр) или ТРег() (титульный регистр), так как сама строка ДФ не умеет управлять регистром текста.
Часто программисты путают параметры ДФ и ДЛФ. Выясним причину важности этого различия. ДЛФ — это Локальный Формат Даты. Он не задает жесткую маску, а указывает системе использовать стандартные настройки отображения, установленные в операционной системе пользователя.
ДЛФ=Д — выведет короткую дату (например, 20.04.2021).ДЛФ=ДД — выведет длинную дату (20 апреля 2021 г.).ДЛФ=В — выведет только время.Использование ДЛФ предпочтительно для интерфейсных форм, так как программа автоматически подстраивается под привычки пользователя. Если у пользователя в Windows настроен американский формат (месяц/день/год), то при использовании ДЛФ он увидит привычную ему картину, тогда как жестко прописанный ДФ всегда будет выдавать один и тот же результат.
Функция Формат() обладает мощным инструментом — третьим параметром, который называется "ЛокальТекста". Это позволяет нам выводить названия месяцев и дней недели на определенном языке, независимо от того, какой язык установлен у пользователя в системе. Рассмотрим пример вывода даты на английском языке:
ДатаСобытия = ТекущаяДата();
// Выведет дату в формате "20 Apr 21" для США
ДатаНаАнглийском = Формат(ДатаСобытия, "ДФ='dd MMM yy'", "en_US");
Сообщить(ДатаНаАнглийском);
Это крайне полезно при формировании международных документов (инвойсов, контрактов) или при выгрузке данных во внешние системы.
Разберем одну из самых распространенных ошибок начинающих разработчиков 1С. В строке формата крайне важен регистр букв для обозначения месяца и минут:
ММ (заглавные) — это Месяц.мм (строчные) — это Минуты.Если вы случайно напишете Формат(Дата, "ДФ='дд.мм.гг'"), то вместо месяца вы получите минуты. Если текущее время 12:00:45, то дата "20 апреля" превратится в "20.00.21". Всегда внимательно проверяйте регистр символов в строке ДФ.
Помимо стандартных дней, месяцев и годов, полезно знать и другие коды, которые могут пригодиться в отчетах:
ддд — краткое название дня недели (например, "Вт").дддд — полное название дня недели ("Вторник").Квартал (код ВВ) — позволяет вывести номер квартала.г (одна буква) — выводит год без ведущих нулей (актуально для исторических дат).д (одна буква) — выводит день без ведущего нуля для чисел меньше 10 (например, "5" вместо "05").Для реализации задачи вывода даты в формате "20 апр 21" мы рекомендуем следующий алгоритм действий:
Формат() с кодом "ДФ='дд MMM гг'".СтрЗаменить().ММ для месяцев, чтобы не вывести минуты вместо даты.ДЛФ, чтобы соблюсти региональные предпочтения пользователя.Следуя этим правилам, вы сможете гибко настраивать отображение дат в любых объектах системы 1С:Предприятие 8, обеспечивая пользователям удобный и понятный интерфейс.