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

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

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

Проблема разрыва поколений: Обычные vs Управляемые формы

В старых версиях платформы (8.1) разработчики работали с элементом ТабличноеПоле, который напрямую связывался с данными. В управляемом приложении (8.2 и 8.3) подход изменился: теперь мы работаем с данными (реквизитами формы), которые платформа визуализирует в элементы формы. Если вы просто перетащите отбор в дерево элементов, вы можете получить текстовую строку вместо таблицы. Давайте выясним причину и исправим это.

Шаг 1: Правильный вывод таблицы отборов

Проанализируем самый быстрый и надежный способ добавления отборов на форму. Вместо того чтобы вручную создавать элементы, воспользуемся механизмом платформы:

  1. Откроем редактор управляемой формы нашего отчета.
  2. В правой части (дерево реквизитов) развернем основной реквизит Отчет (тип ОтчетОбъект).
  3. Найдем путь: Отчет.КомпоновщикНастроек.Настройки.Отбор.
  4. Зажмем левую кнопку мыши и перетащим Отбор в левую часть — в дерево элементов формы.
  5. Важный момент: Платформа предложит выбор типа создаваемого элемента. Выбираем «Таблица».

Если вы случайно выбрали «Поле», то увидите просто список установленных отборов через запятую. Если же выбрана «Таблица», 1С автоматически сформирует полноценный интерфейс с колонками «Левое значение», «Вид сравнения» и «Правое значение».

Шаг 2: Настройка основного реквизита формы

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

В свойствах формы найдем поле Основной реквизит. Там должен быть указан реквизит с типом ОтчетОбъект (обычно он называется Отчет или Объект). Если форма создается автоматически, это происходит без участия программиста. Если вы создаете форму «с нуля» вручную, обязательно установите этот флаг. Это активирует Расширение формы отчета, которое добавляет форме специфические свойства: РезультатОтчета и ПользовательскиеНастройки.

Шаг 3: Вывод результата в табличный документ

Теперь разберем, как организовать вывод данных в «выходную таблицу». В управляемых формах для этого используется объект типа ТабличныйДокумент.

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

После этой манипуляции стандартная кнопка «Сформировать» (если она добавлена на форму) будет автоматически выводить данные именно в это поле без написания единой строки кода.

Шаг 4: Программное управление компоновкой (если нужно больше контроля)

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


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

В данном примере мы использовали объекты ПроцессорКомпоновкиДанных и ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент. Это классическая схема работы СКД «под капотом».

Различие между Настройками и Пользовательскими настройками

Проанализируем важный архитектурный нюанс 1С 8.3. В СКД есть два вида настроек:

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

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

Итоги

Выясним причину, по которой у автора вопроса не получалось связать данные: скорее всего, отсутствовала привязка к Основному реквизиту формы и не было использовано расширение формы отчета. Помните, что в 1С 8.3 большинство визуальных связей настраивается через свойства формы, а не только через код. Используйте перетаскивание реквизитов для автоматического создания нужных типов элементов и всегда проверяйте, какой именно объект вы выводите — Настройки или ПользовательскиеНастройки.

← На главную