Здравствуйте. такой вопрос. подскажите кто знает. суть такая. у меня есть конфигурация для ТСД. с помощью web-сервиса цепляюсь к базе ERP и должен получить остатки номенклатуры в разрезе серий. то есть я обратился к базе ERP и быстро получил остатки в разрезе серий (примерно за одну секунду). Проблема следующая, эти остатки я должен записать в регистр сведений на терминале. и всё вроде хорошо, но у меня 1800 строк в таблице значений. в перспективе будет больше. и запись в регистр сведений у меня происходит 53 секунды. подскажите как ускорить этот момент? есть ли варианты для ускорения записи в регистр сведений? РС непериодический и Независимый. В цикле так же проверяю характеристики, серии, склад и номенклатуру. если они у меня имеются в ТСД аналогично ERP то берём уже созданный элемент, если нет создаём новый.
НаборЗаписей = РегистрыСведений.Остатки.СоздатьНаборЗаписей();
Замер = ТекущаяДата();
Для каждого СтрВн Из Таблица Цикл //в таблице 1800 строк
Номенклатура = ПолучитьНоменклатуру(СтрВн.Номенклатура, СтрВн.НоменклатураНаименование, СтрВн.НоменклатураАртикул, СтрВн.ВидНоменклатурыНаименование).Ссылка; //Здесь проверяю наличие номенклатуры. если она уже создана в базе для ТСД, то подбираем её из справочника, если нет то создаём.
СкладЗаказа = ПолучаемСклад(СтрВн.Склад, СтрВн.СкладНаименование).Ссылка;
НоваяЗапись = НаборЗаписей.Добавить();
Если СтрВн.Серия <> Справочники.СерииНоменклатуры.ПустаяСсылка() И СтрВн.Серия <> NULL И СтрВн.ВидНоменклатурыНаименование <> "Тара" Тогда
Серия = ПолучитьСерию(СтрВн.Серия, СтрВн.СерияНаименование,Номенклатура).Ссылка;
НоваяЗапись.Серия = Серия;
КонецЕсли;
Если СтрВн.ВидНоменклатурыНаименование = "Тара" Тогда
НоваяЗапись.Серия = СтрВн.СерияНаименование;
КонецЕсли;
Если СтрВн.Характеристика <> Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка() И СтрВн.Характеристика <> NULL Тогда
Характеристика = ПолучитьХарактеристику(СтрВн.Характеристика, СтрВн.ХарактеристикаНаименование, Номенклатура).Ссылка;
НоваяЗапись.Характеристика = Характеристика;
КонецЕсли;
НоваяЗапись.Номенклатура = Номенклатура;
НоваяЗапись.Склад = СкладЗаказа;
НоваяЗапись.Остаток = СтрВн.ВНаличииОстаток;
КонецЦикла;
НаборЗаписей.Записать()
ПоказатьПо теме из базы знаний
- Регистры сведений 1С. Как это устроено.
- Ускорение в 100 раз. Решаем проблему блокировок
- Как из 1С отдать миллионы строк в BI и успеть это сделать быстро
- Workaround me в 1С/MS SQL и не только, системный подход к созданию костылей
- История одного админа в мире 1С. Как поиски причины тормозов 1С привели к созданию нового продукта
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Зачем делать функцию ПолучитьНоменклатуру и потом ещё от её результата обращаться через точку к Ссылке?
Обращение через точку приводит к чтению всего объекта из базы.
Нужно сделать так, чтобы функции Получить_ЧтоНибудь возвращали сразу ссылку на ЧтоНибудь.
Обращение через точку приводит к чтению всего объекта из базы.
Нужно сделать так, чтобы функции Получить_ЧтоНибудь возвращали сразу ссылку на ЧтоНибудь.
(6) запрос да) у меня не совсем запрос)
Вот такая функция получает номенклатуру ну и склад и характеристики всё по аналогии)
Функция ПолучитьНоменклатуру(Номенклатура, Наименование, Артикул, ВидНоменклатуры)
ОбъектНеНайден = СтрНайти(Строка(Номенклатура), "<Объект не найден>");
Если ОбъектНеНайден = 0 Тогда
ОбъектНеНайден = СтрНайти(Строка(Номенклатура), "<Ob ject not found>");
КонецЕсли;
//Сообщить(Строка(СтрВн.Номенклатура));
Если ОбъектНеНайден > 0 Тогда
ДанныеОбъект = Справочники.Номенклатура.СоздатьЭлемент();
ДанныеОбъект.УстановитьСсылкуНового(Номенклатура.Ссылка);
ДанныеОбъект.НаименованиеПолное = Наименование;
ДанныеОбъект.Наименование = Наименование;
ДанныеОбъект.Артикул = Артикул;
ДанныеОбъект.ВидНоменклатуры = ВидНоменклатуры;
ДанныеОбъект.Записать();
Возврат ДанныеОбъект.Ссылка;
Иначе
ДанныеОбъект = Номенклатура.Ссылка.ПолучитьОбъект();
ДанныеОбъект.НаименованиеПолное = Наименование;
ДанныеОбъект.Наименование = Наименование;
ДанныеОбъект.Артикул = Артикул;
ДанныеОбъект.ВидНоменклатуры = ВидНоменклатуры;
ДанныеОбъект.Записать();
Возврат ДанныеОбъект.Ссылка;
КонецЕсли;
КонецФункции
ПоказатьВот такая функция получает номенклатуру ну и склад и характеристики всё по аналогии)
(5) Создать запрос, в который передать таблицу с данными для поиска во временную таблицу. Далее в этом же запросе в других пакетах получать данные из базы (номенклатура, характеристика и т.д.) по 1-ой таблице. Если не нашли, то в цикле по выборке создаем.
И еще. Если у вас всегда тянется из ЕРП, то зачем вы создаете сущности в ТСД? Намного быстрее и проще было бы получить из ЕРП УИД, наименование и оперировать ими, нежели каждый раз проверять наличие и создавать элементы справочника
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот