Как вызвать форму выбора с установленным отбором из отчета и передать результат в параметры СКД?

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

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

Постановка задачи и анализ ситуации

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

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

Способ 1. Автоматизация через свойства параметров СКД (без кода)

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

Разберем по шагам, как это настроить:

  1. Откроем схему компоновки данных нашего отчета.
  2. Перейдем на закладку Параметры.
  3. Найдем параметр Номенклатура.
  4. В колонке Параметры выбора нажмем на кнопку выбора (три точки).
  5. В появившемся окне добавим новый элемент отбора. Например, поле Отбор.ЭтоГруппа со значением Ложь или Отбор.ВидНоменклатуры с конкретным значением.

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

Способ 2. Программный вызов формы выбора с фильтром

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

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

Рассмотрим пример кода, который можно разместить в обработчике нажатия на кнопку или в событии НачалоВыбора:


&НаКлиенте
Процедура НоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь; // Отменяем стандартное открытие
    
    // Формируем структуру отбора
    СтруктураОтбора = Новый Структура;
    СтруктураОтбора.Вставить("Услуга", Ложь);
    СтруктураОтбора.Вставить("ПометкаУдаления", Ложь);
    
    // Помещаем отбор в параметры открытия формы
    ПараметрыВыбора = Новый Структура;
    ПараметрыВыбора.Вставить("Отбор", СтруктураОтбора;
    ПараметрыВыбора.Вставить("МножественныйВыбор", Истина); // Если нужно выбрать список
    
    // Открываем форму выбора номенклатуры
    ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВыбораНоменклатуры", ЭтотОбъект);
    ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыВыбора, Элемент, , , , ОписаниеОповещения, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
    
КонецПроцедуры

В данном примере мы используем ОписаниеОповещения для обработки результата выбора. Это современный стандарт для асинхронной работы в управляемом приложении.

Способ 3. Использование фиксированных настроек

Иногда требуется не просто установить начальный фильтр, но и запретить пользователю его менять или отключать внутри формы выбора. Для этого выясним, как работают ФиксированныеНастройки.

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

Обработка возврата данных и установка параметров СКД

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

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

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


&НаКлиенте
Процедура ПослеВыбораНоменклатуры(ВыбранноеЗначение, ДополнительныеПараметры) Экспорт
    
    Если ВыбранноеЗначение = Неопределено Тогда
        Возврат;
    КонецЕсли;

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

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

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

Особенности реализации подбора (Multi-selection)

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

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

Резюме

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

  1. Для простых статических фильтров используйте Параметры выбора в конструкторе СКД.
  2. Для динамических фильтров открывайте форму программно через ОткрытьФорму, передавая структуру Отбор.
  3. При возврате данных не забывайте обновлять ПользовательскиеНастройки компоновщика, чтобы изменения корректно отобразились в интерфейсе.
  4. Используйте ИдентификаторПользовательскойНастройки для связи между основной схемой и тем, что видит пользователь на экране.

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

← На главную