Как в 1С прописать произвольный формат даты для вывода сокращенного месяца?

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

При разработке интерфейсов или печатных форм в 1С часто возникает задача вывести дату в специфическом виде, который отличается от стандартного системного представления. Одной из наиболее частых задач является вывод даты с сокращенным названием месяца, например: "20 апр 21". В этой статье мы подробно разберем, как реализовать подобное форматирование, какие нюансы при этом возникают и как избежать типичных ошибок начинающих разработчиков.

Основы использования функции Формат()

Для преобразования даты в строку по определенным правилам в языке 1С используется встроенная функция Формат(). Рассмотрим ее синтаксис: первым параметром передается сама дата, вторым — строка форматирования, определяющая внешний вид результата.

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

Посмотрим на пример кода, который решает базовую задачу:


НужнаяДата = Дата("20210420"); // 20 апреля 2021 года
Результат = Формат(НужнаяДата, "ДФ='дд MMM гг'");
Сообщить(Результат); // Выведет: 20 апр. 21

Проблема точки в сокращенном названии месяца

Как мы заметили в примере выше, стандартный российский региональный формат при использовании кода MMM автоматически добавляет точку после названия месяца (например, "апр."). Это обусловлено правилами русского языка и настройками локали в системе. Если же по дизайну или требованиям заказчика точка категорически не нужна ("20 апр 21"), стандартными средствами строки формата ДФ убрать ее не получится.

В такой ситуации мы проанализируем ситуацию и применим программный обходной путь. Самый простой способ — использовать функцию СтрЗаменить(). Давайте разберем этот метод:


ДатаДляФормата = ТекущаяДата();
СтрокаСТочкой = Формат(ДатаДляФормата, "ДФ='дд MMM гг'");
// Удаляем точку, если она есть
ИтоговаяСтрока = СтрЗаменить(СтрокаСТочкой, ".", "");
Сообщить(ИтоговаяСтрока);

Важно: этот метод подходит только в том случае, если точка не может встретиться в других частях строки (например, в качестве разделителя). Если вы используете формат с точками между цифрами, такой подход может повредить данные.

Управление регистром и падежами месяцев

При работе с полным названием месяца (ММММ) 1С проявляет определенную интеллектуальность в зависимости от контекста. Разберем, как это работает:

  1. Если в строке формата присутствует символ дня (д), система выводит месяц в родительном падеже. Например, формат ДФ='д ММММ' даст результат "20 апреля".
  2. Если символа дня нет (например, только месяц и год), месяц будет выведен в именительном падеже. Формат ДФ='ММММ гггг' выдаст "Апрель 2021".

Если нам необходимо принудительно изменить регистр первой буквы (например, вывести "апреля" со строчной буквы в середине предложения), нам придется использовать функции работы со строками, такие как НРег() (нижний регистр) или ТРег() (титульный регистр), так как сама строка ДФ не умеет управлять регистром текста.

Различие между ДФ и ДЛФ

Часто программисты путают параметры ДФ и ДЛФ. Выясним причину важности этого различия. ДЛФ — это Локальный Формат Даты. Он не задает жесткую маску, а указывает системе использовать стандартные настройки отображения, установленные в операционной системе пользователя.

Использование ДЛФ предпочтительно для интерфейсных форм, так как программа автоматически подстраивается под привычки пользователя. Если у пользователя в Windows настроен американский формат (месяц/день/год), то при использовании ДЛФ он увидит привычную ему картину, тогда как жестко прописанный ДФ всегда будет выдавать один и тот же результат.

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

Функция Формат() обладает мощным инструментом — третьим параметром, который называется "ЛокальТекста". Это позволяет нам выводить названия месяцев и дней недели на определенном языке, независимо от того, какой язык установлен у пользователя в системе. Рассмотрим пример вывода даты на английском языке:


ДатаСобытия = ТекущаяДата();
// Выведет дату в формате "20 Apr 21" для США
ДатаНаАнглийском = Формат(ДатаСобытия, "ДФ='dd MMM yy'", "en_US");
Сообщить(ДатаНаАнглийском);

Это крайне полезно при формировании международных документов (инвойсов, контрактов) или при выгрузке данных во внешние системы.

Критическая ошибка: ММ против мм

Разберем одну из самых распространенных ошибок начинающих разработчиков 1С. В строке формата крайне важен регистр букв для обозначения месяца и минут:

Если вы случайно напишете Формат(Дата, "ДФ='дд.мм.гг'"), то вместо месяца вы получите минуты. Если текущее время 12:00:45, то дата "20 апреля" превратится в "20.00.21". Всегда внимательно проверяйте регистр символов в строке ДФ.

Дополнительные коды форматирования

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

Итоговые рекомендации

Для реализации задачи вывода даты в формате "20 апр 21" мы рекомендуем следующий алгоритм действий:

  1. Используйте функцию Формат() с кодом "ДФ='дд MMM гг'".
  2. Если точка в конце сокращения месяца недопустима, обработайте результат функцией СтрЗаменить().
  3. Если требуется вывод на иностранном языке, обязательно указывайте третий параметр (Локаль).
  4. Всегда используйте заглавные ММ для месяцев, чтобы не вывести минуты вместо даты.
  5. Для элементов интерфейса (списков, полей ввода) лучше использовать ДЛФ, чтобы соблюсти региональные предпочтения пользователя.

Следуя этим правилам, вы сможете гибко настраивать отображение дат в любых объектах системы 1С:Предприятие 8, обеспечивая пользователям удобный и понятный интерфейс.

← На главную