Как в СКД для стандартного периода настроить режим выбора из списка?

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

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

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

Выясняем причину: особенности поведения платформы 1С

Почему же стандартный код, который приводит автор темы, не дает желаемого результата? Все дело в архитектурных изменениях управляемых форм, произошедших в платформе начиная с версии 8.3.7:

  1. Свойство поля ввода КнопкаСпискаВыбора (ChoiceListButton) было объявлено устаревшим и оставлено исключительно для обеспечения обратной совместимости.
  2. Событие НачалоВыбораИзСписка больше не вызывается платформой в штатных режимах работы современных управляемых форм.
  3. Для полей ввода с типом СтандартныйПериод платформа самостоятельно управляет отображением кнопок. Выпадающий список быстрых вариантов периода отображается автоматически, но только в том случае, если текущее значение периода не является произвольным. Как только пользователь выбирает произвольные даты («сбивая» предопределенный вариант), платформа скрывает кнопку списка выбора (стрелку вниз), оставляя только кнопку «...».

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

Способ 1. Стандартная настройка периода в СКД (без написания кода)

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

Разберем этот процесс по шагам:

  1. Откройте схему компоновки данных вашего отчета и перейдите на вкладку «Параметры».
  2. Создайте новый параметр. Назовем его, например, ПериодОтчета. Установите для него тип данных СтандартныйПериод.
  3. Для системных параметров начала и окончания периода (например, НачалоПериода и КонецПериода, которые используются в ваших запросах или виртуальных таблицах) в колонке «Выражение» пропишите формулы связи:
    &ПериодОтчета.ДатаНачала — для начала периода.
    &ПериодОтчета.ДатаОкончания — для окончания периода.
  4. Для параметров НачалоПериода и КонецПериода обязательно установите флаг «Ограничение доступности». Это нужно для того, чтобы скрыть технические поля от пользователя, не загромождая интерфейс.
  5. Включите созданный параметр ПериодОтчета в быстрые пользовательские настройки (нажмите кнопку со свойствами элемента в колонке настроек).

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

Способ 2. Вынесение параметра на форму как отдельного реквизита

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

Рассмотрим подробнее, как это реализовать:

  1. Откройте форму отчета. В списке реквизитов формы создайте новый реквизит ПериодФормы с типом СтандартныйПериод.
  2. Перетащите этот реквизит на форму в качестве поля ввода. Настройте его свойства: установите РежимВыбораИзСписка в значение Авто или Истина.
  3. Создайте обработчик события ПриИзменении для этого элемента формы. В нем мы будем программно передавать выбранное значение в компоновщик настроек СКД.

Посмотрим на пример программной реализации на клиенте и сервере:


&НаКлиенте
Процедура ПериодФормыПриИзменении(Элемент)
    
    // Передаем новое значение периода в настройки компоновщика
    УстановитьПараметрКомпоновщикаНаСервере("ПериодОтчета", ПериодФормы);
    
КонецПроцедуры

&НаСервере
Процедура УстановитьПараметрКомпоновщикаНаСервере(ИмяПараметра, ЗначениеПериода)
    
    ПараметрСвязи = Новый ПараметрКомпоновкиДанных(ИмяПараметра);
    
    // Ищем параметр в пользовательских настройках
    Для Каждого ЭлементНастройки Из Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
        
        Если ТипЗнч(ЭлементНастройки) = Тип("ЗначениеПараметраКомпоновкиДанных") Тогда
            Если ЭлементНастройки.Параметр = ПараметрСвязи Тогда
                ЭлементНастройки.Значение = ЗначениеПериода;
                ЭлементНастройки.Использование = Истина;
                Прервать;
            КонецЕсли;
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

Не забудьте также заполнить этот реквизит при открытии формы, чтобы пользователь сразу видел текущие настройки отчета:


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

Этот способ дает разработчику стопроцентный контроль над отображением элемента на форме и гарантирует корректную работу кнопок выбора.

Способ 3. Использование механизмов БСП (Библиотека Стандартных Подсистем)

Если вы разрабатываете отчет в типовой конфигурации 1С (например, 1С:Бухгалтерия, 1С:ERP, 1С:УТ), которая построена на базе БСП, вам доступен готовый мощный функционал для работы с периодами.

БСП содержит стандартную общую форму отчета и вспомогательные модули, которые автоматически форматируют быстрые настройки параметров. Вместо того чтобы изобретать велосипед и писать собственный код для выпадающих списков, мы можем задействовать программный интерфейс БСП:

  1. Используйте метод ОтчетыКлиент.ВыбратьПериод(Форма, ИмяКоманды). Это вызовет стандартизированный диалог БСП, привычный для всех пользователей типовых конфигураций.
  2. БСП автоматически обработает сценарии выбора предопределенных интервалов и обновит параметры компоновщика без необходимости ручной привязки событий на управляемой форме.

Проанализировав все три метода, можно сделать вывод: в современной платформе 1С не стоит пытаться принудительно управлять кнопками списка выбора через низкоуровневые свойства динамических элементов компоновщика. Используйте либо штатную привязку выражений в схеме СКД (Способ 1), либо выносите период в реквизиты формы (Способ 2) для тонкой ручной настройки интерфейса.

← На главную