Разработка и оптимизация запросов в 1С:Предприятие 8.3. Модуль 4. Использование нескольких таблиц в запросе: вложенные запросы, соединение, объединение

На данной странице задавайте вопросы по материалам и практическому заданию четвертого модуля курса «Разработка и оптимизация запросов в 1С:Предприятие 8.3».

Практические задания

К сожалению, у Вас недостаточно прав для дальнейшего просмотра.

Если Вы приобрели курс, но еще не активировали токен — пожалуйста, активируйте доступ по инструкциям, высланным на Ваш email после покупки.

Если Вы не залогинены на сайте — залогиньтесь, вернитесь на эту страницу и обновите ее.

Если Вы залогинены, у Вас активирован токен доступа, но Вы все равно видите эту запись — напишите нам на e-mail поддержки.

Комментарии / обсуждение (382):

  1. Евгений

    Добрый день!
    Написал запрос по отбору остатков номенклатуры имеющейся на главном складе с выводом остатков на второстепенном складе. Все получилось, но есть два вопроса:
    1. Если в запросе использую например функцию ЕСТЬNULL(ОстаткиСкладПроверяемый.КоличествоСкладПроверяемый, 0) КАК КоличествоСкладПроверяемый, а в секции ГДЕ напишу условие КоличествоСкладПроверяемый = 0, то результат запроса выводит пустой. Насколько понимаю условие ГДЕ работает не на конечное значение функции в выборке, а на исходные данные таблицы, поэтому не отбирает? Как в этом случае правильно установить такой отбор? Решил эту задачу поместив запрос во временную таблицу и уже по ней отобрал значение.
    2. Можно ли что-то сделать чтобы не получать ошибку формирования отчета в случае когда параметр (&НулевойОстаток) не заполнен пользователем и просто не делать никакого отбора? – Создал отчет в СКД и у пользователя есть выбор Да или Нет у этого поля, а если пользователь снимет с него галку, то 1С выводит ошибку “Не задано значение параметра &НулевойОстаток”.

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

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ВТ1.Номенклатура КАК Номенклатура,
        ВТ1.КоличествоСкладОсновной КАК КоличествоСкладОсновной,
        ВТ1.КоличествоСкладПроверяемый КАК КоличествоСкладПроверяемый
    ИЗ
        ВТ1 КАК ВТ1
    ГДЕ
        ВЫБОР
                КОГДА &НулевойОстаток = ИСТИНА
                    ТОГДА ВТ1.КоличествоСкладПроверяемый = 0
                КОГДА &НулевойОстаток = ЛОЖЬ
                    ТОГДА ВТ1.КоличествоСкладПроверяемый <> 0
            КОНЕЦ
    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • Евгений

        1. Понял, учту при разработке.
        2. Да, так и нужно было, чтобы все остатки показывало только на главном складе. Но за пример спасибо).
        3. Ок, спасибо за рекомендацию.
        4. Верно, КоличествоСкладПроверяемый принимает значение NULL, поэтому привел это значение к нулю функцией ЕСТЬNULL, просто для меня было не очевидно что отбор в этом же запросе по нулевому результату этой функции не пройдет.
        5. Логику понял, благодарю)

  2. Алекс Панскихъ

    Добрый день!
    Конструкция [ ВЫБРАТЬ 1 КАК Поле1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1 ] дает 3 записи.
    Конструкция [ ВЫБРАТЬ 1 КАК Поле1 ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1 ] дает 2 записи.
    НО! Конструкция [ ВЫБРАТЬ 1 КАК Поле1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ] дает только 1 запись.
    Исходя из этого, правильно ли думать, что запросы в “движке” объединяются поочередно, и, если слово “ВСЕ” отсутствует, то над промежуточным результатом проводиться операция убора дублей, и именно этим обусловлено то, что в последнем случае не возвращается 2 записи?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

  3. Алекс Панскихъ

    Добрый день. А если при объединении запросов поставить галку “без дублей” на первый запрос (как на скриншоте), это повлияет на что-нибудь?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

  4. Алекс Панскихъ

    Добрый вечер! Тождественны ли понятия “Подзапрос” и “Вложенный запрос”? Если нет, то в чем разница?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

  5. Алекс Панскихъ

    Добрый вечер! Подскажите, можно ли использовать в конструкции [ Поле В ( &Парам1, &Парам2) ] в параметрах массивы или списки значений, то-есть отобрать по значениям из набора массивов, например, или скомбинировать – отобрать по массиву строк и паре строковых значений, т.е. [ Поле В ( &Массив, &Строка1, &Строка2) ]?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

  6. Алексей

    1) к уроку 4.6
    При внутреннем соединении двух таблиц где лучше накладывать условие: в ГДЕ или в ПО ???
    или лучше сначала положить результат отбора с условием в первый пакет запроса, а вторым уже соединять?
    Как вы расставите запросы по производительности и почему?

    Выбрать
    Таблица1.Артикул,
    Таблица2.Артикул
    ИЗ Таблица1
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица2
    ПО Таблица2.Код = Таблица1.Код
    и Таблица1.Наименование ПОДОБНО %Привет%

    или

    Выбрать
    Таблица1.Артикул,
    Таблица2.Артикул
    ИЗ Таблица1
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица2
    ПО Таблица2.Код = Таблица1.Код
    ГДЕ
    Таблица1.Наименование ПОДОБНО %Привет%

    ИЛИ

    Выбрать
    Таблица1.Артикул,
    Таблица1.Код
    ИЗ Таблица1
    ГДЕ
    Таблица1.Наименование ПОДОБНО %Привет%
    ;
    Выбрать
    Таблица1.Артикул,
    Таблица2.Артикул
    ИЗ Таблица1
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица2
    ПО Таблица2.Код = Таблица1.Код

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • Алексей

        Правильно я понимаю, что в первом варианте перед соединением таблица не фильтруется, т.е. по-другому, фильтр по наименованию срабатывает во время соединения?

        Как в данном случае отрабатывают индексы? Порядок полей соединения в идеале должен соответствовать порядку индексов?

        Что лучше использовать? внутреннее соединение или несколько полей в условии ГДЕ ((Поле1, Поле2 В (ВЫБРАТЬ…))

        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

  7. Энвер

    Вопрос по уроку 4.2.02 Соединение в запросах (Декартово произведение).
    В тестах по 1С Профессионал по платформе есть вопрос:
    7.38. Если в конструкторе запроса при использовании нескольких таблиц очистить закладку “Связи” то … правильный ответ “Запрос отработает исходя из логики, которая в нем заложена”.
    Является ли верным заключение, что заложенная логика системой в запросе есть Декартово произведение и в случае если одна из таблиц пустая, результат будет пустым, так как число умноженное на ноль равно нулю?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

  8. stepiva09@mail.ru

    Добрый день! Не открывается консоль запросов для вложенного запроса. Просмотрела вопросы и комментарии к данному разделу. В одном из ответов на аналогичный вопрос преподаватель предложил ссылку для скачивания консоли для 8.2. Скачала, запустила в толстом клиенте, консоль все равно не открывается. через отладку запустила в толстом клиенте, не открывается. Получается, что весь текст запроса надо набирать вручную?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • stepiva09@mail.ru

        У меня 1С:Предприятие 8.3, учебная версия (8.3.18.1128) и Демонстрационная конфигурация “Управляемое приложение”, используемая в видеоуроках. И какой режим совместимости использовать? Скрин приложила. И если все же использовать управляемую консоль, то как в ней на закладке “Связи” добавить еще одну связь по организации (как в видеоуроке 11 модуля 4)?

        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

          • tsefey

            Добрый день! Присоединяюсь к вопросу, не открывается вложенный запрос, скрин ошибки во вложении, тоже Демобаза с сайта итс, платформа 1С:Предприятие 8.3 (8.3.19.1417). пробовала обе консоли, меняла режим совместимости , изначально стоял 8.3.18, пробовала Не использовать, 8.3.17, тонкой, толстый – ничего. Что делать?

            • Василий Ханевич


              (текст комментария доступен только участникам Мастер-группы)

              • tsefey

                Как я понимаю, отчет он просит от меня, на скрине видно. Пока обхожусь конфигуратором.

                • Василий Ханевич


                  (текст комментария доступен только участникам Мастер-группы)

              • tsefey

                Еще такой вопрос. Мы делали доработку кода в консоли для расшифровки пустых ячеек (скрин во вложении), после доработки выходит ошибка при расшифровке ячейки . Что не так?

                • Василий Ханевич


                  (текст комментария доступен только участникам Мастер-группы)

                  • tsefey

                    В толстом вот это выходит, причем с самого начала, до доработки. Это мой второй курс после “21 день”. Перед записью на курс уточняла, хватит ли этого, написали, что хватит, теперь каждый раз выходят ошибки, которые замедляют процесс и которые исправить мне пока не под силу. В каких курсах изучаются данные моменты?

                    • Василий Ханевич


                      (текст комментария доступен только участникам Мастер-группы)

  9. Doremi_2020

    В уроке 4-15 система предложила связь документа и его табличной части по ссылке:
    РасходТовараТовары.Ссылка = РасходТовара.Ссылка
    Связь не понятна, представляла так, что у документа своя ссылка, а у его табличной части – своя, подчинённая ссылке документа. В чём ошибаюсь?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • Doremi_2020

        А как тогда программа понимает на что ссылка: на сам документ или на его табличную часть?

        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

            • Алексей Катеринич


              (текст комментария доступен только участникам Мастер-группы)

  10. almari@bk.ru

    К сожалению, при редактировании произвольного выражения у меня не срабатывает лайфхак с постановкой пробела и открытием отдельного конструктора запроса для написания текста вложенного запроса (см. скриншот). В чём может быть причина? Пробовал консоли запросов для платформы 8.2 и 8.3 с сайта its.1c.ru. Причём, что странно, консоль запросов для платформы 8.2 выглядит не как у Вас, а скорее также, как для платформы 8.3.

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

  11. almari@bk.ru

    Добрый день. Практическое задание №20.
    На мой взгляд итоговый текст запроса можно улучшить. А именно, во вложенном запросе использовать группировку, чтобы в список для сравнения не попадали повторяющиеся ссылки складов:

    ВЫБРАТЬ
        Склады.Наименование КАК Наименование
    ИЗ
        Справочник.Склады КАК Склады
    ГДЕ
        НЕ Склады.Ссылка В
                    (ВЫБРАТЬ
                        ПоступлениеТоваров.Склад КАК Склад
                    ИЗ
                        Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
                    СГРУППИРОВАТЬ ПО
                        ПоступлениеТоваров.Склад)
    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • almari@bk.ru

        А почему ключевое слово РАЗЛИЧНЫЕ никак не повлияло на фактический запрос к базе данных? Неужели оно отрабатывается обработчиком запроса уже после получения выборки из базы данных (как это происходит с конструкцией ИТОГИ … ПО …)?

        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

  12. Рустам

    Я прошел курс. Большое спасибо автору. Есть некоторые пожелания и замечания.
    1. Заменить иностранные слова на русские, например “ОК” на “хорошо”.
    2. Некоторые темы будут непонятны для людей, которые не работали с SQL.
    Это было мое субъективное мнение, надеюсь не обидел, еще раз спасибо.

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • Рустам

        Насколько я понял, в 1С понимание запросов играет решающую роль. Я программировал на Ассемблере, Паскале, С, С++, после этих языков тяжело привыкнуть к синтаксису языка 1С и тем более написанию алгоритмов с использованием запросов, особенно это было показано в 9-м модуле. Без знания запросов не стоит лезть глубже, нужна будет практика, т.е. надо “набить руку”.

        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

  13. Рустам

    Практическое задание 38 скорее всего необходимо для админа?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

  14. Рустам

    COM-соединение, для меня это тема незнакома, и она не проходилась в курсе “Быстрый старт в профессию”

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

  15. Рустам

    В соединениях условие в секции ГДЕ применяется к результирующей таблице, или обрабатывается до самого соединения таблиц и применяется для каждой таблицы отдельно?

    Этот вопрос также касается секции СГРУППИРОВАТЬ.

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

  16. Рустам

    В курсе “Быстрый старт в профессию” Е.Гилёв говорил, что нежелательно использовать вложенные таблицы больше 2-х уровней вложенности, иначе это тормозит работу системы.

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

  17. maxim.saharov

    Query-1Сv8-theory – Страница 123 –

    ВЫБРАТЬ
        РасходТовара.Ссылка.Номер КАК СсылкаНомер,
        ПУСТАЯТАБЛИЦА.( КАК Товар,  КАК Количество) КАК Состав
    ИЗ
        Документ.РасходТовара КАК РасходТовара

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
        РасходТовара.Ссылка.Номер,
        РасходТовара.Товары.(
            Товар,
            Количество
        )
    ИЗ
        Документ.РасходТовара КАК РасходТовара

    тут что то я совсем не понял или я что то пропустил или это дальше будет где то описываться ?
    у меня вопросы – что такое вложенные таблицы ?
    как в конструкторе запроса сделать ПУСТАЯТАБЛИЦА ?
    что это за конструкция – РасходТовара.Ссылка.Номер – ? и как вы ее сделали в конструкторе ?

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • maxim.saharov

        к сожалению ПУСТАЯТАБЛИЦА в конструкторе не отображается – скрин прикрепил

        “РасходТовара.Ссылка.Номер – это разыменование полей в запросе (обращение к подчиненным полям значения ссылочного типа через точку)” – но в данном случии возле слова Ссылка нету плюсика – что бы раскрыть и выбрать Номер(это тоже видно на скрине) – его тоже в ручную нужно писать ?

        и чего вместо РасходТовара.Ссылка.Номер – нельзя выбрать в конструкторе РасходТовара.Номер ? оно доступно для выбора и тоже самое выводит

        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

  18. maxim.saharov

    Query-1Сv8-theory – Страница 120 –
    “По умолчанию при объединении запросов полностью одинаковые строки, сформированные разными запросами, в результате заменяются одной. Если требуется, чтобы были оставлены разные строки, необходимо указать ключевое слово ВСЕ”
    – это опечатка ?
    – ведь даже на видео вашем видно – что когда добавляеш второй запрос – то галка “Без дубликатов” не стоит – соответственно по умолчанию идет не ОБЪЕДИНИТЬ, а ОБЪЕДИНИТЬ ВСЕ. и соответственно по умолчанию не “По умолчанию при объединении запросов полностью одинаковые строки, сформированные разными запросами, в результате заменяются одной” – а все строки остаются, в том числе и строки дубликаты.

    • Василий Ханевич


      (текст комментария доступен только участникам Мастер-группы)

      • maxim.saharov

        я еще раз перечитал и все таки запутанно написано – так как важное здесь слово “По умолчанию” и потом речь идет не про то что по умолчанию в конструкторе происходит а про то что выше в абзаце написано )
        и потом про “необходимо указать ключевое слово ВСЕ” – а по факту как раз ВСЕ уже указанны по умолчанию и нужно включить галку и отключить все).

        • Василий Ханевич


          (текст комментария доступен только участникам Мастер-группы)

Комментарии закрыты