Имя: Пароль:
1C
1C 7.7
v7: Объединение списка справочника и пересечения справочников по реквизиту в выборку
,
0 SSDDRR
 
27.04.17
20:06
Приветствую!

Дано:

1) справочник "ГТД" размером, допустим, 9 000 элементов; из них примерно 6500 участвуют в справочнике "Партии", по которому уже можно найти страну происхождения, сопоставляя с ГТД.

2) запрос, который выдаёт как раз список из примерно 6500 ГТД, которые участвуют в справочнике "Партии":
[код]
    ТекстЗапроса = "
    |Обрабатывать НеПомеченныеНаУдаление;
    |ГТДОбщий = Справочник.ГТД.ТекущийЭлемент, Справочник.Партии.ГТД;
    |Партия = Справочник.Партии.ТекущийЭлемент;
    |ГТДПартии = Справочник.Партии.ГТД;
    |СтранаПроисхожденияПартии = Справочник.Партии.СтранаПроисхождения;
    |Группировка ГТДОбщий без групп;
    |Группировка Партия без групп;
    |Условие (ПустоеЗначение(ГТДПартии) + ПустоеЗначение(СтранаПроисхожденияПартии) + Найти(Строка(ГТДПартии) + Строка(СтранаПроисхожденияПартии), ""--"") = 0);";
[/код]

Вопрос: можно ли как-нибудь заставить запрос выдавать полный список из 9000 ГТД, а не только 6500, участвующие в справочнике "Партии"? В итогах запроса для остальных 2500 вторичная группировка "Партия" просто должна быть пустой.

Добавление в запрос строки вроде "ГТД = Справочник.ГТД.ТекущийЭлемент;" и соответствующей группировки "Группировка ГТД без групп;" портит запрос, он выдаёт пустой итог, то есть это неправильно. Как исправить запрос?

(Разумеется, можно сделать два запроса и (или) обработку после запроса, но хотелось бы получить сразу в одном запросе.)

Спасибо заранее.
1 SSDDRR
 
27.04.17
20:09
По идее, от запроса следует добиться чего-то вроде "левого соединения" в "Эс-Кью-Эль".
2 GreyK
 
27.04.17
20:46
Как-то так, открывать конфигуратор лень.
    |Группировка ГТДОбщий без групп ВсеВошедшиеВЗапрос;
3 Смотрящий
 
27.04.17
20:46
|Обрабатывать НеПомеченныеНаУдаление;
|ГТДОбщий = Справочник.ГТД.ТекущийЭлемент, Справочник.Партии.ГТД;
|Партия = Справочник.Партии.ТекущийЭлемент;
|СтранаПроисхожденияПартии = Справочник.Партии.СтранаПроисхождения;
|Функция Счетчик = Счётчик();
|Группировка ГТДОбщий без групп;
|Группировка Партия без групп;
4 SSDDRR
 
27.04.17
23:25
(2) (3) Спасибо.

В итоге у меня получилось нужное с таким запросом:

ТекстЗапроса = "
|Обрабатывать НеПомеченныеНаУдаление;
|ГТД = Справочник.ГТД.ТекущийЭлемент, Справочник.Партии.ГТД;
|Партия = Справочник.Партии.ТекущийЭлемент;
|Группировка ГТД без групп Все;
|Группировка Партия без групп;
|Условие (ПустоеЗначение(Строка(ГТД)) + Найти(Строка(ГТД), ""--"") = 0);";

-- я проверил это выгрузив итог в таблицу значений.

Однако при непосредственном обходе итога метод "Группировка("Партия")" приводит к гарантированно мёртвому зависанию в случаях, когда выборка пустая, когда в итог добавлены ГТД, не участвующие в партиях. При выгрузке итога в таблицу значений это выглядит так (с моимими пояснениями):
___________________________________________
00035, 0124020/300102/0000303/1, <-- Группировка("ГТД"): три вложенных значения внутренней вложенной группировки по партиям:
00036, 0124020/300102/0000303/1, 00000001 <-- Группировка ("Партия")
00037, 0124020/300102/0000303/1, 00000001 <-- Группировка ("Партия")
00038, 0124020/300102/0000303/1, 00000001 <-- Группировка ("Партия")
00047, 0210140/030709/0017567/5,  <-- Группировка("ГТД"): ноль значений внутренней вложенной группировки по партиям -- зависание!!!!!!!!!!!!!!!!!!!!
00048, 03910/020301/0002022, <-- Группировка("ГТД"): одно значение внутренней вложенной группировки по партиям:
00049, 03910/020301/0002022, 00000002 <-- Группировка("Партия")
___________________________________________

Как можно делать обход вложенной группировки так, чтобы "Группировка("Партия")" не зависала? Согласно описанию, эта функция должна возвращать "0", если в выборке ничего нет, а не зависать.

(Разумеется, можно работать с таблицей значений, но хотелось бы и прямым перебором уметь тоже.)
5 SSDDRR
 
27.04.17
23:39
А, понял, в чём дело: я использую вызов функции с ключом для вывода выборки в обратном порядке: "Группировка("Партия", -1)" -- видимо, в платформе "7.70.027" есть ошибка, которая приводит к зависанию при пустой выборке.

Поэтому придётся использовать выборку в прямом порядке, что, конечно, очень медленно, ведь мне нужен именно последний элемент справочника "Партии", то есть с конца.
6 пипец
 
28.04.17
08:55
ничо не понял, а в ТЗ , перевернуть и искать , не ?
7 SSDDRR
 
28.04.17
11:09
Хочется именно прямым перебором итогов запроса, без выгрузки в ТЗ.
Независимо от того, куда вы едете — это в гору и против ветра!