Вход | Регистрация

1С:Предприятие ::

Метки: 

полное совпадение таблиц

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

   Tateossian
 
8 - 06.12.17 - 23:23
(4) Если отбросить из примера виртуальные таблицы, получается два. Можно вложенными запросами.



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

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

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

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

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

////////////////////////////////////////////////////////////////////////////////

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

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

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

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

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

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

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

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

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

////////////////////////////////////////////////////////////////////////////////

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

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

////////////////////////////////////////////////////////////////////////////////

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

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



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


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

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

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

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

////////////////////////////////////////////////////////////////////////////////

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

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

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

////////////////////////////////////////////////////////////////////////////////

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

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

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

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

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

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

ИМЕЮЩИЕ
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ГруппыЦБСписокЦБ.ЦБ) = &Кол


Список тем форума
Рекламное место пустует Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует