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