При разработке конфигураций или доработке существующих решений часто возникает задача ограничения ввода даты. Иногда бизнес-логика требует, чтобы пользователь вводил или выбирал только месяц и год, не отвлекаясь на конкретный день. Разберем по шагам несколько эффективных способов решения этой задачи на управляемых формах 1С:Предприятие 8.3, от простых настроек формата до использования типовых диалогов выбора.
Проанализируем ситуацию, когда мы хотим оставить поле ввода с типом Дата, но сделать его удобным для выбора месяца. Для решения этой задачи в рамках управляемых форм сделаем следующее:
ДФ=MM.yyyy, чтобы пользователь видел только месяц и год (например, 12.2023). Также можно использовать формат ДФ='MMMM yyyy', чтобы месяц выводился прописью (например, Декабрь 2023).ПриОткрытии, заполним список выбора поля реквизита значениями первых чисел месяцев. В качестве представления зададим понятные названия месяцев.Регулирование и ОбработкаВыбора поля даты.Посмотрим на пример логики: в обработке выбора мы перехватываем выбранное значение из списка и устанавливаем в наш реквизит первое число нужного месяца. В событии регулирования при нажатии кнопок "вверх" и "вниз" мы программно прибавляем или убавляем месяцы (или года) к текущей дате с помощью функции ДобавитьМесяц.
Если мы хотим предоставить пользователю максимально привычный графический интерфейс без создания собственных форм, рассмотрим использование платформенного типа СтандартныйПериод. Это самый быстрый способ получить готовый диалог с навигацией по годам и месяцам.
СтандартныйПериод.ПриИзменении для этого поля.В коде обработчика мы программно обращаемся к выбранному периоду, получаем его свойство ДатаНачала (которое всегда будет первым числом выбранного месяца) и записываем это значение в наш основной реквизит с типом Дата.
&НаКлиенте
Процедура ПериодМесяцПриИзменении(Элемент)
Объект.ОсновнаяДата = Элемент.Значение.ДатаНачала;
КонецПроцедуры
Рассмотрим подход, который применяется в современных типовых конфигурациях (например, ЗУП 3.1 или ERP). Там красивый выбор месяца реализуется через связку двух реквизитов: скрытой даты и отображаемой строки.
Разберем по шагам этот алгоритм:
Дата), в котором хранятся данные, на форму не выводится (или делается невидимым).Строка.НачалоВыбора строкового поля программно вызываем открытие формы выбора месяца. В типовых конфигурациях для этого уже есть готовые общие формы, например ОбщаяФорма.ВыборСтандартногоПериодаМесяц.Пример вызова формы выбора (упрощенно):
&НаКлиенте
Процедура СтрокаМесяцНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Здесь вызывается типовая общая форма или ваша собственная форма выбора
ОткрытьФорму("ОбщаяФорма.ВыборСтандартногоПериодаМесяц", , Элемент);
КонецПроцедуры
После того как пользователь сделает выбор в диалоге, в обработчике ОбработкаВыбора мы принимаем выбранную дату, записываем ее в наш скрытый реквизит объекта типа Дата, а строковое поле обновляем, используя функцию Формат, чтобы вывести красивое представление, например, "Декабрь 2023".
Если в вашей самописной конфигурации нет формы ВыборСтандартногоПериодаМесяц, вы можете создать ее самостоятельно на основании платформенной формы выбора стандартного периода, жестко ограничив квант выбора одним месяцем.
Применяя эти методы, мы делаем интерфейс интуитивно понятным, защищаем базу от ввода некорректных дней месяца и полностью решаем задачу ввода даты в формате месяц/год.