Введение
День добрый. В сегодняшней статье хотел бы рассказать о том, как использовать инструмент СКД для выборки данных из разных источников и выводе результата в таблицу значений.
Немного о СКД
СКД — система компоновки данных. Появился этот инструмент в 1С 8.2. Чаще всего этот инструмент используется для быстрого построения отчетов практически без применения программирования. Но есть у СКД и другое применение — обработка произвольных наборов данных заранее не известной структуры.
Например найти документы по любому реквизиту в базе. Как это сделать? Для начала необходимо получить список объектов метаданных из базы, а затем построить запрос, который выберет документы с указанным отбором. Сказать проще, чем сделать. Описывать все возможные отборы вручную крайне трудно, поскольку сложно предсказать, какие реквизиты присутствуют у документа и по каким из них построить отбор. Возможно собрать текст запроса с использованием перебора реквизитов метаданных, но возникает другая проблема: построение условий по параметрам, что задает пользователь. Мы знаем, что фантазия пользователя безгранична и, порой, идет неожиданными путями. Как же быть в этом случае? Ответ прост — использовать СКД для построения настроек отбора и сборки результата в нужном виде.
От теории к практике
Дана обработка, которая позволяет удалять любые данные. При запуске обработка анализирует объекты метаданных и создает список, в котором выбираются нужные объекты. Теперь в эту обработку необходимо добавить возможность отбора, что бы не выбирать из списка со всеми объектами по одному.
Решить эту проблему можно с использованием системы компоновки данных. Для этого создаем отдельную форму, на которой размещаем элементы настройки отбора На картинке видно, что на форме присутствуют следующие реквизиты: АдресСКД — строка, в которой сохраняется адрес временного хранилища настроек СКД, НастройкиОтбора — КомпоновщикНастроекКомпоновкиДанных — собственно настройки СКД , ПолноеИмяОбъекта — строка с полным именем объекта обработки (например: Справочник.Контрагенты).
Цифрой 1 обозначена таблица из НастройкиОтбора.Настройки.Отбор.ДоступныеПоляОтбора
Цифрой 2 обозначена таблица из НастройкиОтбора.Настройки.Отбор
На этом подготовительный этап собственно и заканчивается. Далее требуется при закрытии этой формы вернуть в основную форму обработки настройки схемы компоновки данных. Есть разные способы это сделать, но к теме статьи это не имеет отношения.
Перейдем теперь к самой схеме компоновки.
Для начала создадим схему и укажем источник данных. В нашем случае СКД будет брать данные из внешней таблицы.
СхемаКомпановки = Новый СхемаКомпоновкиДанных; ИсточникДанных = СхемаКомпановки.ИсточникиДанных.Добавить(); ИсточникДанных.Имя = "ИсточникДанных1"; ИсточникДанных.ТипИсточникаДанных = "Local"; НаборДанных = СхемаКомпановки.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных")); НаборДанных.ИсточникДанных = "ИсточникДанных1"; НаборДанных.Имя = "НаборДанных1"; НаборДанных.ИмяОбъекта = "ТаблицаЭлементов";Возможно использовать в качестве источника разные объекты. Часто источником выступает «Запрос», но в этом случае схема обработки данных менее наглядна.
Далее добавляем поля СКД и установить их связь с полями источника данных.
В моем случае источник данных это таблица значений, которая формируется из всех полей объекта метаданных. Выглядит этот запрос следующим образом:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ * |ИЗ |" + ОбработкаОбъект().СтрокаДляЗапросаТипа(ВидМетаданных, ВыборМетаданные) + " КАК Элемент"; ТаблицаЭлементов = Запрос.Выполнить().Выгрузить();В запросе код «ОбработкаОбъект().СтрокаДляЗапросаТипа(ВидМетаданных, ВыборМетаданные)» отвечает за получение имени объекта метаданных для использования в запросе.
Далее для работы отбора необходимо добавить поля схемы компоновки данных. Если поле, что указано в отборе не будет добавлено, то это приведет к ошибке. Перебор полей настроек отбора выполняется, как у любой коллекции в 1С:
Для Каждого ПолеОтбора Из Параметр.Отбор.Элементы Цикл ПолеНабораДанныхСхемыКомпоновкиДанных = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); ПолеНабораДанныхСхемыКомпоновкиДанных.Поле = Строка(ПолеОтбора.ЛевоеЗначение); ПолеНабораДанныхСхемыКомпоновкиДанных.ПутьКДанным = Строка(ПолеОтбора.ЛевоеЗначение); ПолеНабораДанныхСхемыКомпоновкиДанных.Заголовок = Строка(ПолеОтбора.ЛевоеЗначение); КонецЦикла;
Следующим шагом будет создание компоновщика настроек для нашей СКД:
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных(); КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпановки)); КомпоновщикНастроек.ЗагрузитьНастройки(Параметр);
Последняя строка отвечает за загрузку настроек, которые были сделаны в форме отбора и переданы в родительскую форму. Дальше производим донастройку СКД:
ВыбранноеПолеКомпоновкиДанных = НастройкиКомпоновки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); ВыбранноеПолеКомпоновкиДанных.Использование = Истина; ВыбранноеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Ссылка"); ДетальныеЗаписиСтруктуры = КомпоновщикНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); ДетальныеЗаписиСтруктуры.Имя = "ДетальныеЗаписи"; ДетальныеЗаписиСтруктуры.Использование = Истина; ВыбранноеПоле = ДетальныеЗаписиСтруктуры.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Ссылка");
Первый блок кода указывает схеме компоновки данных, что для вывода будет использовано одно поле - «Ссылка», а второй блок содержит указание, что выводится детальную запись.
Теперь готовим Компоновщик макета СКД:
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпановки, НастройкиКомпоновки,,,
Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
Первый параметр выполнения указывает на саму СКД, второй — настройки отбора и полей, что сделали ранее, а последний параметр указывает, что подготовятся данные для вывода в коллекцию. В моем случае вывод будет в таблицу значений, но существуют и другие варианты. Теперь все готово и можно приступать к обработке данных и их отбору. Для этого существует «ПроцессорКомпоновкиДанных». В этот процессор передается макет компоновки и набор данных:
ВнешниеНаборы = Новый Структура("ТаблицаЭлементов", ТаблицаЭлементов); ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборы);
На этом шаге уже имеется готовый набор данных, обработанный нашей схемой компановки и осталось только вывести их в таблицу значений, но тут есть своё нюанс: таблица значений, в которую мы будем выводить данные, должна быть создана и иметь колонки с названиями нужных названием полей, как в СКД. Все остальные колонки будут проигнорированы.
процессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; процессорВывода.ОтображатьПроцентВывода = Истина; ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить("Ссылка"); ПроцессорВывода.УстановитьОбъект(ТЗ);
Теперь осталось только вывести данные в таблицу значений через обход коллекции:
ПроцессорВывода.НачатьВывод(); Пока Истина Цикл ЭлементРезультатаКомпоновкиДанных = ПроцессорКомпоновки.Следующий(); Если ЭлементРезультатаКомпоновкиДанных = Неопределено Тогда Прервать; КонецЕсли; ПроцессорВывода.ВывестиЭлемент(ЭлементРезультатаКомпоновкиДанных); КонецЦикла; ПроцессорВывода.ЗакончитьВывод(); процессорВывода.Вывести(ПроцессорКомпоновки);
Теперь создана таблица значений, которая содержит выборку по заданным правилам.