Имя: Пароль:
1C
1С v8
Запрос для осуществления расширенного поиска по всем или нескольким реквизитам
0 Jane_792
 
19.12.14
14:22
Добрый день!
Делаю такой запрос:

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               |    ЛичноеДело.Ссылка,
               |    ЛичноеДело.Номер,
               |    ЛичноеДело.Фамилия КАК Фамилия,
               |    ЛичноеДело.Имя КАК Имя,
               |    ЛичноеДело.Отчество КАК Отчество,
               |    ЛичноеДело.ДатаРождения
               |ИЗ
               |    Документ.ЛичноеДело КАК ЛичноеДело
               |ГДЕ
               |    (ЛичноеДело.Фамилия = &Фамилия
               |            ИЛИ ЛичноеДело.Имя = &Имя
               |            ИЛИ ЛичноеДело.Отчество = &Отчество)";

Запрос.УстановитьПараметр("Фамилия",ЭлементыФормы.Фамилия.Значение );
Запрос.УстановитьПараметр("Имя",ЭлементыФормы.Имя.Значение );
Запрос.УстановитьПараметр("Отчество",ЭлементыФормы.Отчество.Значение );



Результат = Запрос.Выполнить();
    ЭлементыФормы.ТабличноеПоле1.Значение = Результат.Выгрузить();
    ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();

Работает некорректно, выдает списки по всем имеющимся реквизитам, будто бы по отдельности, не учитывая, какие еще поля ввода заполнены.
Меняла "или" на "и", но тогда чтобы получить результат запроса, нужно вводить абсолютно все данные необходимые для поиска.

Как можно осуществить поиск одновременно и по всем и по нескольким реквизитам (расширенный поиск)?  Версия 1С 8.1
1 dk
 
19.12.14
14:28
формируй текст запроса динамически
если значениезаполнено() тогда
....
2 sapphire
 
19.12.14
14:30
(0) Это чегтовски ужасно ибо:
- даже у "ПостроительОтчета" есть Отбор
- у компоновки такожде можно использовать отбор
3 Jane_792
 
19.12.14
14:47
(2) я не умею пользоваться отбором, потому и спрашиваю здесь.
нашла вот такую статью, но она для старшей версии 1с, чем у меня.
4 Jane_792
 
19.12.14
14:47
(1) а подробнее можно?
5 тарам пам пам
 
19.12.14
16:11
Я обычно так делаю, если условий немного и лень заморачиваться с построителем запроса:

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               |    ЛичноеДело.Ссылка,
               |    ЛичноеДело.Номер,
               |    ЛичноеДело.Фамилия КАК Фамилия,
               |    ЛичноеДело.Имя КАК Имя,
               |    ЛичноеДело.Отчество КАК Отчество,
               |    ЛичноеДело.ДатаРождения
               |ИЗ
               |    Документ.ЛичноеДело КАК ЛичноеДело
               |ГДЕ
               |    (&УсловиеФамилия
               |            И &УсловиеИмя
               |            И &УсловиеОтчество)";

Запрос.УстановитьПараметр("Фамилия",ЭлементыФормы.Фамилия.Значение );
Запрос.УстановитьПараметр("Имя",ЭлементыФормы.Имя.Значение );
Запрос.УстановитьПараметр("Отчество",ЭлементыФормы.Отчество.Значение );

УсловиеФамилия = ?(ЗначениеЗаполнено(Фамилия), "ЛичноеДело.Фамилия = &Фамилия", "ИСТИНА");
УсловиеИмя     = ?(ЗначениеЗаполнено(Имя), "ЛичноеДело.Имя = &Имя", "ИСТИНА");
УсловиеОтчество= ?(ЗначениеЗаполнено(Отчество), "ЛичноеДело.Отчество = &Отчество", "ИСТИНА");

Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеФамилия", УсловиеФамилия);
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеИмя", УсловиеИмя);
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеОтчество", УсловиеОтчество);
6 mikecool
 
19.12.14
16:14
(4) почитай про скд
7 mikecool
 
19.12.14
16:17
+6 вот пример
    СхемаКомпоновкиДанных = ПолучитьМакетРасшифровки();
    Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
    //добавление отборов
    Отбор1 = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    Отбор1.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    Отбор1.Использование = Истина;
    Отбор1.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура");
    Отбор1.ПравоеЗначение = пНоменклатура;
    
    Отбор1 = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    Отбор1.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    Отбор1.Использование = Истина;
    Отбор1.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Характеристика");
    Отбор1.ПравоеЗначение = пХарактеристика;
    
    Отбор1 = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    Отбор1.Использование = Истина;
    Отбор1.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Склад");
    Если пСклад = Неопределено Тогда
        Отбор1.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
        Отбор1.ПравоеЗначение = СписокСкладов;
    Иначе
        Отбор1.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
        Отбор1.ПравоеЗначение = пСклад;
    КонецЕсли;
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки);
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , );
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ТабДокумент = Новый ТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ТабДокумент);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);    
    
    ТабДокумент.ОтображатьСетку = Ложь;
    ТабДокумент.ОтображатьЗаголовки = Ложь;
    Возврат ТабДокумент;
8 Михаил Козлов
 
19.12.14
17:47
Мне кажется, проще всего построителем отчета: вывести отбор на форму и все. Правда, логика будет "И".
9 mikecool
 
19.12.14
17:48
(8) вот! а скд может и или или ))
10 Михаил Козлов
 
19.12.14
17:53
(9) С необходимостью "ИЛИ" ни разу не сталкивался.
2 + 2 = 3.9999999999999999999999999999999...