Как вывести настройки и отборы СКД на форму обработки при использовании внешнего набора данных

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

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

Подготовительный этап: создание реквизитов формы

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

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

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

Программная инициализация компоновщика на сервере

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

Разберем пример кода в обработчике ПриСозданииНаСервере:


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

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

Формирование отчета с учетом настроек формы

Теперь рассмотрим, как использовать настроенный пользователем компоновщик при генерации результата. Основная ошибка начинающих разработчиков — создание нового компоновщика в процедуре формирования. Вместо этого мы должны использовать наш реквизит формы КомпоновщикНастроек, в котором пользователь уже установил свои фильтры.

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


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

Почему настройки могут отображаться как "удаленные"?

Иногда в процессе работы пользователь видит в таблице отборов надписи вида <Объект не найден> или элементы, помеченные как удаленные. Посмотрим на причины этого явления:

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

Особенности работы с внешними наборами данных

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

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

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

← На главную