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

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

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

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

Рассмотрим распространенную конструкцию, которая часто приводит к сбою:

ПериодРегистрации = Формат(ПериодРегистрации, "ДФ='MMMM yyyy'");

Выясним причину, почему такой код не работает. В платформе 1С функция Формат() всегда возвращает значение с типом Строка. Если реквизит объекта или переменная формы ПериодРегистрации имеют тип данных Дата, платформа пытается неявно преобразовать полученную строку обратно в дату. Поскольку строковое представление вроде «Апрель 2024» не соответствует стандартному системному формату даты, приведение типов либо сбрасывает значение в пустую дату (01.01.0001 0:00:00), либо просто игнорирует форматирование.

Кроме того, необходимо строго соблюдать правила составления форматной строки ДФ (формат даты):

  1. Единая раскладка символов: нельзя смешивать в одном шаблоне русские и латинские символы. Либо используется русский шаблон (ММММ гггг), либо английский (MMMM yyyy). При смешивании раскладок платформа не сможет распознать управляющие конструкции.
  2. Ограничения поля ввода даты: текстовые представления месяцев (ММММ — полное наименование, МММ — краткое наименование) поддерживаются функцией Формат() для строк и ячеек отчетов, но не поддерживаются в качестве формата редактирования поля ввода с типом Дата. Поле ввода даты рассчитывает маску клавиатурного ввода исключительно для цифр и разделителей.

Способ 1. Использование строкового реквизита на форме

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

  1. Создадим на форме реквизит (или переменную) ПериодРегистрацииСтрокой с типом Строка.
  2. Свяжем этот реквизит с элементом управления на форме (поле ввода или надпись).
  3. При открытии формы или при изменении базовой даты инициализируем строковое значение: ПериодРегистрацииСтрокой = Формат(ПериодРегистрации, "ДФ=""ММММ гггг""");
  4. Если пользователю требуется интерактивно выбирать дату, для поля ввода отключают ручной ввод текста (свойство РедактированиеТекста = Ложь), включают кнопки выбора или регулирования и в обработчиках этих событий программно изменяют реальную дату документа через ДобавитьМесяц(), обновляя отображаемую строку.

Способ 2. Установка числового формата для поля формы

Если для бизнес-логики не принципиально, чтобы месяц выводился прописью (например, достаточно компактного формата «04.2024» или «04/2024»), можно оставить реквизит формы с типом Дата, настроив формат элемента управления программно или в свойствах.

Посмотрим на пример кода для модуля формы:


ЭлементыФормы.ПериодРегистрации.Формат = "ДФ=ММ.гггг";
ЭлементыФормы.ПериодРегистрации.ФорматРедактирования = "ДФ=ММ.гггг";

Обратим внимание на важный нюанс: у элементов формы существуют два независимых свойства — Формат (определяет вид поля, когда оно не активно) и ФорматРедактирования (действует в момент, когда курсор находится в поле). Если задать только Формат, то при входе в поле курсором пользователь увидит стандартную дату со временем. Установка обоих свойств обеспечивает единообразное отображение.

Способ 3. Вывод периода в поле надписи или табличный документ

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


ЭлементыФормы.НадписьПериод.Заголовок = Формат(ПериодРегистрации, "ДФ=""ММММ гггг 'г.'""");

Обратите внимание на статичный текст в формате: любые дополнительные буквы (например, сокращение г.) обязательно заключаются в одинарные кавычки внутри строки, иначе платформа воспримет букву г как символ шаблона года.

Способ 4. Использование системной функции ПредставлениеПериода

Рассмотрим альтернативную возможность платформы, которая позволяет сформировать стандартизированное наименование периода с учетом текущей локализации информационной базы без ручного составления маски формата:


ПериодРегистрацииСтрокой = ПредставлениеПериода(НачалоМесяца(ПериодРегистрации), КонецМесяца(ПериодРегистрации), "ФП=Истина");

Параметр "ФП=Истина" указывает платформе сформировать полное представление периода (например, «Апрель 2024 г.»). Такой подход избавляет от необходимости вручную следить за языковыми шаблонами форматирования и кавычками в строке ДФ.

← На главную