К списку форумов К списку вопросов
Регистр.Обороты.Товар.Родитель.Родитель неправ. работает по СКЛ, как побороть?
ВадимМ
06.07.2004 - 13:30
Имеется запрос, например:
Товар = Регистр.Обороты.Товар;
Родитель1 = Регистр.Обороты.Товар.Родитель;
Родитель2 = Регистр.Обороты.Товар.Родитель.Родитель;
Родитель3 = Регистр.Обороты.Товар.Родитель.Родитель.Родитель;
под дбф все правильно работает, а под скл - родитель2 и родитель3 дает то же что и родитель1.
Варианты с ТЗ работают, но очень медленно. Причем оптимизировать некуда, т.к. команда Т.Товар.Родитель.Родитель съедает 98% времени выполнения и заменить ее нечем.
Что посоветуете?
ВадимМ
1 - 06.07.2004 - 13:32
7.7.021 СКЛ
101
2 - 06.07.2004 - 13:33
клади кусок кода
Пицзеци
3 - 06.07.2004 - 13:35
клади
NS
4 - 06.07.2004 - 13:35
(0) Варианты с ТЗ работают быстро!
и команду Т.Товар.Родитель.Родитель - делать не надо....
(то есть родителей получить мож и нужно - но только один раз для каждого элемента)
ВадимМ
5 - 06.07.2004 - 13:35
  Запрос = СоздатьОбъект("Запрос");
  ТекстЗапроса =
  "//{{ЗАПРОС(Сформировать)
  |Период с ДатаС по ДатаПо;
  |Товар = Регистр.Обороты.Товар;
  //|РодительТовара = Регистр.Обороты.Товар.Родитель;
  |Фирма = Регистр.Обороты.Фирма;
  |Марка = Регистр.Обороты.Товар.Марка;
  |Артикул = Регистр.Обороты.Товар.Артикул;
  |Склад = Регистр.Обороты.ДопИзмерение1;
  |РасходКво = Регистр.Обороты.РасходКво;
  |РасходСум = Регистр.Обороты.РасходСум;
  |Дхд = Регистр.Обороты.Доход;
  |Функция РасхКво = Сумма(РасходКво);
  |Функция РасхСум = Сумма(РасходСум);
  |Функция Доход = Сумма(Дхд);
  //|Группировка РодительТовара;
  |Группировка Товар;
  |Группировка Марка;
  |Группировка Склад все ВошедшиеВзапрос;
  |Условие(Товар в МФвыбТовары);
  |Условие(Склад в МФВыбСклады);
  |Условие(ПустоеЗначение(Фирма)=1);
  |Условие(Марка в МФВыбМарки);
  |"//}}ЗАПРОС
Djkxfhf
6 - 06.07.2004 - 13:37
род1=Т.Товар.Родитель;
род2=род1.Родитель;
ВадимМ
7 - 06.07.2004 - 13:38
(4) не совсем понял
Родителя я и получаю 1 раз для каждого элемента. Просто в зависимости от режима построения отчета извлекается либо Товар.Родитель либо Товар.Родитель.Родитель и т.д.
Средний запрос - продажи за месяц по нескольким магазинам дает 4-5тыс.строк, на обработку 100 записей уходит визуально 0.1-.5 сек. По-моему это медленно.
101
8 - 06.07.2004 - 13:38
5. и чего???
ЗЫ в правила отправить? ;))
NS
9 - 06.07.2004 - 13:40
(7) Получение всех родителей, для 5000 записей происходит быстрее секунды...
Текст я тебе уже выкладывал...
Что такое визуально? Вообще-то делаются замеры...
ВадимМ
10 - 06.07.2004 - 13:51
(6,9) разница по времени выполнения практически не ощущается
Замеры само собой делаю, я имею ввиду относительную разницу производительности - если разница настолько незначительная что ее не заметно на глаз, то какой в ней смысл?
Щас выложу код вместе с замером.
ВадимМ
11 - 06.07.2004 - 14:01
Т.ВыбратьСтроки();
Пока Т.ПолучитьСТроку()=1 Цикл
   Если (Т.НомерСтроки%100)=0 Тогда
      Состояние("Обработка результ.таблицы... "+Строк(Т.НомерСтроки));
   КонецЕсли;
   Если выбУровеньПоМаркам=0 Тогда
        Род1 = Т.Товар.Родитель;
  Род2 = Род1.Родитель;
  Т.Родитель2 = Род2.Родитель;
   ИначеЕсли выбУровеньПоМаркам=1 Тогда
  Род1 = Т.Товар.Родитель;
  Т.Родитель2 = Род1.Родитель;
   ИначеЕсли выбУровеньПоМаркам=2 Тогда
  Т.Родитель2 = Т.Товар.Родитель;
   КонецЕсли;
КонецЦИкла;
\\\\\\\\\\\\\\\\\\\\\\\\\\\
1565 Род1 = Т.Товар.Родитель; 3429 7.147645 34.83
1566 Род2 = Род1.Родитель; 3429 6.654658 32.43
1567 Т.Родитель2 = Род2.Родитель; 3429 6.435169 31.36
ВадимМ
12 - 06.07.2004 - 14:04
11+
итого около 20 сек. на обработку 3429 строк и это только прописывание родителей
Откуда у тебя такие цифры как меньше сенуды 5000 эл=тов?
Сервак у меня достаточно мощный: 2 ксеона 2.4Г, 2 Гига памяти и скази
Djkxfhf
13 - 06.07.2004 - 14:13
а где второй замер?
SiAl
14 - 06.07.2004 - 14:17
Первое:
  |Функция РасхКво = Сумма(РасходКво);
  |Функция РасхСум = Сумма(РасходСум);
настораживает.
Второе:
Лучше так:
Перем Группа[10];
...
|Товар = Регистр.Обороты.Товар;
|Группа = Регистр.Обороты.Товар.Родитель;
...
|Группировка Группа;
|Группировка Товар без групп;
...
Пока Запрос.Группировка("Группа") = 1 Тогда
  ...
  Группа = Запрос.Группа.ТекущийЭлемент();
  Уровень = Группа.Уровень();
  Группа[Уровень] = Группа;
  ...
    Пока Запрос.Группировка("Товар") = 1 Тогда
      ...
      Товар = Запрос.Товар.ТекщийЭлемент();
      ...
    КонецЦикла;
  ...
КонецЦикла;
ВадимМ
15 - 06.07.2004 - 14:21
(14)
1)чем именно настораживает функция Сумма()?
2)твой вариант, т.е.
Группа = Регистр.Обороты.Товар.Родитель;
даст только непосредственного родителя, а мне нужно Товар.Родитель.Родитель.Родитель
Славко
16 - 06.07.2004 - 14:22
(5) ты логически пробовал представить шо у тя выдаст запрос если откоментироать строки? шо ты хошь получить в итоге?
NS
17 - 06.07.2004 - 14:22
(11)Не смешно...
Ты все отчеты вместе с отладчиком запускаешь?
Тебе не говорили - что при этом намного медленней выполняется?
врем=_GetPerformanceCounter();
Т.ВыбратьСтроки();
Пока Т.ПолучитьСТроку()=1 Цикл
  // Если выбУровеньПоМаркам=0 Тогда //Хватило же ума
условие в цикл впихнуть!!!!
       Род1 = Т.Товар.Родитель;
       Род2 = Род1.Родитель;
       Т.Родитель2 = Род2.Родитель;
  // ИначеЕсли выбУровеньПоМаркам=1 Тогда
 // Род1 = Т.Товар.Родитель;
 // Т.Родитель2 = Род1.Родитель;
  // ИначеЕсли выбУровеньПоМаркам=2 Тогда
  //Т.Родитель2 = Т.Товар.Родитель;
  // КонецЕсли;
КонецЦИкла;
сообщить(""+(_GetPerformanceCounter()-врем)+" мс.");
ВадимМ
18 - 06.07.2004 - 14:25
(16) если откоментировать, то будет так как было
нужно:
продажи в разрезе торг.марок с % и разрезе складов и групп складов
Все есть, все работает только очень медленно, т.к. прописывание родителей товара в ТЗ занимает много времения. Был бы ДБФ, проблемы бы не было - запросом сразу бы получил всех вышестоящих родителей, а в СКЛ не работает.
Вопросов 2:
1) лечится ли это в СКЛ версии с тем, чтобы работал корректно запрос
2) если не лечится, то как ускорить построение отчета в варианте с ТЗ?
ВадимМ
19 - 06.07.2004 - 14:28
(17)
1) проверка условия по простой переменной занимает коппечные проценты времени выполнения, но повышает наглядность кода
2) я знаю что время выполнения под отладчиком выше, но не настолько чтобы это было принципиальным для анализа и потом метода _GetPerformanceCounter() я не знаю, во всяком случае в англ.варианте, это документированная команда или что это?
Славко
20 - 06.07.2004 - 14:32
(18) т.е. ты хошь получить:
Группа1
--подгруппа1
----элементподгруппы1
----.......
--подгруппа2
.
.
.
Группа2
--подгруппа1
----элементподгруппы1
----.......
--подгруппа2
так?
ВадимМ
21 - 06.07.2004 - 14:33
(20) вопрос стоит проще, см (0).
ВадимМ
22 - 06.07.2004 - 14:40
(17) без отладчика 18 сек., разница не принципиально. К тому же меня интересует относительно уменьшение времени выполнения, а не абсолютное. Т.е. если процедура с отладчиком будет показывать 2 сек. вместо 20, и то и без отладчика она покажет 1.5 сек. А если с отладчиком время уменьшилось на 3 сек., то и без отладчика оно уменьшиться, пусть даже не на 3, а на 2.7 сек. Ну и что?
NS
23 - 06.07.2004 - 14:42
Да блин!!
Запусти - Без отладчика (Закрой его) - такой текст... Да и всё!!!
И увидишь - Откуда одна секунда!!
врем=_GetPerformanceCounter();
Т.ВыбратьСтроки();
Пока Т.ПолучитьСТроку()=1 Цикл
       Т.Родитель2 = Т.Товар.Родитель.Родитель.Родитель;
КонецЦИкла;
врем1=_GetPerformanceCounter();
сообщить(""+Т.КоличествоСтрок()+" строк - "+(врем1-врем)+" мс.");
NS
24 - 06.07.2004 - 14:45
(+23) И причем тут сервак? - ты ж не на серваке запускаешь!!!
ВадимМ
25 - 06.07.2004 - 14:46
(23) ты чего разошелся? спокойнее надо быть
Т.Родитель2 = Т.Товар.Родитель.Родитель.Родитель;
так было изначально. Работает относительно медленно что с отладчиком, что без.
Попробовал:
Род1 = Т.Товар.Родитель;
Род2 = Род1.Родитель;
Т.Родитель2 = Род2.Родитель;
разницы тоже особе не ощущается
При чем тут отладчик? и о какой секунде ты говоришь?
ВадимМ
26 - 06.07.2004 - 14:48
(24) да что ты говоришь! серьезно? я не на серваке запускаю? а где? вот скажи мне, тебе ведь оттуда все видно. :)
NS
27 - 06.07.2004 - 14:49
(25) Ты с выключенным отладчиком запустил текст (23)?
Я говорю о той секунде - которую этот текст выдаст тебе в окно сообщений.
Славко
28 - 06.07.2004 - 14:49
честно мне некада особо вдумываться, ты хошь сказать шо запросом (5) ты получаешь иерархию (20) или я не правльно понял из (5) че ты хошь?
кроме того в ДБФ версии какое то не такое интерпритирование текста запроса в язык запросов...
ВадимМ
29 - 06.07.2004 - 14:53
(27) все с выключенным отладчиком
Что ты к нему так пристал? Я еще раз повторяю: нет смысла боротся за экономию 0.50-1.00 секунды, если обработка всей таблицы не в самом большом варианте занимает 20сек. Интересует принципиальное ускорение получения родителей всех уровней. Может на каком-то релизе СКЛ версии 7.7 запрос все-таки начал работать как в ДБФ? или еще какие обходные пути есть?
ВадимМ
30 - 06.07.2004 - 14:55
(28) прикол в том, что запрос (5) выдает разные результаты в СКЛ и в ДБФ. В ДБФ все ок, а в СКЛ вместо "Товары/Телевизоры/Телевизоры 21" дает "Телевизоры21/Телевизоры21/Телевиоры21" ведь это же ненормально?
Inka
31 - 06.07.2004 - 14:56
сорри за ОФФ
NS, позвони tsd на трубу
ВадимМ
32 - 06.07.2004 - 15:15
типа все ушли на обед?..
Djkxfhf
33 - 06.07.2004 - 15:17
2(32) типа без вариантов.
Djkxfhf
34 - 06.07.2004 - 15:24
какой тип значения у измерения Регистра - "Обороты.Товар" ?
ВадимМ
35 - 06.07.2004 - 15:33
(34) справочник.товары
Славко
36 - 06.07.2004 - 15:35
не понимая задачи трудно помочь, но СКЛ все правильно вроде выдает, эт ДБФ не правильно выдает... ;)
ВадимМ
37 - 06.07.2004 - 15:38
(36) т.е. ты хочешь сказать что конструкция типа:
Товар = Регистр.Обороты.Товар;
Родитель1 = Регистр.Обороты.Товар.Родитель;
Родитель2 = Регистр.Обороты.Товар.Родитель.Родитель;
Родитель3 = Регистр.Обороты.Товар.Родитель.Родитель.Родитель;
при структуре справочника товары "Товары/Телевизоры/Телевизоры 21/"
должна выдавать "Телевизоры 21/Телевизоры 21"/Телевизоры21"?
Но ведь выдает! и по-моему это, мягко говоря, нелогично.
Славко
38 - 06.07.2004 - 15:44
исходя из 1С-ного интерпритатора в язык запросов вполне логично, я же не вижу как ты получаешь то своих родителей...
ЗЫ таблику (20) под СКЛ получал без особых усилий... правда я под ДБФ пишу тексты запросов с СКЛ направленностью поэтому у меня запросы вроде одинаково работают независимо от хранилища данных 1С...
Djkxfhf
39 - 06.07.2004 - 15:45

И когда ты идёшь по 1-й группировке ("|Группировка Товар;"), то у тебя разве группы/родители не выводятся первыми?
ВадимМ
40 - 06.07.2004 - 15:46
(38) ну почему не видишь?
Товар - переменная запроса, вполне конкретно определена
Родитель1,2,3 тоже.
Чего ты не видишь?
Djkxfhf
41 - 06.07.2004 - 15:47
(39) -> (35,5)
Djkxfhf
42 - 06.07.2004 - 16:08
чего притих? (39) помогло?
Славко
43 - 06.07.2004 - 16:30
(40) сидел читал (5)... думал... долго думал... так и не надумал де ж там у тя определены "Родитель1,2,3 тоже"...
(39) выводятся, тока я так понял ВадимМ это не подходит ;)
SiAl
44 - 06.07.2004 - 16:30
А вообще то это лажа столько раз определять родителей. Вот здесь то у тебя постоянно идет обращение к базе. Тем более если у тебя добавиться количество иерархии, что тогда, новую переменную? Не пытайся в запросе все загнать в горизонталь. Запрос хорош вертикальным результатом.
В идеале работает все и через одну группировку. Типовые тому подтверждение.
Djkxfhf
45 - 06.07.2004 - 16:33
2(43) почему?
Славко
46 - 06.07.2004 - 16:38
(45) я ж не ВадимМ, у него и узнавай, как я понял из того шо он мне ответил на (20) ему это не нада...
Эстет хренов
47 - 06.07.2004 - 18:47
1.ВключитьSQL(0);
2.Использовать кэш-список родителей.
Славко
48 - 06.07.2004 - 18:56
Запрос.ВключитьSQL(1) -> 5.5 сек.
Запрос.ВключитьSQL(0) -> 49.5 сек
не проще ли правильно писать запросы?
Эстет хренов
49 - 06.07.2004 - 19:25
(48) а никто не против правильно писать запросы, только часто бывает, что необходимость радикальных изменений экономически нецелесообразна.
+(0)
3 вариант) На форме список уровней 1-2-3 с пометками,
В тексте запроса убираешь родителей.
В цикле вывода в печатную форму, сверяешься с списком нужно ли выводить данную группу товара или нет.

К списку вопросов на форуме 1C

>>