Имя: Пароль:
1C
1C 7.7
v7: Результаты запроса в список значений
0 Iriniya
 
22.05.13
01:27
Нужно получить выборку, кот. содеожит группы и подчиненные элементы при условии, что наименование группы любого вышестоящего уровня начинается с «Авто.
Ругается " Поле агрегатного объекта не обнаружено (Принадлежит)"
Хотя СЗ.количествострок() =1 (как в базе)

       Перем Запрос, ТекстЗапроса, Таб;
   Спр = СоздатьОбъект("Справочник.Номенклатура");
   СЗ=СоздатьОбъект("СписокЗначений");
   
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса =
   "//{{ЗАПРОС(Сформир)
   |ТекущийЭлемент = Справочник.Номенклатура.ТекущийЭлемент;
   |Родитель = Справочник.Номенклатура.Родитель;
   |Условие(Лев(ТекущийЭлемент,4) = ""Авто"");
   |"//}}ЗАПРОС
   ;
   // Если ошибка в запросе, то выход из процедуры
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Возврат;
   КонецЕсли;
   
   Запрос.Выгрузить(СЗ);
   
   //Запрос.Выгрузить(СЗ);
   Если СЗ.КоличествоСтрок() > 0  Тогда
       Спр.ВыбратьЭлементы();
       Пока Спр.ПолучитьЭлемент() =1 Цикл
           Если Спр.ТекущийЭлемент().ЭтоГруппа()=0 Тогда
               Если СЗ.Принадлежит(Спр.ТекущийЭлемент())=1  Тогда
                   зн=Спр.ТекущийЭлемент();
               КонецЕсли;
           КонецЕсли;
       КонецЦикла;    
   КонецЕсли;

помогите разобраться.
1 zak555
 
22.05.13
01:29
лучше сделать внешнюю функцию
2 Злопчинский
 
22.05.13
01:29
Запрос.Выгрузить(СЗ);
СЗ будет иметь тип Таблица Значений
3 zak555
 
22.05.13
01:33
(2) +1


(0) что за зачем заново перебирать элементы ?
4 Iriniya
 
22.05.13
01:36
(3) в запросе отобраны только группы, а нужны еще элементы справочника

(1) научите пожалуйста
5 Iriniya
 
22.05.13
01:49
(2) ...Если переданное значение пустое, тогда система сама создаст объект типа 'Таблица значений'. Это стало ясно.

тогда чего не хватает, чтоб был тип СписокЗначений?
6 Злопчинский
 
22.05.13
01:52
мне вообще не нравится конструкция
|ТекущийЭлемент = Справочник.Номенклатура.ТекущийЭлемент;
|Условие(Лев(ТекущийЭлемент,4) = ""Авто"");

текущийэлемент  - тип = справочник
.
а потом ты к нему применяешь строковую функцию в условии, хз как оно там сработает унутре, напиши уже так
.
|ТекущийЭлемент = Справочник.Номенклатура.ТекущийЭлемент;
|Наименование   = Справочник.Номенклатура.Наименование;
|Условие(Врег(Лев(Наименование,4)) = ""АВТО"");
7 Cthulhu
 
22.05.13
01:52
(5): определенным образом скомпонованных аминокислот.
8 Злопчинский
 
22.05.13
01:55
запорос возвращает "таблицу" из несколких колонок! СЗ - это не таблица из нескольких колонок, поэтому в сз запрос запихнет таблицу и получится таблицазначений.
.
после запрос.Выгрузить
какой-то бред написан
9 Злопчинский
 
22.05.13
01:56
сначала запросом получи перечень групп. которые = АВТО. полученный перечень - запихни в СЗ.
Полученный СЗ используй во втором запросе в условии
10 Iriniya
 
22.05.13
01:58
(6) а если так
   |Родитель = Справочник.Номенклатура.Родитель;
   |Условие(Лев(Родитель,4) = ""Авто"");

всетаки запрос создавался, чтоб группы выбрать
11 Злопчинский
 
22.05.13
02:04
(10) угу, похоже
ща поверчу, там есть какие-то затыки, в свое время маялся
12 Злопчинский
 
22.05.13
02:32
вот типа так

//======================================================================
Функция фуЭтоГруппаАвто(ВыбРодитель,Что)
   
   Если Врег(Лев(ВыбРодитель.Наименование,СтрДлина(Что))) = Врег(Что)
   Тогда
       //Сообщить(""+ВыбРодитель.Уровень()+"#"+ВыбРодитель+"#"+ВыбРодитель.ПолноеНаименование());
       Возврат 1;
   КонецЕсли;
   Возврат 0;
КонецФункции //фуЭтоГруппаАвто()

//*******************************************
Процедура Сформировать()
   Перем Запрос, ТекстЗапроса, Таб;
   
   Запрос = СоздатьОбъект("Запрос");

   ТекстЗапроса = "
   |Без Итогов;
   |Родитель = Справочник.Номенклатура.Родитель;
   |Условие(фуЭтоГруппаАвто(Родитель,""A"") = 1);
   |Группировка Родитель Без Групп;
   |";
   Если Запрос.Выполнить(ТекстЗапроса) = 0
   Тогда
       Возврат;
   КонецЕсли;
   
   ТЗ = "";
   Запрос.Выгрузить(ТЗ);
   ПечатьТЗ(ТЗ,"Список групп");
   СЗ = СоздатьОбъект("СписокЗначений");
   Если ТЗ.КоличествоСтрок()>0
   Тогда
       ТЗ.Выгрузить(СЗ,,,"Родитель");
   КонецЕсли;
   
   ТекстЗапроса = "
   |Без Итогов;
   |Элемент = Справочник.Номенклатура.ТекущийЭлемент;
   |Условие(СЗ.Принадлежит(Элемент) = 1);
   |Группировка Элемент;
   |";
   Если Запрос.Выполнить(ТекстЗапроса) = 0
   Тогда
       Возврат;
   КонецЕсли;
   
   ТЗ = "";
   Запрос.Выгрузить(ТЗ);
   ПечатьТЗ(ТЗ,"Иерархия групп и элементов");
   
КонецПроцедуры
13 Злопчинский
 
22.05.13
02:36
(1) без внешней функции у меня не получилось...
14 Iriniya
 
22.05.13
02:59
(12) после первого запроса отладка показывает ТЗ.КоличествоСтрок()=0 хотя группы на "А" точно есть
15 Злопчинский
 
22.05.13
03:05
(14) Врешь. у меня там стоит английская А - исправь на русскую
16 Злопчинский
 
22.05.13
03:07
(140 кстати. тебе повезло. днем на мисте новичку женской части населения без фотки топлесс в личке фиг кто что подскажет. так что пользуйся моей добротой и хоть плечо оголи.
17 Iriniya
 
22.05.13
03:16
(15) исправила - все ОК.
а у меня без функции вот так выходило
   Перем Запрос, ТекстЗапроса, Таб;
   Спр = СоздатьОбъект("Справочник.Номенклатура");
   ТЗ=СоздатьОбъект("ТаблицаЗначений");
   ТЗ1=СоздатьОбъект("ТаблицаЗначений");
   //    СЗ=СоздатьОбъект("СписокЗначений");
   
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса =
   "//{{ЗАПРОС(Сформир)
   |Родитель = Справочник.Номенклатура.Родитель;
   |Группировка Родитель;
   |Условие(Лев(Родитель,1) = ""А"");
   |"//}}ЗАПРОС
   ;
   // Если ошибка в запросе, то выход из процедуры
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Возврат;
   КонецЕсли;
   
   Запрос.Выгрузить (ТЗ);
   СЗ = СоздатьОбъект ("СписокЗначений");
   ТЗ.Выгрузить (СЗ,,,"Родитель");
   
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса =
   "//{{ЗАПРОС(Сформир)
   |Номен = Справочник.Номенклатура.ТекущийЭлемент;
   |Группировка Номен;
   |Условие(СЗ.Принадлежит(Номен) = 1);
   |"//}}ЗАПРОС
   ;
   
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Возврат;
   КонецЕсли;
   
   Запрос.Выгрузить (ТЗ1);
после первого запроса результат праильный, а после второго ТЗ1.КоличествоСтрок=0 ;(
18 Iriniya
 
22.05.13
03:20
(16) За доброту твою спасибо ))))
а оголенная спинка зачтется в благодарность?
19 Злопчинский
 
22.05.13
03:34
(18) за такие ненатуральные фотки народ тя растерзает
20 zak555
 
22.05.13
08:56
действительно, и это в 3:20
Программист всегда исправляет последнюю ошибку.