При разработке отчетов на базе Системы компоновки данных (СКД) часто возникает задача ограничить выбор пользователя в параметрах. Например, когда необходимо, чтобы в параметре типа «Список значений» можно было выбрать только два конкретных вида документов, а не весь справочник целиком. Это повышает удобство интерфейса и исключает ошибки ввода данных.
В этой статье мы подробно разберем несколько способов решения этой задачи: от настройки схемы компоновки в конфигураторе до программного управления параметрами в модуле отчета. Рассмотрим плюсы и минусы каждого подхода, проанализируем примеры кода и выясним причины возможных ошибок при работе с коллекциями значений в СКД.
Рассмотрим самый простой вариант, который не требует написания сложного программного кода и изменения конфигурации (добавления предопределенных элементов). Этот метод идеально подходит, если вам нужно быстро ограничить выбор пользователя фиксированным набором значений.
Разберем этот метод по шагам:
ГДЕ
ВнутренниеДокументы.ВидДокумента.Наименование В (&ВидыДокументов)
ВидыДокументов установим тип Строка.Преимущества: Простота реализации и наглядность для пользователя. В форме отчета в выпадающем списке будут видны только те строки, которые мы указали.
Недостатки: Если в справочнике изменится наименование элемента, отчет перестанет выводить данные, так как жесткая привязка к строке — это всегда риск. Рассмотрим более надежные методы.
Если нам необходимо работать со ссылками (что более правильно с точки зрения архитектуры 1С) и мы хотим динамически заполнять список параметров, воспользуемся модулем объекта отчета. Проанализируем ситуацию: нам нужно перехватить процесс формирования отчета и передать в компоновщик настроек готовый объект СписокЗначений.
Посмотрим на пример кода, который реализует эту логику в процедуре ПриКомпоновкеРезультата:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Создаем список значений с нужными ссылками
СписокВидов = Новый СписокЗначений;
Элемент1 = Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Приказ по основной деятельности");
Элемент2 = Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Распоряжение по основной деятельности");
Если ЗначениеЗаполнено(Элемент1) Тогда
СписокВидов.Добавить(Элемент1);
КонецЕсли;
Если ЗначениеЗаполнено(Элемент2) Тогда
СписокВидов.Добавить(Элемент2);
КонецЕсли;
// Устанавливаем значение параметра в компоновщике настроек
// Важно: используем метод УстановитьЗначениеПараметра для коллекции ПараметрыДанных
КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ВидДокумента", СписокВидов);
КонецПроцедуры
Обратите внимание на важный нюанс: при программной установке параметра-списка в запросе СКД обязательно должно использоваться условие В (&ВидДокумента), а не = &ВидДокумента. В противном случае система выдаст ошибку несоответствия типов, так как нельзя сравнивать одиночную ссылку с целым списком.
Выясним, как можно задать список значений по умолчанию прямо в конфигураторе, не используя программный код и не прибегая к строкам. В СКД есть мощный механизм — поле Выражение на закладке параметров. Мы можем использовать конструкцию ЗНАЧЕНИЕ() для обращения к предопределенным данным или системным перечислениям.
Однако для обычных элементов справочника (не предопределенных) напрямую ЗНАЧЕНИЕ() использовать не получится. Но если элементы предопределенные, выражение может выглядеть так:
ПолучитьСписок(ЗНАЧЕНИЕ(Справочник.ВидыДокументов.Приказ), ЗНАЧЕНИЕ(Справочник.ВидыДокументов.Распоряжение))
Поскольку функции ПолучитьСписок в стандартной поставке нет, программисты часто используют вызов функции общего модуля. Например:
ОбщийМодульСервер.СформироватьСписокВидов()
В этом случае функция в общем модуле должна возвращать объект СписокЗначений. Это позволяет вынести логику определения «правильных» элементов в отдельное место и использовать её в нескольких отчетах одновременно.
Бывают ситуации, когда стандартных механизмов установки параметров недостаточно, и нам требуется полный контроль над процессом компоновки макета. Рассмотрим более сложный, но максимально гибкий пример кода. Здесь мы отключаем стандартный вывод и управляем каждым шагом вручную.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Отключаем встроенный механизм
// Формируем список значений
СписокДляПараметра = Новый СписокЗначений;
// ... здесь логика заполнения списка ...
// Устанавливаем параметр в настройках компоновщика
ИмяПараметра = "ВидДокумента";
ЗначениеПараметра = КомпоновщикНастроек.Настройки.ParaметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(ИмяПараметра));
Если ЗначениеПараметра <> Неопределено Тогда
ЗначениеПараметра.Значение = СписокДляПараметра;
ЗначениеПараметра.Использование = Истина;
КонецЕсли;
// Инициализируем макет и процессор компоновки
КомпоновщикМакет = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакет.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(Макет, , ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Разберем, почему этот код надежнее. Когда мы используем СтандартнаяОбработка = Ложь, мы гарантируем, что наши программно установленные настройки (включая сложные списки значений) будут корректно переданы в ПроцессорКомпоновкиДанных. Иногда при стандартном выводе настройки могут перетираться настройками пользователя или значениями по умолчанию, если не соблюдена последовательность вызовов.
Проанализировав все подходы, можно дать следующие советы:
НачалоВыбора на форме отчета для установки ФиксированныхНастроек формы выбора.Важный совет: При работе с параметрами-списками всегда проверяйте тип данных в колонке Тип на закладке Параметры в СКД. Если там указан конкретный справочник, то и в список значений нужно добавлять только ссылки на этот справочник. Смешивание типов (например, добавление строки в список ссылок) приведет к тому, что запрос не вернет результат или завершится с ошибкой Несоответствие типов.
Рассмотренные методы позволяют гибко управлять поведением отчетов и делать их интерфейс более профессиональным. Выбирайте тот вариант, который максимально соответствует требованиям стабильности и архитектурным стандартам вашей информационной базы.