8.х Проверка на вхождение в список в запросе

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

  1. TopicStarter Overlay
    Profaner
    Offline

    Profaner

    Регистрация:
    8 авг 2016
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    1
    Добрый день! Вопрос звучит довольно банально. Получилась заминка при построении запроса.
    Суть: при отборе динамического списка необходимо при определенных событиях устанавливать параметры, чтобы выполнялся отбор по табличной части товаров. В ТЧ есть определенные значения, пользователь делает отбор по списку со значениями аналогичного типа. Условие "В" позволяет проверить вхождение хотя бы одного элемента в список. Возможно ли без соединений проверить, присутствуют ли в ТЧ все элементы из списка? То есть по сути условие в обратную сторону: (&МойСписок) В (ТЧ.НужныйРеквизит) . Таким способом, конечно, нельзя.
    Попытался проиллюстрировать на рисунке свою мысль, я не художник:) v8.jpg
  2. 1с-ник
    Offline

    1с-ник Профессионал в 1С

    Регистрация:
    5 окт 2014
    Сообщения:
    401
    Симпатии:
    68
    Баллы:
    54
    Извини, но я ничего не понял =\.
    Дин. список где расположен и что в нём за запрос? Что за список и как он формируется?
  3. TopicStarter Overlay
    Profaner
    Offline

    Profaner

    Регистрация:
    8 авг 2016
    Сообщения:
    9
    Симпатии:
    0
    Баллы:
    1
    Это совершенно не важно) Ну для общей картины: список динамический, формируется на форме списка справочника номенклатуры в УНФ произвольным запросом. Суть вопроса - можно ли наложить такой отбор в запросе.
    Давайте абстрагируемся от формы.
    Допустим, есть простой запрос:
    Код:
    ВЫБРАТЬ
    *
    ИЗ
    Таблица КАК Таблица
    Где ТабЧастьТаблицы.Реквизит СОДЕРЖИТ ВСЕ ЗНАЧЕНИЯ ИЗ (&СписокЗначений)
    Интересно само условие. Как отобрать только те элементы, в табличной части которых присутствуют все значения из списка/массива, передаваемого параметром.
  4. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.432
    Симпатии:
    325
    Баллы:
    104
    Нужен еще один параметр: количество позиций в переданном списке.

    Тогда так:

    Код:
    ВЫБРАТЬ
       РеализацияТоваровУслугТовары.Ссылка,
       КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Номенклатура) КАК КоличествоПозицийВДокументе,
       СУММА(ВЫБОР
           КОГДА РеализацияТоваровУслугТовары.Номенклатура В (&СписокЗначений)
             ТОГДА 1
           ИНАЧЕ 0
         КОНЕЦ) КАК КоличествоПозицийИзСписка
    
    ИЗ
       Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
    ГДЕ
       РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
    
    СГРУППИРОВАТЬ ПО
       РеализацияТоваровУслугТовары.Ссылка
    
    ИМЕЮЩИЕ
       КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Номенклатура) = СУММА(ВЫБОР
           КОГДА РеализацияТоваровУслугТовары.Номенклатура В (&СписокЗначений)
             ТОГДА 1
           ИНАЧЕ 0
         КОНЕЦ) И
       КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Номенклатура) = &КоличествоПозицийВСпискеЗначений
  5. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.432
    Симпатии:
    325
    Баллы:
    104
    Хотя чет подумал, это не совсем то что нужно.
  6. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.432
    Симпатии:
    325
    Баллы:
    104
    Вот так, без дополнительных параметров:

    Код:
    ВЫБРАТЬ
        РеализацияТоваровУслугТовары.Ссылка КАК Документ,
        КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Номенклатура) КАК КоличествоВДокументе,
        ЗапросКоличество.Количество КАК КоличествоВСписке
    ИЗ
        Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары,
        (ВЫБРАТЬ
            КОЛИЧЕСТВО(Т.Ссылка) КАК Количество
        ИЗ
            Справочник.Номенклатура КАК Т
        ГДЕ
            Т.Ссылка В(&СписокЗначений)) КАК ЗапросКоличество
    ГДЕ
        РеализацияТоваровУслугТовары.Номенклатура В(&СписокЗначений)
        И РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
    
    СГРУППИРОВАТЬ ПО
        РеализацияТоваровУслугТовары.Ссылка,
        ЗапросКоличество.Количество
    
    ИМЕЮЩИЕ
        КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Номенклатура) = ЗапросКоличество.Количество
    1с-ник нравится это.
  7. 1с-ник
    Offline

    1с-ник Профессионал в 1С

    Регистрация:
    5 окт 2014
    Сообщения:
    401
    Симпатии:
    68
    Баллы:
    54
    Супер, спасибо :)
  8. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.685
    Симпатии:
    955
    Баллы:
    204
    Ну через ВТ делается и все

    вот этот запрос во ВТ надо что бы быстрее работал
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары,
    (ВЫБРАТЬ
    КОЛИЧЕСТВО(Т.Ссылка) КАК Количество
    ИЗ
    Справочник.Номенклатура КАК Т
    ГДЕ
    Т.Ссылка В(&СписокЗначений)) КАК ЗапросКоличество
    ГДЕ

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