Имя: Пароль:
1C
1С v8
СКД, отборы и несколько схем...
0 ДенисЧ
 
05.06.13
11:30
Картинка такая...
Есть отчёт с основной схемой СКД. В ней можно наложиьт отборы по нескольким справочникам, например по Подразделению и Номенклатуре.
Далее. Перед формиррванием отчёта мне нужно сделать запрос к внешней базе с применением наложенных фильтров, чтобы не тянуть 100500 записей.

Делаю так:

   СхемаОтборПодр = ПолучитьМакет("Отбор_Подразделения");
   НастройкиОтборПодр = СхемаОтборПодр.НастройкиПоУмолчанию;
   
   Для каждого эл Из ЭтотОбъект.КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
       Если СокрЛП(эл.ЛевоеЗначение) = "Подразделение" Тогда
           новЭл = НастройкиОтборПодр.Отбор.Элементы.Добавить(ТипЗнч(эл));
           ЗаполнитьЗначенияСвойств(новЭл, эл);
       КонецЕсли;
   КонецЦикла;
   Если НастройкиОтборПодр.Отбор.Элементы.Количество() > 0 Тогда
       КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
       МакетКомпоновкиПодр= КомпоновщикМакета.Выполнить(СхемаОтборПодрНастройкиОтборПодр,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
       
       ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
       ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиАптеки);
       
       вывод = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
       тзПодр = вывод.Вывести(ПроцессорКомпоновкиДанных);
   Иначе
       тзПодр= Новый ТаблицаЗначений;
   КонецЕсли;

Так что, если юзверб указал в отборе прямо подразделение, то всё прекрасно. Но если он указал в отборе Подразделение.Реквизит, то естественно в тз отбирается всё, ибо отбор не применяется...

Если же копировать все отборы, то можем наткнуться на ситуацию, когда в запрос по подразделениям лезут фильтры, например, по номенклатуре и имеем ошибку.

Вопрос.

Как из доп схемы получить возможные накладываемые отборы?

В доп схеме запрос элементарный
Выбрать Ссылка КАК Подразделение
Из справочник.Подразделения.
1 ДенисЧ
 
05.06.13
11:56
уп.
Или я непонятно написал?
2 assasu
 
05.06.13
12:57
ЭтотОбъект.КомпоновщикНастроек.Настройки.Отбор.Элементы тут не должно быть "левых" отборов. для этого нужно связать компоновщик со схемой. У меня это делается вот так:
       скд = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");        
       Настройки = скд.НастройкиПоУмолчанию;
       КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(скд));
3 ДенисЧ
 
05.06.13
13:29
мне нельзя портить настройки основного отчёта...
4 Nexux
 
05.06.13
13:33
программно добавлять отобры к основной СКД, если они применимы %)
5 ДенисЧ
 
05.06.13
13:34
(4) в основной у меня всё нормально.
Мне нужно добавить к дополнительной :-)
6 Nexux
 
05.06.13
13:38
но через точку проваливаться можно рекурсивнобесконечно, мне кажется надо искать где-то в КомпоновщикНастроек.Настройки.ДоступныеПоляОтбора
7 Defender aka LINN
 
05.06.13
13:46
(0) А как СКД применит твой отбор к внешней базе?
8 ДенисЧ
 
05.06.13
14:07
(7) А я сам его применю. Мне главное - получить из справочника значения, которые попадают под отбор
(6) там пусто...
9 toypaul
 
гуру
05.06.13
14:12
чот я не понял нифига, но у меня вроде похожая была сиутация. лишние отборы я отключал через Использование.
10 ДенисЧ
 
05.06.13
14:16
(9) они не лишние... Мне просто нужно отобрать те, что применимы к допсхеме.
В основной - они вполне себе нужные
11 ssh2006
 
05.06.13
14:20
(0) можно скопировать все отборы, обойти коллекцию и сотавить только те,  имя поля которых содержит "Подразделение"
12 ДенисЧ
 
05.06.13
14:28
(11) А если я выберу Подразделение.ВидЦФО? Какое имя поля будет?
13 ssh2006
 
05.06.13
14:29
(12) можно в имени поля подстроку "Подразделение" искать
14 Nexux
 
05.06.13
15:24
(12) .ЛевоеЗначение =  Новый ПолеКомпоновкиДанных("Подразделение.ВидЦФО")
15 ДенисЧ
 
05.06.13
15:25
(14) Нене.... Оно уже выбрано... Мне его опознать....
16 Nexux
 
05.06.13
15:31
есть вариант тогда инициализировать компоновщик настроек на основе НастройкиОтборПодр, скопировать нужные отборы в его настройки, потом метод Восстановить(СпособВосстановленияНастроекКомпоновкиДанных.ПроверятьДоступность)
17 assasu
 
06.06.13
07:33
(3)сделай настройку доп. компоновки по нажатию кнопки. под кнопкой переопредели компоновщик и вызови форму настройки, где задашь отборы. после того как форма закрылась  - обратно инициализируй компоновщик основной схемой.