Имя: Пароль:
1C
1C 7.7
v7: глюк или не глюк?
0 gimbat
 
27.12.11
15:00
Всем привет, с наступающим Новым...

Версия 1с v7.7 (7.70.027)
Торговля + склад редакция 9.2
оптово-розничная конфигурация (7.70.944)

Проблема такая.
Выполняю запрос:
обрабатывать непомеченныенаудаление;
Тек = Справочник.номенклатура.текущийэлемент;
Номенклатура = Справочник.номенклатура.наименование;
Код = Справочник.номенклатура.код;
группа = Справочник.номенклатура.родитель;
группировка тек;

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

1. Хотелось бы знать это проблема в кривизне моих рук или это присущий данной версии 1с глюк.

2. Если руки у меня кривые: подскажите какой запрос более правильный, чтобы я далее из результата запроса мог получить иерархию групп.

Заранее благодарен.
1 Ёпрст
 
27.12.11
15:01
(0) это твоё незнание
2 andrewks
 
27.12.11
15:02
боян
3 Ёпрст
 
27.12.11
15:03
запрос по справочнику обрабатывает ТОЛЬКО элементы справочника и достраивает группы на выходе.
Поэтому реквизиты групп ты не видишь.
4 Ёпрст
 
27.12.11
15:04
группировка тек без групп;

вот так выполни - увидишь ровно столько, сколько запрос перебрал записей.
Всю остальную иерархию он достраивает потом.
5 gimbat
 
27.12.11
15:12
Я правильно понял, вот нижеприведенным способом (которым я пытался увидеть) я группы не увижу, а поможет мне только запрос.группировка?
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Возврат;
   КонецЕсли;
   Запрос.Выгрузить(ТЗ,1,0);
//ТЗ таблица на форме, где я вижу "результат" запроса
6 Ёпрст
 
27.12.11
15:16
(5) выкини вот это:
группа = Справочник.номенклатура.родитель;

и увидишь свои группы (правда не все, если есть пустые группы - без элементов которые,их не увидишь), но, без атрибутов .
7 gimbat
 
27.12.11
15:19
(6)
ну это наверное не то что мне надо, я ведь не смогу отличить группу от простой номенклатуры
8 Ёпрст
 
27.12.11
15:19
(7) метод запроса ЭтоГруппа поможет тебе в этом.
9 gimbat
 
27.12.11
15:21
(8)
и ... этот метод я смогу использовать при обходе выборки запроса, правильно?
10 gimbat
 
27.12.11
15:23
(8)
и смириться с тем, что для получения иерархии групп, мне надо выкачать всю номенклатуру, правильно?
11 Ёпрст
 
27.12.11
15:23
(9) ага
12 Ёпрст
 
27.12.11
15:23
(10) в смысле ? А тебе не это надо ?
13 gimbat
 
27.12.11
15:26
мне это надо, но желательно было бы, без лишних операций...
т.е. еси справочник 100000 записей, а групп в общей сложности всего 40, мне надо создать выборку 100000 (ну или там чуток меньше), и в ней искать свои 40.
Правильно я понял?
14 gimbat
 
27.12.11
15:29
можно сказать по другому, для моей цели (иерархия групп), не нужно делать запрос, а сразу перебрать справочник?
15 Ёпрст
 
27.12.11
15:32
тебе нужно получить только группы из запроса, или что ?
16 gimbat
 
27.12.11
15:39
сформулирую так: мне нужно получить список групп с учетом иерархии, для дальнейшей обработки.
Ищу самый быстрый способ (количество строк в справочнике более 70000)
17 gimbat
 
27.12.11
15:41
имхо, считал что запросом это будет выполняться быстрее.
18 Ёпрст
 
27.12.11
15:43
select id as [Спр $Справочник.Номенклатура] from $Справочник.Номенклатура where isfolder = 1

вот тебе, быстрее некуда - поимеешь список всех групп вообще.
19 gimbat
 
27.12.11
15:47
(18)
Запрос[1] : Ожидается  '=' перед 'id'
20 Ёпрст
 
27.12.11
15:47
21 gimbat
 
27.12.11
15:52
Вывод: средствами языка запросов 1с это не раелизуется?
22 gimbat
 
27.12.11
15:54
Вывод: средствами языка запросов 1с, это (16) не реализуется?
23 Ёпрст
 
27.12.11
15:55
(22) реализуется. Только запросом ты не получишь никогда все группы.
Только те, в которых есть элементы.
24 Ёпрст
 
27.12.11
15:56
но, штатно, в разы быстрее получить рекурсивной функцией.
25 gimbat
 
27.12.11
18:36
спасибо за ответ.
небольшую часть пустот в моем мозгу заполнили))
еси бы намекнули за счет чего в данном контексте рекурсивная функция получает многоразовое преимущестов, был премного благодарен.
26 Ёпрст
 
27.12.11
18:47
(25)выборка +использовать ИспользоватьРодителя+ ВключатьПодчиненные(0) или ПолучитьЭлемент(0), если группа - вызвать рекурсивно , если элемент - прервать выборку.
27 gimbat
 
27.12.11
19:08
примерно так?
   ТЗ.очистить();
   ТЗ.Новаяколонка("Код");
   ТЗ.Новаяколонка("Группа");
   ТЗ.Новаяколонка("ВУ");
   Спр = СоздатьОбъект("Справочник.номенклатура");
   
   Спр.выбратьэлементы(1);
   Пока Спр.получитьэлемент() =1 Цикл
       Если спр.этогруппа() =1 Тогда
           ТЗ.новаястрока();
           ТЗ.код = спр.код;
           ТЗ.группа = спр.наименование;
           ТЗ.ВУ = спр.родитель;
       КонецЕсли;
   КонецЦикла;
28 Ёпрст
 
27.12.11
19:37
(27) нет
29 Ёпрст
 
27.12.11
19:42
Процедура ПоиметьГруппу(ВыбГруппа)
   Спр = СоздатьОбъект("Справочник.Номенклатура");
   Спр.ИспользоватьРодителя(ВыбГруппа);
   Спр.ВыбратьЭлементы();
   Пока Спр.ПолучитьЭлемент(0) = 1 Цикл
       Если Спр.ЭтоГруппа() = 0 Тогда
           Возврат;
       КонецЕсли;  
       ТЗ.НоваяСтрока();
       ТЗ.Группа = Спр.ТекущийЭлемент();
       ПоиметьГруппу(ТЗ.Группа)
  КонецЦикла;
КонецПроцедуры
30 G-Re
 
27.12.11
21:06
(29) Рекурсия это в самом деле сила!
(0) Просто к сведению: глюк(Gluck) с немецкого - счастье. Счастье, что есть этот форум, где своевременно и профессионально ответят на любой вопрос!
31 gimbat
 
27.12.11
22:22
Сделал, как было предложено (29)

 Процедура ПоиметьГруппу(ВыбГруппа)
   Спр = СоздатьОбъект("Справочник.Номенклатура");
   Спр.ИспользоватьРодителя(ВыбГруппа);
   Спр.ВыбратьЭлементы();
   Пока Спр.ПолучитьЭлемент(0) = 1 Цикл
       Если Спр.ЭтоГруппа() = 0 Тогда
           Возврат;
       КонецЕсли;  
       ТЗ.НоваяСтрока();
       ТЗ.Группа = Спр.ТекущийЭлемент();
   ТЗ.код = Спр.Код;
   ТЗ.ВУ = Спр.родитель;
       ПоиметьГруппу(ТЗ.Группа)
  КонецЦикла;
КонецПроцедуры

Процедура Сформировать()
   ТЗ.очистить();
   ТЗ.Новаяколонка("Код");
   ТЗ.Новаяколонка("Группа");
   ТЗ.Новаяколонка("ВУ");
   ПоиметьГруппу("");
КонецПроцедуры


Хочу доложить работает практически мгновенно.
Большое спасибо, что находите время, делиться опытом.
Снимаю шляпу!
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.