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


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

Метки: 

Как написать запрос с условием к справочнику с табличной частью?

Я
   Saari
 
07.09.18 - 09:22
Есть справочник с табличной частью, содержащей один реквизит.
Есть массив из нескольких элементов.
Тип элемента массива и тип реквизита табличной части справочника одинаков.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

выбрать первые 1 Т.Ссылка 
из Т КАК Т
//где Т.Р В (&Массив)

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

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

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


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

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



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