Имя: Пароль:
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 Тогда
           Возврат;
       КонецЕсли;  
       ТЗ.НоваяСтрока();
       ТЗ.Группа = Спр.ТекущийЭлемент();
   ТЗ.код = Спр.Код;
   ТЗ.ВУ = Спр.родитель;
       ПоиметьГруппу(ТЗ.Группа)
  КонецЦикла;
КонецПроцедуры

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


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