Как вывести флажок включения и отключения группировки СКД на управляемую форму 1С

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

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

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

Механизм работы пользовательских настроек «под капотом»

Прежде чем перейти к практике, проанализируем, как платформа взаимодействует с настройками компоновки данных. В СКД существует четкое разделение на две коллекции:

  1. Настройки варианта (КомпоновщикНастроек.Настройки) — это базовая, эталонная структура отчета, которую разработчик закладывает в конфигураторе или которую пользователь создает через форму «Изменить вариант».
  2. Пользовательские настройки (КомпоновщикНастроек.ПользовательскиеНастройки) — это те параметры, отборы и группировки, которые вынесены непосредственно на форму для быстрого доступа. Они накладываются поверх основных настроек в момент формирования отчета.

Когда мы включаем группировку в состав пользовательских настроек и задаем ей режим редактирования «Быстрый доступ», происходит следующее:

Решение проблемы: Пошаговая декларативная настройка в конфигураторе

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

Шаг 1. Переход к настройкам группировки

Откроем схему компоновки данных нашего отчета в конфигураторе. Перейдем на вкладку «Настройки». В окне структуры отчета выберем ту группировку, которой мы хотим управлять с формы (например, группировку по полю Регистратор).

Шаг 2. Настройка состава пользовательских настроек

В правом нижнем углу окна конфигуратора найдем свойства выбранной группировки. Нажмем на кнопку «Свойства пользовательских настроек группировки» (иконка с изображением шестеренки или гаечного ключа в колонке пользовательских настроек).

Шаг 3. Заполнение параметров настройки

В открывшемся диалоговом окне выполним следующие действия:

  1. Установим флажок напротив свойства «Группировка». Этим мы сообщаем системе, что хотим вынести признак использования всей группировки в пользовательские настройки.
  2. В поле «Представление» введем понятный для пользователя текст, который будет отображаться рядом с флажком на форме (например, «По документам» или «Детализация по регистратору»).
  3. В поле «Режим редактирования» обязательно выберем значение «Быстрый доступ». Если оставить значение «Обычный», настройка будет доступна только в расширенном окне настроек отчета, а на саму форму в виде быстрого флажка не выведется.
  4. Нажмем кнопку «ОК» для сохранения параметров.

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

Главная проблема разработчиков: «Я все настроил, но флажок на форме не появился»

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

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

Как решить эту проблему:

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

Разгадка поведения системы при изменении варианта

Выясним причину интересного поведения, которое часто ставит в тупик начинающих программистов. Если мы устанавливаем или снимаем галочку «По документам» на форме, а затем заходим в меню «Еще» -> «Изменить вариант», мы можем увидеть, что у группировки по регистратору флажок использования в структуре варианта не меняется.

Это абсолютно нормальное и логичное поведение платформы. Как мы уже выяснили выше, структура в окне «Изменить вариант» отображает коллекцию КомпоновщикНастроек.Настройки (статический вариант отчета). В то же время флажок на быстрой панели управляет коллекцией КомпоновщикНастроек.ПользовательскиеНастройки (динамические настройки пользователя). При компоновке макета эти две коллекции соединяются. Пользовательские настройки имеют приоритет над настройками варианта, поэтому реальное состояние группировки определяется именно флажком на форме, несмотря на то, что в структуре варианта галочка может быть выключена.

Альтернативный вариант: Программное управление группировкой СКД

Рассмотрим ситуацию, когда стандартный декларативный механизм нам не подходит. Такое бывает, если:

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

Шаг 1. Именование группировки в СКД

Для того чтобы обратиться к конкретной группировке из кода, ей необходимо присвоить уникальное имя. Откроем схему компоновки данных, выделим нашу группировку и в окне ее свойств заполним поле «Имя» (зададим, например, значение "ГруппировкаРегистратор").

Шаг 2. Подготовка формы

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

Шаг 3. Написание программного кода

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

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


&НаКлиенте
Процедура ВыводитьДетализациюПоДокументамПриИзменении(Элемент)
    
    // Вызываем серверную процедуру для изменения настроек компоновщика
    ВыводитьДетализациюПоДокументамПриИзмененииНаСервере();
    
КонецПроцедуры

&НаСервере
Процедура ВыводитьДетализациюПоДокументамПриИзмененииНаСервере()
    
    // Получаем текущие рабочие настройки компоновщика
    РабочиеНастройки = Отчет.КомпоновщикНастроек.Настройки;
    
    // Запускаем рекурсивный поиск и изменение флага использования группировки
    УстановитьИспользованиеГруппировкиРекурсивно(РабочиеНастройки.Структура, "ГруппировкаРегистратор", ВыводитьДетализациюПоДокументам);
    
КонецПроцедуры

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

В этом примере процедура УстановитьИспользованиеГруппировкиРекурсивно безопасно обходит всю иерархию настроек вашего отчета, находит группировку с именем "ГруппировкаРегистратор" на любом уровне вложенности и устанавливает признак её использования в соответствии с состоянием флажка на форме.

Влияние на производительность и оптимизация SQL-запросов

Проанализируем очень важное архитектурное преимущество, которое дает нам отключение неиспользуемых группировок в СКД. Система компоновки данных является интеллектуальным генератором запросов.

Если группировка по регистратору отключена пользователем (снят флажок) и поля регистратора больше не задействованы в выводе других полей, отборах или сортировках, СКД автоматически оптимизирует итоговый SQL-запрос к СУБД. Она исключит из запроса виртуальные таблицы или левые соединения с таблицами документов-регистраторов, которые нужны были исключительно для получения детальных записей.

В результате СУБД выполнит гораздо более легкий запрос с меньшим количеством соединений и встроенным агрегированием на уровне базы данных. Это ускоряет формирование отчета в разы (а на крупных базах данных — в десятки раз) по сравнению с вариантом, когда детальные записи выбираются из базы данных всегда, но просто скрываются на уровне визуального отображения.

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

← На главную