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

Введение

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

Немного о СКД

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

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

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

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

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

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

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

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

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

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

СхемаКомпановки = Новый СхемаКомпоновкиДанных;

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

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

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

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

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

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

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

КонецЦикла;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Будь вкурсе!

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

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