|
Как перенести настройки СКД в построитель запроса? | ☑ | ||
---|---|---|---|---|
0
le_
02.11.11
✎
16:53
|
Делаю отчет на СКД. В качестве источника данных СКД используется внешний источник (ТаблицаЗначений).
ТЗ формирую запросом. Подскажите, как лучше сформировать запрос со всеми отборами и параметрами, которые используются в СКД? Пробую использовать объект "ПостроительЗапроса" - как в него передать параметры и отбор из СКД? Может, есть какой-нибудь пример? |
|||
1
mikecool
02.11.11
✎
16:59
|
отбор списка в параметры компоновки подставлял, тебе наоборот )))
Для Каждого ЕдиничныйОтбор Из ВладелецФормы.ДокументСписок.Отбор Цикл Если Не ЕдиничныйОтбор.Использование Тогда Продолжить; КонецЕсли; ПолеОтбораКомпоновки = Новый ПолеКомпоновкиДанных(ЕдиничныйОтбор.Имя); // // Если ЕдиничныйОтбор.ВидСравнения = ВидСравнения.ИнтервалВключаяГраницы Или ЕдиничныйОтбор.ВидСравнения = ВидСравнения.Интервал Тогда ЭлементОтбора = Отборы.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных")); УстановленныйОтбор = ЭлементОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); УстановленныйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно; УстановленныйОтбор.ЛевоеЗначение = ПолеОтбораКомпоновки; УстановленныйОтбор.ПравоеЗначение = ЕдиничныйОтбор.ЗначениеС; УстановленныйОтбор = ЭлементОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); УстановленныйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно; УстановленныйОтбор.ЛевоеЗначение = ПолеОтбораКомпоновки; УстановленныйОтбор.ПравоеЗначение = ЕдиничныйОтбор.ЗначениеПо; Если ЕдиничныйОтбор.Имя = "Дата" Тогда НачПериода = ЕдиничныйОтбор.ЗначениеС; КонПериода = ЕдиничныйОтбор.ЗначениеПо; КонецЕсли; ИначеЕсли ЕдиничныйОтбор.ВидСравнения = ВидСравнения.Больше Тогда УстановленныйОтбор = Отборы.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); УстановленныйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше; УстановленныйОтбор.ЛевоеЗначение = ПолеОтбораКомпоновки; УстановленныйОтбор.ПравоеЗначение = ЕдиничныйОтбор.Значение; Если ЕдиничныйОтбор.Имя = "Дата" Тогда НачПериода = ЕдиничныйОтбор.Значение; КонПериода = Неопределено; КонецЕсли; ИначеЕсли ЕдиничныйОтбор.ВидСравнения = ВидСравнения.Меньше Тогда УстановленныйОтбор = Отборы.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); УстановленныйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше; УстановленныйОтбор.ЛевоеЗначение = ПолеОтбораКомпоновки; УстановленныйОтбор.ПравоеЗначение = ЕдиничныйОтбор.Значение; Если ЕдиничныйОтбор.Имя = "Дата" Тогда НачПериода = Неопределено; КонПериода = ЕдиничныйОтбор.Значение; КонецЕсли; ИначеЕсли ЕдиничныйОтбор.ВидСравнения = ВидСравнения.БольшеИлиРавно Тогда УстановленныйОтбор = Отборы.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); УстановленныйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно; УстановленныйОтбор.ЛевоеЗначение = ПолеОтбораКомпоновки; УстановленныйОтбор.ПравоеЗначение = ЕдиничныйОтбор.Значение; Если ЕдиничныйОтбор.Имя = "Дата" Тогда НачПериода = ЕдиничныйОтбор.Значение; КонПериода = Неопределено; КонецЕсли; ИначеЕсли ЕдиничныйОтбор.ВидСравнения = ВидСравнения.МеньшеИлиРавно Тогда УстановленныйОтбор = Отборы.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); УстановленныйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно; УстановленныйОтбор.ЛевоеЗначение = ПолеОтбораКомпоновки; УстановленныйОтбор.ПравоеЗначение = ЕдиничныйОтбор.Значение; Если ЕдиничныйОтбор.Имя = "Дата" Тогда НачПериода = Неопределено; КонПериода = ЕдиничныйОтбор.Значение; КонецЕсли; ИначеЕсли ЕдиничныйОтбор.ВидСравнения = ВидСравнения.ВИерархии Тогда УстановленныйОтбор = Отборы.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); УстановленныйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии; УстановленныйОтбор.ЛевоеЗначение = ПолеОтбораКомпоновки; УстановленныйОтбор.ПравоеЗначение = ЕдиничныйОтбор.Значение; ИначеЕсли ЕдиничныйОтбор.ВидСравнения = ВидСравнения.ВСписке Тогда УстановленныйОтбор = Отборы.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); УстановленныйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке; УстановленныйОтбор.ЛевоеЗначение = ПолеОтбораКомпоновки; УстановленныйОтбор.ПравоеЗначение = ЕдиничныйОтбор.Значение; ИначеЕсли ЕдиничныйОтбор.ВидСравнения = ВидСравнения.ВСпискеПоИерархии Тогда УстановленныйОтбор = Отборы.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); УстановленныйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии; УстановленныйОтбор.ЛевоеЗначение = ПолеОтбораКомпоновки; УстановленныйОтбор.ПравоеЗначение = ЕдиничныйОтбор.Значение; ИначеЕсли ЕдиничныйОтбор.ВидСравнения = ВидСравнения.НеВИерархии Тогда УстановленныйОтбор = Отборы.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); УстановленныйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВИерархии; УстановленныйОтбор.ЛевоеЗначение = ПолеОтбораКомпоновки; УстановленныйОтбор.ПравоеЗначение = ЕдиничныйОтбор.Значение; ИначеЕсли ЕдиничныйОтбор.ВидСравнения = ВидСравнения.НеВСписке Тогда УстановленныйОтбор = Отборы.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); УстановленныйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке; УстановленныйОтбор.ЛевоеЗначение = ПолеОтбораКомпоновки; УстановленныйОтбор.ПравоеЗначение = ЕдиничныйОтбор.Значение; ИначеЕсли ЕдиничныйОтбор.ВидСравнения = ВидСравнения.НеВСпискеПоИерархии Тогда УстановленныйОтбор = Отборы.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); УстановленныйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСпискеПоИерархии; УстановленныйОтбор.ЛевоеЗначение = ПолеОтбораКомпоновки; УстановленныйОтбор.ПравоеЗначение = ЕдиничныйОтбор.Значение; ИначеЕсли ЕдиничныйОтбор.ВидСравнения = ВидСравнения.НеРавно Тогда УстановленныйОтбор = Отборы.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); УстановленныйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно; УстановленныйОтбор.ЛевоеЗначение = ПолеОтбораКомпоновки; УстановленныйОтбор.ПравоеЗначение = ЕдиничныйОтбор.Значение; //Если ЕдиничныйОтбор.Имя = "Дата" Тогда // НачПериода = ЕдиничныйОтбор.Значение; // КонПериода = ЕдиничныйОтбор.Значение; //КонецЕсли; ИначеЕсли ЕдиничныйОтбор.ВидСравнения = ВидСравнения.НеСодержит Тогда УстановленныйОтбор = Отборы.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); УстановленныйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.НеСодержит; УстановленныйОтбор.ЛевоеЗначение = ПолеОтбораКомпоновки; УстановленныйОтбор.ПравоеЗначение = ЕдиничныйОтбор.Значение; ИначеЕсли ЕдиничныйОтбор.ВидСравнения = ВидСравнения.Равно Тогда УстановленныйОтбор = Отборы.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); УстановленныйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; УстановленныйОтбор.ЛевоеЗначение = ПолеОтбораКомпоновки; УстановленныйОтбор.ПравоеЗначение = ЕдиничныйОтбор.Значение; Если ЕдиничныйОтбор.Имя = "Дата" Тогда НачПериода = ЕдиничныйОтбор.Значение; КонПериода = ЕдиничныйОтбор.Значение; КонецЕсли; ИначеЕсли ЕдиничныйОтбор.ВидСравнения = ВидСравнения.Содержит Тогда УстановленныйОтбор = Отборы.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); УстановленныйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит; УстановленныйОтбор.ЛевоеЗначение = ПолеОтбораКомпоновки; УстановленныйОтбор.ПравоеЗначение = ЕдиничныйОтбор.Значение; КонецЕсли; КонецЦикла; |
|||
2
izekia
02.11.11
✎
17:03
|
а формировать скд и там таблицу?
|
|||
3
ptiz
02.11.11
✎
17:06
|
1) Построитель не умеет делать запросы по ТЗ.
2) Не все настройки СКД можно перенести в построитель. |
|||
4
le_
02.11.11
✎
17:17
|
(1) Видимо, придется делать что-то подобное. Думал, может есть возможность выгрузить как-нибудь быстренько и загрузить...
|
|||
5
mikecool
02.11.11
✎
17:18
|
(4) я сам так думал )
но - если будет вариант проще - готов его принять ))) |
|||
6
Stepa86
02.11.11
✎
17:21
|
Функция ПолучитьПредТаблицу()
скд = ПолучитьМакет( "предТаблица" ); настройки = скд.НастройкиПоУмолчанию; настройкиИсточник = КомпоновщикНастроек.ПолучитьНастройки(); ЗаполнитьЭлементы(настройки.ПараметрыДанных, настройкиИсточник.ПараметрыДанных); СкопироватьЭлементы(настройки.Отбор, настройкиИсточник.Отбор); предТаблица = ТаблицаСКД( скд , настройки ); Возврат предТаблица; КонецФункции //Формирует и возвращает таблицу значений по СКД //Параметры: //СКД - схема компоновки данных, //ВнешниеНаборыДанных - Тип: Структура. Ключ структуры соответствует имени внешнего набора данных. Значение структуры - внешнему набору данных. // Функция ТаблицаСКД( СКД , Настройки ) Экспорт КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить( СКД , Настройки ,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновкиДанных.Инициализировать( МакетКомпоновки ); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; ТаблицаЗначений = Новый ТаблицаЗначений; ПроцессорВывода.УстановитьОбъект(ТаблицаЗначений); ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); Возврат ТаблицаЗначений; КонецФункции // Копирует элементы из одной коллекции в другую Процедура СкопироватьЭлементы(ПриемникЗначения, ИсточникЗначения, ПроверятьДоступность = Ложь, ОчищатьПриемник = Истина) Экспорт Если ТипЗнч(ИсточникЗначения) = Тип("УсловноеОформлениеКомпоновкиДанных") ИЛИ ТипЗнч(ИсточникЗначения) = Тип("ВариантыПользовательскогоПоляВыборКомпоновкиДанных") ИЛИ ТипЗнч(ИсточникЗначения) = Тип("ОформляемыеПоляКомпоновкиДанных") ИЛИ ТипЗнч(ИсточникЗначения) = Тип("ЗначенияПараметровДанныхКомпоновкиДанных") Тогда СоздаватьПоТипу = Ложь; Иначе СоздаватьПоТипу = Истина; КонецЕсли; ПриемникЭлементов = ПриемникЗначения.Элементы; ИсточникЭлементов = ИсточникЗначения.Элементы; Если ОчищатьПриемник Тогда ПриемникЭлементов.Очистить(); КонецЕсли; Для каждого ЭлементИсточник Из ИсточникЭлементов Цикл Если ТипЗнч(ЭлементИсточник) = Тип("ЭлементПорядкаКомпоновкиДанных") Тогда // Элементы порядка добавляем в начало Индекс = ИсточникЭлементов.Индекс(ЭлементИсточник); ЭлементПриемник = ПриемникЭлементов.Вставить(Индекс, ТипЗнч(ЭлементИсточник)); Иначе Если СоздаватьПоТипу Тогда ЭлементПриемник = ПриемникЭлементов.Добавить(ТипЗнч(ЭлементИсточник)); Иначе ЭлементПриемник = ПриемникЭлементов.Добавить(); КонецЕсли; КонецЕсли; ЗаполнитьЗначенияСвойств(ЭлементПриемник, ЭлементИсточник); // В некоторых коллекциях необходимо заполнить другие коллекции Если ТипЗнч(ИсточникЭлементов) = Тип("КоллекцияЭлементовУсловногоОформленияКомпоновкиДанных") Тогда СкопироватьЭлементы(ЭлементПриемник.Поля, ЭлементИсточник.Поля); СкопироватьЭлементы(ЭлементПриемник.Отбор, ЭлементИсточник.Отбор); ЗаполнитьЭлементы(ЭлементПриемник.Оформление, ЭлементИсточник.Оформление); ИначеЕсли ТипЗнч(ИсточникЭлементов) = Тип("КоллекцияВариантовПользовательскогоПоляВыборКомпоновкиДанных") Тогда СкопироватьЭлементы(ЭлементПриемник.Отбор, ЭлементИсточник.Отбор); КонецЕсли; // В некоторых элементах коллекции необходимо заполнить другие коллекции Если ТипЗнч(ЭлементИсточник) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда СкопироватьЭлементы(ЭлементПриемник, ЭлементИсточник); ИначеЕсли ТипЗнч(ЭлементИсточник) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда СкопироватьЭлементы(ЭлементПриемник, ЭлементИсточник); ИначеЕсли ТипЗнч(ЭлементИсточник) = Тип("ПользовательскоеПолеВыборКомпоновкиДанных") Тогда СкопироватьЭлементы(ЭлементПриемник.Варианты, ЭлементИсточник.Варианты); ИначеЕсли ТипЗнч(ЭлементИсточник) = Тип("ПользовательскоеПолеВыражениеКомпоновкиДанных") Тогда ЭлементПриемник.УстановитьВыражениеДетальныхЗаписей (ЭлементИсточник.ПолучитьВыражениеДетальныхЗаписей()); ЭлементПриемник.УстановитьВыражениеИтоговыхЗаписей(ЭлементИсточник.ПолучитьВыражениеИтоговыхЗаписей()); ЭлементПриемник.УстановитьПредставлениеВыраженияДетальныхЗаписей(ЭлементИсточник.ПолучитьПредставлениеВыраженияДетальныхЗаписей ()); ЭлементПриемник.УстановитьПредставлениеВыраженияИтоговыхЗаписей(ЭлементИсточник.ПолучитьПредставлениеВыраженияИтоговыхЗаписей ()); КонецЕсли; КонецЦикла; КонецПроцедуры Процедура ЗаполнитьЭлементы(ПриемникЗначения, ИсточникЗначения, ПервыйУровень = Неопределено) Экспорт Если ТипЗнч(ПриемникЗначения) = Тип("КоллекцияЗначенийПараметровКомпоновкиДанных") Тогда КоллекцияЗначений = ИсточникЗначения; Иначе КоллекцияЗначений = ИсточникЗначения.Элементы; КонецЕсли; Для каждого ЭлементИсточник Из КоллекцияЗначений Цикл Если ПервыйУровень = Неопределено Тогда ЭлементПриемник = ПриемникЗначения.НайтиЗначениеПараметра(ЭлементИсточник.Параметр); Иначе ЭлементПриемник = ПервыйУровень.НайтиЗначениеПараметра(ЭлементИсточник.Параметр); КонецЕсли; Если ЭлементПриемник = Неопределено Тогда Продолжить; КонецЕсли; ЗаполнитьЗначенияСвойств(ЭлементПриемник, ЭлементИсточник); Если ТипЗнч(ЭлементИсточник) = Тип("ЗначениеПараметраКомпоновкиДанных") Тогда Если ЭлементИсточник.ЗначенияВложенныхПараметров.Количество() <> 0 Тогда ЗаполнитьЭлементы(ЭлементПриемник.ЗначенияВложенныхПараметров, ЭлементИсточник.ЗначенияВложенныхПараметров, ПриемникЗначения); КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |