8.х Как добавить параметры запроса?

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Venturion, 1 июл 2008.

  1. TopicStarter Overlay
    Venturion
    Offline

    Venturion

    Регистрация:
    3 апр 2008
    Сообщения:
    21
    Симпатии:
    0
    Баллы:
    1
    Документ, в нем создана табличная часть со списком элементов.

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


    Пример:

    Код:
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |	ГруппыФильтров.Группа КАК Группа,
    |ИЗ
    |	РегистрСведений.ГруппыФильтров КАК ГруппыФильтров
    |ГДЕ
    |	Группа = &ФильтрЗапроса
    |";
    
    Для Каждого ФильтрГрупп Из Группы Цикл
    Запрос.УстановитьПараметр("ФильтрЗапроса", ФильтрГрупп.Группа);
    КонецЦикла;
    
    Группы табличная часть ...
    В Установить параметр попадает последнее а как все добавить? чтоб еще и в запросе |Где туда поже все попадали.
  2. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Код:
    "|ГДЕ
    |    Группа В (&ФильтрЗапроса)"
    
    ФильтрЗапроса должен быть массивом.


    ЗЫ. В справке, кстати, написано
  3. tugrik
    Offline

    tugrik Опытный в 1С

    Регистрация:
    18 июн 2008
    Сообщения:
    77
    Симпатии:
    0
    Баллы:
    26
    Как вариант можно сделать цикл по табличной части и в нем добавлять в запрос условие (так часто в типовой делается, но не для табличной части). Если правильно тебя понял, то где-то так, не тестил и могу ошибаться:

    Код:
    Запрос = Новый Запрос;
    ТекстЗапроса = "ВЫБРАТЬ
    | ГруппыФильтров.Группа КАК Группа,
    |ИЗ
    | РегистрСведений.ГруппыФильтров КАК ГруппыФильтров";
    
    Если Док.Элементы.Количество >0 тогда
    ТекстЗапроса = ТекстЗапроса+Символы.ПС+"| Где";
    Для каждого СтрокаТаб из Док.Группы цикл
    ТекстЗапроса = ТекстЗапроса+Символы.ПС+"| Группа = "+СтрокаТаб;
    КонецЦикла;
    КонецЕсли;
    
    Запрос.Текст = ТекстЗапроса;
    
    
    
    Исправлено: текст запроса подкорректировал:)

    Хотя правильнее конечно сделать массивом... Одно условие по идее должно быстрее работать, да и некрасиво получается. Такой механизм хорощо использовать для динамического формирования выходных полей или сложных условий че-нить еще. Для простых условий есть массивы.
  4. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Есть такое ограничение в MSSQL, как не более 38 условий ГДЕ на одну таблицу
  5. TopicStarter Overlay
    Venturion
    Offline

    Venturion

    Регистрация:
    3 апр 2008
    Сообщения:
    21
    Симпатии:
    0
    Баллы:
    1
    Ладно с массивом разобрался

    Код:
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |    ГруппыФильтров.Объект КАК Объект,
    |    ГруппыФильтров.Группа КАК Группа,
    |ИЗ
    |    РегистрСведений.ГруппыФильтров КАК ГруппыФильтров
    |ГДЕ
    |    Группа В (&ФильтрЗапроса)
    |";
    
    ФильтрМассив = Новый Массив;
    Для Каждого ФильтрГрупп Из Группы Цикл
    ФильтрМассив.Добавить(ФильтрГрупп.Группа);
    КонецЦикла;
    
    Запрос.УстановитьПараметр("ФильтрЗапроса", ФильтрМассив);
    
    Результат = Запрос.Выполнить().Выбрать();
    
    А как добавить условие чтоб отбирало те объекты, элементы массива которых есть у объекта

    например

    Объект 1, фильтр1
    Объект 2, фильтр4
    Объект 3, фильтр1
    Объект 3, фильтр4

    Задали в группы 2 элемента фильтра 1 и 4 и чтоб только Объект 3 попал в результат?
  6. tugrik
    Offline

    tugrik Опытный в 1С

    Регистрация:
    18 июн 2008
    Сообщения:
    77
    Симпатии:
    0
    Баллы:
    26
    неа, наскоко помню табличная часть это таблица значений?.

    кстати, а никто не пробовал задать больше 38 условий на таблицу? что на это скажет платформа? помнится говорили мне, что в ней есть оптимайзер, который переформировывает запрос, а потом разбивает его на подзапросы. Т.е. возможно все будет очень долго работать, но будет!
  7. tugrik
    Offline

    tugrik Опытный в 1С

    Регистрация:
    18 июн 2008
    Сообщения:
    77
    Симпатии:
    0
    Баллы:
    26
    как простейший вариант сделать этот запрос вложенным, и забабахать в нем свертку с вычислением количества строк. а во внешнем оставить только те записи, у которых число строк получилось равным величине массива. Грубо, но первое, что пришло в голову. Наверняка можно более изящно сделать.
  8. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Если вы нарисуете, что хотите получить - будет проще.
    А то я что-то потерял суть..
  9. tugrik
    Offline

    tugrik Опытный в 1С

    Регистрация:
    18 июн 2008
    Сообщения:
    77
    Симпатии:
    0
    Баллы:
    26
    по моему у него есть регистр с множеством полей. и есть табличное поле, куда пользователь накидывает поля, которые обязательно должны присутствовать в отбираемых записях одновременно.

    Т.е. запись включается в выборку только если в ней есть все поля из указанных в табличном поле. Если хоть одного поля нет, то запись отбрасывается.
  10. TopicStarter Overlay
    Venturion
    Offline

    Venturion

    Регистрация:
    3 апр 2008
    Сообщения:
    21
    Симпатии:
    0
    Баллы:
    1
    Есть регистр сведений. Измерения Объект и Группа = Спр.Группы ресурс Фильтр = булево.

    Есть в документе табл. часть Группы с реквизитом группа = Спр.Группы, в нее выбирают группы по которым нужно отобрать данные.

    Например ввели в ТЧ Фильтр1 и Фильтр3 ... из регистра отобральсь те Объекты у которых есть и 1 и 3
  11. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Я не очень понял - зачем еще ресурс Фильтр?

    А так - простой запрос, где выбираются все объекты и "Группа В(&МассивГрупп)"
  12. tugrik
    Offline

    tugrik Опытный в 1С

    Регистрация:
    18 июн 2008
    Сообщения:
    77
    Симпатии:
    0
    Баллы:
    26
    по-моему как раз "В" выбирает если есть хоть одно вхождение, а надо чтобы выбирались только те, у кого найдены все вхождения.
  13. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Блин, вот теперь я понял, что нужно.

    Нарисовал бы так структуру и понятно было сразу, как выглядит РС.
    Измерения:
    Объект
    Группа
    Ресурс:
    Фильтр

    ---

    Попробую порыться - где-то я делал такое....
  14. TopicStarter Overlay
    Venturion
    Offline

    Venturion

    Регистрация:
    3 апр 2008
    Сообщения:
    21
    Симпатии:
    0
    Баллы:
    1
    Ну как поиск а то мне что то не приходит в голову как в запрос такое написать...
  15. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Упс.... :) Забыл про обещание :)
    Сорри, постараюсь не забыть и к вечеру найти

Поделиться этой страницей