Имя: Пароль:
1C
1С v8
Можно ли реализовать такое 1 запросом
,
0 Borteg
 
30.08.13
10:42
Добрый день. Есть наименование контрагента, ИНН ,договор,код агента. Поиск происходит в такой последовательности.  Если по ИНН и договору найден 1 контрагент - тогда он искомый, если больше 1 или 0  то ищем по коду агента, если и коду ничего не нашли то ищем по виду взаиморасчетов. Можно ли такое реализовать 1 запросом. Сейчас все работает, но получается что Если Выборка.количество()>1  тогда там еще запрос итд итп , хотелось бы както это упразднить.
1 Wobland
 
30.08.13
10:43
назначь приоритет, объедини, упорядочи, выбери
2 престидижитатор
 
30.08.13
10:44
а почему именно одним запросом?
3 kosts
 
30.08.13
10:45
(2) В принципе все что можно сделать одним запрос, то лучше так и сделать. (без фанатизма конечно).
4 Borteg
 
30.08.13
10:45
(2) сейчас запрос в цикле, а там еще один цикл и в нем другой запрос. мне очень не нравится, думаю что можно както и без этого.
5 kosts
 
30.08.13
10:45
(3)+ т.к. запрос к серверу это медленная операция...
6 exwill
 
30.08.13
10:45
(4) Конечно можно. Про сортировку слышал?
7 Borteg
 
30.08.13
10:46
главная проблема при соединении что в базе есть контрагенты с одинаковым договорами и инн(так поставили учет давно и не хотят отходить от этого), и после левого соединения у меня дубли вылазят...
8 Жан Пердежон
 
30.08.13
10:46
(0) миста разрешает
9 masenshi
 
30.08.13
10:46
(0) можно
10 Borteg
 
30.08.13
10:47
(8) (9) натолкните в сторону чего копать
11 Borteg
 
30.08.13
10:48
(6) слышал вроде)
12 Rie
 
30.08.13
10:48
(7) Вот насчёт договоров - не понял. Договоры ведь - подчиненный справочник. Как может быть один договор на двух контрагентов?
13 Borteg
 
30.08.13
10:49
(12) поиск идет по номеру, это загрузка из внешней системы, в базе например есть контрагенты почта россии , их штук 80, инн номер договора совпадают
14 Borteg
 
30.08.13
10:50
(13) их ищут по коду, а есть еще сбор данных с интернет сайтов, там вообще только виду взаиморасчетов определить можно
15 kosts
 
30.08.13
10:54
(10) см.(1) Сделай три там запроса. Первый как бы расчитывает, что будет найден один контрагент по ИНН. Второй что если контрагентов несколько и т.д.
Выбрать 1 как Приоритет,

ИНН как ИНН,
...
Из ...
левое соединение ...
Объединить все
Выбрать 2 как Приоритет,
ИНН как ИНН,
...
Из ...
левое соединение ...
Объединить все
...


Т.е. сделать запрос сразу по всем вариантам, а в выборке уже разобраться, что нужно.
16 Borteg
 
30.08.13
10:56
(15) Спасибо, щас попробую разобраться
17 kosts
 
30.08.13
10:57
К тому же запрос 1С может возвращать массив выборок. Это если вместо объединения. Возможно будет проще в реализации.
18 masenshi
 
30.08.13
11:11
(10)

сюда копай.

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

СГРУППИРОВАТЬ ПО
    а.ИНН
19 Borteg
 
30.08.13
11:23
(18) спасибо, тоже буду разбирать))
20 МихаилМ
 
30.08.13
11:36
если существует подходящий индекс , делайте сразу избыточную выборку.
21 dk
 
30.08.13
11:37
можно тупо через объединения

Выбрать
  Выбор Когда ЕСТЬNULL(МАКСИМУМ(_1), 0) <> 0 Тогда МАКСИМУМ(_1) Иначе ВЫБОР КОГДА ЕСТЬNULL(МАКСИМУМ(_2), 0) <> 0 Тогда МАКСИМУМ(_2) Иначе ВЫБОР ...
ИЗ
(ВЫБОР
   Контра1 _1,
   NULL _2,
   NULL _3
ИЗ ... ГДЕ ...

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

ВЫБОР
   NULL _1,
   Контра2 _2,
   NULL _3
ИЗ ... ГДЕ ...

ОБЪЕДИНИТЬ ВСЕ
...
)
22 Borteg
 
30.08.13
11:40
(21) интересное решение, будем сейчас строгать запросы) Спасибо всем огромное за помощь.
2 + 2 = 3.9999999999999999999999999999999...