Имя: Пароль:
1C
1С v8
Вернуть неповторяющиеся сочетания для связанных пар через запрос
,
0 maskitone
 
08.08.19
22:49
Доброго!
Нужна помощь, уже мозг сломал.
Имеется: в справочнике номенклатуры в ТЧ прописаны аналоги в виде ссылки на другую номенклатуру. Записи зеркальные, т.е. в номенклатуре 1 указана номенклатура 2, а в номенклатуре 2 - номенклатура 1. т.е получается поле аналогов, где каждый аналог указан у каждого аналога.
Надо: получить запросом (только запросом, т.к. там отчет на СКД) таблицу аналогов состоящую из двух колонок (номенклатура и аналог), но только по одной (любой) номенклатуре из каждого "поля" аналогов, а не по всему полю. Надо для группировки номенклатуры к "заказу" в отчетах по продажам и закупкам.
В чем сложность: допустим есть 3 номенклатуры. Запросом ТЧ аналогов можно получить таблицу пар аналогов, но связи в ней будут дублироваться (зеркально):
1-1
1-2
1-3
2-1
2-2
2-3
3-3
3-1
3-2

А мне на выходе надо получить:
1-1
1-2
1-3
или
2-1
2-2
2-3
или
3-1
3-2
3-3.
1 Йохохо
 
08.08.19
22:59
и код больше
2 RomanYS
 
08.08.19
23:01
(0) Если наличие зеркальных записей гарантировано и надо только их убрать, то:
"где спр.Ссылка <= Аналоги.Аналог"
только получишь
1-1
1-2
1-3
2-2
2-3
3-3
3 RomanYS
 
08.08.19
23:03
Судя по примерам тебе надо

выбрать
минимум(ТЧ.Ссылка),
ТЧ.Аналог
ИЗ Справочник.Номенклатура.Аналоги как ТЧ
сгруппировать по ТЧ.Аналог
4 RomanYS
 
08.08.19
23:04
+(3) но наличие зеркальных записей тоже обязательно
5 assasu
 
09.08.19
04:19
(0) придумай новый показатель, который есть результат любой пары типа чч-зз.
но придумай его так что бы показатель 1-2 = показатель 2-1. потом по этому показателю группируй
6 fgaabbb
 
09.08.19
04:33
отсортировать, меняя местами первую номенклатуру и вторую ("выбор когда ..."), к примеру, по коду номенклатуры, потом выбрать различные, не?
7 Ботаник Гарден Меран
 
09.08.19
08:42
ВЫБРАТЬ 1 КАК П1,1 КАК П2
ПОМЕСТИТЬ ВТ
ОБЪЕДИНИТЬ
ВЫБРАТЬ    1,2
ОБЪЕДИНИТЬ
ВЫБРАТЬ    1,3
ОБЪЕДИНИТЬ
ВЫБРАТЬ    2,1
ОБЪЕДИНИТЬ
ВЫБРАТЬ    2,2
ОБЪЕДИНИТЬ
ВЫБРАТЬ    2,3
ОБЪЕДИНИТЬ
ВЫБРАТЬ    3,3
ОБЪЕДИНИТЬ
ВЫБРАТЬ    3,1
ОБЪЕДИНИТЬ
ВЫБРАТЬ    3,2
;

ВЫБРАТЬ
    ВТ.П1 КАК П1,
    ВТ.П2 КАК П2,
    ВЫБОР
        КОГДА ВТ_Зеркало.П1 ЕСТЬ NULL
            ТОГДА ЛОЖЬ
        ИНАЧЕ ИСТИНА
    КОНЕЦ КАК ЕстьПара
ПОМЕСТИТЬ ВТ_Результат
ИЗ
    ВТ КАК ВТ
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ_Зеркало
        ПО ВТ.П1 = ВТ_Зеркало.П2
            И ВТ.П2 = ВТ_Зеркало.П1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Результат.П1 КАК П1,
    ВТ_Результат.П2 КАК П2
ИЗ
    ВТ_Результат КАК ВТ_Результат
ГДЕ
    (ВТ_Результат.П1 <= ВТ_Результат.П2
            ИЛИ НЕ ВТ_Результат.ЕстьПара)
8 maskitone
 
09.08.19
11:40
(2) нет, на выходе получается что в первой колонке выборки не только ссылка, но и его аналоги.
9 maskitone
 
09.08.19
12:02
(7) на выходе имеем
1-1
1-2
1-3
2-2
2-3
3-3
10 Ботаник Гарден Меран
 
09.08.19
13:31
(9)
А что, вам травка животик не щекочет? (С)
11 Cyberhawk
 
09.08.19
13:56
Бывает еще, что аналоги не взаимозаменяемы. Т.е. товар2 является аналогом товара1, а товар1 не является аналогом для товара2 :)
12 maskitone
 
09.08.19
14:23
(10) смешно, да)
мне надо выбрать результаты только любой одной номенклатуры из всего "поля" аналогов с прописанными для нее аналогами во второй колонке  , ваш запрос этого не дает.
Спасибо за предложение, но это факт)
13 maskitone
 
09.08.19
14:24
(11) Бывает, у меня такого нет)
14 Ботаник Гарден Меран
 
09.08.19
14:26
(12)
GIGO
Garbage In - Garbage Out
ЗЫ.
Где П1 = &П1
15 maskitone
 
09.08.19
15:20
(14) Читай внимательно описание проблемы)
16 maskitone
 
09.08.19
15:56
(7) все оказалось просто - надо было добавить МИНИМУМ из (3) :

ВЫБРАТЬ
    МИНИМУМ(ВТ.СС) КАК СС,
    ВТ.Ном КАК Ном,
    ВЫБОР
        КОГДА ВТ_Зеркало.СС ЕСТЬ NULL
            ТОГДА ЛОЖЬ
        ИНАЧЕ ИСТИНА
    КОНЕЦ КАК ЕстьПара
ПОМЕСТИТЬ ВТ_результат
ИЗ
    ВТ КАК ВТ
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ_Зеркало
        ПО (ВТ.СС = ВТ_Зеркало.Ном)
            И (ВТ.Ном = ВТ_Зеркало.СС)

СГРУППИРОВАТЬ ПО
    ВТ.Ном,
    ВЫБОР
        КОГДА ВТ_Зеркало.СС ЕСТЬ NULL
            ТОГДА ЛОЖЬ
        ИНАЧЕ ИСТИНА
    КОНЕЦ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_результат.СС КАК СС,
    ВТ_результат.Ном КАК Ном
ИЗ
    ВТ_результат КАК ВТ_результат
ГДЕ
    (ВТ_результат.СС <= ВТ_результат.Ном
            ИЛИ НЕ ВТ_результат.ЕстьПара)

УПОРЯДОЧИТЬ ПО
    СС,
    Ном