Как красиво сгруппировать и расположить отборы СКД на управляемой форме в 1С?

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

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

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

Метод 1. Использование стандартного свойства «Группа пользовательских настроек»

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

Рассмотрим по шагам, как это реализовать:

  1. Откроем вашу созданную управляемую форму отчета в конфигураторе.
  2. В дереве элементов формы (в левой верхней части редактора) добавим новый элемент. Для этого нажмем правой кнопкой мыши на корневой элемент Форма и выберем Добавить.
  3. Выберем тип элемента Группа - Обычная группа (или Группа - Страницы, если вы хотите спрятать отборы на отдельную вкладку). Дадим ей понятное имя, например, ГруппаБыстрыеОтборы.
  4. В свойствах созданной группы настроим визуальное представление: укажем группировку (например, Горизонтальная если возможно, чтобы отборы выстраивались в колонки, а не шли длинным списком вниз).
  5. Теперь выделим самый корневой элемент дерева — Форма. В палитре свойств справа найдем свойство Группа пользовательских настроек.
  6. В выпадающем списке этого свойства выберем только что созданную нами группу ГруппаБыстрыеОтборы.

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

Метод 2. Управление режимами редактирования в самой схеме СКД

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

В настройках СКД на вкладке Настройки (в нижней части окна схемы) выберем нужный отбор или параметр. Нажмем на кнопку Свойства элемента пользовательских настроек (иконка с изображением ключа/шестеренки). Нам доступны три режима редактирования:

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

Метод 3. Программная группировка через событие обновления настроек

Если стандартное поведение платформы все равно не удовлетворяет вашим требованиям (например, требуется сгруппировать определенные отборы по смысловым блокам «Параметры времени» и «Фильтры номенклатуры»), на помощь приходит программный код.

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

Разберем пример создания и настройки обработчика события:


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

Обратите внимание, что отключение стандартной обработки (СтандартнаяОбработка = Ложь) накладывает на разработчика обязанность самостоятельно создать элементы формы для каждого значимого отбора и связать их с данными компоновщика.

Метод 4. Динамическое создание элементов формы и ручная привязка к СКД

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

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

Рассмотрим детальный пример реализации этого механизма:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // 1. Сначала отключим стандартный автоматический вывод настроек СКД на форму,
    // очистив свойство формы, если оно было заполнено.
    ЭтотОбъект.ГруппаПользовательскихНастроек = "";
    
    // 2. Получим коллекцию пользовательских настроек нашего отчета
    ПользовательскиеНастройкиКомпоновщика = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки;
    
    // 3. Создадим на форме структуру групп для красивой раскладки
    // Создаем родительскую горизонтальную группу для двух колонок
    ГруппаКолонки = Элементы.Добавить("ГруппаКолонки", Тип("ГруппаФормы"), Элементы.Форма);
    ГруппаКолонки.Вид = ВидГруппыФормы.ОбычнаяГруппа;
    ГруппаКолонки.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная;
    ГруппаКолонки.Отображение = ОтображениеОбычнойГруппы.Нет;
    
    // Создаем левую колонку (например, для основных отборов)
    КолонкаЛевая = Элементы.Добавить("КолонкаЛевая", Тип("ГруппаФормы"), ГруппаКолонки);
    КолонкаЛевая.Вид = ВидГруппыФормы.ОбычнаяГруппа;
    КолонкаЛевая.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
    КолонкаЛевая.Отображение = ОтображениеОбычнойГруппы.Нет;
    
    // Создаем правую колонку (для дополнительных фильтров)
    КолонкаПравая = Элементы.Добавить("КолонкаПравая", Тип("ГруппаФормы"), ГруппаКолонки);
    КолонкаПравая.Вид = ВидГруппыФормы.ОбычнаяГруппа;
    КолонкаПравая.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
    КолонкаПравая.Отображение = ОтображениеОбычнойГруппы.Нет;
    
    // 4. Перебираем пользовательские настройки и распределяем их по колонкам
    Для Индекс = 0 По ПользовательскиеНастройкиКомпоновщика.Элементы.Количество() - 1 Цикл
        
        ТекущийЭлемент = ПользовательскиеНастройкиКомпоновщика.Элементы[Индекс];
        ИдентификаторНастройки = ТекущийЭлемент.ИдентификаторПользовательскойНастройки;
        
        // Нам нужны только те настройки, у которых заполнен идентификатор (они доступны для изменения)
        Если ЗначениеЗаполнено(ИдентификаторНастройки) Тогда
            
            // Определяем имя для нового поля формы
            ИмяПоляФормы = "ПолеНастройки_" + СтрЗаменить(ИдентификаторНастройки, "-", "_");
            
            // Выбираем, в какую колонку поместить элемент (для примера распределим четные/нечетные)
            ЦелеваяГруппа = ?(Индекс % 2 = 0, КолонкаЛевая, КолонкаПравая);
            
            // Добавляем поле ввода на форму
            НовоеПоле = Элементы.Добавить(ИмяПоляФормы, Тип("ПолеФормы"), ЦелеваяГруппа);
            НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;
            
            // Самый важный шаг: связываем поле с конкретным элементом коллекции настроек компоновщика
            НовоеПоле.ПутьКДанным = "Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[" + Формат(Индекс, "ЧГ=0") + "].Значение";
            
            // Устанавливаем заголовок поля из представления настройки в СКД
            Если ЗначениеЗаполнено(ТекущийЭлемент.Представление) Тогда
                НовоеПоле.Заголовок = ТекущийЭлемент.Представление;
            Иначе
                // Если представление не задано, попробуем определить по типу или имени
                НовоеПоле.Заголовок = "Настройка " + ИмяПоляФормы;
            EndIf;
            
            // Дополнительные свойства для красоты интерфейса
            НовоеПоле.Ширина = 25;
            НовоеПоле.РастягиватьПоГоризонтали = Ложь;
            
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

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

Рекомендации по эргономике при размещении отборов

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

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

← На главную