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