1с скд таблица значений как параметр
Добрый день.
Нужно передать таблицу значений в СКД как параметр, чтобы потом ее содержимое поместить во временную таблицу и далее сделать пакетный запрос с внутренним соединением с этой временной таблицей.
Обычный способ передачи таблицы значений в набор данных для СКД не подходит, т к мне нужно делать внутренне соединение с этим набором, а СКД делает только левое.
Возьми левое, выкинь все что получилось Null при соединении, не вариант?
Долго работать будет, выполняя соединение. Очень много строк в том что справа.
Я в подобных случаях делаю набор данных сам, вообще не в СКД, а потом уже готовый для вывода туда запихиваю.
а почему просто тупо не присвоить ТЗ параметру СКД?
Дело в том, что если в запросе есть 1 такой запрос из пакета
то при сохранении отчета и при открытии одинаково рунается так
Ошибка получения информации набора данных
по причине:
Ошибка в запросе набора данных
по причине:
<(16, 2)>: Неверные параметры «ТаблЗн»
>&ТаблЗн КАК ВремТабл
(5) Формируй сразу источник данных и отдавай его СКД
(6) Что именно Вы имеете ввиду?
В смысле выполнить весь пакетный запрос обычным объектом запрос, и результитрующую таблицу значений выдать в СКД как набор данных?
Но тогда у меня не будет возможности отбирать данные на этапе запроса с целью повыения быстродействия, фильтр уже будет только на конечный результат ложиться.
(0) На сколько я понял СКД — никак. Можно ТЗ передать в СКД только как независимый источник данных, но использовать его тут же в запросе этого же СКД нельзя.
(8) для фильтрации можно использовать колонку этой таблицы. Колонка — это массив. А массив можно передать как параметр.
(2) а так он что без соединения работает или внутреннее соединение быстрее левого? При выводе Отбор и все.
1с скд таблица значений как параметр

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

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

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

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

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

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

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

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