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

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

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

Пошаговая инициализация Компоновщика настроек СКД на управляемой форме

Разберем процесс связывания макета СКД с реквизитом формы. Для работы с пользовательскими настройками отбора выполним следующие шаги:

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

Проанализируем код инициализации компоновщика в событии ПриСозданииНаСервере:


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

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

Программный вывод результата СКД в Таблицу Значений

Выясним, как сформировать результат работы СКД с учетом пользовательских отборов и поместить данные в коллекцию значений. Для выгрузки данных в таблицу значений используются специализированные объекты: КомпоновщикМакетаКомпоновкиДанных, ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений, ПроцессорКомпоновкиДанных и ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений.

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


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

Частые ошибки и особенности настройки

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

  1. Таблица значений получается пустой при выполнении:

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

  2. Не применяются отборы, установленные пользователем:

    Убедитесь, что отборы считываются через метод КомпоновщикНастроек.ПолучитьНастройки(). Именно этот метод объединяет основные настройки схемы с пользовательскими изменениями, внесенными на форме.

  3. Использование параметров в запросе:

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

Сравнение подхода СКД с Динамическим списком

Проанализируем, когда следует выгружать СКД в таблицу значений, а когда выгоднее использовать ДинамическийСписок:

Динамический список оптимален для отображения больших массивов данных с считыванием «по требованию» (порциями). Однако он не предназначен для прямого редактирования ячеек в таблице формы и последующей массовой записи изменений в объекты базы данных.

СКД с выгрузкой в Таблицу Значений загружает всю выборку в память, но предоставляет полную свободу для редактирования ячеек пользователем, вычислений на клиенте и последующей программной записи изменений в справочники или документы 1С.

← На главную