СКД и таблицы значений

Введение

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

Немного о СКД

СКД — система компоновки данных. Появился этот инструмент в 1С 8.2. Чаще всего этот инструмент используется для быстрого построения отчетов практически без применения программирования. Но есть у СКД и другое применение — обработка произвольных наборов данных заранее не известной структуры.

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

От теории к практике

Дана обработка, которая позволяет удалять любые данные. При запуске обработка анализирует объекты метаданных и создает список, в котором выбираются нужные объекты. Теперь в эту обработку необходимо добавить возможность отбора, что бы не выбирать из списка со всеми объектами по одному.

Решить эту проблему можно с использованием системы компоновки данных. Для этого создаем отдельную форму, на которой размещаем элементы настройки отбора ФормаОтбора.png На картинке видно, что на форме присутствуют следующие реквизиты: АдресСКД — строка, в которой сохраняется адрес временного хранилища настроек СКД, НастройкиОтбора — КомпоновщикНастроекКомпоновкиДанных — собственно настройки СКД , ПолноеИмяОбъекта — строка с полным именем объекта обработки (например: Справочник.Контрагенты).

Цифрой 1 обозначена таблица из НастройкиОтбора.Настройки.Отбор.ДоступныеПоляОтбора

Цифрой 2 обозначена таблица из НастройкиОтбора.Настройки.Отбор

На этом подготовительный этап собственно и заканчивается. Далее требуется при закрытии этой формы вернуть в основную форму обработки настройки схемы компоновки данных. Есть разные способы это сделать, но к теме статьи это не имеет отношения.

Перейдем теперь к самой схеме компоновки.

Для начала создадим схему и укажем источник данных. В нашем случае СКД будет брать данные из внешней таблицы.
СхемаКомпановки = Новый СхемаКомпоновкиДанных;

ИсточникДанных = СхемаКомпановки.ИсточникиДанных.Добавить();

ИсточникДанных.Имя = "ИсточникДанных1";
ИсточникДанных.ТипИсточникаДанных = "Local";

НаборДанных = СхемаКомпановки.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
НаборДанных.ИсточникДанных = "ИсточникДанных1";
НаборДанных.Имя = "НаборДанных1";
НаборДанных.ИмяОбъекта = "ТаблицаЭлементов";
Возможно использовать в качестве источника разные объекты. Часто источником выступает «Запрос», но в этом случае схема обработки данных менее наглядна.

Далее добавляем поля СКД и установить их связь с полями источника данных.

В моем случае источник данных это таблица значений, которая формируется из всех полей объекта метаданных. Выглядит этот запрос следующим образом:
Запрос = Новый Запрос;
Запрос.Текст =
	 "ВЫБРАТЬ *
	 |ИЗ
	 |" + ОбработкаОбъект().СтрокаДляЗапросаТипа(ВидМетаданных, ВыборМетаданные) + " КАК Элемент";
ТаблицаЭлементов = Запрос.Выполнить().Выгрузить();
В запросе код «ОбработкаОбъект().СтрокаДляЗапросаТипа(ВидМетаданных, ВыборМетаданные)» отвечает за получение имени объекта метаданных для использования в запросе.

Далее для работы отбора необходимо добавить поля схемы компоновки данных. Если поле, что указано в отборе не будет добавлено, то это приведет к ошибке. Перебор полей настроек отбора выполняется, как у любой коллекции в 1С:
Для Каждого ПолеОтбора Из Параметр.Отбор.Элементы Цикл
    ПолеНабораДанныхСхемыКомпоновкиДанных = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));

    ПолеНабораДанныхСхемыКомпоновкиДанных.Поле = Строка(ПолеОтбора.ЛевоеЗначение);
    ПолеНабораДанныхСхемыКомпоновкиДанных.ПутьКДанным = Строка(ПолеОтбора.ЛевоеЗначение);
    ПолеНабораДанныхСхемыКомпоновкиДанных.Заголовок = Строка(ПолеОтбора.ЛевоеЗначение);

КонецЦикла;

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

КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных();
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпановки));
КомпоновщикНастроек.ЗагрузитьНастройки(Параметр);

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

ВыбранноеПолеКомпоновкиДанных = НастройкиКомпоновки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПолеКомпоновкиДанных.Использование = Истина;
ВыбранноеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Ссылка");

ДетальныеЗаписиСтруктуры = КомпоновщикНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ДетальныеЗаписиСтруктуры.Имя = "ДетальныеЗаписи";
ДетальныеЗаписиСтруктуры.Использование = Истина;
ВыбранноеПоле = ДетальныеЗаписиСтруктуры.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));   
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Ссылка");

Первый блок кода указывает схеме компоновки данных, что для вывода будет использовано одно поле - «Ссылка», а второй блок содержит указание, что выводится детальную запись.

Теперь готовим Компоновщик макета СКД:

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпановки, НастройкиКомпоновки,,,
Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

Первый параметр выполнения указывает на саму СКД, второй — настройки отбора и полей, что сделали ранее, а последний параметр указывает, что подготовятся данные для вывода в коллекцию. В моем случае вывод будет в таблицу значений, но существуют и другие варианты. Теперь все готово и можно приступать к обработке данных и их отбору. Для этого существует «ПроцессорКомпоновкиДанных». В этот процессор передается макет компоновки и набор данных:

ВнешниеНаборы = Новый Структура("ТаблицаЭлементов", ТаблицаЭлементов);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборы);

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

процессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
процессорВывода.ОтображатьПроцентВывода = Истина;

ТЗ = Новый ТаблицаЗначений;

ТЗ.Колонки.Добавить("Ссылка");

ПроцессорВывода.УстановитьОбъект(ТЗ);

Теперь осталось только вывести данные в таблицу значений через обход коллекции:

ПроцессорВывода.НачатьВывод();

Пока Истина Цикл
      ЭлементРезультатаКомпоновкиДанных = ПроцессорКомпоновки.Следующий();
      Если ЭлементРезультатаКомпоновкиДанных = Неопределено Тогда
             Прервать;
      КонецЕсли;
      ПроцессорВывода.ВывестиЭлемент(ЭлементРезультатаКомпоновкиДанных);
КонецЦикла;

ПроцессорВывода.ЗакончитьВывод();

процессорВывода.Вывести(ПроцессорКомпоновки);

Теперь создана таблица значений, которая содержит выборку по заданным правилам.

Изображение автора статьи

Разработчик на платформе 1С

Будь вкурсе!

Сообщим о новых материалах, важных событиях и предложениях

Email заполнен не корректно
Нажимая на кнопку «Подписаться», вы даете согласие на обработку своих персональных данных.
Нажимая на кнопку «Подписаться», вы даете согласие на обработку своих персональных данных.
Подписка на email рассылку
Поделитесь статьей