Как настроить параметры выбора для поля СКД типа "Справочник.ЗначенияСвойствОбъектов" с отбором по владельцу?

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

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

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

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

Это решение является одним из наиболее надежных, поскольку позволяет напрямую манипулировать элементами формы отчета и устанавливать им необходимые параметры выбора. Мы будем использовать события формы, такие как ОпределитьНастройкиФормы и ПослеЗаполненияПанелиБыстрыхНастроек.

Шаг 1: Подключение обработчика события в модуле объекта отчета

Прежде всего, нам нужно сообщить платформе, что мы хотим обрабатывать события формы. Для этого в модуле объекта отчета необходимо добавить экспортную процедуру ОпределитьНастройкиФормы:


Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
    Настройки.События.ПослеЗаполненияПанелиБыстрыхНастроек = Истина;
КонецПроцедуры

Эта строка указывает, что после заполнения панели быстрых настроек формы отчета будет вызван наш обработчик.

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


#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Процедура ПриОпределенииНастроек(Настройки) Экспорт
    Настройки.ОпределитьНастройкиФормы = Истина;
КонецПроцедуры
#КонецЕсли

Шаг 2: Реализация процедуры ПослеЗаполненияПанелиБыстрыхНастроек

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


Процедура ПослеЗаполненияПанелиБыстрыхНастроек(Форма, ПараметрыОбновления) Экспорт
    // Получаем путь к данным для наших полей отбора
    ПутьКДаннымПоля_Плавка = ПутьКДаннымЭлементаФормыЗначенияОтбора("Плавка");
    ПутьКДаннымПоля_НомерСертификатаПроизводителя = ПутьКДаннымЭлементаФормыЗначенияОтбора("НомерСертификатаПроизводителя");

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

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

Шаг 3: Вспомогательная функция для получения пути к данным

Для удобства поиска нужных элементов формы нам потребуется вспомогательная функция ПутьКДаннымЭлементаФормыЗначенияОтбора, которая по имени поля компоновки данных вернет соответствующий путь к данным элемента формы отбора:


Функция ПутьКДаннымЭлементаФормыЗначенияОтбора(ИмяПоляКомпоновкиДанных)
    ПолеКомпоновкиДанных = Новый ПолеКомпоновкиДанных(ИмяПоляКомпоновкиДанных);
    ИдентификаторПользовательскойНастройки = Неопределено;

    // Находим идентификатор пользовательской настройки для данного поля
    Для Каждого Элемент Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
        Если Элемент.ЛевоеЗначение = ПолеКомпоновкиДанных Тогда
            ИдентификаторПользовательскойНастройки = Элемент.ИдентификаторПользовательскойНастройки;
            Прервать;
        КонецЕсли;
    КонецЦикла;

    Если ИдентификаторПользовательскойНастройки = Неопределено Тогда
        Возврат Неопределено;
    КонецЕсли;

    // Ищем соответствующий элемент в пользовательских настройках
    ПользовательскиеНастройки = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;
    Для Индекс = 0 По ПользовательскиеНастройки.Количество-1 Цикл
        Если ПользовательскиеНастройки[Индекс].ИдентификаторПользовательскойНастройки = ИдентификаторПользовательскойНастройки Тогда
            Возврат "Отчет.КомпоновщикНастроек.ПользовательскиеНастройки["+Формат(Индекс, "ЧДЦ=0; ЧГ=")+"].Значение";
        КонецЕсли;
    КонецЦикла;

    Возврат Неопределено;
КонецФункции

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

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

Решение 2: Использование параметров данных и связей параметров выбора с программной установкой на сервере

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

Шаг 1: Настройка схемы компоновки данных

В схеме компоновки данных, на вкладке "Параметры", мы должны создать параметр, например, ПВХ_НомерСертификата. Этот параметр будет использоваться для передачи значения владельца. Важно, чтобы этот параметр был доступен и мог быть установлен.

Затем для поля, по которому мы хотим установить отбор (например, НомерСертификата, имеющего тип СправочникСсылка.ЗначенияСвойствОбъектов), мы переходим на вкладку "Наборы данных" или "Параметры", находим колонку "Параметры редактирования". В этой колонке для нашего поля мы устанавливаем "Связи параметров выбора":

  1. В качестве "Параметра выбора" указываем Отбор.Владелец.
  2. В качестве "Поля" или "Параметра данных" указываем наш созданный параметр ПараметрыДанных.ПВХ_НомерСертификата.

Эта связь говорит СКД, что при выборе значения для поля НомерСертификата, отбор по владельцу должен использовать значение, переданное в параметр ПВХ_НомерСертификата.

Шаг 2: Программная установка параметра данных на сервере

Теперь нам нужно программно установить значение параметра ПВХ_НомерСертификата. Это можно сделать в процедуре ПриОткрытииНаСервере формы отчета:


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

    // Пример для других полей, если они есть
    // Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(
    //     "ПВХ_Плавка",
    //     мт_ОпределенныеЭлементыСправочников.Характеристика_НомерПлавки
    // );
КонецПроцедуры

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

Решение 3: "Костыль" с пользовательскими настройками

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

Принцип работы

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

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

Общие принципы и рекомендации при работе с параметрами выбора в СКД

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

  1. Понимание "Связей параметров выбора":

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

  2. Отличия программной установки в модуле объекта и модуле формы:

    Мы выяснили, что попытка установки ПараметровВыбора в модуле объекта отчета (например, при попытке доступа к Поле_НомерСертификатаПроизводителя.ПараметрыРедактирования) не даст желаемого результата, потому что эти параметры устанавливаются для метаданных СКД, а не для конкретных элементов формы, которые появляются только при открытии отчета. Правильный подход – воздействовать на элементы формы после их создания, как в Решении 1.

  3. Использование расширения языка запросов СКД:

    Для создания необязательных параметров и гибкого управления условиями отбора в запросе СКД всегда рекомендуется использовать синтаксические элементы расширения языка запросов, такие как {ГДЕ ...}. Это позволяет избежать ошибок "Не задан параметр отчета", если пользователь отключает параметры или отбор. Например:

    
    ВЫБРАТЬ
        ...
    ИЗ
        Справочник.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    ГДЕ
        {(&ПараметрВладелец ЕСТЬ NULL ИЛИ ЗначенияСвойствОбъектов.Владелец = &ПараметрВладелец)}
    

    Где &ПараметрВладелец – это параметр СКД, который вы можете установить программно или через пользовательские настройки.

  4. Передача параметров при открытии отчета:

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

    
    СтруктураПараметров = Новый Структура("КлючПараметра", ЗначениеДляПараметра);
    ОткрытьФорму("Отчет.ИмяВашегоОтчета.ФормаОтчета", СтруктураПараметров);
    

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

  5. Фиксированный отбор в запросе:

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

  6. Работа с отбором по владельцу в СКД при наборе данных из внешнего источника:

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

Заключение

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

← На главную