Имя: Пароль:
1C
1С v8
Как перенести настройки СКД в построитель запроса?
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 Тогда
               ЗаполнитьЭлементы(ЭлементПриемник.ЗначенияВложенныхПараметров, ЭлементИсточник.ЗначенияВложенныхПараметров, ПриемникЗначения);
           КонецЕсли;
       КонецЕсли;
   КонецЦикла;
   
КонецПроцедуры
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс