Имя: Пароль:
1C
 
полное совпадение таблиц
0 Dom26
 
06.12.17
16:23
естьмассив справочников А, и Есть справочник Б где ТЧ из Элементов Спр А, как проще всего запросом найти Элемент Б, где список точно совпадает с Массивом А (ни больше ни меньше)
1 Петрович 2018
 
06.12.17
16:25
(0) Запросом жеж!
2 Dom26
 
06.12.17
16:26
(1) так а как проще всего?
3 Ц_У
 
06.12.17
16:27
(2) так и говори, напишите за меня запрос
4 Dom26
 
06.12.17
16:29
(3) я могу написать, но че то больно мудрено выходит, в кучу пакетов
5 Ц_У
 
06.12.17
16:32
(4) покажи, а мы посмотрим
6 Serg_1960
 
06.12.17
16:35
(4) Sorry, но Вы тоже заумно-мудрёно мысли свои излагаете. Расшифруйте, например, непонятно-двоякосмысловое словосочетание "массив массив справочников А"?
Если подключить присущую мне в полной мере интуицию, то вероятно это "массив [записей] справочника[ед.ч] А"?
7 Ildarovich
 
06.12.17
22:54
Вот на примере справочника "Контрагенты" (Как справочник Б). Приведенным запросом находятся контрагенты, у которых в табличной части имеются менеджеры из справочника "Пользователи" (Справочник А), список которых точно определен массивом &Массив. Требуется заранее определить размер массива и передать его в параметр &МассивКоличество.ВЫБРАТЬ
    Менеджеры.Ссылка
ИЗ
    Справочник.Контрагенты.МенеджерыПокупателя КАК Менеджеры
ГДЕ
    Менеджеры.МенеджерПокупателя В(&Массив)
СГРУППИРОВАТЬ ПО
    Менеджеры.Ссылка
ИМЕЮЩИЕ
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Менеджеры.МенеджерПокупателя) = &МассивКоличество
8 Tateossian
 
06.12.17
23:23
(4) Если отбросить из примера виртуальные таблицы, получается два. Можно вложенными запросами.



ВЫБРАТЬ
    "ТЧЭлементА" КАК ЭлементОтбора
ПОМЕСТИТЬ МассивОтбора

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

ВЫБРАТЬ
    "ТЧЭлементБ"

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

ВЫБРАТЬ
    "ТЧЭлементВ"
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    "ШапкаА" КАК СсылкаА,
    "ТЧЭлементА" КАК ЭлементТЧ
ПОМЕСТИТЬ ВиртСправочник

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

ВЫБРАТЬ
    "ШапкаА",
    "ТЧЭлементБ"

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

ВЫБРАТЬ
    "ШапкаА",
    "ТЧЭлементВ"

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

ВЫБРАТЬ
    "ШапкаБ",
    "ТЧЭлементА"

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

ВЫБРАТЬ
    "ШапкаБ",
    "ТЧЭлементГ"
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВиртСправочник.СсылкаА
ПОМЕСТИТЬ НеУдовлетворяющие
ИЗ
    МассивОтбора КАК МассивОтбора
        ПОЛНОЕ СОЕДИНЕНИЕ ВиртСправочник КАК ВиртСправочник
        ПО (ВиртСправочник.ЭлементТЧ = МассивОтбора.ЭлементОтбора)
ГДЕ
    МассивОтбора.ЭлементОтбора ЕСТЬ NULL

СГРУППИРОВАТЬ ПО
    ВиртСправочник.СсылкаА
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВиртСправочник.СсылкаА КАК Отобранные
ИЗ
    ВиртСправочник КАК ВиртСправочник
        ЛЕВОЕ СОЕДИНЕНИЕ НеУдовлетворяющие КАК НеУдовлетворяющие
        ПО ВиртСправочник.СсылкаА = НеУдовлетворяющие.СсылкаА
ГДЕ
    НеУдовлетворяющие.СсылкаА ЕСТЬ NULL

СГРУППИРОВАТЬ ПО
    ВиртСправочник.СсылкаА



Можешь этот вариант проверить. Концептуально делаешь полное соединение, выбираешь те ссылки справочника, у которых есть NULL (то есть, не все совпали). Затем полученное множество соединяешь со всем справочником, удаляя элементы предыдущего подзапроса (исключая, то есть). Останутся нужные.
9 Tateossian
 
06.12.17
23:31
(8) Погоди, еще одна проверка нужна, если все элементы целевого справочника лежат в массиве. Не работает в этом случае.
10 Лефмихалыч
 
06.12.17
23:48
ВЫБРАТЬ А.а, Б.б
ИЗ А полное соединение Б по А.а=Б.б
ГДЕ
А.а есть null
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ А.а, Б.б
ИЗ А полное соединение Б по А.а=Б.б
ГДЕ
Б.б есть null


Если этот запрос что-то вернул, значит таблицы не совпадают.

Можно вместо объединения ИЛИ, но на взрослых данных это ИЛИ может угондонить производительность запроса.
11 Tateossian
 
07.12.17
00:22
(10) Да, тоже потом понял ошибку - нужно декартово произведение

Для моего варианта будет выглядеть так (чтобы без ИЛИ)

ВЫБРАТЬ РАЗЛИЧНЫЕ
    МассивОтбора.ЭлементОтбора,
    ВиртСправочник.СсылкаА
ПОМЕСТИТЬ ВсеИскомые
ИЗ
    МассивОтбора КАК МассивОтбора,
    ВиртСправочник КАК ВиртСправочник
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВиртСправочник.СсылкаА СсылкаРезульт
ИЗ
    ВиртСправочник КАК ВиртСправочник
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            ВЗ.СсылкаА КАК СсылкаА,
            ВЗ.ЭлементТЧ КАК ЭлементТЧ,
            СУММА(ВЗ.Рез) КАК Рез
        ИЗ
            (ВЫБРАТЬ
                ВиртСправочник.СсылкаА КАК СсылкаА,
                ВиртСправочник.ЭлементТЧ КАК ЭлементТЧ,
                1 КАК Рез
            ИЗ
                ВиртСправочник КАК ВиртСправочник
            
            ОБЪЕДИНИТЬ ВСЕ
            
            ВЫБРАТЬ
                ВсеИскомые.СсылкаА,
                ВсеИскомые.ЭлементОтбора,
                -1
            ИЗ
                ВсеИскомые КАК ВсеИскомые) КАК ВЗ
        
        СГРУППИРОВАТЬ ПО
            ВЗ.СсылкаА,
            ВЗ.ЭлементТЧ
        
        ИМЕЮЩИЕ
            СУММА(ВЗ.Рез) <> 0) КАК ВЗ
        ПО ВиртСправочник.СсылкаА = ВЗ.СсылкаА
ГДЕ
    ВЗ.СсылкаА ЕСТЬ NULL
12 Dom26
 
07.12.17
09:05
ВЫБРАТЬ
    ГруппыЦБСписокЦБ.Ссылка КАК Ссылка,
    МАКСИМУМ(ГруппыЦБСписокЦБ.НомерСтроки) КАК НомерСтроки
ПОМЕСТИТЬ ГруппыЦбПоКолву
ИЗ
    Справочник.ГруппыЦБ.СписокЦБ КАК ГруппыЦБСписокЦБ

СГРУППИРОВАТЬ ПО
    ГруппыЦБСписокЦБ.Ссылка

ИМЕЮЩИЕ
    МАКСИМУМ(ГруппыЦБСписокЦБ.НомерСтроки) = &кол
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВложенныйЗапрос.Ссылка) КАК Ссылка,
    ГруппыЦБСписокЦБ.Ссылка КАК Ссылка1
ИЗ
    (ВЫБРАТЬ
        СтатьиОборотовПоБюджетам.Ссылка КАК Ссылка
    ИЗ
        Справочник.СтатьиОборотовПоБюджетам КАК СтатьиОборотовПоБюджетам
    ГДЕ
        СтатьиОборотовПоБюджетам.Ссылка В (&Массив)) КАК ВложенныйЗапрос
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыЦБ.СписокЦБ КАК ГруппыЦБСписокЦБ
        ПО ВложенныйЗапрос.Ссылка = ГруппыЦБСписокЦБ.ЦБ
ГДЕ
    ГруппыЦБСписокЦБ.Ссылка В
            (ВЫБРАТЬ
                ГруппыЦбПоКолву.Ссылка КАК Ссылка
            ИЗ
                ГруппыЦбПоКолву КАК ГруппыЦбПоКолву)

СГРУППИРОВАТЬ ПО
    ГруппыЦБСписокЦБ.Ссылка

ИМЕЮЩИЕ
    КОЛИЧЕСТВО(различные ВложенныйЗапрос.Ссылка) = &кол

где кол количество эл в массиве
13 Dom26
 
07.12.17
13:38
вот самый короткий с количеством

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ГруппыЦБСписокЦБ.Ссылка КАК ГруппаЦБ,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ГруппыЦБСписокЦБ.ЦБ) КАК ЦБ
ИЗ
    Справочник.ГруппыЦБ.СписокЦБ КАК ГруппыЦБСписокЦБ
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ГруппыЦБ КАК ГруппыЦБ
        ПО ГруппыЦБСписокЦБ.Ссылка = ГруппыЦБ.Ссылка
ГДЕ
    ГруппыЦБСписокЦБ.ЦБ В(&Массив)
    И ГруппыЦБСписокЦБ.Ссылка.КоличествоЦБ = &Кол

СГРУППИРОВАТЬ ПО
    ГруппыЦБСписокЦБ.Ссылка

ИМЕЮЩИЕ
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ГруппыЦБСписокЦБ.ЦБ) = &Кол
Основная теорема систематики: Новые системы плодят новые проблемы.