Имя: Пароль:
1C
1С v8
Как написать запрос с условием к справочнику с табличной частью?
,
0 Saari
 
07.09.18
09:22
Есть справочник с табличной частью, содержащей один реквизит.
Есть массив из нескольких элементов.
Тип элемента массива и тип реквизита табличной части справочника одинаков.

Можно ли написать запрос, который вернет ссылку на элемент справочника, содержащий в своей табличной части ВСЕ элементы массива?
1 Пуля
 
07.09.18
09:26
Да можно
2 Saari
 
07.09.18
09:27
(1) напишите, пожалуйста.
3 MonteCarlo
 
07.09.18
09:28
ВЫБРАТЬ
   Псевдноним.Ссылка КАК Ссылка
ИЗ
   Справочник.ИмяСправочника.ИмяТЧ КАК Псевдонимв
ГДЕ
   Псевдноним.ИмяРеквизитаТЧ В (&Массив)
СГРУППИРОВАТЬ ПО
   ССылка
4 MonteCarlo
 
07.09.18
09:28
Как-то так.
5 youalex
 
07.09.18
09:30
(3) мимо
6 MonteCarlo
 
07.09.18
09:31
(5) чёйто,
7 MonteCarlo
 
07.09.18
09:32
(5) Напишите свой вариант
8 Strogg
 
07.09.18
09:32
(3) неа. Вернет все элементы справочника, в которых присутствует хотя бы один из массива...
9 MonteCarlo
 
07.09.18
09:33
А я не так понял задание, сорри. Нужна ссылка на элемент справочника, ТЧ которого содержит абсолютно все элементы массива, так?
10 butterbean
 
07.09.18
09:33
(0)создать таблицу значений, запихнуть ее в запрос и сделать с ней соединение
11 MonteCarlo
 
07.09.18
09:34
Тогда ТЗ, туда массив, ТЗ в качестве параметра передать в запрос, сделать временную таблицу и дальше соединять внутренним соединением
12 Strogg
 
07.09.18
09:34
если только внутренне соединить с подсчетом количества строк и вывести в выборку только те, у которых количество строк в ТЧ совпадет с количеством элементов в масиве.
13 youalex
 
07.09.18
09:35
(7) ну, если в массиве нет дублей, можно к вашему запросу добавить
ИМЕЮЩИЕ Количество(Различные ИмяРеквизитаТЧ ) = &КоличествоВМассиве

по идее..
14 MonteCarlo
 
07.09.18
09:36
(13) Неа. А если в ТЧ больше записей?
15 Strogg
 
07.09.18
09:37
(14) ну тогда больше либо равно :)
16 Sapiens_bru
 
07.09.18
09:37
Играем в угадалку...
17 youalex
 
07.09.18
09:38
(14) в смысле больше? там же фильтр, он отберет только те, которые есть в массиве.
18 MonteCarlo
 
07.09.18
09:38
(16) Решение уже написали. ТЗ передаем в запрос и внутреннее соединение. Либо как в (12) должно работать.
19 Sapiens_bru
 
07.09.18
09:39
Это задачка с собеседования? Потому как явно чисто синтетическая. Если нет - там как минимум должны быть какие-нибудь количества/суммы в табличной части и в массиве
20 Saari
 
07.09.18
09:39
(9) да, так
(14) количество элементов массива = количеству строк в ТЧ. При этом ТЧ содержит абсолютно все элементы массива.
(18) написали теорию. Как будет выглядеть запрос?
21 MonteCarlo
 
07.09.18
09:39
(17) Записей в ТЧ может быть больше. ТОгда Количество различные будет > количество элементов массива. И такой элемент справочника не попадет в выборку.
22 Saari
 
07.09.18
09:40
(19) нет, это не с собеседования.
23 Sapiens_bru
 
07.09.18
09:40
(18) Да ни разу это не решение. Ни то ни другое. Даже  синтетическую задачу не решает
24 Strogg
 
07.09.18
09:40
(17) ну то есть в ТЧ справочника есть абсолютно все значения из массива плюс еще чуть чуть.
25 Saari
 
07.09.18
09:40
(21) совершенно верно. не попадет.
26 MonteCarlo
 
07.09.18
09:40
(20) Тогда в (13) тебе должно подойти.
27 Saari
 
07.09.18
09:41
(24) нет. без чуть чуть. В ТЧ 3 строки и в массиве 3 таких же элемента. тогда нашли элемент.
28 Saari
 
07.09.18
09:41
(26) попробую
29 MonteCarlo
 
07.09.18
09:42
(27) А если в ТЧ 3 строки нужные из массива, то есть все из масиа и еще один левый, такой элемент справочника подходит?
30 MonteCarlo
 
07.09.18
09:42
(13) А разве нельзя свернуть массив перед сравнением?
31 Sapiens_bru
 
07.09.18
09:49
(26) Решение из 13 даст ложно положительные результаты.
Ищем Ложка+Вилка , среди Ложка+Вилка и Ложка+Морж.
Оба ответа упадут в выборку
32 youalex
 
07.09.18
09:49
(21) Количество(Различные) считает число записей в ТЧ с условием ГДЕ Псевдноним.ИмяРеквизитаТЧ В (&Массив)

(30) можно, и даже нужно)
33 Saari
 
07.09.18
09:50
(29) нет, не подходит. Значит не нашли.
(30) массив свернут. повторяющихся элементов нет ни в массиве ни в ТЧ
34 Saari
 
07.09.18
09:51
(31) должно выдать только Ложка+Вилка
35 Strogg
 
07.09.18
09:52
(31) да блин, если ты внутренне соединишь Таблицы, то у тебя получится некое количество элементов справочника с неким количеством элементов в ТЧ. Далее, ты сравнишь получившееся количество элементов в ТЧ, с количеством элементов в массиве, и если это количество будет одинаково, значит элемент справочника удовлетворяет условиям задачи.
36 Strogg
 
07.09.18
09:53
(35)+ естественно, надо загнать в ВТ массив, а потом уже внутренне соединять эту ВТ с ТЧ справочника
37 Saari
 
07.09.18
09:53
(35) напишите, текст решения, пожалуйста.
38 youalex
 
07.09.18
09:53
(31) чой то?
Массив (Ложка, Вилка).Количество() = 2

ТЧ (Ложка, Морж)

ВЫБРАТЬ Ссылка, КоличествоРазличные(РекТЧ)
из ТЧ ГДЕ РекТЧ В (&Массив)
Сгруппировать по Ссылка

будет 1
39 MonteCarlo
 
07.09.18
09:58
(35) Вот твое решение, всё закрывай ветку.
40 Ненавижу 1С
 
гуру
07.09.18
10:02
ВЫБРАТЬ
    КонтрагентыМенеджерыПокупателя.Ссылка
ИЗ
    Справочник.Контрагенты.МенеджерыПокупателя КАК КонтрагентыМенеджерыПокупателя

СГРУППИРОВАТЬ ПО
    КонтрагентыМенеджерыПокупателя.Ссылка

ИМЕЮЩИЕ
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВЫБОР
            КОГДА КонтрагентыМенеджерыПокупателя.МенеджерПокупателя В (&Массив)
                ТОГДА КонтрагентыМенеджерыПокупателя.МенеджерПокупателя
        КОНЕЦ) = &РазмерМассива
41 Saari
 
07.09.18
10:11
(40) Выдает много записей, имеющих элементы массива.
42 Saari
 
07.09.18
10:14
попробовал как в (13). Тоже выдает много записей.
43 youalex
 
07.09.18
10:15
условие из (29) еще нужно учесть.
44 youalex
 
07.09.18
10:17
А если, как в (40) :

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

= КОЛИЧЕСТВО(РАЗЛИЧНЫЕ МенеджерПокупателя )
45 Мимохожий Однако
 
07.09.18
10:18
ОФФ: Нахально и пятнично)
46 MonteCarlo
 
07.09.18
10:20
Кстати, а если в массиве например элементы (1,2,3) а в ТЧ (1,1,2,3). Такой элемент справочника нужно отобрать или тоже не подходит? Равенство должно быть полное и о по качеству и по количеству?
47 youalex
 
07.09.18
10:20
(44) не, не прокатит. тогда просто  добавить

И КОЛИЧЕСТВО(РАЗЛИЧНЫЕ МенеджерПокупателя ) = &РазмерМассива
48 Малыш Джон
 
07.09.18
10:23
(0): Можно ли написать запрос...
(1): Да можно
(2): напишите..

супер!
49 Sapiens_bru
 
07.09.18
10:26
(35) Согласен. Решение подойдёт для предварительно сгруппированных таблиц.
50 MonteCarlo
 
07.09.18
10:28
(46) И еще вариант, в массиве (1,1,2,3) в ТЧ (1,1,1,2,3). Такой вариант возможен? Должен ли отобрать элемент справочника?
51 иубиповец
 
07.09.18
10:29
Можно ли написать запрос, который вернет ссылку на элемент справочника, содержащий в своей табличной части ВСЕ элементы массива?

А не пойдет через  динамическое условие?


   Псевдноним.ИмяРеквизитаТЧ В (0)
И Псевдноним.ИмяРеквизитаТЧ В (1)
и тд.
Если в тч есть все элимены, + какие то еще то выдаст, если какого то нет, то нет.
52 MonteCarlo
 
07.09.18
10:30
(51) Если есть какие-то не из массива, то такой элемент не подходит.
53 Saari
 
07.09.18
10:32
(46) да, не подходит. Но такого и не будет. А если и будет, то не подходит.
(45) ничего нахального. Просто нужно сделать такую функцию.
Если администрация считает ветку таковой (плохой), то пусть удаляет/закрывает/и т.п.
Никого не хотел обидеть/расстроить/и т.п.
Просто нужно решение вопроса.

Если делать не запросом, то я сделал. Теперь думаю, можно ли сделать запросом?
54 dmt
 
07.09.18
10:34
(53) в (13) и в (40) рабочие решения
55 Малыш Джон
 
07.09.18
10:35
решение с выбором тх элементов, которые с реквизитами из массива, и потом сравнение с размером массива - он простой и в принципе правильный, но не рабочий, если в массиве задвоены значения.

Вытаскивать в ТЗ из соответсвующего справочника те элементы, которые в массиве, потом левым соединением  её соединять с ТЧ нужного справчника и ГДЕ НужныйСправочник.Ссылка Есть NULL
56 Малыш Джон
 
07.09.18
10:36
+(55) *вытаскивать в ВТ
57 Sapiens_bru
 
07.09.18
10:37
(53) Можно.
Минимум тремя вариантами.
1) Как уже тут подсказали через внутреннее соединение и подсчёт успешных соединений. Альтернативой будет ввод признака на совпадение с массивом и подсчёт успешных совпадений (но работать будет дольше)
2) Сведение всех элементов из ТЧ по нужному признаку в одну строку (например строку из кодов) и поиск регэкспов. Работать будет при длине результирующей строки до 4тыс символов
3) Динамическое создание текста запроса с разбором массива в параметры.
58 Малыш Джон
 
07.09.18
10:38
+(55) вернее, это те, у которых как раз отсутствует хотя бы один элемент из массива, сооветственно, остальные - это как раз те, которые нужны
59 Saari
 
07.09.18
10:39
(54) там выдает несколько элементов
60 Saari
 
07.09.18
10:39
(55) (57) текст запроса можете написать?
61 dmt
 
07.09.18
10:40
(59) врешь, покажи запрос
62 Saari
 
07.09.18
10:41
(61) вот запрос из (40):
        |    ТеррЗоныМаршрута.Ссылка КАК Маршрут
        |ИЗ
        |    Справочник.Маршруты.ТерриториальныеЗоны КАК ТеррЗоныМаршрута
        |СГРУППИРОВАТЬ ПО
        |   ТеррЗоныМаршрута.Ссылка
        |ИМЕЮЩИЕ Количество(Различные ВЫБОР
        |                      КОГДА ТеррЗоныМаршрута.ТерриториальнаяЗона В (&ВыбМассивТеррЗон)
        |                       ТОГДА ТеррЗоныМаршрута.ТерриториальнаяЗона
        |                       КОНЕЦ) = (&ВыбКоличествоВМассиве)
        |
        |";
63 Saari
 
07.09.18
10:42
(61) только что проверил.
64 dmt
 
07.09.18
10:46
(62) ну, он тебе вернет все ссылки справочника, в ТЧ которых есть все элементы массива. Ты не можешь выбрать первые 1 сделать?
65 MonteCarlo
 
07.09.18
10:46
(59) Несколько элементов одного и того же маршрута? Сгруппировать поможет. Просто если есть вариант что в массиве будут дублироваться элементы, то сравнение с количеством в массиве не поможет.
Если такой вариант ты исключаешь, тогда решение уже тебе написали. Соединяешь внутренне и отбираешь по равентсву количества записей ТЧ и массива.
66 Saari
 
07.09.18
10:47
(64) мне нужно чтобы вернул ссылку, в которой только элементы массива. Не больше и не меньше.
В массиве и в ТЧ нет одинаковых записей.
67 Sapiens_bru
 
07.09.18
10:49
(66) "В массиве и в ТЧ нет одинаковых записей."
Доверяй, но проверяй.
Сколько красивых алгоритмов сломалось о реальные базы...
68 Малыш Джон
 
07.09.18
10:49
(62) а отбор не забыл добавить?


|    ТеррЗоныМаршрута.Ссылка КАК Маршрут
        |ИЗ
        |    Справочник.Маршруты.ТерриториальныеЗоны КАК ТеррЗоныМаршрута
        |ГДЕ
        |   ТеррЗоныМаршрута.ТерриториальнаяЗона В (&ВыбМассивТеррЗон
        |СГРУППИРОВАТЬ ПО
        |   ТеррЗоныМаршрута.Ссылка
        |ИМЕЮЩИЕ Количество(Различные ВЫБОР
        |                      КОГДА ТеррЗоныМаршрута.ТерриториальнаяЗона В (&ВыбМассивТеррЗон)
        |                       ТОГДА ТеррЗоныМаршрута.ТерриториальнаяЗона
        |                       КОНЕЦ) = (&ВыбКоличествоВМассиве)
        |
        |";
69 dmt
 
07.09.18
10:49
(66) похоже что у разных маршрутов есть один и тот же набор зон, которые ты передаешь в массиве
70 dmt
 
07.09.18
10:50
(68) отбор внутри Имеющие()
71 Малыш Джон
 
07.09.18
10:50
даже вот так:

ТеррЗоныМаршрута.Ссылка КАК Маршрут
        |ИЗ
        |    Справочник.Маршруты.ТерриториальныеЗоны КАК ТеррЗоныМаршрута
        |ГДЕ
        |   ТеррЗоныМаршрута.ТерриториальнаяЗона В (&ВыбМассивТеррЗон)
        |СГРУППИРОВАТЬ ПО
        |   ТеррЗоныМаршрута.Ссылка
        |ИМЕЮЩИЕ Количество(Различные ТеррЗоныМаршрута.ТерриториальнаяЗона) = &ВыбКоличествоВМассиве
        |
        |";
72 Saari
 
07.09.18
10:51
(69) повторяющихся маршрутов (элементов справочника с одинаковой ТЧ) нет.
73 Малыш Джон
 
07.09.18
10:51
(70) да, увидел
74 dmt
 
07.09.18
10:51
(71) это вариант из (13)
вариант в (40) интересен тем, что Количество() не подсчитывает строки с NULL
75 dmt
 
07.09.18
10:52
(72) приведи ТЧ "нескольких" маршрутов, которые тебе выдаются, и какой массив ты передаешь
76 dmt
 
07.09.18
10:52
выбрать 10 КАК Ссылка, 1 КАК Р
поместить Т
объединить
выбрать 10 КАК Ссылка, 3 КАК Р
объединить
выбрать 10 КАК Ссылка, 2 КАК Р
объединить
выбрать 20 КАК Ссылка, 2 КАК Р
объединить
выбрать 20 КАК Ссылка, 1 КАК Р
объединить
выбрать 30 КАК Ссылка, 2 КАК Р
объединить
выбрать 40 КАК Ссылка, 1 КАК Р
объединить
выбрать 40 КАК Ссылка, 3 КАК Р
;

выбрать первые 1 Т.Ссылка
из Т КАК Т
//где Т.Р В (&Массив)
сгруппировать по
    Т.Ссылка
Имеющие
    Количество(выбор когда Т.Р В (&Массив) тогда Т.Р конец) = &РазмерМассива    
    //Количество(*) = &РазмерМассива
77 youalex
 
07.09.18
10:52
(74) причем именно Количество(Различные), просто Количество() - null  считает.
78 Малыш Джон
 
07.09.18
10:53
(74) точно, не увидел)
79 Saari
 
07.09.18
10:53
(75) Массив передаю: Зона1, Зона2
Выдаются ссылки на элементы справочника с ТЧ:
Зона1, Зона2, Зона3
Зона1, Зона3, Зона4
Зона1, Зона5, Зона2
80 Saari
 
07.09.18
10:54
(79) вот так правильнее, во второй строке опечатался
Зона1, Зона2, Зона3
Зона1, Зона2, Зона4
Зона1, Зона5, Зона2
81 dmt
 
07.09.18
10:56
(80) а теперь перечитай (0) - ты получил что хотел
82 Малыш Джон
 
07.09.18
10:56
(80) ну они же содержат все элементы массива, верно?
83 MonteCarlo
 
07.09.18
10:56
(80) Ты условие на сравнение количества добавил? Причем количество записей в ТЧ не свернутой.
84 Ненавижу 1С
 
гуру
07.09.18
10:57
(66) а вот этого в условии не было
85 Saari
 
07.09.18
10:57
(81) (82) да, согласен. Вопрос некорректный.
Надо было написать:
содержащий в своей табличной части только элементы массива
86 Ненавижу 1С
 
гуру
07.09.18
10:58
ВЫБРАТЬ
    КонтрагентыМенеджерыПокупателя.Ссылка
ИЗ
    Справочник.Контрагенты.МенеджерыПокупателя КАК КонтрагентыМенеджерыПокупателя

СГРУППИРОВАТЬ ПО
    КонтрагентыМенеджерыПокупателя.Ссылка

ИМЕЮЩИЕ
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВЫБОР
            КОГДА КонтрагентыМенеджерыПокупателя.МенеджерПокупателя В (&Массив)
                ТОГДА КонтрагентыМенеджерыПокупателя.МенеджерПокупателя
        КОНЕЦ) = &РазмерМассива И
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ КонтрагентыМенеджерыПокупателя.МенеджерПокупателя) = &РазмерМассива
87 Saari
 
07.09.18
10:58
Ё, надо же было так вопросить?...
88 dmt
 
07.09.18
10:58
(77) попробовал, тоже не считает. код выше в (76), Ссылка = 10
89 Saari
 
07.09.18
11:00
(86) СПАСИБО! РАБОТАЕТ!!!
90 Saari
 
07.09.18
11:01
ВСЕМ ОГРОМНОЕ СПАСИБО!
Извините за некорректный вопрос в условии (увидел, что не так спросил).
91 dmt
 
07.09.18
11:05
NULL считает только Количество(*)


выбрать 1 КАК Ссылка
поместить Т
объединить
выбрать 2
объединить
выбрать NULL
;

выбрать Количество(Ссылка) КАК КоличествоСт, Количество(различные Ссылка) КАК КоличествоСтРазличные, Количество(*) КАК КоличествоЗв из Т
------------
результат:
КоличествоСт    КоличествоСтРазличные    КоличествоЗв
2        2            3
-----------