Как реализовать выбор даты с точностью до месяца в отчетах на управляемых формах

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

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

Почему стандартная настройка формата не решает задачу

Проанализируем поведение платформы при настройке параметров отчета. Если задать полю формат редактирования ДФ='ММММ гггг', визуальное отображение значения действительно изменится — дата начнет показываться как название месяца и год. Однако интерактивный календарь платформы 1С жестко привязан к выбору конкретных дней. При нажатии на кнопку выбора даты платформа в любом случае откроет стандартное окно с сеткой дней текущего месяца.

Кроме того, если отчет не имеет собственной формы и формируется на стандартной автоматической форме платформы, переопределить логику открытия календаря для отдельного параметра СКД невозможно. Для реализации специализированного диалога выбора месяца необходимо обязательно создать форму отчета и переопределить обработку элементов управления.

Способ 1. Реализация через строковое поле и кнопки регулирования

Рассмотрим распространенный подход, используемый в типовых прикладных решениях (например, в документе ЛимитыРасходаДенежныхСредств конфигурации «Управление торговлей 11»). В этом варианте на форме разделяется хранение данных и их визуальное представление.

Разберем по шагам создание такого механизма:

  1. Создадим в форме основной реквизит Период с типом Дата (он будет хранить первое число выбранного месяца и передаваться в параметры отчета).
  2. Создадим дополнительный строковый реквизит формы ПериодСтрока с длиной строки 25–30 символов и вынесем его на форму.
  3. В свойствах элемента формы ПериодСтрока установим параметры: КнопкаРегулирования = Истина, КнопкаВыбора = Истина, а также отключим прямое РедактированиеТекста.
  4. Назначим обработчики событий для элемента формы.

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


&НаКлиенте
Процедура ПериодСтрокаРегулирование(Элемент, Направление, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    Период = ДобавитьМесяц(Период, Направление);
    ОбновитьОтображениеПериода();
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьОтображениеПериода()
    ПериодСтрока = Формат(Период, "ДФ='ММММ гггг'");
КонецПроцедуры

Функция ДобавитьМесяц платформы 1С автоматически корректно изменяет дату с учетом перехода через границу года, когда значение параметра Направление равно 1 или -1.

Способ 2. Интерактивный выбор месяца через выпадающий список

Чтобы пользователь мог быстро выбрать нужный месяц текущего года без многократных кликов по стрелкам, обработаем событие нажатия на кнопку выбора. В типовой общей форме ФормаОтчета похожая логика вынесена в специализированную процедуру выбора периода из списка.

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


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

&НаКлиенте
Процедура ПослеВыбораМесяцаИзСписка(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт
    Если ВыбранныйЭлемент <> Неопределено Тогда
        Период = ВыбранныйЭлемент.Значение;
        ОбновитьОтображениеПериода();
    КонецЕсли;
КонецПроцедуры

С помощью метода ПоказатьВыборИзМеню открывается компактное меню непосредственно под полем ввода, в котором отображаются все 12 месяцев выбранного года.

Способ 3. Использование СтандартногоПериода в СКД без программирования

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

  1. В схеме компоновки данных создадим параметр ПериодОтчета с типом СтандартныйПериод.
  2. Включим этот параметр в состав пользовательских настроек отчета.
  3. В параметрах запроса схемы (например, &НачалоПериода и &КонецПериода) пропишем выражения для связи с выбранным периодом: &ПериодОтчета.ДатаНачала и КонецПериода(&ПериодОтчета.ДатаОкончания, "День").

При использовании стандартного периода платформа предоставляет пользователю готовое интерактивное окно с вкладками, где в один клик можно выбрать любой месяц, квартал или год без разработки отдельного программного кода.

← На главную