Поиск объектов имеющих все заданные значения свойств.

//am+
//Поиск объектов имеющих все заданные в табл. значений СвойстваИЗначения
//значения свойств.
//
//Формат колонок таблицы СвойстваИЗначения:
//    "Значение", тип Характеристика.СвойстваОбъектов
//    "Свойство", тип ПланВидовХарактеристикСсылка.СвойстваОбъектов
//Можно задать Владельца объекта, для поиска в пределах подчинения
//Например ищем характеристику номеклатуры с заданными св-ми для заданной номеклатуры.
//
//Возвращаемое значение всегда массив с найденными ссылками на объекты.
//
//Примечание:
//  1) Если Значение - пустое тогда в регистре сведений ЗначенияСвойствОбъектов
//     не должно быть записи по данному Свойству у искомого объекта, это учитывается при построении запроса.
//  2) Если задать пустыми все значения свойств, то в результат должны попасть все объекты БД у которых
//     данные св-ва не установлены. Тем не менее в результат попадут лишь те объекты которые "засветились" в
//     РС.ЗначенияСвойствОбъектов
//
//См. также в типовой конфигурации Обработка.ЗначенияСвойствОбъекта табличная часть СвойстваИЗначения
//
Функция НайтиОбъектыСоВсемиЗаданнымиСвойствами(СвойстваИЗначения, Владелец=Неопределено) Экспорт

    Если Не
ЗначениеЗаполнено(СвойстваИЗначения) Тогда
        Возврат Новый
Массив;
    КонецЕсли;

    Если
СвойстваИЗначения.Количество()=0 Тогда
        Возврат Новый
Массив;
    КонецЕсли;

   
Запрос = Новый Запрос;
   
Запрос.Текст = "ВЫБРАТЬ
    |   ПодЗапрос.Объект,
    |   СУММА(ПодЗапрос.флаг) КАК флаг
    |ИЗ
    |(
    |"
;

   
Индекс = ;
   
ПоправкаИндекса = ;
    Для Каждого
ЭлКоллекции Из СвойстваИЗначения Цикл

        Если
Индекс > 0 Тогда

           
Запрос.Текст = Запрос.Текст+
           
"   ОБЪЕДИНИТЬ ВСЕ
            |"
;

        КонецЕсли;

        Если Не
ЗначениеЗаполнено(ЭлКоллекции.Значение) Тогда
           
Запрос.Текст = Запрос.Текст+
           
"   ВЫБРАТЬ РАЗЛИЧНЫЕ
            |       ЗначенияСвойствОбъектов.Объект КАК Объект,
            |       -1 КАК флаг
            |   ИЗ
            |       РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
            |   ГДЕ
            |       ЗначенияСвойствОбъектов.Свойство = &Св"
+Индекс+"
            |"
;
           
ПоправкаИндекса = ПоправкаИндекса + 1;
        Иначе
           
Запрос.Текст = Запрос.Текст+
           
"    ВЫБРАТЬ
            |       ЗначенияСвойствОбъектов.Объект КАК Объект,
            |       1 КАК флаг
            |   ИЗ
            |       РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
            |   ГДЕ
            |       ЗначенияСвойствОбъектов.Свойство = &Св"
+Индекс+"
            |       И ЗначенияСвойствОбъектов.Значение = &Зн"
+Индекс+"
            |"
;
        КонецЕсли;

        Если
Владелец<>Неопределено Тогда
           
Запрос.Текст = Запрос.Текст+"
            |       И ЗначенияСвойствОбъектов.Объект.Владелец = &Владелец
            |"
;
        КонецЕсли;

       
Запрос.УстановитьПараметр("Св"+Индекс,ЭлКоллекции.Свойство);
       
Запрос.УстановитьПараметр("Зн"+Индекс,ЭлКоллекции.Значение);

       
Индекс = Индекс + 1;

    КонецЦикла;

   
Запрос.Текст = Запрос.Текст+
   
") КАК ПодЗапрос
    |
    |СГРУППИРОВАТЬ ПО
    |   ПодЗапрос.Объект
    |
    |ИМЕЮЩИЕ
    |   СУММА(ПодЗапрос.флаг) = "
+(Индекс-ПоправкаИндекса);

    Если
Владелец<>Неопределено Тогда
       
Запрос.УстановитьПараметр("Владелец",Владелец);
    КонецЕсли;

    Возврат
Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Объект");

КонецФункции
//am-

Похожие материалы

Справочники

Документы

Отчеты

Обработки