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