Имя: Пароль:
1C
1С v8
Сложное условие на СКД
,
0 sinner_world
 
30.08.16
17:26
Добрый день.
Есть Регистр сведений КомпетенцииСотрудников Измерение: Кандидат (Спр.ФизЛица); Компетенция (Спр.Навыки) Ресурс Оценка(число)

Запрос:
ВЫБРАТЬ
    КомпетенцииКандидатовСрезПоследних.Кандидат,
    КомпетенцииКандидатовСрезПоследних.Компетенция,
    КомпетенцииКандидатовСрезПоследних.Оценка
ИЗ
    РегистрСведений.КомпетенцииКандидатов.СрезПоследних(&Период, ) КАК КомпетенцииКандидатовСрезПоследних

Получаем Кандидатов с оценками их навыком.

Кандидат1    1С:Управление торговлей ред. 10.3    5
Кандидат1    1С:Управление торговлей ред. 11.x    2
Кандидат1    Бухгалтерия предприятия                    2    

Кандидат2    1С:Управление торговлей ред. 10.3    4
Кандидат2    1С:Управление торговлей ред. 11.x    4
Кандидат2    Бухгалтерия предприятия                    3

Кандидат3    1С:Управление торговлей ред. 10.3    2
Кандидат3    1С:Управление торговлей ред. 11.x    5
Кандидат3    Бухгалтерия предприятия                    4


Используя группы в отборе хочу получить вот такое сочетание навыков

Параметры:    Период: 30.08.2016 0:00:00
Отбор:    "( ( Компетенция Равно ""1С:Управление торговлей ред. 10.3"" И
        Оценка Больше или равно ""4"" ) ИЛИ
        ( Компетенция Равно ""1С:Управление торговлей ред. 11.x"" И
        Оценка Больше или равно ""4"" ) ) И
    
    ( Компетенция Равно "" Бухгалтерия предприятия"" И
    Оценка Больше или равно ""4"" )"

В консоли СКД смотрю какой запрос мне сформировал компоновщик:

ВЫБРАТЬ
    КомпетенцииКандидатовСрезПоследних.Кандидат КАК Кандидат,
    КомпетенцииКандидатовСрезПоследних.Компетенция КАК Компетенция,
    КомпетенцииКандидатовСрезПоследних.Оценка КАК Оценка,
    ПРЕДСТАВЛЕНИЕССЫЛКИ(КомпетенцииКандидатовСрезПоследних.Кандидат) КАК КандидатПредставление,
    ПРЕДСТАВЛЕНИЕССЫЛКИ(КомпетенцииКандидатовСрезПоследних.Компетенция) КАК КомпетенцияПредставление
ИЗ
    РегистрСведений.КомпетенцииКандидатов.СрезПоследних(&П, ) КАК КомпетенцииКандидатовСрезПоследних
ГДЕ
    (КомпетенцииКандидатовСрезПоследних.Компетенция = &П2
                И КомпетенцииКандидатовСрезПоследних.Оценка >= &П3
            ИЛИ КомпетенцииКандидатовСрезПоследних.Компетенция = &П4
                И КомпетенцииКандидатовСрезПоследних.Оценка >= &П3)
    И КомпетенцииКандидатовСрезПоследних.Компетенция = &П5
            И КомпетенцииКандидатовСрезПоследних.Оценка >= &П6


Вывод результат пустой т.к. условия И.

Вопрос: Как получить список кандидатов которые знают УТ 10 ИЛИ УТ 11 больше чем на 4 И БП больше чем на 4

В приведенном примере это Кандидат3
1 Волшебник
 
модератор
30.08.16
17:27
сделай несколько левых соединений на каждую компетенцию
2 sinner_world
 
30.08.16
17:29
А как быть если пользователь в запросе будет выбирать их произвольно ??
3 Волшебник
 
модератор
30.08.16
17:29
(2) динамически генери текст запроса
4 Лефмихалыч
 
30.08.16
17:31
>Вопрос: Как получить список кандидатов которые знают УТ 10 ИЛИ УТ 11 больше чем на 4 И БП больше чем на 4

надо сформировать таблицу с требуемыми компетенциями и баллами и потом эту таблицу содеинить с регистром внутренним соединением. И не едловать мозги компоновке и ее отборам
5 sinner_world
 
30.08.16
17:33
(4) Ok Спасибо Буду пробовать.
6 Buster007
 
30.08.16
17:35
Вывод результат пустой т.к. условия И.

а это где такое ты нашел?
По-моему запрос нормальный, а косяк где-то в твоих параметрах.
7 sinner_world
 
30.08.16
17:47
(6) Запрос нормальный, что бы ему быть не нормальным то.

но если уберешь все условия кроме:

КомпетенцииКандидатовСрезПоследних.Компетенция = &П2
И КомпетенцииКандидатовСрезПоследних.Компетенция = &П5

ГДЕ П2 эде "УТ 10" а П5 это "БП"
8 Buster007
 
30.08.16
17:59
(7) так ты на СКД не греши.
То что ты указал в отборах, то он тебе и сформировал.
9 sinner_world
 
30.08.16
18:16
(8) а с чего ты взял что я на него грешу. Если задача хочется решить ее на СКД, знаешь как подскажи.
10 sinner_world
 
07.09.16
10:01
Дошли руки сделать набросок решения задачи, может кому пригодится:
На форме ТЗ СписокКомпетенция (Компетенция (Спр), Отбор (ТипОбластиОформленияВидСравнения), Оценка (Число))

И Отчет (ТабличныйДокумент)


&НаКлиенте
Функция КорректировкаСравнения(ТекстЗапроса)
ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"Больше или равно",">=");
ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"Меньше или равно","<=");
ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"Не равно","<>");
ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"Равно","=");
ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"Меньше","<");
ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"Больше",">");

Возврат ТекстЗапроса;    
КонецФункции

&НаКлиенте
Процедура Сформировать(Команда)

МассивУсловийКомпетенции = Новый Массив;
МассивУсловийОценок = Новый Массив;

СтрокаГДЕ = "ГДЕ ";
СтрокаСоединение = "";
СтрокаПоляВыборки = "";
КолСоединений = 1;

Если ПоИли = Истина Тогда
    УсловияИ_Или = "ИЛИ";
Иначе
    УсловияИ_Или = "И";
КонецЕсли;

Для каждого Стр Из СписокКомпетенция Цикл
    
СтрПрефиксСоединения = "ВТ"+Строка(КолСоединений);    
СтрокаСоединение = СтрокаСоединение + " ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК " + СтрПрефиксСоединения +
         " ПО ВТ.Кандидат = "+СтрПрефиксСоединения+".Кандидат " + Символы.ПС;    
        
СтрокаГДЕ = СтрокаГДЕ + " " + СтрПрефиксСоединения+".Компетенция = &Компетенция"+СтрПрефиксСоединения;
СтрокаГДЕ = СтрокаГДЕ + " И " + СтрПрефиксСоединения+".Оценка "+ Строка(Стр.Отбор) +" &Оценка"+СтрПрефиксСоединения + Символы.ПС;  
        
МассивУсловийКомпетенции.Добавить(Стр.Компетенция);
МассивУсловийОценок.Добавить(Стр.Оценка);

СтрокаГДЕ = СтрокаГДЕ + " " + УсловияИ_Или;        

СтрокаПоляВыборки = СтрокаПоляВыборки + "," + СтрПрефиксСоединения+".Компетенция КАК Компетенция"+СтрПрефиксСоединения + Символы.ПС +
                                        "," + СтрПрефиксСоединения+".Оценка КАК Оценка"+СтрПрефиксСоединения + Символы.ПС;

    
КолСоединений = КолСоединений + 1;    
    
КонецЦикла;

ТекстЗапрос = "ВЫБРАТЬ
               |    КомпетенцииКандидатовСрезПоследних.Кандидат,
               |    КомпетенцииКандидатовСрезПоследних.Компетенция,
               |    КомпетенцииКандидатовСрезПоследних.Оценка
               |ПОМЕСТИТЬ ВТ
               |ИЗ
               | РегистрСведений.КомпетенцииКандидатов.СрезПоследних(&МоментВремени, ) КАК КомпетенцииКандидатовСрезПоследних
               |;
               |
              |////////////////////////////////////////////////////////////////////////////////
               |ВЫБРАТЬ
               |    ВТ.Кандидат КАК Кандидат
               | //ПоляВыборки
               |ИЗ
               |    ВТ КАК ВТ
               |";



Если КолСоединений <> 1 Тогда
СтрокаГДЕ = Лев(СтрокаГДЕ, СтрДлина(СтрокаГДЕ)-СтрДлина(УсловияИ_Или));

ТекстЗапрос = ТекстЗапрос + СтрокаСоединение + СтрокаГДЕ;
КорректировкаСравнения(ТекстЗапрос);
ТекстЗапрос = СтрЗаменить(ТекстЗапрос,"//ПоляВыборки",СтрокаПоляВыборки);
КонецЕсли;

ТабДок = СформироватьОтчет(ТекстЗапрос,МассивУсловийКомпетенции,МассивУсловийОценок);

Отчет = ТабДок;
    
КонецПроцедуры

&НаСервере
Функция СформироватьОтчет(ТекстЗапроса,МассивУсловияКомпетенция,МассивУсловияОценок)
    
    СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
    
    Источник = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
    Источник.Имя = "ЛокальнаяБаза";
    Источник.СтрокаСоединения = "";
    Источник.ТипИсточникаДанных = "Local";
    
    НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
    НаборДанных.Имя = "Кандидат";
    НаборДанных.ИсточникДанных = "ЛокальнаяБаза";
    НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина;
    НаборДанных.Запрос = ТекстЗапроса;
    
    
   КомпНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
   КомпНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
   КомпНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);     
  
   ПараметрСКД = КомпНастроек.Настройки.ПараметрыДанных.Элементы.Найти("МоментВремени");
   ПараметрСКД.Использование = Истина;
   ПараметрСКД.Значение  = ТекущаяДата();
  
   Для ИндексСтрока = 0 По МассивУсловияКомпетенция.Количество() - 1 Цикл
        
       ПараметрСКД = КомпНастроек.Настройки.ПараметрыДанных.Элементы.Найти("КомпетенцияВТ" + Строка(ИндексСтрока+1));
       ПараметрСКД.Использование = Истина;
       ПараметрСКД.Значение  = МассивУсловияКомпетенция[ИндексСтрока];
      
       ПараметрСКД = КомпНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ОценкаВТ" + Строка(ИндексСтрока+1));
       ПараметрСКД.Использование = Истина;
       ПараметрСКД.Значение  = МассивУсловияОценок[ИндексСтрока];

   КонецЦикла;

  
  
    ПолеОтчета = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
    ПолеОтчета.Заголовок = "Кандидат";
    ПолеОтчета.ПутьКДанным = "Кандидат";
    ПолеОтчета.Поле = "Кандидат";
    
    //добавить группировку
    ГруппировкаПоКандидат =  КомпНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
    ГруппировкаПоКандидат.Имя = "Кандидат";
    ГруппировкаПоКандидат.Использование = Истина;

    //созданная группировка по полю "ТО"    
    ПолеГруппировки = ГруппировкаПоКандидат.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));      
    ПолеГруппировки.Использование      = Истина;
    ПолеГруппировки.Поле               = Новый ПолеКомпоновкиДанных("Кандидат");
    ПолеГруппировки.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;
    ПолеГруппировки.ТипДополнения      = ТипДополненияПериодаКомпоновкиДанных.БезДополнения;
    
    //добавить выводимые поля в группировке: склад и количество остаток для данной группировки
    АвтоПоле = ГруппировкаПоКандидат.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
    АвтоПоле.Использование = Истина;
    
      Для ИндексСтрока = 0 По МассивУсловияКомпетенция.Количество() - 1 Цикл
        
        ПолеОтчета = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
        ПолеОтчета.Заголовок = "Компетенция" + Строка(ИндексСтрока+1);
        ПолеОтчета.ПутьКДанным = "КомпетенцияВТ" + Строка(ИндексСтрока+1);
        ПолеОтчета.Поле = "КомпетенцияВТ" + Строка(ИндексСтрока+1);
        
        ПолеОченка = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
        ПолеОченка.Заголовок = "Оценка" + Строка(ИндексСтрока+1);
        ПолеОченка.ПутьКДанным = "ОценкаВТ" + Строка(ИндексСтрока+1);
        ПолеОченка.Поле = "ОценкаВТ" + Строка(ИндексСтрока+1);
        
        ПолеГруппировки = ГруппировкаПоКандидат.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));    
        ПолеГруппировки.Использование = Истина;
            ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("КомпетенцияВТ" + Строка(ИндексСтрока+1));
    
        ПолеГруппировки = ГруппировкаПоКандидат.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));    
        ПолеГруппировки.Использование = Истина;
        ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("ОценкаВТ" + Строка(ИндексСтрока+1));    


        КонецЦикла;

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