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

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

  • автор:

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

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

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

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

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

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

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

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

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

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

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

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

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

(12) Очень долго работает.
Спасибо за ответы.

Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший

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

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

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

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

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

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

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

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

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

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

СКД внешний источник данных 1С

Часто данные проще обработать программно и поместить в таблицу значений и в нужном виде передать в систему компоновки данных для формирования отчета.

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

Создадим новый отчет в конфигураторе и создадим основную схему компоновки данных.

В схеме компоновки данных добавим набор данных – объект, как на рисунке ниже.

Назовем сам набор данных ВидыИнструмента, в табличной части Поля, создадим поля с названиями, как в таблице значений, которая будет использоваться в качестве источника данных.

Далее в модуле отчета сформируем процедуру ПриКомпоновкеРезультата, как на рисунке ниже.

Заготовка для процедуры создалась автоматически.

Сформируем простейшую таблицу значений и заполним ее данными.

ТаблицаИсточник = Новый ТаблицаЗначений; ТаблицаИсточник.Колонки.Добавить("Код"); ТаблицаИсточник.Колонки.Добавить("Наименование"); НоваяСтрока = ТаблицаИсточник.Добавить(); НоваяСтрока.Код = 1; НоваяСтрока.Наименование = Электродрели; НоваяСтрока = ТаблицаИсточник.Добавить(); НоваяСтрока.Код = 2; НоваяСтрока.Наименование = Генераторы; НоваяСтрока = ТаблицаИсточник.Добавить(); НоваяСтрока.Код = 3; НоваяСтрока.Наименование = Шуруповерты;

Так выглядит весь листинг процедуры ПриКомпоновкеРезультата.

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; ТаблицаИсточник = Новый ТаблицаЗначений; ТаблицаИсточник.Колонки.Добавить("Код"); ТаблицаИсточник.Колонки.Добавить("Наименование"); НоваяСтрока = ТаблицаИсточник.Добавить(); НоваяСтрока.Код = 1; НоваяСтрока.Наименование = "Электродрели"; НоваяСтрока = ТаблицаИсточник.Добавить(); НоваяСтрока.Код = 2; НоваяСтрока.Наименование = "Генераторы"; НоваяСтрока = ТаблицаИсточник.Добавить(); НоваяСтрока.Код = 3; НоваяСтрока.Наименование = "Шуруповерты"; ВнешнийНаборДанных = Новый Структура("ТаблицаВидыИнструмента", ТаблицаИсточник); //НастройкиКомпоновки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию; НастройкиКомпоновки = КомпоновщикНастроек.ПолучитьНастройки(); КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновки); ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешнийНаборДанных); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ДокументРезультат); ПроцессорВывода.Вывести(ПроцессорКомпоновки); КонецПроцедуры

Важно при создании структуры указать ключ, соответствующий названию указанному при создании набора данных.

ВнешнийНаборДанных = Новый Структура("ТаблицаВидыИнструмента", ТаблицаИсточник);

Настройки отчета сделаем, как на картинке. Добавим детальные записи и выберем созданные нами поля.

Сохраним и попробуем сформировать созданный отчет.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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