8.х Необязательные параметры в запросе

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

  1. TopicStarter Overlay
    OXED
    Offline

    OXED Опытный в 1С

    Регистрация:
    10 апр 2012
    Сообщения:
    256
    Симпатии:
    0
    Баллы:
    26
    Добрый день
    Задача казалось бы банальна и проста, но уже 2й день мне никак не дается.
    Есть простенький запрос:
    Код:
    ВЫБРАТЬ
        Партнеры.Ссылка КАК Партнер,
        Контрагенты.Ссылка КАК Контрагент,
        ДоговорыКонтрагентов.Ссылка КАК Договор
    ИЗ
        Справочник.Партнеры КАК Партнеры
            ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
                ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
                ПО Контрагенты.Ссылка = ДоговорыКонтрагентов.Контрагент
            ПО Партнеры.Ссылка = Контрагенты.Партнер
    ГДЕ
        Партнеры.Ссылка = &Партнер
    {ГДЕ
        (Контрагенты.Ссылка = &Контрагент)}
    Необходимо чтобы в зависимости от того заполнен параметр "Контрагент" или не заполнен, условие в запросе включалось или не включалось. Перелазив по куче форумов, синтаксис помощнику и первым десяти страницам гугла смог откопать только информацию о том, что нужно пользоваться неким построителем запроса. Что это такое и как им пользоваться не понимаю упорно. Везде пишут "все что в скобках само игнорируется, если не заполнен параметр". У меня, даже с заполненным параметром, часть в фигурных скобках упорно игнорируется. Вопросов два:
    1. Как включать или выключать условие в фигурных скобках? Если программно, то где это делается? Если в конструкторе запросов я галку какую-то забыл, то прошу знающих подсказать.
    2. Простая консоль запросов должна реагировать на эту конструкцию или нет? Сейчас консоль пропускает кусок в фигурных скобках

    Заранее спасибо за помощь
  2. Draco
    Online

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.644
    Симпатии:
    948
    Баллы:
    204
    этот запрос гжде используете? в модуле или в СКД или в построителе?
  3. TopicStarter Overlay
    OXED
    Offline

    OXED Опытный в 1С

    Регистрация:
    10 апр 2012
    Сообщения:
    256
    Симпатии:
    0
    Баллы:
    26
    Есть внешняя обработка. В обработке создан макет СКД. В СКД запрос. В модуле обработки я вывожу результат в табличный документ на форму
  4. n.s.gnedash
    Offline

    n.s.gnedash Опытный в 1С Команда форума

    Регистрация:
    15 авг 2010
    Сообщения:
    1.359
    Симпатии:
    5
    Баллы:
    29
    Код:
    ВЫБРАТЬ
        Спр.Ссылка
    ИЗ
        Справочник.Контрагенты КАК Спр
    ГДЕ
        ВЫБОР
                КОГДА &Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
                    ТОГДА ИСТИНА
                ИНАЧЕ Спр.Ссылка = &Контрагент
            КОНЕЦ
    
    ну вот так запрос должен отработать (я не проверял)
  5. TopicStarter Overlay
    OXED
    Offline

    OXED Опытный в 1С

    Регистрация:
    10 апр 2012
    Сообщения:
    256
    Симпатии:
    0
    Баллы:
    26
    Спасибо за идею, но такой вариант не подходит. Мне необходимо разобраться именно с фигурными скобками и неким "построителем"
  6. Draco
    Online

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.644
    Симпатии:
    948
    Баллы:
    204
    Ну фигурные скобки у вас есть. а на вкладке параметры у Вас параметр контрагент есть?
  7. TopicStarter Overlay
    OXED
    Offline

    OXED Опытный в 1С

    Регистрация:
    10 апр 2012
    Сообщения:
    256
    Симпатии:
    0
    Баллы:
    26
    Снимок.JPG
    Да, есть. Я эти параметры заполняю программно в модуле объекта, но фильтр по контрагенту упорно не отрабатывает
    Снимок2.JPG
  8. Draco
    Online

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.644
    Симпатии:
    948
    Баллы:
    204
    Если программно не устнавливать, то у Вас данный запрос все же ок отрабатывает - правильно?
    --- Объединение сообщений, 23 сен 2015 ---
    Прост я думаю что Вам параметры сделать перед тем как КомппановщикМакета.Выполнить()
  9. TopicStarter Overlay
    OXED
    Offline

    OXED Опытный в 1С

    Регистрация:
    10 апр 2012
    Сообщения:
    256
    Симпатии:
    0
    Баллы:
    26
    Нет, запрос игнорирует условие в фигурных скобках, независимо от того заполнен параметр или нет. В этом и проблема
  10. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    this
  11. TopicStarter Overlay
    OXED
    Offline

    OXED Опытный в 1С

    Регистрация:
    10 апр 2012
    Сообщения:
    256
    Симпатии:
    0
    Баллы:
    26
    Сделал. Не помогло. По партнеру фильтрует, по контрагенту нет
    --- Объединение сообщений, 23 сен 2015 ---
    Такое ощущение, что конструкция в фигурных скобках должна как-то включаться. Потому что сейчас значение и заполненность параметра никак не влияют на результат
  12. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    ПараметрТакой-то.Использование = Истина;
    ?
  13. TopicStarter Overlay
    OXED
    Offline

    OXED Опытный в 1С

    Регистрация:
    10 апр 2012
    Сообщения:
    256
    Симпатии:
    0
    Баллы:
    26
    Заметил, что если в конструкторе СКД, на вкладке "параметры" в колонке "использование" поставить значение "всегда", то
    Да, оба параметра включены
  14. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    OXED - код дайте. Не скрином.
  15. Draco
    Online

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.644
    Симпатии:
    948
    Баллы:
    204
    У меня все ок

    Вложения:

  16. TopicStarter Overlay
    OXED
    Offline

    OXED Опытный в 1С

    Регистрация:
    10 апр 2012
    Сообщения:
    256
    Симпатии:
    0
    Баллы:
    26
    Процедура
    Код:
    &НаСервере
    Процедура СформироватьСписокОснований(ПараметрыОтчета) Экспорт
    
        ЭтотОбъект.СписокОснований.Очистить();
    
        СКД = ПолучитьМакет("Макет");
        СКД.Параметры.Партнер.Значение = ПараметрыОтчета.Партнер;
        СКД.Параметры.Контрагент.Значение = ПараметрыОтчета.Контрагент;
        КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
        МакетКомпоновки = КомпоновщикМакета.Выполнить(СКД, СКД.НастройкиПоУмолчанию,);
    
        ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
        ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);
    
        ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
        ПроцессорВывода.УстановитьДокумент(ЭтотОбъект.СписокОснований);
        ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
      
    КонецПроцедуры
    
    Запрос:
    Код:
    ВЫБРАТЬ
        Партнеры.Ссылка КАК Партнер,
        Контрагенты.Ссылка КАК Контрагент,
        ДоговорыКонтрагентов.Ссылка КАК Договор
    ИЗ
        Справочник.Партнеры КАК Партнеры
            ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
                ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
                ПО Контрагенты.Ссылка = ДоговорыКонтрагентов.Контрагент
            ПО Партнеры.Ссылка = Контрагенты.Партнер
    ГДЕ
        Партнеры.Ссылка = &Партнер
    {ГДЕ
        (Контрагенты.Ссылка = &Контрагент)}
    Чуть-чуть подправил заполнение параметров. Поиск по наименованию заменил на передачу ссылку. Правда ничего не изменилось
    Последнее редактирование: 23 сен 2015
  17. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Код:
    &НаСервере
    Процедура СформироватьСписокОснований(ПараметрыОтчета) Экспорт
    
        ЭтотОбъект.СписокОснований.Очистить();
    
        СКД = ПолучитьМакет("Макет");
    КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
    КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СКД));
    КомпоновщикНастроек.ЗагрузитьНастройки(СКД.НастройкиПоУмолчанию);
    
    ПараметрПартнер = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый  ПараметрКомпоновкиДанных("Партнер"));
    ПараметрПартнер.Использование = Истина;
    ПараметрПартнер.Значение = Справочники.Партнеры.НайтиПоНаименованию(ПараметрыОтчета.Партнер);
    
    ПараметрКонтрагент = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Контрагент"));
    ПараметрКонтрагент.Использование = Истина;
    ПараметрКонтрагент.Значение = Справочники.Контрагенты.НайтиПоНаименованию(ПараметрыОтчета.Контрагент);
    
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СКД, КомпоновщикНастроек.Настройки);
    
    
    
        ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
        ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);
    
        ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
        ПроцессорВывода.УстановитьДокумент(ЭтотОбъект.СписокОснований);
        ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
     
    КонецПроцедуры
  18. TopicStarter Overlay
    OXED
    Offline

    OXED Опытный в 1С

    Регистрация:
    10 апр 2012
    Сообщения:
    256
    Симпатии:
    0
    Баллы:
    26
    Спасибо, сейчас попробую
    --- Объединение сообщений, 23 сен 2015 ---
    Если у меня оба параметра заполнены, то все отлично. А если у меня контрагент не заполнен, то результат пустой, поскольку сравнивается с пустым значением, а необходимо чтобы при пустом параметре условие сравнения по контрагенту отключалось
    --- Объединение сообщений, 23 сен 2015 ---
    Возможно я не правильно понимаю принцип работы вот этого механизма:
    Код:
    {ГДЕ
        (Контрагенты.Ссылка = &Контрагент)}
    Насколько я правильно понял гугл и документацию - в момент выполнения запроса проверяется заполненность параметра и если он заполнен, то вся конструкция работает. Если не заполнен, то конструкция игнорируется. Или я ошибся?
  19. Draco
    Online

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.644
    Симпатии:
    948
    Баллы:
    204
    Прикрепите Ваш отчет
  20. TopicStarter Overlay
    OXED
    Offline

    OXED Опытный в 1С

    Регистрация:
    10 апр 2012
    Сообщения:
    256
    Симпатии:
    0
    Баллы:
    26
    Смог найти вот такое решение проблемы:
    Код:
        Построитель = Новый ПостроительЗапроса;
        Построитель.Текст =
            "ВЫБРАТЬ
            |    Партнеры.Ссылка КАК Партнер,
            |    Контрагенты.Ссылка КАК Контрагент,
            |    ДоговорыКонтрагентов.Ссылка КАК Договор
            |ИЗ
            |    Справочник.Партнеры КАК Партнеры
            |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
            |            ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
            |            ПО Контрагенты.Ссылка = ДоговорыКонтрагентов.Контрагент
            |        ПО Партнеры.Ссылка = Контрагенты.Партнер
            |ГДЕ
            |    Партнеры.Ссылка = &Партнер
            |{ГДЕ
            |    Контрагенты.Ссылка.* КАК Контрагент}";
           
            Если ЗначениеЗаполнено(ПараметрыОтчета.Контрагент) Тогда
                Построитель.Отбор.Добавить("Контрагент");
                Построитель.Отбор.Контрагент.Значение = ПараметрыОтчета.Контрагент;
                Построитель.Отбор.Контрагент.ВидСравнения = ВидСравнения.Равно;
                Построитель.Отбор.Контрагент.Использование = Истина;
            КонецЕсли;
           
            Построитель.Параметры.Вставить("Партнер",ПараметрыОтчета.Партнер);
           
            Построитель.Выполнить();
            Результат = Построитель.Результат;
    
    И потом этот текст запроса после команды "Построитель.Выполнить()" передается в СКД.
    Причем стоит отметить важный момент. Отбор, который тут используется, это не просто фильтр наложенный на огромную таблицу, которая была чуть ранее прочитала запросом. Отбор сначала "включает" вот это самое условие в фигурных скобках и в момент отправки запроса на сервер в тексте уже есть оба условия и результат запроса возвращается уже отфильтрованный. По крайней мере если верить профайлеру SQL сервера.
    --- Объединение сообщений, 23 сен 2015 ---
    Огромное спасибо всем за помощь и потраченное время
Похожие темы
  1. Lugano
    Ответов:
    3
    Просмотров:
    816
Загрузка...

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