Форум программистов, компьютерный форум, киберфорум
Наши страницы
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.61/41: Рейтинг темы: голосов - 41, средняя оценка - 4.61
Tomosh
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 42
1

Быстрый Поиск Родителя Первого Уровня

09.03.2014, 12:11. Просмотров 8340. Ответов 7
Метки нет (Все метки)

здравствуйте

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


Код ( (Unknown Language)):
ТзПроданоПерУр=СоздатьОбъект("ТаблицаЗначений");
ТзПроданоПерУр.Загрузить(ТзПродано);
ТзПроданоПерУр.ВыбратьСтроки();
Пока ТзПроданоПерУр.ПолучитьСтроку()=1 Цикл
Пока ТзПроданоПерУр.Товар.Уровень()>1 Цикл
ТзПроданоПерУр.Товар=ТзПроданоПерУр.Товар.Родитель;
КонецЦикла;
КонецЦикла;
всё работает нормально, но по замеру в отладчике именно расчет родителя первого уровня для 10-12к товаров занимает 80% времени формирования отчета

можно ли как-то оптимизировать данный код, или каким-то иным способом ускорить выполнение?
может быть можно в самом запросе получать родителя первого уровня? сам искал, но находил только получение родителя, а при разной глубине вложения - это не то, что необходимо.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.03.2014, 12:11
Ответы с готовыми решениями:

1c77 Быстрый поиск по наименованию
Есть 2 базы ТиС. В общем, они более-менее одинаковы с точки зрения конфигурации. Но в одной (9.27)...

Как в запросе получить родителя второго уровня
Добрый день! Есть иерархия групп и элементов. Я через запрос обращаюсь к справочнику и получаю...

Продажи по регионам, или как в запросе получить родителя самого верхнего уровня?
Всем доброго времени суток. Подскажите, пожалуйста, как это можно осуществить? Интересуют продажи,...

Быстрый поиск
Доброго суток дня! Собрал быстрый поиск, но почему то выдает ошибку ...

Написать программу замены элементов списков первого уровня на элементы списка самого низкого уровня в цикл
Пажалуйста помогите с задачкой Пример: (((a)) (b) (((c) e)) (((d)))) -> ((c) (d) (c) (d))

7
Tomosh
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 42
09.03.2014, 13:57 2
опытным путем установил, что:


Код ( (Unknown Language)):
Пока ПустоеЗначение(ТзПроданоПерУр.ТОвар.Родитель)=0 Цикл
работает в среднем на 30% быстрее, уже неплохо, но может можно что-то ещё выжать?
0
puh14
0 / 0 / 0
Регистрация: 07.07.2008
Сообщений: 1,401
10.03.2014, 09:15 3
Те же яица , но вдруг быстреее
ПустРод = ПолучитьПустоеЗначение("Справочник.Номенклатура");
Если Стр.Родитель = пустРод Тогда
0
ktukmom
0 / 0 / 0
Регистрация: 21.06.2013
Сообщений: 38
10.03.2014, 22:16 4
ТзПроданоПерУр=СоздатьОбъект("ТаблицаЗначений");
ТзПроданоПерУр.Загрузить(ТзПродано);
ТзПроданоПерУр.ВыбратьСтроки();
Пока ТзПроданоПерУр.ПолучитьСтроку()=1 Цикл
Спр = ТзПроданоПерУр.Товар;
ВерхнийРодитель=ЗначениеИзСтрокиВнутр(Шаблон("[ЗначениеВСтрокуВнутр(Спр"+СтрЗаменить(Формат("","С"+(Спр.Уровень()-1))," ",".Родитель")+")]"));
ТзПроданоПерУр.Товар = ВерхнийРодитель;
КонецЦикла;

Попробуйте так.
Суть убыстрения - будет один проход по циклу без излишнего перебора.
0
10.03.2014, 22:16
vbs
0 / 0 / 1
Регистрация: 22.06.2013
Сообщений: 9
12.03.2014, 13:31 5
Хороший способ предложил Glukman.
Но я тоже решил развлечься и проверил свой метод :

Код ( (Unknown Language)):
ТзПроданоПерУр=СоздатьОбъект("ТаблицаЗначений");
ТзПроданоПерУр.Загрузить(ТзПродано);
ТзПроданоПерУр.ВыбратьСтроки();
NN = CreateObject("Reference.Номенклатура"); // возможно, название справочника другое
Пока ТзПроданоПерУр.ПолучитьСтроку()=1 Цикл
Спр = ТзПроданоПерУр.Товар.;
Slash = Find(Спр.FullCode(),"/");
Code = Left(Спр.FullCode(),Slash-1);
NN.FindByCode(Code);
ТзПроданоПерУр.Товар = NN.CurrentItem(); //ВерхнийРодитель;
КонецЦикла;
На выборке из 30 тыс. позиций у меня работает в 3 раза быстрее.
Видимо, преобразование во внутреннее представление и обратно работает все же медленнее
0
ktukmom
0 / 0 / 0
Регистрация: 21.06.2013
Сообщений: 38
12.03.2014, 15:57 6
Цитата Сообщение от vbs
Хороший способ предложил Glukman.
Но я тоже решил развлечься и проверил свой метод :

Код ( (Unknown Language)):
ТзПроданоПерУр=СоздатьОбъект("ТаблицаЗначений");
ТзПроданоПерУр.Загрузить(ТзПродано);
ТзПроданоПерУр.ВыбратьСтроки();
NN = CreateObject("Reference.Номенклатура"); // возможно, название справочника другое
Пока ТзПроданоПерУр.ПолучитьСтроку()=1 Цикл
Спр = ТзПроданоПерУр.Товар.;
Slash = Find(Спр.FullCode(),"/");
Code = Left(Спр.FullCode(),Slash-1);
NN.FindByCode(Code);
ТзПроданоПерУр.Товар = NN.CurrentItem(); //ВерхнийРодитель;
КонецЦикла;
На выборке из 30 тыс. позиций у меня работает в 3 раза быстрее.
Видимо, преобразование во внутреннее представление и обратно работает все же медленнее
А вот про полный код забыл. Решение не мое, автор если память не изменяет ака Рупор абсурда. на Мисте мелькало.
0
vbs
0 / 0 / 1
Регистрация: 22.06.2013
Сообщений: 9
12.03.2014, 19:34 7
Решение не мое, автор если память не изменяет ака Рупор абсурда. на Мисте мелькало.

Я имею обыкновение проверять чужие предложения, если понимаю, как надо :blush:
Часто интересные идеи мелькают - так я их в свою библиотеку...


Еще чуточку быстрее должно сработать так :
Спр = ТзПроданоПерУр.Товар.FullCode();
Slash = Find(Спр,"/");
Code = Left(Спр,Slash-1);
0
Tomosh
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 42
13.03.2014, 18:43 8
спасибо всем, проверил, все варианты рабочие, выдают один и тот же результат, но в данном конкретном отчете скорости на 15к товарах такие:

1. Оригинал - 90,33 сек
2. Условие цикла - ПустоеЗначение() - 67,69 сек
3. Вариант от vbs - 49,15 сек
4. Вариант от Glukman - 45,74 сек

не славы ради, но спортивного интереса для ;)
0
13.03.2014, 18:43
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2014, 18:43

Вывод поста, который содержит id категории, её родителя, родителя родителя
Есть 2 таблицы, первая - категории ( category_id, parent_id и т.д), вторая - посты (post_id,...

Домен первого уровня
Делаю интернет магазин. И хочется получить домен 2 уровня на халяву. Но никак, к сожалению,...

Поиск родителя
Всем доброго времени суток! Ситуация такая Есть html код: <div class="item"> ... <div...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.