//am+
//Поиск объектов имеющих все заданные в табл. значений СвойстваИЗначения
//значения свойств.
//
//Формат колонок таблицы СвойстваИЗначения:
// "Значение", тип Характеристика.СвойстваОбъектов
// "Свойство", тип ПланВидовХарактеристикСсылка.СвойстваОбъектов
//Можно задать Владельца объекта, для поиска в пределах подчинения
//Например ищем характеристику номеклатуры с заданными св-ми для заданной номеклатуры.
//
//Возвращаемое значение всегда массив с найденными ссылками на объекты.
//
//Примечание:
// 1) Если Значение - пустое тогда в регистре сведений ЗначенияСвойствОбъектов
// не должно быть записи по данному Свойству у искомого объекта, это учитывается при построении запроса.
// 2) Если задать пустыми все значения свойств, то в результат должны попасть все объекты БД у которых
// данные св-ва не установлены. Тем не менее в результат попадут лишь те объекты которые "засветились" в
// РС.ЗначенияСвойствОбъектов
//
//См. также в типовой конфигурации Обработка.ЗначенияСвойствОбъекта табличная часть СвойстваИЗначения
//
Функция НайтиОбъектыСоВсемиЗаданнымиСвойствами(СвойстваИЗначения, Владелец=Неопределено) Экспорт
Если Не ЗначениеЗаполнено(СвойстваИЗначения) Тогда
Возврат Новый Массив;
КонецЕсли;
Если СвойстваИЗначения.Количество()=0 Тогда
Возврат Новый Массив;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ПодЗапрос.Объект,
| СУММА(ПодЗапрос.флаг) КАК флаг
|ИЗ
|(
|";
Индекс = 0;
ПоправкаИндекса = 0;
Для Каждого ЭлКоллекции Из СвойстваИЗначения Цикл
Если Индекс > 0 Тогда
Запрос.Текст = Запрос.Текст+
" ОБЪЕДИНИТЬ ВСЕ
|";
КонецЕсли;
Если Не ЗначениеЗаполнено(ЭлКоллекции.Значение) Тогда
Запрос.Текст = Запрос.Текст+
" ВЫБРАТЬ РАЗЛИЧНЫЕ
| ЗначенияСвойствОбъектов.Объект КАК Объект,
| -1 КАК флаг
| ИЗ
| РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
| ГДЕ
| ЗначенияСвойствОбъектов.Свойство = &Св"+Индекс+"
|";
ПоправкаИндекса = ПоправкаИндекса + 1;
Иначе
Запрос.Текст = Запрос.Текст+
" ВЫБРАТЬ
| ЗначенияСвойствОбъектов.Объект КАК Объект,
| 1 КАК флаг
| ИЗ
| РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
| ГДЕ
| ЗначенияСвойствОбъектов.Свойство = &Св"+Индекс+"
| И ЗначенияСвойствОбъектов.Значение = &Зн"+Индекс+"
|";
КонецЕсли;
Если Владелец<>Неопределено Тогда
Запрос.Текст = Запрос.Текст+"
| И ЗначенияСвойствОбъектов.Объект.Владелец = &Владелец
|";
КонецЕсли;
Запрос.УстановитьПараметр("Св"+Индекс,ЭлКоллекции.Свойство);
Запрос.УстановитьПараметр("Зн"+Индекс,ЭлКоллекции.Значение);
Индекс = Индекс + 1;
КонецЦикла;
Запрос.Текст = Запрос.Текст+
") КАК ПодЗапрос
|
|СГРУППИРОВАТЬ ПО
| ПодЗапрос.Объект
|
|ИМЕЮЩИЕ
| СУММА(ПодЗапрос.флаг) = "+(Индекс-ПоправкаИндекса);
Если Владелец<>Неопределено Тогда
Запрос.УстановитьПараметр("Владелец",Владелец);
КонецЕсли;
Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Объект");
КонецФункции
//am-