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

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

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

Почему стандартные методы иногда не работают

Разберем типичную ситуацию: программист пытается изменить КомпоновщикНастроек.Настройки напрямую в модуле формы. Однако в СКД существует жесткое разделение между настройками варианта (основная структура) и пользовательскими настройками. Если мы просто меняем элемент отбора в настройках варианта, система может «не понять», что этот отбор нужно вывести в пользовательский интерфейс, если у него не заполнен специальный идентификатор связи.

Проанализируем жизненный цикл загрузки настроек. Когда мы работаем с событием ПередЗагрузкойВариантаНаСервере, платформа предоставляет нам доступ к объекту НовыеНастройкиКД. Это те настройки, которые вот-вот будут применены к компоновщику. Если менять компоновщик формы напрямую, наши изменения будут просто перекрыты процессом загрузки нового варианта. Поэтому ключевое правило — работать с параметрами события.

Решение проблемы через ПередЗагрузкойВариантаНаСервере

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

  1. Найти нужный элемент отбора в коллекции настроек варианта.
  2. Установить необходимые значения (вид сравнения, правое значение, использование).
  3. Присвоить элементу ИдентификаторПользовательскойНастройки.
  4. Установить режим отображения (например, быстрый доступ).

Рассмотрим пример кода, который решает эту задачу для случая, когда нам нужно установить отбор по списку значений:


&НаСервере
Процедура ПередЗагрузкойВариантаНаСервере(Форма, НовыеНастройкиКД) Экспорт

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

    // Перебираем элементы отбора в новых настройках
    Для Каждого ЭлементОтбора Из НовыеНастройкиКД.Отбор.Элементы Цикл
        
        // Проверяем поле по его идентификатору (ПолеКомпоновкиДанных)
        Если ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ВидОперации") Тогда
            
            // Устанавливаем параметры фильтрации
            ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.ВСписке;
            ЭлементОтбора.ПравоеЗначение = СпВидовОпераций;
            ЭлементОтбора.Использование  = Истина;
            
            // КРИТИЧЕСКИ ВАЖНО: Устанавливаем режим отображения и идентификатор
            // Без этого отбор останется "невидимым" для пользователя в шапке
            ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ;
            
            // Генерируем новый идентификатор, чтобы связать с пользовательскими настройками
            ЭлементОтбора.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор;
            
        КонецЕсли;
        
    КонецЦикла;

КонецПроцедуры

Разбор важных нюансов реализации

Посмотрим на код внимательнее. Почему мы используем Новый ПолеКомпоновкиДанных("ВидОперации")? При работе с СКД сравнение ЛевоеЗначение через приведение к строке не всегда надежно. Прямое создание объекта поля гарантирует точность сопоставления с метаданными схемы.

Идентификатор пользовательской настройки — это "мостик". Если у элемента отбора в настройках варианта это поле пустое, платформа считает, что этот отбор является техническим (внутренним) и не должен редактироваться пользователем в упрощенном интерфейсе. Устанавливая туда Новый УникальныйИдентификатор, мы заставляем систему создать соответствующий элемент в коллекции ПользовательскиеНастройки.

Проанализируем использование РежимОтображения. Мы выбрали БыстрыйДоступ. В интерфейсе «Такси» это приведет к тому, что отбор появится сразу в верхней части отчета. Если выбрать Обычный, отбор будет виден только после нажатия кнопки «Настройки».

Что делать, если элемента отбора еще нет в схеме?

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


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

Важно помнить, что при ручном добавлении элемента нужно быть осторожным, чтобы не создать дублирующих отборов по одному и тому же полю, что может привести к путанице или пустым результатам отчета.

Особенности работы со Списком Значений

При передаче списка значений (как в примере автора) следует убедиться, что ВидСравнения установлен именно в значение ВСписке или НеВСписке. Если вы установите Равно и передадите СписокЗначений, СКД может выдать ошибку типов при попытке выполнения запроса.

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

Итоги и рекомендации

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

  1. Используйте событие ПередЗагрузкойВариантаНаСервере для модификации структуры настроек.
  2. Всегда оперируйте параметром НовыеНастройкиКД, а не напрямую компоновщиком отчета.
  3. Для отображения на форме обязательно заполняйте ИдентификаторПользовательскойНастройки.
  4. Для удобства пользователя используйте РежимОтображения.БыстрыйДоступ.
  5. При работе со списками значений не забывайте устанавливать корректный ВидСравнения.

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

← На главную