![]() |
![]() |
ВадимМ 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 с пометками, В тексте запроса убираешь родителей. В цикле вывода в печатную форму, сверяешься с списком нужно ли выводить данную группу товара или нет. |