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