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

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

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

Разбор типичной ошибки

Основная проблема при работе с КомпоновщикНастроек в контексте управляемой формы заключается в том, что попытка использовать объект Компоновщик, полученный напрямую через РеквизитФормыВЗначение("Объект"), часто приводит к потере связи с метаданными схемы. В результате МакетКомпоновки оказывается пустым или некорректным, а ПроцессорВывода не заполняет таблицу значений данными.

Пошаговое решение задачи

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

  1. Инициализация компоновщика: Создадим новый объект КомпоновщикНастроекКомпоновкиДанных и привяжем его к источнику настроек из схемы.
  2. Загрузка настроек: Установим настройки по умолчанию, чтобы обеспечить корректную структуру вывода.
  3. Установка параметров и отборов: Перенесем необходимые значения из реквизитов обработки в параметры СКД.
  4. Формирование макета: Используем КомпоновщикМакетаКомпоновкиДанных с указанием генератора для коллекции значений.
  5. Вывод в результат: Используем ПроцессорКомпоновкиДанных и ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений.

Пример программного кода

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


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

Важные замечания

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

← На главную