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

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

При разработке конфигураций или доработке существующих решений часто возникает задача ограничения ввода даты. Иногда бизнес-логика требует, чтобы пользователь вводил или выбирал только месяц и год, не отвлекаясь на конкретный день. Разберем по шагам несколько эффективных способов решения этой задачи на управляемых формах 1С:Предприятие 8.3, от простых настроек формата до использования типовых диалогов выбора.

Способ 1. Настройка формата реквизита и списка выбора

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

  1. У реквизита даты на форме необходимо задать формат редактирования. Зададим ДФ=MM.yyyy, чтобы пользователь видел только месяц и год (например, 12.2023). Также можно использовать формат ДФ='MMMM yyyy', чтобы месяц выводился прописью (например, Декабрь 2023).
  2. Для элемента формы оставим только кнопку регулирования (стрелки вверх-вниз) и кнопку выпадающего списка. Обычный календарь лучше отключить, так как он предлагает выбор дня.
  3. В модуле формы, например, в обработчике ПриОткрытии, заполним список выбора поля реквизита значениями первых чисел месяцев. В качестве представления зададим понятные названия месяцев.
  4. Создадим процедуры для событий Регулирование и ОбработкаВыбора поля даты.

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

Способ 2. Использование типа "Стандартный период" для графического выбора

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

  1. Добавим на форму вспомогательный реквизит с типом СтандартныйПериод.
  2. При нажатии на кнопку выбора у такого поля платформа автоматически откроет удобное диалоговое окно, где в левой панели есть готовая навигация по месяцам. Пользователю достаточно кликнуть на нужный месяц.
  3. Создадим обработчик события ПриИзменении для этого поля.

В коде обработчика мы программно обращаемся к выбранному периоду, получаем его свойство ДатаНачала (которое всегда будет первым числом выбранного месяца) и записываем это значение в наш основной реквизит с типом Дата.


&НаКлиенте
Процедура ПериодМесяцПриИзменении(Элемент)
    Объект.ОсновнаяДата = Элемент.Значение.ДатаНачала;
КонецПроцедуры

Способ 3. Реализация через вспомогательное строковое поле и общую форму

Рассмотрим подход, который применяется в современных типовых конфигурациях (например, ЗУП 3.1 или ERP). Там красивый выбор месяца реализуется через связку двух реквизитов: скрытой даты и отображаемой строки.

Разберем по шагам этот алгоритм:

  1. Реквизит объекта (с типом Дата), в котором хранятся данные, на форму не выводится (или делается невидимым).
  2. На форму выводится вспомогательный реквизит формы с типом Строка.
  3. В свойствах этого строкового поля отключаем возможность ручного редактирования текста и включаем кнопку выбора (можно установить для нее картинку "Календарь").
  4. В обработчике события НачалоВыбора строкового поля программно вызываем открытие формы выбора месяца. В типовых конфигурациях для этого уже есть готовые общие формы, например ОбщаяФорма.ВыборСтандартногоПериодаМесяц.

Пример вызова формы выбора (упрощенно):


&НаКлиенте
Процедура СтрокаМесяцНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    // Здесь вызывается типовая общая форма или ваша собственная форма выбора
    ОткрытьФорму("ОбщаяФорма.ВыборСтандартногоПериодаМесяц", , Элемент);
КонецПроцедуры

После того как пользователь сделает выбор в диалоге, в обработчике ОбработкаВыбора мы принимаем выбранную дату, записываем ее в наш скрытый реквизит объекта типа Дата, а строковое поле обновляем, используя функцию Формат, чтобы вывести красивое представление, например, "Декабрь 2023".

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

Применяя эти методы, мы делаем интерфейс интуитивно понятным, защищаем базу от ввода некорректных дней месяца и полностью решаем задачу ввода даты в формате месяц/год.

← На главную