Вход | Регистрация

1С:Предприятие ::

Метки: 

Оптимизация кода XML через XDTO в табличную часть

Я
   jedbez
 
20.12.17 - 01:28
Есть получаемый XML определенного формата, в XDTO описан. После происходит преобразование параметров в значения справочников по уеазанным кодам.

// XML в ОбъектXDTO

ЧтениеXML.УстановитьСтроку(XMLСтрока);
Об = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,Тип_);
// SLUCH - табличная часть документа

НС = Объект.SLUCH.Добавить();
Для Каждого Эл из Об.SLUCH[0].Свойства() цикл
    ЗаполнитьПоле(НС[Эл.Имя],Об.SLUCH[0][Эл.Имя],,"SLUCH ");
КонецЦикла;

Ну и непосредственно сама процедура, определяет какой тип имеет поле в строке табличной части и ищет в справочнике
Процедура ЗаполнитьПоле(Поле,Значение,РазрешитьДобавить=Ложь,Коментарий="")
    
    Если Значение<>Неопределено тогда
        Если ТипЗнч(Поле)=Тип("Строка") тогда
            Поле = Значение;
        ИначеЕсли ТипЗнч(Поле)=Тип("Число") тогда
            Поле = Значение;
        ИначеЕсли ТипЗнч(Поле)=Тип("Дата") тогда
            Поле = Значение;
        ИначеЕсли ТипЗнч(Поле)=Тип("Булево") тогда
            Поле = Значение;
        ИначеЕсли ТипЗнч(Поле)=Тип("Null") тогда
            Поле = Значение;
        Иначе
            Мд = Метаданные.НайтиПоТипу(ТипЗнч(Поле));
            Спр = Справочники[МД.Имя];
            Если СокрЛП(Значение) <> "" тогда
                Если ТипЗнч(Поле.Код)=Тип("Строка") тогда
                    Поле = Спр.НайтиПоКоду(Строка(Значение));
                ИначеЕсли ТипЗнч(Поле.Код)=Тип("Число") тогда
                    Попытка 
                        Поле = Спр.НайтиПоКоду(Число(Значение));
                    Исключение
                    КонецПопытки;
                КонецЕсли;
            КонецЕсли;
            Если ЗначениеЗаполнено(Значение) и Поле = Спр.ПустаяСсылка() тогда
                НС = Ошибки.Добавить();
                НС.Описание = ""+Коментарий+" - "+МД.Имя+" <> "+Значение;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Всё работает нормально, но записей очень много, и вот понимаю что можно както оптимизировать, ускорить разбор или ускорить преобразование строки XML с кодами справочников в значения полей строки табличной части докумета
 
  Рекламное место пустует
   France
 
1 - 20.12.17 - 01:31
"..много.." - а насколько много??
   Armando
 
2 - 20.12.17 - 01:44
Покажи снимок экрана с результатами замера производительности в отладчике.
   jedbez
 
3 - 20.12.17 - 10:12
Во, замером производительности научился пользоваться...

[img]http://s014.radikal.ru/i328/1712/3c/d8f8b9787f3c.png[/img]

Много это около 221-370 сек.
разбор 6700 строк
   jedbez
 
4 - 20.12.17 - 10:13
   jedbez
 
5 - 20.12.17 - 10:25
Не видно первых строк
http://s017.radikal.ru/i420/1712/e7/0e39b7805546.png

Вот 2,3 строка 

Поле = Спр.НайтиПоКоду(Строка(Значение));

из функции "ЗаполнитьПоле" - всё сжирают
   Armando
 
6 - 20.12.17 - 15:11
Вот с этим и надо что-то делать. НайтиПоКоду это обращение к СУБД. По возможности коды надо предварительно закэшировать, например, в соответствие.
   тарам пам пам
 
7 - 20.12.17 - 15:29
(5) сначала считывай в массив все коды сразу, потом вытаскивай из БД одним запросом все нужные ссылки, потом подставляй уже в таблицу - будет быстро.
   kiruha
 
8 - 20.12.17 - 15:33
(5)
Не пиши так никогда
   jedbez
 
9 - 21.12.17 - 02:03
(6) В табличной строке порядка 40 ссылок на различные справочники, хэшировать все справочники, это же не логично, хотя можно попробовать.
А запросом не быстрее будит, чем НайтиПоКоду?
(7) Хм... надо попробовать

Мысль такая, для каждого поля сделать соответствие в которое поместить Структуру (Ключ, ссылка) возможных значений поля.
И при заполнении строки таблицы, дёргать от туда ссылки на справочники, согласно кода из XML.

(8) Критикуя - предлагай, иначе остаётся вопрос - Чо? (Выражающий не аргументированный позыв к агрессивному диалогу ни о чём, троль?)
   RomaH
 
10 - 21.12.17 - 06:54
(9) как вариант кеширования - общий модуль с повторным использованием
но кещирование поможет если много совпадающих кодов
 
  Рекламное место пустует
   тарам пам пам
 
11 - 21.12.17 - 09:28
(9) "А запросом не быстрее будит" - запросом в цикле будет ровно то же самое, что и НайтиПоКоду в цикле, потому что НайтиПоКоду и есть запрос.

Поэтому для ускорения нужно делать меньше запросов => читаешь сначала все коды (либо, если будут проблемы с недостатком памяти при загрузке очень большого файла, часть кодов; 6700 строк - маленький файл, если что) и ищешь сразу все ссылки.
   kiruha
 
12 - 21.12.17 - 12:37
(9)
>>ритикуя - предлагай, иначе остаётся вопрос - Чо? (Выражающий не аргументированный позыв к агрессивному диалогу ни о чём, троль?)

Раз не было - код настолько плох , что даже нет смысла объяснять - на курсы вам надо , а не темы писать
   jedbez
 
13 - 26.12.17 - 05:41
(12) В чём код плох? "Нет смысла объяснять", а вы попробуйте. Млин, всё равно не пойму я вас, будьте добры спуститесь с небес до моего уровня и ткните презренного меня в чем плохость кода, или это просто вброс для накручивания счетчика сообщений?
   NWsFF
 
14 - 26.12.17 - 06:43
(13) Забей для 1С хороший код :)
   h-sp
 
15 - 26.12.17 - 07:41
(13) вот это
            Мд = Метаданные.НайтиПоТипу(ТипЗнч(Поле));
            Спр = Справочники[МД.Имя];

что-то дикость какая-то

напишите

            Мд = Поле.Метеданные();
            Спр = Справочники[МД.Имя];


Список тем форума
Рекламное место пустует   Рекламное место пустует
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует