Как в СКД ограничить выбор в параметре-списке конкретными элементами справочника

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

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

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

Способ 1. Использование «Доступных значений» и строкового типа

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

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

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

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

Недостатки: Если в справочнике изменится наименование элемента, отчет перестанет выводить данные, так как жесткая привязка к строке — это всегда риск. Рассмотрим более надежные методы.

Способ 2. Программная установка значений в событии ПриКомпоновкеРезультата

Если нам необходимо работать со ссылками (что более правильно с точки зрения архитектуры 1С) и мы хотим динамически заполнять список параметров, воспользуемся модулем объекта отчета. Проанализируем ситуацию: нам нужно перехватить процесс формирования отчета и передать в компоновщик настроек готовый объект СписокЗначений.

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


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

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

Обратите внимание на важный нюанс: при программной установке параметра-списка в запросе СКД обязательно должно использоваться условие В (&ВидДокумента), а не = &ВидДокумента. В противном случае система выдаст ошибку несоответствия типов, так как нельзя сравнивать одиночную ссылку с целым списком.

Способ 3. Использование конструкции ЗНАЧЕНИЕ() в выражении параметра

Выясним, как можно задать список значений по умолчанию прямо в конфигураторе, не используя программный код и не прибегая к строкам. В СКД есть мощный механизм — поле Выражение на закладке параметров. Мы можем использовать конструкцию ЗНАЧЕНИЕ() для обращения к предопределенным данным или системным перечислениям.

Однако для обычных элементов справочника (не предопределенных) напрямую ЗНАЧЕНИЕ() использовать не получится. Но если элементы предопределенные, выражение может выглядеть так:

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

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

ОбщийМодульСервер.СформироватьСписокВидов()

В этом случае функция в общем модуле должна возвращать объект СписокЗначений. Это позволяет вынести логику определения «правильных» элементов в отдельное место и использовать её в нескольких отчетах одновременно.

Способ 4. Полная кастомизация вывода (СтандартнаяОбработка = Ложь)

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


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

    // Инициализируем макет и процессор компоновки
    КомпоновщикМакет = Новый КомпоновщикМакетаКомпоновкиДанных;
    Макет = КомпоновщикМакет.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(Макет, , ДанныеРасшифровки);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);

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

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

Рекомендации по выбору метода

Проанализировав все подходы, можно дать следующие советы:

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

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

← На главную