Имя: Пароль:
1C
1С v8
Объёмная выгрузка с внешнего веб-сервиса
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.