Имя: Пароль:
1C
1С v8
Поиск в нескольких справочниках сразу
, ,
0 DrRaptor
 
23.11.15
22:53
Специалисты, подскажите, пожалуйста, можно ли как-то применить метод Справочник.НайтиПоКоду(НужныйКод) для поиска в нескольких справочниках одновременно. То есть создать что-то типа набора справочников, и искать уже внутри этого набора. При этом нужно фиксировать в каком именно справочнике был найден НужныйКод. Какие-либо изменения в справочниках не предлагать - обработка не должна затрагивать структуру 1С.
1 mikecool
 
23.11.15
22:55
запрос
2 ИсчадиеADO
 
23.11.15
22:55
Запросом через объединить?
3 Zamestas
 
23.11.15
22:55
(1) +1
4 DrRaptor
 
23.11.15
23:05
Может, кто накидает здесь пример такого запроса, если не сложно?
5 Мимохожий Однако
 
23.11.15
23:22
Взял бы консоль запросов и потренировался.
6 mikecool
 
23.11.15
23:25
мне лень
7 User_Agronom
 
23.11.15
23:30
выбрать
ссылка
из справочник.Номенклатура
где код = &Код

объединить усё

выбрать
ссылка
из справочник.Контрагенты
где код = &Код


объединить усё

выбрать
ссылка
из справочник.Организации
где код = &Код


И всё в том же духе.
8 DrRaptor
 
24.11.15
14:08
Сделал запрос:

Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |    __Акции.Код,
        |    __Облигации.Код КАК Код1,
        |    __Паи.Код КАК Код2
        |ИЗ
        |    Справочник.__Акции КАК __Акции,
        |    Справочник.__Паи КАК __Паи,
        |    Справочник.__Облигации КАК __Облигации
        |ГДЕ
        |    __Акции.Код = &Код
        |    ИЛИ __Облигации.Код = &Код
        |    ИЛИ __Паи.Код = &Код";
        
    Запрос.УстановитьПараметр("Код", "LSNG");

    РезультатЗапроса = Запрос.Выполнить();

    Выборка = РезультатЗапроса.Выбрать();
    
    Пока Выборка.Следующий() Цикл
        Сообщить(Выборка.Ссылка);
        Сообщить(Выборка.Наименование);
    КонецЦикла;

Почему у Выборка  вообще нет реквизита Ссылка или Наименование. Работает только Выборка.Количество
9 Лефмихалыч
 
24.11.15
14:10
(8) потому. что их нет после слова ВЫБРАТЬ
10 Горогуля
 
24.11.15
14:15
а в Выборка.Количество() ты загляни. только цикл не делай
11 DrRaptor
 
24.11.15
14:16
А как должно быть? Чтобы определять по результатам запроса в каком именно справочнике был найден Код
12 Горогуля
 
24.11.15
14:17
(11) выбрать "справочник раз" из справочник.раз
13 Лефмихалыч
 
24.11.15
14:17
(11) ссылку в выборку добавь
14 Web00001
 
24.11.15
14:18
(8) Это немного не то, что тебе предлагали сделать в (7), читай сюда http://wiki-1c.ru/doku.php/1c:база:запросы#объединения
15 Горогуля
 
24.11.15
14:19
(14) он "усего" испугался видимо
16 Web00001
 
24.11.15
14:23
каждый раз когда даю ссылку с якорем, вспоминаю Asmody ну вот почему ссылка, не может иметь якорь с русскими буквами? Вот так лучше будет goo.gl/AZrOZx
17 Web00001
 
24.11.15
14:24
хотя тоже хрень
18 DrRaptor
 
24.11.15
14:30
"ВЫБРАТЬ ПЕРВЫЕ 1
        |    __Акции.Ссылка,
        |    __Облигации.Ссылка,
        |    __Паи.Ссылка  
        |ИЗ


Теперь Выборка.Ссылка выдает название элемента справочника
А как сразу получать название справочника?
19 Горогуля
 
24.11.15
14:33
тебе зачем?
20 DrRaptor
 
24.11.15
14:35
Мне нужно знать в каком справочнике был найден код
21 Горогуля
 
24.11.15
14:36
тебе зачем нужно знать в каком справочнике был найден код?
22 DrRaptor
 
24.11.15
14:38
Что зачем???? Нужно!
23 DrRaptor
 
24.11.15
14:40
проверил: находит только в первом справочнике Справочник.__Акции, а остальные игнорирует, что не так?
24 hhhh
 
24.11.15
14:41
(23) ну так ПЕРВЫЕ 1

он находит первую. Остальные находить нет смысла.
25 Горогуля
 
24.11.15
14:41
(22) делай!
26 Гёдза
 
24.11.15
14:43
(8) Ты даже переписать запрос из (7) нормально не можешь.
Как так?
27 Горогуля
 
24.11.15
14:45
(26) Текст запроса: Строка 7: {(7,12)}: Ожидается выражение "ВЫБРАТЬ"
объединить <<?>>усё
28 DrRaptor
 
24.11.15
14:46
hhhh, это понятно.
Если находит в первом справочнике, то выдает элемент и все ок
а если не находит, то выдает элемент из первого справочника первый попавшийся от балды а в остальных справочниках вообще не ищет
29 George Wheels
 
24.11.15
14:51
В каком справочнике найден код поможет ПолноеИмя
30 hhhh
 
24.11.15
15:02
(28) так вы смотрели Код1 и Код2 ??
31 palladyi
 
24.11.15
15:03
Блин, думал, порно. Зашел, а тут...
32 DrRaptor
 
24.11.15
15:15
Короче, при таком алгоритме находится позиция элемента в  справочнике, а в каком именно вообще не понятно.

Сообщить(Выборка.Ссылка);
Сообщить(Выборка.Ссылка1);
Сообщить(Выборка.Ссылка2);

Каждая ссылка выдает элемент соответствующей позиции в своем справочнике
33 Горогуля
 
24.11.15
15:22
да не за что, мелочь какая
34 Лефмихалыч
 
24.11.15
15:49
а вообще - это полнотекстовый поиск.
35 Гёдза
 
24.11.15
15:52
Что то не могу понять: тут шутят или тупят?
36 George Wheels
 
24.11.15
16:02
(32) А где .Метаданные()
37 DrRaptor
 
24.11.15
16:05
Дубль два:

Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |    __Облигации.Ссылка,
        |    __Акции.Ссылка КАК Ссылка1,    
        |    __Паи.Ссылка КАК Ссылка2  
        |ИЗ
        |    Справочник.__Облигации КАК __Облигации,
        |    Справочник.__Акции КАК __Акции,
        |    Справочник.__Паи КАК __Паи
        |ГДЕ
        |    __Акции.Код = &Код
        |    ИЛИ __Облигации.Код = &Код
        |    ИЛИ __Паи.Код = &Код";
        
    Запрос.УстановитьПараметр("Код", "LSNG");
    РезультатЗапроса = Запрос.Выполнить();
        Выборка = РезультатЗапроса.Выбрать();
    
    Пока Выборка.Следующий() Цикл
        Сообщить(Выборка.Ссылка);
        Сообщить(Выборка.Ссылка1);
        Сообщить(Выборка.Ссылка2);
    КонецЦикла;

1) Почему Ссылка, Ссылка1 и Ссылка2 равны по номеру элемента справочника? Команда ВЫБРАТЬ ПЕРВЫЕ 1 должна выбрать первый совпавший элемент и прервать дальнейший поиск. Почему тогда все три ссылки имеют значения?

2) Зачем мне делать объединение (объединить все), если мы ищем только один единственный уникальный результат?

3) Как все-таки определить к какому справочнику пренадлежит найденный элемент?
38 Лефмихалыч
 
24.11.15
16:05
(32) ТипЗнч(выборка.Ссылка)
или
выборка.Ссылка.Метаданные().Имя
или
Выборка.Ссыдка.Метаданные().ПолноеИмя()

или еще 100500 способов
39 Лефмихалыч
 
24.11.15
16:06
(37) закрой конфигуратор нахрен, пожалуйста
40 Горогуля
 
24.11.15
16:08
(37) это работа программиста
41 DrRaptor
 
24.11.15
16:10
Лефмихалыч, только не надо крутого хама включать, пожалуйста...
42 Горогуля
 
24.11.15
16:13
(41) не сцы, включу я
43 DrRaptor
 
24.11.15
16:14
Вот за Метаданные().ПолноеИмя()  большое спасибо -минус однин вопрос!
Просто все задачи у нас раньше решались на семерке - там без запросов справлялись.
44 VikingKosmo
 
24.11.15
16:17
похоже это очередная реинкарнация Ливингстара...
45 Горогуля
 
24.11.15
16:18
(43) ну а кто тебя тут заставляет запросы крутить?
46 VikingKosmo
 
24.11.15
16:19
(45) хочешь, что бы опять понеслось про НайтиПоНаименованию()?
47 Лефмихалыч
 
24.11.15
16:20
(43) ты соревнуешься в бессмысленной беспощаде что ли?
у тебя запрос так написан, что в Ссылка не может быть вообще ни чего, кроме Справочник.__Облигации, а в Ссылка2 - ни чего, кроме Справочник.__Акции и так далее. Накой проверять еще раз?
48 Горогуля
 
24.11.15
16:21
(46) ну не справляется человек, человек - гуманитарий. а я что-то интересное пропустил?
49 VikingKosmo
 
24.11.15
16:22
(48) да нет наверное ;)
50 Лефмихалыч
 
24.11.15
16:24
а, автор - старовер-клюшкодав. Понятно.

DrRaptor почитай хотя бы Радченко перед тем, как кодить. Много времени и сил сэкономишь
51 DrRaptor
 
24.11.15
16:25
(47) Это уже и так понятно, так скажите как должно быть, чтобы на выходе была одна Ссылка вместо трех разных.
52 George Wheels
 
24.11.15
16:25
Ещё на Clipper мучился с чужой программой где в двумерном массиве было количество колонок по количеству сотрудников.
53 VikingKosmo
 
24.11.15
16:27
(51) тебе уже в (7) писали
54 Лефмихалыч
 
24.11.15
16:27
(51) используй ОБЪЕДИНИТЬ ВСЕ вместо декартова произведения

ВЫБРАТЬ
Ссылка
ИЗ Справочник.__ОДин
ГДЕ Код = &Код
ОБЪЕЖИНИТЬ ВСЕ
ВЫБРАТЬ
Ссылка
ИЗ Справочник.__ДВА
ГДЕ Код = &Код
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Ссылка
ИЗ Справочник.__ТРИ
ГДЕ Код = &Код
55 Web00001
 
24.11.15
16:27
(51) ты (14) читать не стал? Или стал но ничего не понял?
56 Лефмихалыч
 
24.11.15
16:29
(55) с клюшками в голове ни чего из этого не помогает
57 DrRaptor
 
24.11.15
16:34
Я все читаю, но нигде нет простого и понятного примера с запросом для поиска в нескольких справочниках - везде только разные комбинации что нужно ВЫБРАТЬ, а ИЗ всегда что-то одно.
58 VikingKosmo
 
24.11.15
16:35
(57) тебе из одно и того же справочника нужно выбрать разные значения, что ли?
59 Горогуля
 
24.11.15
16:35
(57) теперь можешь попробовать почитать собственную ветку
60 Лефмихалыч
 
24.11.15
16:37
(57) примеры простые и понятные есть в этой ветке. Просто ты их не видишь потому, что не знаешь матчасть вообще.
61 DrRaptor
 
24.11.15
16:38
(58) НЕТ
нужно выбрать один элемент из трех справочников при совпадении значения "код" у этого элемента.
62 VikingKosmo
 
24.11.15
16:39
пффф... Перечитай тогда еще раз всею ветку
63 Лефмихалыч
 
24.11.15
16:41
и еще может сильно помочь что-то вроде "SQL для чайников". Хоть на полшишечки...
64 DrRaptor
 
24.11.15
17:08
Спасибо большое за помощь - что-то стало получаться.
65 Горогуля
 
24.11.15
17:10
три часа. это отличный результат!
66 VikingKosmo
 
24.11.15
17:12
процесс излечения клюшек головного мозга пошел...
67 Web00001
 
24.11.15
17:16
(57)Я все читаю, но нигде нет простого и понятного примера с запросом для поиска в нескольких справочниках
Идем по ссылке из (14) и видим первое! предложение
Когда необходимо выбрать данные из двух! никак не связанных таблиц... пример там тоже есть.
да нигде нет простого и понятного примера, куда уж проще...
68 DrRaptor
 
24.11.15
18:11
А вопросы то остались:

"ВЫБРАТЬ
        |    __Облигации.Ссылка как Ссылка
        |ИЗ
        |    Справочник.__Облигации КАК __Облигации
        |ГДЕ
        |    (__Облигации.Код В (&Код)
        |    ИЛИ __Облигации.ДопКод В (&Код)
        |    ИЛИ __Облигации.ISIN В (&Код)
        |    ИЛИ __Облигации.ГосРегНомер В (&Код))
        |ОБЪЕДИНИТЬ
        |ВЫБРАТЬ
        |    __Акции.Ссылка как Ссылка
        |ИЗ
        |    Справочник.__Акции КАК __Акции
        |ГДЕ
        |    (__Акции.Код В (&Код)
        |    ИЛИ __Акции.ДопКод В (&Код)
        |    ИЛИ __Акции.ISIN В (&Код)
        |    ИЛИ __Акции.ГосРегНомер В (&Код))
        |ОБЪЕДИНИТЬ
        |ВЫБРАТЬ
        |    __Паи.Ссылка как Ссылка
        |ИЗ
        |    Справочник.__Паи КАК __Паи
        |ГДЕ
        |    (__Паи.Код В (&Код))";
          
        Запрос.УстановитьПараметр("Код",МассивКодовЦБ);


В качестве параметра в запрос передаю массив возможных значений.  Выборка.Ссылка работает нормально, но выдает только уникальные ссылки (сворачивает их). Как-то можно узнать на какой именной код из массива была получена ссылка?
69 VikingKosmo
 
24.11.15
18:24
запрос выдает все ссылки у которых выполнились условия запроса. Ни кто там ни кого не сворачивает и не заворачивает
70 Drac0
 
24.11.15
18:32
(68) А ты не массив передавай, а ТЗ. Помещай ее в ВТ, а потом с ней соединяйся.
И да, я знаю, что это было бессмысленно писать.
71 VikingKosmo
 
24.11.15
18:38
(68) или если ты хочешь узнать по какому именно полю нашлось значение, то пиши больше объединений с соответствующими условиями
72 Web00001
 
24.11.15
19:15

"ВЫБРАТЬ
        |    __Облигации.Ссылка как Ссылка,
        |    "Это справочник облигации" как НазваниеСправочника
        |ИЗ
        |    Справочник.__Облигации КАК __Облигации
        |ГДЕ
        |    (__Облигации.Код В (&Код)
        |    ИЛИ __Облигации.ДопКод В (&Код)
        |    ИЛИ __Облигации.ISIN В (&Код)
        |    ИЛИ __Облигации.ГосРегНомер В (&Код))
        |ОБЪЕДИНИТЬ
        |ВЫБРАТЬ
        |    __Акции.Ссылка как Ссылка,
        |    "Это справочник акции"
        |ИЗ
        |    Справочник.__Акции КАК __Акции
        |ГДЕ
        |    (__Акции.Код В (&Код)
        |    ИЛИ __Акции.ДопКод В (&Код)
        |    ИЛИ __Акции.ISIN В (&Код)
        |    ИЛИ __Акции.ГосРегНомер В (&Код))
        |ОБЪЕДИНИТЬ
        |ВЫБРАТЬ
        |    __Паи.Ссылка как Ссылка,
        |    "Это справочник паи"
        |ИЗ
        |    Справочник.__Паи КАК __Паи
        |ГДЕ
        |    (__Паи.Код В (&Код))";
73 Web00001
 
24.11.15
19:16
(72) к (68) и собственно будешь знать, что откуда.
74 DrRaptor
 
24.11.15
19:33
(73) - не оценил стеб
все уже сделал
отказался нахрен от массива, слишком много с ним проблем
запрос внутри цикла - и все задачи теперь решены.
75 Web00001
 
24.11.15
19:40
(74)в каком месте там стеб?
>>запрос внутри цикла - и все задачи теперь решены.
Ты тролишь так или дворник?
76 Web00001
 
24.11.15
19:41
(74)Ты как бы это, не веришь, что в качестве поля может быть строковая константа?
77 DrRaptor
 
24.11.15
20:09
(76) Во-первых, как эту константу увидеть после выполнения запроса, а во-вторых в результате выдается только одно значение, даже если в массиве было 10 одинаковых кодов (а надо получить 10 одинаковых значений).
78 Drac0
 
24.11.15
20:20
(74) роняя скупую мужскую слезу: "Поздравляю! У вас родился... говн*кодер."
79 Лефмихалыч
 
24.11.15
20:25
(77) Почитай. Хоть что-нибудь. Про SQL.
хотя бы первое попавшееся http://www.site-do.ru/db/db.php#2
80 Лефмихалыч
 
24.11.15
20:25
(74) за запросы в цикле в приличном обществе неприлично ругают
81 DrRaptor
 
24.11.15
21:50
(78) Ты сам кусок Г
(79) Спасибо за ссылку, просто ради одной вшивой обработки не хочется изучать всю теорию SQL, которая больше никогда не понадобится
82 Мимохожий Однако
 
24.11.15
21:53
(81)"которая больше никогда не понадобится". У тебя есть хрустальный шар?
83 Drac0
 
24.11.15
22:11
(82) Может, он-таки понял, что 1с - это не его и решил сменить профессию :)
84 User_Agronom
 
24.11.15
22:41
(83) При попытке понять принцип работы "ОБЪЕДИНИТЬ УСЁ" ум зашел за разум и выпал с запрос в цикле.
Reboot
85 DrRaptor
 
24.11.15
22:51
Может 1С и не моё, если не считать созданную с нуля специальную систему учета на семерке (со всеми проводками, регистрами и пр.). Ну простите, что я не херачу сутками на пролет запросы - просто последние 7 лет в них надобности не было.
86 DrRaptor
 
24.11.15
22:53
А обсирать кого-то - это любимое занятие на форуме. Спасибо всем, кто помог - остальные идите в ж.
87 hhhh
 
24.11.15
23:03
правду, оказывается, говорят, что клюшки разъедают мозг.
88 Web00001
 
25.11.15
03:43
(77)>>Во-первых, как эту константу увидеть после выполнения запроса
Да так же как и твое значение: Выборка.НазваниеСправочника ты открой конструктор на закладке "Объединения/Псевдонимы" и увидишь названия всех полей.
(78)>> а во-вторых в результате выдается только одно значение, даже если в массиве было 10 одинаковых кодов
Так в справочнике одна ссылка, ты и получаешь одно значение, выбираешь ты данные из справочника? По крайней мере именного этого ты хотел в (0).
(81)Запросы в цикле указывают на г@внокод. Тебе сказали по существу. Это плохая практика создающая ненужную нагрузку на сервер в целом и БД в частности. Необходимо писать запросы так, что бы данные получались одним запросом. Все возможности для этого есть.
(86)Ты демонстрируешь то ли явное отсутствие читать буквари то ли отсутствие мозга. Причем вполне себе упорно. Ответ на (0) дали сразу почти, дальше да, уже добавить нечего.
89 patria0muerte
 
25.11.15
05:50
(85) В среднем, 1Сник, при нормальной нагрузке - запросы в своей работе так или иначе использует каждый день. Даже для простого анализа каких либо данных порой проще не в журнал доков лезть, а запрос написать и в консоли глянуть. Отсюда вопрос, чем ты блин занимался крайние 7 лет, если тебе запросы были не нужны?
90 Горогуля
 
25.11.15
06:06
тут дело не только в запросах, а ещё и в неспособности воспринять нужную информацию и упорствовании в своей тупизне

(89) я вот циклы на семёрке пару лет крутил, пока не открыл для себя чудесный мир прямых запросов ;)
91 Горогуля
 
25.11.15
06:24
а вот и "созданную с нуля специальную систему учета на семерке (со всеми проводками, регистрами и пр.)", похоже

Встроенная обработка "Проведение документов"
92 ЧеловекДуши
 
25.11.15
07:06
(0) >>>>  Какие-либо изменения в справочниках не предлагать - обработка не должна затрагивать структуру 1С.

Беги, беги от туда...
Если нечего менять нельзя, то рекомендую начать говорить, что бы контора подстраивалась под программу :)
93 ЧеловекДуши
 
25.11.15
07:16
(61) Чет ты походу не понимаешь сам, что тебе надо :)
94 ЧеловекДуши
 
25.11.15
07:18
Какой код, если нужно выбрать только один элемент.
И какой ты элемент будешь выбирать, когда коды совпадают в 3-ех справочниках.

...можешь не отвечать...
Постановка задачи противоречит самой сути... Либо ты излагаешь кашу :)
95 Web00001
 
25.11.15
07:57
(91)кхм очень показательно ага.
- Так делать нельзя!
- Хватит меня обсирать.
Отличная точка зрения. Какая то дикая упертость или упоротость?
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший