Имя: Пароль:
1C
1С v8
Установка цен номенклатуры (оптимизированный алгоритм загрузки)
, ,
0 on2
 
15.01.20
14:14
Привет мальчики!
Такая задача: нужно оптимизировать загрузку данных по ценам.
Смысл. Есть файл - в нем номер артикула и цена.
Нужно найти в справочнике номенклатура (там 200 000 позиций) все номенклатуры с указанным артикулом из файла и все их прописать в документе "Установка цен номенклатуры".

Кто что думает? какие мысли? файлы бывают для загрузки по 500 000 строк)))))
1 Krendel
 
15.01.20
14:15
Звони Мане
2 Krendel
 
15.01.20
14:16
Или призывай Маню в ветку, но его опять забанили, был под Вдовой клюко 13 года
3 on2
 
15.01.20
14:19
Маняяяяяяяяяяяяяяяяяяяяяя!!!!!
4 seevkik
 
15.01.20
14:32
Секунду, не понял, файл для загрузки 500к строк, справочник номенклатуры 200к, мы про 1с говорим?)
5 on2
 
15.01.20
14:34
(4) да все правильно думаешь((((
6 seevkik
 
15.01.20
14:39
Ну-с, начнемс. Конфа?
7 GreyK
 
15.01.20
14:41
(0) А в чём проблема? Ну добавьте обработку табличной части для установки цен, она прочитает файлик и всё разложит по полочкам, всего то делов.
8 seevkik
 
15.01.20
14:43
А почему файлик на 500к, а справочник на 200к? Не все данные грузятся или там дубли?
9 sdf
 
15.01.20
14:44
+не забыть что в табличной части документа может быть только 100 тыс строк
10 bolero
 
15.01.20
14:47
(9) и открывается в клиенте такая установка цен (99к строк) на моем железе около 5 минут
мысли о том, чтобы его из клиента заполнять, не то что посмотреть открыть - даже не возникает
11 Bober
 
15.01.20
14:48
(0) загружать из файла по 99999 значений в тз, тз в запрос, результат запроса в тч документа установка цен.
12 Bober
 
15.01.20
14:49
(10) да, в типовых оч прекрасная форма документа установки цен.
13 bolero
 
15.01.20
14:51
(0) если прям вот руки чешутся автоматизировать, чтобы человекам и не надо было исправлять цены вручную, то рекомендую думать в сторону создания другого документа, ВнешняяУстановкаЦенНоменклатуры, у которого будут только движения в РС.ЦеныНоменклатуры, но не будет отображения номенклатуры и цен в клиенте (максимум в виде простой статичной таблицы)

Причина тормозов стандартного документа в том, что он слишком универсальный.
14 seevkik
 
15.01.20
14:54
(13) без отображения это хорошо, статичная таблица это плохо, заколебется программа представления показывать)
Тс, надо копать в эту сторону
15 edwin
 
15.01.20
14:55
16 bolero
 
15.01.20
14:55
(8) когда-то имел дело с автозапчастями (TecDoc) так там объемы прайс-листов измерялись несколькими DVD-дисками
поставщик шлет все цены, а не только на те запчасти, которые продаются в данном магазине

моя задача как раз была в том, чтобы помножить эти DVD на ассортимент магазина менее чем за неделю, которую они тратили вручную на это
17 GreyK
 
15.01.20
15:00
(9) А пользователь на что? Ручками могут поделить на 5 файлов :)
Ну или сделать обработку, которая будет делать 5 установок цен.
18 Krendel
 
15.01.20
15:02
(0) Я бы забивал построчно
19 Йохохо
 
15.01.20
15:02
(17) но там может быть до 499999 дублей!!1
20 GreyK
 
15.01.20
15:13
(19) Ну, дубли отработать - это ваще не вопрос!
21 unenu
 
15.01.20
15:14
у нас более 200К номенклатуры.
могу сказать, что в подобных задачах критичны в контексте затрат времени по приоритетам
1. поиск номенклатуры
   способ оптимизации: перед операцией загрузки запросом выбираем(УИД потом получаем) из номенклатуры два поля
   ссылка и "ключ поиска". Ключом поиска может быть УИД, Артикул, ...
   Далее формируем соответствие где клчю - наш ключ, а занчение ссылка.
   можно сохранить это ств в файл потом получить их файла не суть, можно сразу в память.

   тогда поиск номенклатуры идет очень быстро
   тСсылка = Ств.Получить(тУИД);  
   тСсылка = Ств.Получить(тАртикул);

2. при загрузке данные бъем на порции и обрабатываем в несколько фоновых потоков
   Тут мне лень детализировать...

Думаю хватит и п.1. чтобы мир стал светлее.
22 mikecool
 
15.01.20
15:32
(3) готовь 75к )))
23 mikecool
 
15.01.20
15:33
(0) а что делал или что думаешь делать?
24 on2
 
15.01.20
15:55
(23) делала....
из экселя грузила все 500 тыс строк в ТЗ
потом голову долго ломала как сделать быстрее
- тупо поискПо реквизиту не спасает (он первый находит)
-другой вариант думаю временные таблицы сделать
клеит ТЗ1 и ТЗ2 по артикулу, где ТЗ1 - это артикул и цена из файла, а ТЗ2- артикул из справочника
25 Bober
 
15.01.20
16:12
(3)  за что 75к?
26 bolobol
 
15.01.20
17:02
(25) Там - за всё!"
27 GreyK
 
15.01.20
17:11
(24) Закинь ТЗ в запрос и подыщи номенклатуру для артикулов.
28 Tatitutu
 
15.01.20
17:14
(1) Маня уже не с нами (((
29 unenu
 
15.01.20
17:43
(27) процесс может быть циклический.

допустим, мы получит извне файл с 500К записей или 5КК - не суть, очень много.
сразу после получения в один проход получаем артикулы из нее
далее по данным из базы приемника в один проход сохраняем на диск соответствие.

далее, как писал, при циклических загрузках, обрывах и т.д. грузим данные по этим эти 5КК в приемник
с мгновенным поиском товара в приемнике
СтвПоИсточнику.Получить(тАртикулИзИсточника) и не насилуем приемник раз за разом запросами, вт и прочим

это реально быстрее.
30 GreyK
 
15.01.20
18:20
(29) Так не делайте его циклическим, левое соединение по артикулу отработает быстрее чем отдельные запросы по каждой строке, а фильтр по неопределено (нет такого артикула в базе) упростит код.
31 Garykom
 
гуру
15.01.20
18:29
(0) Я думаю что надо нанять программиста.
Можно и Маню если лишние $ есть.
32 Garykom
 
гуру
15.01.20
18:32
А так простейшая задачка, 500к файлик закидываем в sqlite внешнюю базу, подрубаем ее к 1С и тупо делаем запрос в цикле по номенклатуре из 1С.
В смысле берем каждую нашу номенклатуру в 1С и ищем ее запросом в sqlite, если нашли то пишем в документу.

На практике надо подобрать (оно зависит от много чего вплоть до погоды на улице) некий параметр N, по сколько записей номенклатуры брать разово для поиска запросом в sqlite и записи в документу установки цен.
33 Garykom
 
гуру
15.01.20
18:34
(32)+ Можно кроме файлика 500к выкинуть и всю номенклатуру в 200к в sqlite и сделать кроссзапрос между этими табличками.
Тут проблема что (в отличие от выше) если частая установка цен, то каждый раз всю номенклатуру обновлять в sqlite а это долго.
34 H A D G E H O G s
 
15.01.20
18:40
Как обычно Гариком пишет хрень.
35 Garykom
 
гуру
15.01.20
18:57
(34) Это не хрень а нормальное по скорости работы решение.
Все прочее если поиск/сопоставление делать внутри 1С сильно тормозней.
36 Garykom
 
гуру
15.01.20
19:00
(35)+ Да при наличии серверной 1С можно запустить параллельно фоновыми с его помощью, но нагрузка будет охеренная.
Подходит только для крупный контор, но в подобных конторах вопросами типа как ТС и не заморачиваются.
37 RomanYS
 
15.01.20
19:04
(0) Варианта два
- пихать в ВТ и соединять (возможно файл брать порциями)
- номенклатуру в соответствие и цикл по файлу