8.х Определение параметров отбора отчета

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

  1. TopicStarter Overlay
    User
    Offline

    User Опытный в 1С

    Регистрация:
    4 фев 2013
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Здравствуйте! Очень нужна помощь - не могу никак разобраться. Создаю отчет (не СКД), на форме реквизиты отбора: НачальнаяДата, КонечнаяДата, Ответственный. Если в запросе обозначить параметры виртуальной таблицы
    Код:
    ОплатаПоДоговорамОбороты.ДатаДоговора МЕЖДУ &НачальнаяДата И &КонечнаяДата
    и/или
    Код:
    ОплатаПоДоговорамОбороты.ДокументПлатежа.Ответственный = &Ответственный
    , тогда для корректного вывода отчета, все реквизиты на форме должны быть заполнены, поэтому в запросе, как мне кажется надо писать что-то типа:

    Код:
    |        РегистрНакопления.ОплатаПоДоговорам.Обороты(, , Регистратор, "+ПризнакОтбораПоДате+" и/или "+ПризнакОтбораПоОтветственному+") КАК ОплатаПоДоговорамОбороты
    с описанием
    Код:
    Запрос.УстановитьПараметр("НачальнаяДата", НачальнаяДата);
    Запрос.УстановитьПараметр("КонечнаяДата", КонечнаяДата);
    Запрос.УстановитьПараметр("Ответственный", Ответственный);
    ПризнакОтбораПоДате = ?(Не ЗначениеЗаполнено(НачальнаяДата) и Не ЗначениеЗаполнено(КонечнаяДата), "", "ОплатаПоДоговорамОбороты.ДатаДоговора МЕЖДУ &НачальнаяДата И &КонечнаяДата" );
    
    ПризнакОтбораПоОтветственному = ?(Не ЗначениеЗаполнено(Ответственный), "", " ОплатаПоДоговорамОбороты.ДокументПлатежа.Ответственный = &Ответственный" );
      
    .
    Как приавильно присвоить описание временной таблицы, чтобы при формировании отчета, можно было делать отбор по реквизитам не зависимо друг от друга?
  2. nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.984
    Симпатии:
    398
    Баллы:
    104
    Смекаете?
    Код:
    Запрос = Новый Запрос;
    Если ЗначениеЗаполнено(Артикул) Тогда
        тАртикул = " ГДЕ Номенклатура.Артикул = &Артикул ";
        Запрос.УстановитьПараметр("Артикул", Артикул);
    Иначе
        тАртикул = "";
    КонецЕсли;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Номенклатура.Ссылка
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура " + тАртикул + "";
  3. TopicStarter Overlay
    User
    Offline

    User Опытный в 1С

    Регистрация:
    4 фев 2013
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Вопрос в том, что у меня несколько этих переменных:
    Код:
    Если ЗначениеЗаполнено(НачальнаяДата) тогда
            ПризнакОтбораПоДатеН = "ДатаДоговора >= &НачальнаяДата";
            Запрос.УстановитьПараметр("НачальнаяДата", НачальнаяДата);       
        Иначе
            ПризнакОтбораПоДатеН = "";               
        КонецЕсли;
       
        Если ЗначениеЗаполнено(КонечнаяДата) тогда
            ПризнакОтбораПоДатеК = "ДатаДоговора <= &КонечнаяДата";
            Запрос.УстановитьПараметр("КонечнаяДата", КонечнаяДата);
        Иначе
            ПризнакОтбораПоДатеК = "";       
        КонецЕсли;
       
        Если ЗначениеЗаполнено(Ответственный) тогда
            ПризнакОтбораПоОтветственному = "ДокументПлатежа.Ответственный = &Ответственный";
            Запрос.УстановитьПараметр("Ответственный", Ответственный);
        Иначе
            ПризнакОтбораПоОтветственному = "";       
        КонецЕсли;
    А теперь как их всех правильно в запросе разместить?
    Код:
    |    ИЗ
                |        РегистрНакопления.ОплатаПоДоговорам.Обороты(
                |                ,
                |                ,
                |                Регистратор,
                |                "+ПризнакОтбораПоОтветственному+"
                |                "+ПризнакОтбораПоДатеН+"
                |                "+ПризнакОтбораПоДатеК+") КАК ОплатаПоДоговорамОбороты
    
    1С хочет скобочку закрыть сразу после
    Код:
     "+ПризнакОтбораПоОтветственному+"
  4. TODD22
    Online

    TODD22 Профессионал в 1С Команда форума

    Регистрация:
    23 фев 2009
    Сообщения:
    4.759
    Симпатии:
    147
    Баллы:
    104
    В параметрах виртуальных таблиц не надо делать конкатенацию. Просто передавайте как параметр.

    РегистрНакопления.Оплата.Обороты(,,Регистратор,Ответственный = &Ответственный)

    И посмотрите как задаются параметры отбора по дате.
  5. nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.984
    Симпатии:
    398
    Баллы:
    104
    Вот здесь даже я не понял. Чёйто?????? Запрос 1С- это всего лишь текстовая инструкция для языка запросов 1С, который в свою очередь преобразует его в запрос SQL. Так что делайте смело конкатенацию где хотите и как хотите. Делается она по правилам "ВЫБРАТЬ .... " + ИмяПеременной + " дальше текст какой либо ".
  6. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.771
    Симпатии:
    509
    Баллы:
    204
    Постоянно пользуюсь конкатенцией запроса, упрощает работу, проблем не замечал:)
  7. nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.984
    Симпатии:
    398
    Баллы:
    104
    Смотрите как я делаю в таких случаях, может будет удобно. Сначала конструктором создаю текст, который мне нужен АБСОЛЮТНО СО ВСЕМИ ОТБОРАМИ. Потом по одному убираю их в переменные. Их всего лишь через "И" или "ИЛИ" нужно прописать. Ну и фраза "ГДЕ" нужна если просто в условия добавлять. А если в параметры виртуальной таблицы, то ваще лафа, т.к. там нет ГДЕ.
  8. TODD22
    Online

    TODD22 Профессионал в 1С Команда форума

    Регистрация:
    23 фев 2009
    Сообщения:
    4.759
    Симпатии:
    147
    Баллы:
    104
    И тебя не смущает что конкатенацию он пихает в параметры виртуальной таблицы?
    Зачем её туда пихать? Если можно просто не инициализировать параметр при передаче.
  9. nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.984
    Симпатии:
    398
    Баллы:
    104
    Абсолютно не смущает. Если параметр прописан, то его необходимо установить. Либо использовать {} в построителе или СКД.
    User нравится это.
  10. TODD22
    Online

    TODD22 Профессионал в 1С Команда форума

    Регистрация:
    23 фев 2009
    Сообщения:
    4.759
    Симпатии:
    147
    Баллы:
    104
    Так если у него параметры это две даты и ссылочное поле то не проще инициализировать начало периода пустой датой если дата не заполнена, конец периода текущей датой. А ссылочное поле пустой ссылкой.
    Ну и есть ещё функция СтрЗаменить. То же удобно.... с конкатенацией конструктор не работает... на сложных запросах геморно.
  11. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.639
    Симпатии:
    948
    Баллы:
    204
    Делается все как вам сказали либо через конкатенацию строк и добавления нужной строки в запрос
    Либо можно попробовать через необязательное условие в запросе {}
    User нравится это.
  12. TODD22
    Online

    TODD22 Профессионал в 1С Команда форума

    Регистрация:
    23 фев 2009
    Сообщения:
    4.759
    Симпатии:
    147
    Баллы:
    104
    Оно же вроде только для СКД?
  13. nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.984
    Симпатии:
    398
    Баллы:
    104
    Построитель и СКД
    --- Объединение сообщений, 21 май 2015 ---
    Текст запроса можно собрать как угодно. Это просто текст и все.
  14. TopicStarter Overlay
    User
    Offline

    User Опытный в 1С

    Регистрация:
    4 фев 2013
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Проблема решена. Спасибо за внимание!
    Код:
    |        РегистрНакопления.ОплатаПоДоговорам.Обороты(
                |                ,
                |                ,
                |                Регистратор,
                |                ДатаДоговора >= &ДатаНач
                |                    И ДатаДоговора <= &ДатаКон
                |                    И ВЫБОР
                |                        КОГДА &Отв = &Ответ
                |                            ТОГДА НЕ ДокументПлатежа.Ответственный = &Отв
                |                        ИНАЧЕ ДокументПлатежа.Ответственный = &Отв
                |                    КОНЕЦ
                |                    И ВЫБОР
                |                        КОГДА &Ном = &Номен
                |                            ТОГДА НЕ Номенклатура В ИЕРАРХИИ (&Ном)
                |                        ИНАЧЕ Номенклатура В ИЕРАРХИИ (&Ном)
                |                    КОНЕЦ
                |                    И ВЫБОР
                |                        КОГДА &Дог = &Догов
                |                            ТОГДА НЕ Договор = &Дог
                |                        ИНАЧЕ Договор = &Дог
                |                    КОНЕЦ) КАК ОплатаПоДоговорамОбороты
    
            Ответ=Справочники.Пользователи.ПустаяСсылка();
            Запрос.УстановитьПараметр("Ответ", Ответ);
            Отв=Ответственный;
            Запрос.УстановитьПараметр("Отв", Отв);
          
            Номен="";
            Запрос.УстановитьПараметр("Номен", Номен);
            Ном=Номенклатура;
            Запрос.УстановитьПараметр("Ном", Ном);
          
            Догов=Справочники.ДоговорыКонтрагентов.ПустаяСсылка();
            Запрос.УстановитьПараметр("Догов", Догов);
            Дог=Договор;
            Запрос.УстановитьПараметр("Дог", Дог);
    Последнее редактирование: 21 май 2015
  15. nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.984
    Симпатии:
    398
    Баллы:
    104
    Что это за хрень? Почему Вы не делаете так как Вам сказали?
  16. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.639
    Симпатии:
    948
    Баллы:
    204
    Да не ругайся
    кстати да -тупанул необязательное условие можно было написать типа
    |Где
    |ВЫБОР
    | КОГДА &Ном <>Значение(Справочники.номенклатура.ПустаяСсылка)
    | ТОГДА Номенклатура В ИЕРАРХИИ (&Ном)
    | ИНАЧЕ Истина
    | КОНЕЦ

    Чтото старею
    --- Объединение сообщений, 21 май 2015 ---
    Сам же недавно чуваку писал данный пример на связи по условию
  17. TopicStarter Overlay
    User
    Offline

    User Опытный в 1С

    Регистрация:
    4 фев 2013
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Как бы я рада была написать "не хрень", если бы только она работала, но нет!
    Код:
     |    {ГДЕ
                |        ОплатаПоДоговорамОбороты.ДокументПлатежа.Ответственный = &Ответственный
                |         И ОплатаПоДоговорамОбороты.Договор = &Договор
                |         И ОплатаПоДоговорамОбороты.Номенклатура = &Номенклатура}
    
    Запрос.УстановитьПараметр("Договор", Договор);
        Запрос.УстановитьПараметр("Ответственный", Ответственный);
        Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    Ни один параметр отбора не работает, выводится весь список из регистра, хоть тресни! Кто-нибудь знает почему?
  18. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.639
    Симпатии:
    948
    Баллы:
    204
    Напишите через Выбор как я Вам говорю.
  19. TopicStarter Overlay
    User
    Offline

    User Опытный в 1С

    Регистрация:
    4 фев 2013
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Если пишу
    Код:
    |    ГДЕ
                |ВЫБОР
                | КОГДА &Номенклатура <>Значение(Справочники.номенклатура.ПустаяСсылка)
                | ТОГДА ОплатаПоДоговорамОбороты.Номенклатура В ИЕРАРХИИ (&Номенклатура)
                | ИНАЧЕ Истина
                | КОНЕЦ
                |ВЫБОР
                | КОГДА &Ответственный <>Значение(Справочники.Пользователи.ПустаяСсылка)
                | ТОГДА ОплатаПоДоговорамОбороты.ДокументПлатежа.Ответственный В ИЕРАРХИИ (&Ответственный)
                | ИНАЧЕ Истина
                | КОНЕЦ
                 |ВЫБОР
                | КОГДА &Договор <>Значение(Справочники.ДоговорыКонтрагентов.ПустаяСсылка)
                | ТОГДА ОплатаПоДоговорамОбороты.Договор В ИЕРАРХИИ (&Договор)
                | ИНАЧЕ Истина
                | КОНЕЦ
    Выходит ошибка
    Ошибка при вызове метода контекста (Выполнить)
    ВыборкаНомер = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    по причине:
    {(75, 33)}: Неверные параметры "Справочники.номенклатура.ПустаяСсылка"
    КОГДА &Номенклатура <>Значение(<<?>>Справочники.номенклатура.ПустаяСсылка)
  20. nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.984
    Симпатии:
    398
    Баллы:
    104
    Конструктор запроса избавит Вас от таких нелепых ошибок
    Значение(Справочник.Номенклатура.ПустаяСсылка)
    User нравится это.

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