Как реализовать выбор «В списке» для параметра отчета на СКД

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

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

Настройка параметров в схеме СКД

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

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

Корректировка текста запроса

Проанализируем ситуацию с текстом запроса. Если в наборе данных запрос написан жестко с использованием оператора «равно», это может привести к ошибке при передаче списка. Рассмотрим правильный вариант написания условия в секции ГДЕ:


ВЫБРАТЬ
    Продажи.Контрагент,
    Продажи.СуммаОборот
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Продажи
ГДЕ
    Продажи.Контрагент В (&Контрагент)

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

Вывод параметра на форму отчета

Если вы используете автоматически генерируемую форму, то после установки флага «Доступен список значений» параметр появится в пользовательских настройках и будет работать корректно. Однако, если форма создана вручную, нам потребуется выполнить дополнительные действия.

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Определяем массив типов, которые будут доступны в списке
    Типы = Новый Массив;
    Типы.Добавить(Тип("СправочникСсылка.Контрагенты"));
    
    // Назначаем описание типов реквизиту формы, который является списком значений
    // Предположим, реквизит называется СписокКонтрагенты
    Отчет.СписокКонтрагенты.ТипЗначения = Новый ОписаниеТипов(Типы);
    
КонецПроцедуры

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

Связь реквизита формы с компоновщиком настроек

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


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

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

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

Важные нюансы работы с пользовательскими настройками

Посмотрим на настройки самой СКД на закладке «Настройки». Чтобы параметр был доступен пользователю для редактирования в шапке отчета или в окне настроек, необходимо:

  1. Выбрать вкладку «Параметры» в нижней части окна настроек.
  2. Нажать на кнопку «Свойства элемента пользовательских настроек» (иконка с гаечным ключом).
  3. Установить флаг «Включать в пользовательские настройки».
  4. Выбрать режим редактирования (обычно «Обычный»).

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

Обработка пустых списков

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


ВЫБРАТЬ
    Продажи.Контрагент,
    Продажи.СуммаОборот
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , {Контрагент В (&Контрагент)}) КАК Продажи

В таком случае, если параметр &Контрагент не будет заполнен или флаг его использования будет снят, СКД просто проигнорирует это условие, и в отчет попадут данные по всем контрагентам. Это делает отчет более гибким и удобным для конечного пользователя.

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

← На главную