Как реализовать выбор и отображение даты в формате «Месяц Год» в управляемых формах 1С?

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

При разработке интерфейсов в 1С часто возникает задача сделать ввод данных максимально удобным для пользователя. Одной из классических задач является выбор расчетного периода, который обычно ограничен месяцем и годом (например, «Сентябрь 2023»). Однако стандартное поле ввода даты в управляемых формах ведет себя специфически, когда мы пытаемся заставить его отображать названия месяцев. Давайте подробно разберем, почему это происходит и как правильно реализовать такой функционал.

Различие между свойствами «Формат» и «Формат редактирования»

Первое, с чем мы сталкиваемся при настройке поля — это свойства Формат и Формат редактирования. Проанализируем, за что отвечает каждое из них:

  1. Формат (Format): определяет внешний вид значения, когда поле не активно (курсор находится в другом месте). Здесь строка ДФ='ММММ гггг' (где ММММ — полное название месяца, а гггг — четырехзначный год) работает безупречно.
  2. Формат редактирования (EditFormat): определяет маску ввода, когда пользователь начинает изменять значение. И здесь кроется главная проблема: тип данных Дата в 1С на уровне платформы жестко привязан к числовому вводу. Платформа не позволяет вводить буквы в поле с типом «Дата».

Рассмотрим ситуацию: вы установили формат ДФ='ММММ гггг'. Пока пользователь просто смотрит на форму, он видит «Июль 2024». Как только он нажимает на поле, формат «сбрасывается» до стандартных цифр, так как платформа ожидает ввод числа месяца, номера месяца и года. Это поведение нельзя изменить простым свойством, так как это ограничение ядра управляемого приложения.

Способ 1: Использование форматной строки (базовый метод)

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

ДФ='ММММ yyyy'

Или, если вы предпочитаете использовать кириллические идентификаторы:

ДФ='ММММ гггг'

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

Способ 2: Использование списка выбора (ChoiceList)

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

  1. Установите у поля ввода свойство РежимВыбораИзСписка = Истина.
  2. В обработчике события формы ПриСозданииНаСервере заполните этот список программно.

Посмотрим на пример кода:


&НаСервере
Процедура ЗаполнитьСписокМесяцев()
    ТекущаяДатаНачала = НачалоГода(ТекущаяДата());
    Для НомерМесяца = 0 По 11 Цикл
        ДатаМесяца = ДобавитьМесяц(ТекущаяДатаНачала, НомерМесяца);
        ПредставлениеМесяца = Формат(ДатаМесяца, "ДФ='ММММ гггг'");
        Элементы.РасчетныйМесяц.СписокВыбора.Добавить(ДатаМесяца, ПредставлениеМесяца);
    КонецЦикла;
КонецПроцедуры

В этом случае в реквизит формы (тип Дата) запишется реальное значение (например, 01.03.2024), а пользователь в выпадающем списке будет выбирать понятную строку «Март 2024».

Способ 3: Использование типа «СтандартныйПериод»

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

Чтобы получить дату из такого реквизита для дальнейших расчетов (например, в запросе), используйте обращение к свойству ДатаНачала:

ДатаДляЗапроса = Объект.ПериодРегистрации.ДатаНачала;

Этот способ лишен проблем с форматами редактирования и интуитивно понятен всем пользователям 1С.

Способ 4: Программный перехват начала выбора

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

  1. Установите у поля свойство КнопкаВыбора = Да.
  2. Создайте событие НачалоВыбора.

&НаКлиенте
Процедура РасчетныйМесяцНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь; // Отключаем стандартный календарь
    
    // Описываем логику открытия своего диалога или меню
    СписокВыбора = Новый СписокЗначений;
    Для НомерМесяца = -6 По 6 Цикл
        ЗначениеДаты = ДобавитьМесяц(НачалоМесяца(ТекущаяДата()), НомерМесяца);
        СписокВыбора.Добавить(ЗначениеДаты, Формат(ЗначениеДаты, "ДФ='ММММ гггг'"));
    КонецЦикла;
    
    ВыбранныйЭлемент = ВыбратьИзСписка(СписокВыбора, Элемент);
    Если ВыбранныйЭлемент <> Неопределено Тогда
        Объект.РасчетныйМесяц = ВыбранныйЭлемент.Значение;
    КонецЕсли;
КонецПроцедуры

Особенности локализации (Л=ru_RU)

Не забудем про важный технический нюанс. Формат ММММ выводит название месяца на языке текущего сеанса пользователя. Если вашу базу откроет пользователь с английским интерфейсом, он увидит "July 2024" вместо "Июль 2024". Чтобы жестко зафиксировать русский язык отображения, используйте параметр локализации в форматной строке:

ДФ='ММММ гггг'; Л=ru_RU

Резюме и рекомендации

Подводя итог нашему разбору, можно выделить следующие правила:

Выбор конкретного метода зависит от бизнес-задачи, но наиболее «чистым» решением для управляемых форм остается использование программно заполняемого списка выбора или стандартного диалога редактирования периода.

← На главную