Имя: Пароль:
1C
1С v8
Знатокам СКД! Как в параметре для СКД сделать вид сравнения??
0 SerGa
 
18.02.14
12:26
Есть СКД источником данных которой является не запрос а Набор данных.

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

Для корректного первоначального формирования ТЗ, для запроса который формирует эту ТЗ мне нужны параметры.
Например Контрагент, для которого должна быть возможность задать в запросе не только Контрагент = &Контрагент, а и Не равно Не в списке  и т.д.

Если параметры передавать через Параметры СКД
и потом их считывать через ПараметрыДанных.Элементы.Найти(НаименованиеПараметра)
то в параметрах СКД нет возможности выбора вида сравнения

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

НО они будут потом опять накладываться на конечный набор данных, что не правильно, т.к. в конечном наборе таких полей нет вообще (например Контрагент).

Как быть???
1 Gr
 
18.02.14
12:29
Используй не запрос для формирования ТЗ, а построитель запроса. Напиши функцию синхронизации отборов СКД с отборами построителя. Будет счастье.
2 mikecool
 
18.02.14
12:32
(1) сомнительное это счастье )) писал такую - строк 500 вышла
3 SerGa
 
18.02.14
12:32
(1) правильно я понял, что на форму нужно будет вывести форму отбора построителя???
4 Gr
 
18.02.14
12:33
(2) у меня универсальная около 30-40 строк
5 Gr
 
18.02.14
12:33
(3) нет, на форме используй настройки скд
6 SerGa
 
18.02.14
12:33
(2) что то типа этого??

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

        Отбор.Использование = Ложь;
        Возврат;
    КонецЕсли;
    
    Отбор.Значение = ОтборКомпоновщика.ПравоеЗначение;
    
КонецПроцедуры
7 Gr
 
18.02.14
12:34
(6) да
8 SerGa
 
18.02.14
12:35
(5) не понял тогда.. параметр контрагент мне в Параметры СКД выносить???
9 Gr
 
18.02.14
12:36
(8) в том то и дело, что не нужно
10 SerGa
 
18.02.14
12:37
вот..  а где тогда пользователь будет выбирать вид сравнения и задавать конкретного контрагента???
11 Gr
 
18.02.14
12:39
(10) перед выполнением запроса построителя, выполни синхронизацию отборов скд с отборами построителя. В отборах скд задай нужного тебе контрагента, список контрагентов и т.п.
12 SerGa
 
18.02.14
12:43
ага...НО тогда эти отборы будут потом опять накладываться на конечный набор данных, что не правильно, т.к. в конечном наборе таких полей нет вообще (например Контрагент).


например выбираю из регистра Продажи с отбором по контрагенту продажи по номенклатуре

т.е. в конечной тз есть поля Номенклатура и Сумма а поля Контрагент Нет и быть не должно.

В отборе же контрагент есть и этот отбор активен!
т.е. несмотря на то что ТЗ не пустая, но отчет мне будет выдавать пустоту, т.к поверх будет наложен отбор Контрагент
13 Зойч
 
18.02.14
12:44
Зачем построитель? Юзай еще одну скд для получения таблицы!!!
14 Gr
 
18.02.14
12:44
(12) что мешает включить в набор данных контрагента, но не выводить его потом для пользователя?
15 Gr
 
18.02.14
12:45
(13) тоже правильно, вообще все зависит от сложности выборки данных, нужно смотреть на конкретную задачу
16 SerGa
 
18.02.14
12:48
(14) не получиться т.е. запрос к продажам, является одним из десятка подзапросов ко многим регистрам как накопления так и бухгалтерии, из которых собираются а потом группируются много самых разнородных данных (для фин анализа) и соответственно контрагент в конечном наборе вообще не в тему
17 Gr
 
18.02.14
12:49
(16) тогда, придумай к параметру Контрагент, еще один параметр ВидСравненияДляКонтрагента, и выкручивайся как то так
18 Gr
 
18.02.14
12:51
лично я предпочитаю не использовать ТЗ в качестве набора данных, делаю это очень редко. Как по мне, то лучше в запросе СКД использовать временные таблицы
19 SerGa
 
18.02.14
12:55
(17) примерно так и думал сделать, но полагал есть более красивое решение...

(18) возможно я не вполне оцениваю возможности использования операторов {} , т.к. не вполне понимаю как сделать так, чтобы в зависимости от выбранных параметров сделать так, чтобы какие-то временные таблицы формировались а какие-то нет...
20 SerGa
 
18.02.14
13:09
Придумал как избежать наложение отборов на конечный набор ...

перед
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, ТекНастройки, ДанныеРасшифровкиОтчета, );

в ТекНастройки отключаю использование необходимых Отборов
21 Gr
 
18.02.14
13:12
(21) да, так тоже будет работать. Только не забудь после вывода данных на экран, опять включить отбор, а то пользователи будут дезориентированы
22 SerGa
 
18.02.14
13:16
(22) да, именно так и сделаю. спасибо за конструктивную беседу..
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn