|
СКД : Скопировать отборы и параметры из одной схемы в другую | ☑ | ||
---|---|---|---|---|
0
bvb
23.08.23
✎
15:16
|
Суть решаемой задачи :
Есть отчет на СКД. Пользователь может задавать отборы самостоятельно и стандартно выводить результат в табличный документ Но мне нужно с теми же отборами выгрузить этот же результат и в ТЗ Воспользоваться тем же макетом и настройками я не могу ибо : "Не поддерживается вывод таблиц, диаграмм и вложенных отчетов в универсальную коллекцию значений" Нужно создать аналогичны макет но без таблиц и настройки для него : ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных_дляКП); КомпоновщикНастроек.Инициализировать(ИсточникДоступныхНастроек); КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных_дляКП.НастройкиПоУмолчанию); Вопрос : Как мне скопировать отборы и параметры в новые настройки ? ЗЫ : Получить текст запроса из макета не предлагать КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки); ТекстЗапроса = МакетКомпоновки.НаборыДанных[0].Запрос; |
|||
1
Мультук
гуру
23.08.23
✎
15:37
|
(0)
1) Создай вариант отчёта "Выгрузка в плоскую таблицу" 2) Настройки отбора можно скопировать, например вот так. Параметры -- напиши аналогичную процедуру Например: СкопироватьНастройкиОтбора(НастройкиКомпоновщика.Отбор.Элементы, Отбор.Элементы); Процедура СкопироватьНастройкиОтбора(ОтборИсточник, ОтборПриемник) Для каждого ЭлементОтбора Из ОтборИсточник Цикл Если тип("ГруппаЭлементовОтбораКомпоновкиДанных") = типЗнч(ЭлементОтбора) Тогда НовыйЭлемент = ОтборПриемник.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных")); ЗаполнитьЗначенияСвойств(НовыйЭлемент, ЭлементОтбора); СкопироватьНастройкиОтбора(ЭлементОтбора.Элементы, НовыйЭлемент.Элементы); Иначе НовыйЭлемент = ОтборПриемник.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЗаполнитьЗначенияСвойств(НовыйЭлемент, ЭлементОтбора, "ИдентификаторПользовательскойНастройки, ЛевоеЗначение, ВидСравнения, ПравоеЗначение, Использование"); КонецЕсли КонецЦикла; КонецПроцедуры |
|||
2
Галахад
гуру
23.08.23
✎
15:42
|
||||
3
Garykom
гуру
23.08.23
✎
16:16
|
(0) тебе кто мешает вручную ТабДок перебрать и перенести в ТЗ?
|
|||
4
rozer76
24.08.23
✎
11:04
|
я так делаю
Процедура НастройкаКомпоновщикаНастроекДляСхемыИнтеграции(КомпоновщикНастроек, Макет, ПолеКомпоновки, Параметры, ДобавитьОтбор = Ложь) Если НЕ ДобавитьОтбор Тогда //получим компановщик настроек по нужной схеме выгрузки Схема = ПланыОбмена.вртЛичныйКабинет.ПолучитьМакет(Макет); КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема)); КомпоновщикНастроек.ЗагрузитьНастройки(Схема.НастройкиПоУмолчанию); КонецЕсли; //добавим основные отборы в компоновщик ОтборОсновной = Параметры.КомпоновщикНастроекОтбора.Настройки.Отбор; ОтборТекущий = КомпоновщикНастроек.Настройки.Отбор; Для каждого ЭлементОсновногоОтбора Из ОтборОсновной.Элементы Цикл Если ЭлементОсновногоОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПолеКомпоновки) И ЭлементОсновногоОтбора.Использование Тогда ОсновнойОтбор = Неопределено; Для каждого ЭлементТекущегоОтбора Из ОтборТекущий.Элементы Цикл Если ЭлементТекущегоОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПолеКомпоновки) Тогда ОсновнойОтбор = ЭлементТекущегоОтбора; КонецЕсли; КонецЦикла; Если ОсновнойОтбор <> Неопределено Тогда ОсновнойОтбор.ВидСравнения = ЭлементОсновногоОтбора.ВидСравнения; ОсновнойОтбор.ПравоеЗначение = ЭлементОсновногоОтбора.ПравоеЗначение; ОсновнойОтбор.Использование = Истина; Иначе НовыйЭлемент = ОтборТекущий.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); НовыйЭлемент.ИдентификаторПользовательскойНастройки = "ПрограммныйОтбор_" + ПолеКомпоновки; НовыйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПолеКомпоновки); НовыйЭлемент.ВидСравнения = ЭлементОсновногоОтбора.ВидСравнения; НовыйЭлемент.ПравоеЗначение = ЭлементОсновногоОтбора.ПравоеЗначение; НовыйЭлемент.Использование = Истина; КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры и вызов, например: КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; НастройкаКомпоновщикаНастроекДляСхемыИнтеграции(КомпоновщикНастроек, "СхемаВыгрузкиСклады", "Склад", Параметры); |
|||
5
bvb
24.08.23
✎
12:02
|
Блин я замучался...
Сделал отдельный КомпоновщикНастроек , чтобы манипуляции с ТЗ не влияли на настройки / перестроения основного варианта выводящегося в форму Отборы заполняются из основного вариант - ОК А вот с ПараметрыДанных проблема - в настройках варианта они не заполнены (почему не понятно...) а при попытке заполнить возникает ошибка : Коллекция значений параметров не может изменять свой состав, так как она связана с доступными параметрами |
|||
6
bvb
24.08.23
✎
12:03
|
Вот :
ДанныеРасшифровкиДляВарианта = Новый ДанныеРасшифровкиКомпоновкиДанных; КомпоновщикМакетаДляВарианта = Новый КомпоновщикМакетаКомпоновкиДанных; НастройкиОсновногоВарианта = КомпоновщикНастроек.Настройки; //Создаем отдельный компоновщик , чтобы не "забивать" настройки компоновщика основной схемы в форме //Вдруг пользователь поменяет настройки и захочет перестроить отчет КомпоновщикНастроекДляВарианта = Новый КомпоновщикНастроекКомпоновкиДанных; КомпоновщикНастроекДляВарианта.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных)); КомпоновщикНастроекДляВарианта.ЗагрузитьНастройки(СхемаКомпоновкиДанных.ВариантыНастроек.Найти("БезТаблиц").Настройки); НастройкиДляВарианта = КомпоновщикНастроекДляВарианта.Настройки; НастройкиДляВарианта.Отбор.Элементы.Очистить(); //Нужно очистить так как там отбор из варианта. можно очистить сразу в варианте СкопироватьНастройкиОтбора(НастройкиОсновногоВарианта.Отбор.Элементы, НастройкиДляВарианта.Отбор.Элементы); //НастройкиВарианта.ПараметрыДанных.Элементы.Очистить(); //Вот здесь возникает ошибка : Коллекция значений параметров не может изменять свой состав, так как она связана с доступными параметрами СкопироватьПараметрыДанных(НастройкиОсновногоВарианта.ПараметрыДанных.Элементы, НастройкиДляВарианта.ПараметрыДанных.Элементы); МакетКомпоновки = КомпоновщикМакетаДляВарианта.Выполнить(СхемаКомпоновкиДанных, НастройкиДляВарианта, , ,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,, ДанныеРасшифровкиДляВарианта, ИСТИНА); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; ТЗ = Новый ТаблицаЗначений; ПроцессорВывода.УстановитьОбъект(ТЗ); ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных, Истина); |
|||
7
Мультук
гуру
24.08.23
✎
12:07
|
(6)
Список параметров (имена) априори одинаков. Разные только значения и "флажки" Вместо "очищать" используйте "Найти" и т.п. |
|||
8
unenu
24.08.23
✎
12:11
|
||||
9
bvb
24.08.23
✎
12:17
|
Все разобрался . Туплю я.
Список параметров сформирован но не заполнен Параметры нужно не ДОБАВЛЯТЬ а ИСКАТЬ И ЗАПОЛНЯТЬ. Процедура СкопироватьПараметрыДанных(ПараметрыИсточник, ПараметрыПриемник) Экспорт Для каждого ЭлементПараметров Из ПараметрыИсточник Цикл ПараметрСКД = ПараметрыПриемник.Найти(ЭлементПараметров.Параметр); ПараметрСКД.Использование = ЭлементПараметров.Использование; ПараметрСКД.Значение = ЭлементПараметров.Значение; КонецЦикла; КонецПроцедуры |
|||
10
bvb
24.08.23
✎
12:18
|
Все задача решена. Данный пост можно использовать как рабочий пример
|
|||
11
yopQua
24.08.23
✎
12:38
|
(3) :DDD
|
|||
12
Garykom
гуру
24.08.23
✎
13:07
|
(11) ничего смешного зачем дважды запросы выполнять/данные получать?
сначала в ТабДок затем отдельно в ТЗ когда можно данные уже полученные их ТабДок перегнать в ТЗ |
|||
13
bvb
24.08.23
✎
13:09
|
(12) А как достать значение например номенклатуры ?
|
|||
14
toypaul
гуру
24.08.23
✎
13:27
|
Если конфа на БСП, то
КомпоновкаДанныхКлиентСервер.СкопироватьЭлементы можно копировать и отбор и параметры и все остальное |
|||
15
rozer76
24.08.23
✎
13:43
|
(14) в какой это версии?
|
|||
16
rozer76
25.08.23
✎
09:00
|
(15) нашел, спс )
|
|||
17
rozer76
25.08.23
✎
12:04
|
(8) будет ошибка в строке
"ОтборПриемник.ДоступныеПоляОтбора.НайтиПоле(ЭлементИсточник.ЛевоеЗначение) = Неопределено Тогда" в случае когда ОтборПриемник это ГруппаЭлементовОтбораКомпоновкиДанных Поправил: Процедура ПеренестиОтбор(ОтборПриемник, ОтборИсточник, ДоступныеПоляОтбораПриемника) Для каждого ЭлементИсточник Из ОтборИсточник.Элементы Цикл Если ТипЗнч(ЭлементИсточник) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда Если ТипЗнч(ЭлементИсточник.ЛевоеЗначение) = Тип("ПолеКомпоновкиДанных") Тогда Если ДоступныеПоляОтбораПриемника.НайтиПоле(ЭлементИсточник.ЛевоеЗначение) = Неопределено Тогда Продолжить; КонецЕсли; КонецЕсли; КонецЕсли; ЭлементПриемник = ОтборПриемник.Элементы.Добавить(ТипЗнч(ЭлементИсточник)); ЗаполнитьЗначенияСвойств(ЭлементПриемник, ЭлементИсточник); Если ТипЗнч(ЭлементИсточник) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда ПеренестиОтбор(ЭлементПриемник, ЭлементИсточник, ДоступныеПоляОтбораПриемника); КонецЕсли; КонецЦикла; КонецПроцедуры |
|||
18
Garykom
гуру
25.08.23
✎
14:19
|
(13) например из расшифровки
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |