1с скд таблица значений как параметр
Перейти к содержимому

1с скд таблица значений как параметр

  • автор:

1с скд таблица значений как параметр

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

Возьми левое, выкинь все что получилось Null при соединении, не вариант?
Долго работать будет, выполняя соединение. Очень много строк в том что справа.

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

а почему просто тупо не присвоить ТЗ параметру СКД?

Дело в том, что если в запросе есть 1 такой запрос из пакета

то при сохранении отчета и при открытии одинаково рунается так

Ошибка получения информации набора данных
по причине:
Ошибка в запросе набора данных
по причине:
<(16, 2)>: Неверные параметры «ТаблЗн»
>&ТаблЗн КАК ВремТабл

(5) Формируй сразу источник данных и отдавай его СКД
(6) Что именно Вы имеете ввиду?

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

(0) На сколько я понял СКД — никак. Можно ТЗ передать в СКД только как независимый источник данных, но использовать его тут же в запросе этого же СКД нельзя.

(8) для фильтрации можно использовать колонку этой таблицы. Колонка — это массив. А массив можно передать как параметр.

(2) а так он что без соединения работает или внутреннее соединение быстрее левого? При выводе Отбор и все.

1с скд таблица значений как параметр

Создание нового внешнего отчета

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

Создание предопределенной процедуры

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

Для примера добавим три строки данных. Далее по шагам создаем вывод отчета.

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

Добавляем макет схемы компоновки. Название можем оставить по умолчанию.

Добавление нового макета СКД

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

Создание набора данных и полей отчета СКД

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

Добавление ресурсов набора данных СКД

В закладке Настройки с помощью конструктора настроек формируем вариант отчета по умолчанию

Настройка варианта отчета СКД

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

Пример отчета СКД с данными из таблицы значений

Вот и все. Достаточно просто, не правда ли?

Получившийся отчет для примера можно скачать тут

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

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

Немного о СКД

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

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

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

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

ФормаОтбора.png

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

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

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

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

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

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

СхемаКомпановки = Новый СхемаКомпоновкиДанных; ИсточникДанных = СхемаКомпановки.ИсточникиДанных.Добавить(); ИсточникДанных.Имя = "ИсточникДанных1"; ИсточникДанных.ТипИсточникаДанных = "Local"; НаборДанных = СхемаКомпановки.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных")); НаборДанных.ИсточникДанных = "ИсточникДанных1"; НаборДанных.Имя = "НаборДанных1"; НаборДанных.ИмяОбъекта = "ТаблицаЭлементов";

Возможно использовать в качестве источника разные объекты. Часто источником выступает «Запрос», но в этом случае схема обработки данных менее наглядна.

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

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

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

В запросе код «ОбработкаОбъект().СтрокаДляЗапросаТипа(ВидМетаданных, ВыборМетаданные)» отвечает за получение имени объекта метаданных для использования в запросе.

Далее для работы отбора необходимо добавить поля схемы компоновки данных. Если поле, что указано в отборе не будет добавлено, то это приведет к ошибке. Перебор полей настроек отбора выполняется, как у любой коллекции в 1С:

Для Каждого ПолеОтбора Из Параметр.Отбор.Элементы Цикл ПолеНабораДанныхСхемыКомпоновкиДанных = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); ПолеНабораДанныхСхемыКомпоновкиДанных.Поле = Строка(ПолеОтбора.ЛевоеЗначение); ПолеНабораДанныхСхемыКомпоновкиДанных.ПутьКДанным = Строка(ПолеОтбора.ЛевоеЗначение); ПолеНабораДанныхСхемыКомпоновкиДанных.Заголовок = Строка(ПолеОтбора.ЛевоеЗначение); КонецЦикла;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Синельников Михаил

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

Использование внешних таблиц значений в отчете 1С на СКД на реальном примере.

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

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

МВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос. МенеджерВременныхТаблиц = МВТ;
Запрос.Текст color: #3366ff;»>ВЫБРАТЬ
| ТекущиеКадровыеДанныеСотрудников.Сотрудник КАК Сотрудник,
| ТекущиеКадровыеДанныеСотрудников.ДатаПриема КАК ДатаПриема,
| ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность КАК ТекущаяДолжность
| ИЗ
| РегистрСведений.ТекущиеКадровыеДанныеСотрудников КАК ТекущиеКадровыеДанныеСотрудников»;
НашаТаблица = Запрос. Выполнить() . Выгрузить() ;

// добавили колонку под наши новые данные
НашаТаблица. Колонки . Добавить( «КадровыеДанныеСтрокой», Новый ОписаниеТипов( «Строка», , Новый КвалификаторыСтроки( 100 ))) ;

// здесь обрабатываем НашаТаблица
// .
// .

// и далее передаем в Менеджер временных таблиц через новый запрос

Запрос_2 = Новый Запрос ;
Запрос_2. МенеджерВременныхТаблиц = МВТ;
Запрос_2.Текст color: #3366ff;»>ВЫБРАТЬ * ПОМЕСТИТЬ НашаТаблица ИЗ &НашаТаблица КАК НашаТаблица»;
Запрос_2. УстановитьПараметр( «НашаТаблица», НашаТаблица ) ;
Запрос_2. Выполнить() ;
ПроцессорКомпоновкиДанных . Инициализировать( МакетКомпоновкиДанных
,ВнешниеНаборыДанных,ДанныеРасшифровки. МВТ ) ;

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

ВЫБРАТЬ
ВидыЗанятостиСотрудников.Сотрудник КАК Сотрудник,
НашаТаблица.КадровыеДанныеСтрокой,
ВидыЗанятостиСотрудников.ВидЗанятости КАК ВидЗанятости
ИЗ
РегистрСведений.ВидыЗанятостиСотрудников КАК ВидыЗанятостиСотрудников
ЛЕВОЕ СОЕДИНЕНИЕ НашаТаблица КАК НашаТаблица
ПО НашаТаблица.Сотрудник = ВидыЗанятостиСотрудников.Сотрудник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *