Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Индексированная таблица: вставка строки (число прочтений - 2132 )
Reptile
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 4
Зарегистрирован: 22. Июня 2009
Индексированная таблица: вставка строки
21. Июня 2012 :: 15:07
Печать  
Задача: дерево в ТП на базе итз. Развертка группировки. Алгоритм взял из класса ПоставщикДанных.ДеревоЗначений (метод РазвернутьУзелДерева).
Алгоритм там следующий:
1. создается копия итз поставщика данных ТП
2. удаляются из итз поставщика все строки после разворачиваемой
3. добавляются строки из другой таблицы (подчиненные разворачиваемой)
4. добавляются строки из копии итз с номером больше разварачиваемой.

Все работает хорошо, только этап №4 выполняется 2,5 сек  при количестве записей в итз = 200 (этапы с 1 по 3 выполняются примерно за 20 мс)

Пробовал немного изменить алгоритм:
1. создается копия итз поставщика данных ТП
2. удаляются из итз поставщика все строки после разворачиваемой
3. удаляются из копии итз все строки до разворачиваемой (включительно)
4. добавляются строки из другой таблицы (подчиненные разворачиваемой)
5. добавляются строки из копии итз через метод Объединить()

Выигрыш получается где-то 0,1 сек на том же наборе записей.

Есть ли способ добавить строку в ИТЗ после указанной строки чтобы обойтись без добавления записей из копии?
Или есть другие алгоритмы развертывания в дереве на базе ТП?
  
Наверх
 
IP записан
 
Reptile
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 4
Зарегистрирован: 22. Июня 2009
Re: Индексированная таблица: вставка строки
Ответ #1 - 21. Июня 2012 :: 15:50
Печать  
Пока вышел из положения, используя в качестве поставщика не ИТЗ, а ТЗ (обычную 1С). В ТЗ в методе НоваяСтрока() есть параметр НомерСтроки - куда вставлять строку.
Но вопрос остается открытым, потому что при использовании ТЗ нельзя использовать отбор по индексу (в данной задаче это не используется)

Может можно в ИТЗ в метод НоваяСтрока() добавить параметр НомерСтроки?
Хотя идеальный вариант - чтобы поставщик данных ИТЗ табличного поля умел работать с  сгруппированной ИТЗ автоматически  Подмигивание
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Индексированная таблица: вставка строки
Ответ #2 - 21. Июня 2012 :: 16:20
Печать  
Сбрось содержимое ИТЗ-шек в файл, и сделай тестовую обработку, которая из этих файлов будет заполнять ИТЗ и затем повторять твои операции, тогда можно будет посмотреть
  
Наверх
ICQ  
IP записан
 
Reptile
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 4
Зарегистрирован: 22. Июня 2009
Re: Индексированная таблица: вставка строки
Ответ #3 - 21. Июня 2012 :: 17:33
Печать  
Выгрузил данные в ИТЗ, поменяв ссылки  (справочники/документы) на строковые представления - все стало разворачиваться  очень быстро.
Видимо дело именно в обработке ссылок при копировании данных из одной ИТЗ в другугю
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Индексированная таблица: вставка строки
Ответ #4 - 22. Июня 2012 :: 15:40
Печать  
Значит используются неоптимальные индексы. Хотя без твоего кода, все это гадание на кофейной гуще.
  
Наверх
ICQ  
IP записан
 
Reptile
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 4
Зарегистрирован: 22. Июня 2009
Re: Индексированная таблица: вставка строки
Ответ #5 - 22. Июня 2012 :: 20:28
Печать  
Salimbek,
тест с тексовыми данными ничего не покажет.
Вот структура ИТЗ:
Код
Выбрать все
итзТаблицаДанных = СоздатьОбъект("ИндексированнаяТаблица");

	итзТаблицаДанных.НоваяКолонка("ИдентификаторЗаписи"); //Уникальный идентификатор
	итзТаблицаДанных.НоваяКолонка("СтрокаДобавлена"); //1 если товар добавлен интерактивно
	итзТаблицаДанных.НоваяКолонка("Родитель"); //Пусто для контрагента, контрагент для заказа товара или ЗаказТовара для товара
	итзТаблицаДанных.НоваяКолонка("Элемент"); //Контрагент, ЗаказТовара или Товар
	итзТаблицаДанных.НоваяКолонка("Элемент_Код"); //Код контрагента или товара
	итзТаблицаДанных.НоваяКолонка("Элемент_Представление"); //Строковое представление
	итзТаблицаДанных.НоваяКолонка("ЭтоГруппа"); //1 для Контрагент и ЗаказТовара
	итзТаблицаДанных.НоваяКолонка("Уровень");   //Уровень вложенности
	итзТаблицаДанных.НоваяКолонка("УзелРазвернут"); //1 если развернута группа
	итзТаблицаДанных.НоваяКолонка("КоличествоФин");
	итзТаблицаДанных.НоваяКолонка("КоличествоФин_ЕстьИзменения");
	итзТаблицаДанных.НоваяКолонка("ЦенаФин");
	итзТаблицаДанных.НоваяКолонка("ЦенаФин_ЕстьИзменения");
	итзТаблицаДанных.НоваяКолонка("СуммаФин");
	итзТаблицаДанных.НоваяКолонка("Количество");
	итзТаблицаДанных.НоваяКолонка("Количество_ЕстьИзменения");
	итзТаблицаДанных.НоваяКолонка("Цена");
	итзТаблицаДанных.НоваяКолонка("Цена_ЕстьИзменения");
	итзТаблицаДанных.НоваяКолонка("Сумма");
	итзТаблицаДанных.НоваяКолонка("ГТД");
	итзТаблицаДанных.НоваяКолонка("ГТД_ЕстьИзменения");

	итзТаблицаДанных.ДобавитьИндекс("Элемент","Элемент");
 



С помощью отладчика и sql pofiler удалось выяснить следующее:

1. Код
Код
Выбрать все
итзЗаказыПоставщику.УстановитьФильтр(Родитель,Родитель,"ЗаказПоставщику");
итзЗаказыПоставщику.ВыбратьСтроки("ЗаказПоставщику"); 


, где итзЗаказыПоставщику - индексированная таблица, в которой колонка "ЗаказПоставщику" содержит документы и по которой стоит индекс
вызывает хранимку exec _1sp__1SJOURN_ByIDDOC()  (которая возвращает строку со всеми колонками по документу из журнала) по всем ЗаказамПоставщику, попавшим в отбор по  индексу

2. Код (структура ИТЗ выше)
Код
Выбрать все
итзТаблицаДанных.НоваяСтрока();
итзТаблицаДанных.ЗаполнитьСтроку(,КопияТаблицыДанных,ъ,1); 


для строк, в которых Элемент - это документ (когда элемент = стравочник ничего не проиходит), вывзвает эту же хранимку причем несколько раз, примерно так:
Код
Выбрать все
exec _1sp__1SJOURN_ByIDDOC '18TIRL001'
exec _1sp__1SJOURN_ByIDDOC '1HWUTG001'
exec _1sp__1SJOURN_ByIDDOC '1HPOFK001'
exec _1sp__1SJOURN_ByIDDOC '1HWUTG001'
exec _1sp__1SJOURN_ByIDDOC '1I0YMN001'
exec _1sp__1SJOURN_ByIDDOC '1HWUTG001'
exec _1sp__1SJOURN_ByIDDOC '1HW62S001'
exec _1sp__1SJOURN_ByIDDOC '1HWUTG001'
exec _1sp__1SJOURN_ByIDDOC '1HYHCQ001'
exec _1sp__1SJOURN_ByIDDOC '1HWUTG001'
exec _1sp__1SJOURN_ByIDDOC '1HXJSG001'
exec _1sp__1SJOURN_ByIDDOC '1HWUTG001'
exec _1sp__1SJOURN_ByIDDOC  1HWHM8001'
exec _1sp__1SJOURN_ByIDDOC '1HWUTG001'
exec _1sp__1SJOURN_ByIDDOC '1HWQQT001'
exec _1sp__1SJOURN_ByIDDOC '1HWUTG001'
 


причем только документ с ИД '1HWUTG001' находится в копируемой строке, и только один документ есть у этого контрагента в итзТаблицаДанных.
А база у нас (можете судить по ид документа) - очень большая, поэтому лишние обращения к ней - ни к чему

Возможно дело именно в индексах, а точнее с попыткой итз сортировать индекс, причем для документа, видимо, по позиции.

Обычная ТЗ при методе НайтиЗначение() никаких обращений не выполняет
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать