При разработке отчетов и документов часто возникает задача ограничить выбор даты только месяцем и годом (например, для указания расчетного периода, лимитов или плановых показателей). Разработчики нередко пытаются решить эту задачу через настройку формата поля или параметра компоновки данных, однако сталкиваются с тем, что стандартный календарь платформы продолжает открывать выбор конкретного дня месяца. Разберем особенности работы платформы с датами и рассмотрим надежные способы реализации удобного выбора месяца.
Проанализируем поведение платформы при настройке параметров отчета. Если задать полю формат редактирования ДФ='ММММ гггг', визуальное отображение значения действительно изменится — дата начнет показываться как название месяца и год. Однако интерактивный календарь платформы 1С жестко привязан к выбору конкретных дней. При нажатии на кнопку выбора даты платформа в любом случае откроет стандартное окно с сеткой дней текущего месяца.
Кроме того, если отчет не имеет собственной формы и формируется на стандартной автоматической форме платформы, переопределить логику открытия календаря для отдельного параметра СКД невозможно. Для реализации специализированного диалога выбора месяца необходимо обязательно создать форму отчета и переопределить обработку элементов управления.
Рассмотрим распространенный подход, используемый в типовых прикладных решениях (например, в документе ЛимитыРасходаДенежныхСредств конфигурации «Управление торговлей 11»). В этом варианте на форме разделяется хранение данных и их визуальное представление.
Разберем по шагам создание такого механизма:
Период с типом Дата (он будет хранить первое число выбранного месяца и передаваться в параметры отчета).ПериодСтрока с длиной строки 25–30 символов и вынесем его на форму.ПериодСтрока установим параметры: КнопкаРегулирования = Истина, КнопкаВыбора = Истина, а также отключим прямое РедактированиеТекста.Посмотрим на пример программного кода, который реализует перелистывание месяцев кнопками со стрелками и открытие выпадающего списка при нажатии кнопки выбора:
&НаКлиенте
Процедура ПериодСтрокаРегулирование(Элемент, Направление, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Период = ДобавитьМесяц(Период, Направление);
ОбновитьОтображениеПериода();
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьОтображениеПериода()
ПериодСтрока = Формат(Период, "ДФ='ММММ гггг'");
КонецПроцедуры
Функция ДобавитьМесяц платформы 1С автоматически корректно изменяет дату с учетом перехода через границу года, когда значение параметра Направление равно 1 или -1.
Чтобы пользователь мог быстро выбрать нужный месяц текущего года без многократных кликов по стрелкам, обработаем событие нажатия на кнопку выбора. В типовой общей форме ФормаОтчета похожая логика вынесена в специализированную процедуру выбора периода из списка.
Разберем, как сформировать динамический список месяцев и показать его пользователю в точке нажатия:
&НаКлиенте
Процедура ПериодСтрокаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
СписокМесяцев = Новый СписокЗначений;
ТекущийГод = Год(Период);
Если ТекущийГод = 1 Тогда
ТекущийГод = Год(ТекущаяДата());
КонецЕсли;
Для НомерМесяца = 1 По 12 Цикл
ДатаМесяца = Дата(ТекущийГод, НомерМесяца, 1);
СписокМесяцев.Добавить(ДатаМесяца, Формат(ДатаМесяца, "ДФ='ММММ гггг'"));
КонецЦикла;
Оповещение = Новый ОписаниеОповещения("ПослеВыбораМесяцаИзСписка", ЭтотОбъект);
ПоказатьВыборИзМеню(Оповещение, СписокМесяцев, Элемент);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораМесяцаИзСписка(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт
Если ВыбранныйЭлемент <> Неопределено Тогда
Период = ВыбранныйЭлемент.Значение;
ОбновитьОтображениеПериода();
КонецЕсли;
КонецПроцедуры
С помощью метода ПоказатьВыборИзМеню открывается компактное меню непосредственно под полем ввода, в котором отображаются все 12 месяцев выбранного года.
Если строгая фиксация исключительно на одном поле не является жестким требованием к интерфейсу отчета, выясним альтернативный путь, предусмотренный самой системой компоновки данных:
ПериодОтчета с типом СтандартныйПериод.&НачалоПериода и &КонецПериода) пропишем выражения для связи с выбранным периодом: &ПериодОтчета.ДатаНачала и КонецПериода(&ПериодОтчета.ДатаОкончания, "День").При использовании стандартного периода платформа предоставляет пользователю готовое интерактивное окно с вкладками, где в один клик можно выбрать любой месяц, квартал или год без разработки отдельного программного кода.