|
Объёмная выгрузка с внешнего веб-сервиса | ☑ | ||
---|---|---|---|---|
0
jango_mango
14.02.17
✎
19:19
|
Есть задача: выгрузка большого объёма данных со стороннего веб-сервиса и заполнение им справочника.
Написав обработку, ужаснулся: она заняла более трёх часов. В итоге в справочнике около 22000 записей. А эта обработка должна будет выполняться пару раз в неделю стабильно. Собственно как я получаю данные. Отправляю SOAP запросы через http соединение. Вопрос: должен ли этот процесс занимать столько времени, норма ли это? Есть ли другие способы получение информации с веб-сервисов, более шустрые? В 1С недавно совсем, так что не серчайте может за странный вопрос. |
|||
1
lubitelxml
14.02.17
✎
19:24
|
покажи код загрузки справочника
|
|||
2
jango_mango
14.02.17
✎
19:28
|
Код достаточно объёмный.
NewObjectProductsAndServices = Справочники.ProductsAndServices.СоздатьЭлемент(); Description = ATDProductNumber + " " + Style; NewObjectProductsAndServices.Родитель = Parent; NewObjectProductsAndServices.Description = Description; NewObjectProductsAndServices.DescriptionFull = Description+" "+Brand; NewObjectProductsAndServices.SKU = ATDProductNumber; Vendor = Справочники.Counterparties.НайтиПоНаименованию(Brand); NewObjectProductsAndServices.Vendor = Vendor; ProductUOM = Справочники.UOMClassifier.НайтиПоНаименованию("pcs"); NewObjectProductsAndServices.MeasurementUnit = ProductUOM; ProductGR = Справочники.ProductsAndServicesCategories.НайтиПоНаименованию("Main group"); NewObjectProductsAndServices.ProductsAndServicesCategory = ProductGR; NewObjectProductsAndServices.EstimationMethod = Перечисления.InventoryValuationMethods.ByAverage; NewObjectProductsAndServices.OrderCompletionDeadline = 1; ProductVAT = Справочники.VATRates.НайтиПоНаименованию("18%"); NewObjectProductsAndServices.VATRate = ProductVAT; NewObjectProductsAndServices.Записать(); Для Каждого Элемент Из Структура Цикл Если Элемент.Ключ = "CountryOfOrigin" Тогда CountryValue = Элемент.Значение; CountryValue = Врег(CountryValue); Country = Справочники.WorldCountries.НайтиПоНаименованию(CountryValue); Если Country <> Неопределено Тогда NewObjectProductsAndServices.CountryOfOrigin = Country; КонецЕсли; КонецЕсли; НоваяСтрока = NewObjectProductsAndServices.AdditionalAttributes.Добавить(); НоваяСтрока.Value = Элемент.Ключ; НоваяСтрока.TextString = Элемент.Значение; NewObjectProductsAndServices.Записать(); КонецЦикла; Для Каждого Элемент Из LargeURIMassiv Цикл НоваяСтрока = NewObjectProductsAndServices.Images.Добавить(); НоваяСтрока.Link = Элемент; НоваяСтрока.Type = "Large"; NewObjectProductsAndServices.Записать(); КонецЦикла; Для Каждого Элемент Из SmallURIMassiv Цикл НоваяСтрока = NewObjectProductsAndServices.Images.Добавить(); НоваяСтрока.Link = Элемент; НоваяСтрока.Type = "Small"; NewObjectProductsAndServices.Записать(); КонецЦикла; Для Каждого Элемент Из ThumbnailURIMassiv Цикл НоваяСтрока = NewObjectProductsAndServices.Images.Добавить(); НоваяСтрока.Link = Элемент; НоваяСтрока.Type = "Thumbnail"; NewObjectProductsAndServices.Записать(); КонецЦикла; |
|||
3
lubitelxml
14.02.17
✎
19:34
|
прости друг, пиши все на русском, такой код даже читать не буду, навскидку - три последнии обхода по ТЗ загнать в один, все равно один справочник пишешь, ну и в тз тоже в одну пиши
|
|||
4
lubitelxml
14.02.17
✎
19:34
|
забыл - код выкинуть, написать нормально, хотя для сайта ховнокод подойдет
|
|||
5
breezee
14.02.17
✎
19:36
|
(2) Структура это твои данные, которые приходят? Тыб это описал, что-ли.
ProductGR = Справочники.ProductsAndServicesCategories.НайтиПоНаименованию("Main group"); вот тут плохо, надо в констану пихать, по наименованию не ищут |
|||
6
jango_mango
14.02.17
✎
19:39
|
(3) К сожалению есть необходимость использовать английский. (5) В структуре часть данных.
Вот все данные, что я передаю: AddNewProduct(ATDProductNumber, MFGProductNumber, Style, Brand, ProductGroup, Cost, Retail, SpecialDiscount, Fet, Local, LocalPlus, NationWide, LargeURIMassiv, SmallURIMassiv, ThumbnailURIMassiv,Структура) |
|||
7
Asirius
14.02.17
✎
19:40
|
(0) после каждогго добавления строки нет смысла целиком записывать справочник.
Вместо Для Каждого.. цикл НоваяСтрока = NewObjectProductsAndServices..Добавить(); ... NewObjectProductsAndServices.Записать() КонецЦикла; вполне можно Для Каждого.. цикл НоваяСтрока = NewObjectProductsAndServices..Добавить(); ... КонецЦикла; NewObjectProductsAndServices.Записать() |
|||
8
Asirius
14.02.17
✎
19:40
|
(0)
И вообще на одну .СоздатьЭлемент() должна быть одна .Записать() |
|||
9
jango_mango
14.02.17
✎
19:41
|
(8) Учту, спасибо.
|
|||
10
Asirius
14.02.17
✎
19:46
|
(9)
А еще лучше писать пачками транзакций НачатьТранзакуцию() Для К = 1 по 100 Цикл .СоздатьЭлемент(); .... .... .Записать(); КонецЦикла; ЗафиксироватьТранзакцию(); |
|||
11
arsik
гуру
14.02.17
✎
21:16
|
Еще советую посылать в вебсервис сразу одним вызовом много данных. А не каждый элемент отдельно кидать.
|
|||
12
Сниф
14.02.17
✎
21:23
|
(10) Когда уже коллективный разум создаст функцию, определяющую количество записей на транзакцию в режиме обратной связи.
Берем начальное количество N (например 100), измеряем время. Добавляем к N некотое количество (например 100+50) - стало быстрее - добавляем еще 50, стало медленнее - минус 50. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |