|
Как написать запрос с условием к справочнику с табличной частью? | ☑ | ||
---|---|---|---|---|
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 ----------- |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |