Как программно передать значения табличной части документа в отбор отчета 1С?

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

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

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

Извлечение значений из табличной части документа

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

Разберем пример получения массива ссылок на номенклатуру:

МассивНоменклатуры = Объект.Товары.ВыгрузитьКолонку("Номенклатура");

Метод ВыгрузитьКолонку() возвращает объект типа Массив. Этот массив можно напрямую использовать в отборах отчета со сравнением типа ВидСравнения.ВСписке.

Способ 1. Передача отбора в управляемых формах (СКД)

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

Проанализируем пример кода для клиентского обработчика кнопки на форме документа:


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

В этом примере имя ключа в структуре отбора ("Номенклатура") должно строго совпадать с именем доступного поля отбора в схеме компоновки данных отчета.

Способ 2. Программная установка отбора в обычных формах (Построитель отчета)

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

Рассмотрим, как это реализуется программно:


// Извлекаем данные из табличной части документа
МассивНоменклатуры = ЭтотОбъект.Товары.ВыгрузитьКолонку("Номенклатура");

// Создаем объект отчета и настраиваем отбор
ОтчетОбъект = Отчеты.ОтчетПродажи.Создать();

ЭлементОтбора = ОтчетОбъект.ПостроительОтчета.Отбор["Номенклатура"];
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ВидСравнения = ВидСравнения.ВСписке;
ЭлементОтбора.Значение = МассивНоменклатуры;

// Получаем и открываем форму отчета
ФормаОтчета = ОтчетОбъект.ПолучитьФорму("Форма");
ФормаОтчета.Открыть();

Важные особенности и ограничения производительности

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

  1. Обработка пустой табличной части: Если табличная часть документа пуста, метод ВыгрузитьКолонку() вернет пустой массив. Передача пустого массива в отбор со сравнением «В списке» приведет к тому, что отчет вернет пустой результат. Перед передачей отбора рекомендуется проверять массив на наличие элементов.
  2. Ограничения СУБД по длине списка: При передаче очень большого массива элементов (сотни или тысячи строк) платформой формируется тяжелый SQL-запрос с длинным условием IN (...). Это может существенно снизить производительность базы данных.
  3. Альтернативный подход (передача ссылки на документ): Если табличная часть содержит много строк, наиболее оптимальным решением с точки зрения производительности является передача в параметр отчета ссылки на сам документ (Объект.Ссылка). В этом случае соединение с табличной частью документа выполняется непосредственно в запросе СКД на стороне сервера базы данных.
← На главную