Имя: Пароль:
1C
 
Ускорить загрузку номенклатуры когда ее 4.500.000
0 nodrama
 
08.08.22
13:18
в базе 1с 700.000 номенклатуры.
Во второй базе 4.500.000 номенклатуры

Проверяю по артиклу есть ли в первой базе позиция и если нет кидаю ее из второй базы. большей части нету поэтому расчеты примерно такие
В среднем за 1 секунду, вижу что создается 5-7 новых позиций.

4.500.000 /7 = 642 857 секунд

Это получается 7.5 суток.  При этом надо надеется что за 7.5 суток не знаю свет не вырубится на долго (есть бесперебойник минут на 30-40 хватает). или не знаю мало ли что сервер ребутнется/зависнет и т.д.
Есть какие то мысли как ускорить загрузку (кроме как купить еще более новый сервер))
1 Krendel
 
08.08.22
13:18
200к
2 YFedor
 
08.08.22
13:19
Конфигурации идентичные?
3 Krendel
 
08.08.22
13:20
Сколько сервак выдает по гилеву? какова скорость работы рейда?
4 СеменовСемен
 
08.08.22
13:21
(0) чтоб свет не влиял переноси через план обмена
5 СеменовСемен
 
08.08.22
13:22
Можно ускорить сделав обмен многопоточным
6 nodrama
 
08.08.22
13:22
(4) да свет это к слову так на всякий случай
7 Timon1405
 
08.08.22
13:23
8 nodrama
 
08.08.22
13:25
(7) в этом примере идет через  ТаблицаТоваров = Запрос.Выполнить().Выгрузить();

я че то сыкую 4.5 миллиона позиций с данными и т.д. выгружать сразу...

у меня через Выполнить().Выбрать().
и далее пока следующий().
9 mistеr
 
08.08.22
13:25
(0) Если там не 100500 связанных объектов, то это кривой код у тебя. Через КД2 будет на порядок быстрее.
10 СеменовСемен
 
08.08.22
13:26
(8) выбрать и выгрузить разницы на x64 нет
11 mistеr
 
08.08.22
13:27
(10) Нигде нет разницы.
12 СеменовСемен
 
08.08.22
13:27
На 32 выбрать делало через файл большие выборки
13 nodrama
 
08.08.22
13:27
(9) там кода 5 строк..
проверка по артиклу если нет то создаем новую позицию и все..
я так понимаю что сама проверка по артиклу с каждым разом все дольше и дольше ибо номенклатуры все больше и больше. но без проверки будут дубли
14 mistеr
 
08.08.22
13:28
(12) Любое обращение к результату запроса грузит в память всю выборку.
15 СеменовСемен
 
08.08.22
13:28
(13) если индекс есть, то разницы нет
16 mistеr
 
08.08.22
13:29
(13) >создаем новую позицию

Скорее всего тут и тормозит
17 Ботаник Гарден Меран
 
08.08.22
13:29
Надо начать с количества записей в транзакции.
18 RomanYS
 
08.08.22
13:30
(13) Запрос в цикле по каждому артикулу?
19 СеменовСемен
 
08.08.22
13:30
А что замер говорит, какая операция самая долгая?
20 Garykom
 
гуру
08.08.22
13:30
(0) Наймите нормального грамотного программиста

ЗЫ Ты там не через COMОбъект случайно?
21 YFedor
 
08.08.22
13:31
(13) Кто мешает сначала взять все артикулы, которые есть в загружаемой базе (их же немного) натравить на базу из которой загружаем и там пометить каким-либо образом те объекты, которые нужно выгрузить.
А потом забирать только их не проверяя каждый раз в приемнике.
22 СеменовСемен
 
08.08.22
13:32
(21) тормозит запись, а не поиск
23 YFedor
 
08.08.22
13:32
(22) Да хрен его знает что там тормозит
24 СеменовСемен
 
08.08.22
13:32
Ну и желательно при записи всякие версионирования отключать, может даже и жр
25 nodrama
 
08.08.22
13:34
Другой вопрос. а как можно узнать (не заходя в ЖР поиска там).
Когда создалась определенная номенклатура? или только по ЖР?
26 Фрэнки
 
08.08.22
13:34
Запись и тормозит. Если версионирование включено, то и оно тоже.
В транзакциях нужно записывать. Порциями.
27 RomanYS
 
08.08.22
13:35
(25) Если есть версионирование, то лучше там
28 СеменовСемен
 
08.08.22
13:37
(26) транзакции кмк только на 77 ускоряли.
На 8 все равно транзакция сначала в журнал скл на диск пишется
29 6awkup_true
 
08.08.22
13:40
ОбменДанными.Загрузка = Истина? мож там 100500 проверок еще при записи, вот и увеличивает время
30 nodrama
 
08.08.22
13:42
Если записывать в транзации порциями и поставить обменданными.загрузка=истина
это на много ускорит ? если разница будет между 7.5 днями и 7 днями )) то смысла дергаться даже нет.
31 nodrama
 
08.08.22
13:42
(27) версии по номенклатуре не ведутся
32 dmt
 
08.08.22
13:46
(30) + в несколько потоков запустить
33 6awkup_true
 
08.08.22
13:47
(30) ОбменДанными.Загрузка может существенно ускорить при условии того, что будут отключены все проверки(например, на дубли), все подписки и прочее ненужное. если всего это нет - то не ускорит
34 СеменовСемен
 
08.08.22
13:48
(30) замер то когда запустишь?
35 nodrama
 
08.08.22
13:49
(34) так что бы запустить замер нужно выключить загрузку ;) а то замер будет не правильный. загрузка то идет.
36 nodrama
 
08.08.22
13:50
сейчас встал вопрос. как без версифицирования вот узнать когда номенклатура создана? искать по ЖР? хочу проверить кое что
37 dmt
 
08.08.22
13:51
38 Aleksey
 
08.08.22
13:51
(35) зачем?
39 RoRu
 
08.08.22
13:53
(35) на копии никак? )))
в чём тогда вообще смысл вопроса, если загрузка идёт всё равно )))?
40 СеменовСемен
 
08.08.22
13:53
(35) если из конфигуратора запускал предприятие, то ничего перезапускать не нужно.
Да и вообще я бы уже давно остановил такую загрузку
41 Djelf
 
08.08.22
13:57
(35) А какая тебе разница? Заново загрузится не может из-за проверки по артикулу. См. (0).
Боюсь спрость: не всё в одной транзакции?
5-7 позиций в секунду, ну... такое надо отменять сразу же, это ты где-то накосячил, так быть не должно!
42 Shur1cIT
 
08.08.22
13:58
(0) объединял два документооборота? цифры примерно похожие были, запускал в несколько потоков, причем чтобы отслеживать статус потоков для каждого потока в каждом потоке генерировал HTML страницу и записывал, при обновлении на клиенте этой сранице видел сколько загружено и сколько осталось;-)))
43 Kassern
 
08.08.22
13:58
(0) я бы попробовал следующим образом, разбил бы ваши 4.5кк номенклатуры на несколько частей. Далее бы эти части параллельно бы запустил на загрузку (разными фоновыми заданиями например). Проверку бы по артикулу на нахождение в базе приемнике сделал бы одним запросом со временной таблицей.
44 Kassern
 
08.08.22
13:59
(43) + и запись в режиме обмена данными
45 nodrama
 
08.08.22
14:05
(39) В том что это не разовая штука
46 nodrama
 
08.08.22
14:05
А если через универсальный обмен загрузка XML ? базы то идентичные
47 Krendel
 
08.08.22
14:07
(45) У тебя будет целовое время
48 nodrama
 
08.08.22
14:08
через универсальный обмед xml быстрее не будет ? я могу кинуть во второй базе (все ном группы в папку "выгрузка").
создать в первой базе папка "выгрузка".
следовательно при загрузке он должен всю номенклатуру закинуть в папку выгрузка ну и далее по папкам.
49 Kassern
 
08.08.22
14:11
(46) в любом случае нужно будет правило обмена писать. А там с номенклатурой много чего другого интересного тянуть надо. Это и картинки и упаковки, а для картинок еще и регистры сведений тянуть и т.д.
50 nodrama
 
08.08.22
14:14
(49) там пустая номенклатура.
наименование, вид, ставка, ед измерения наименованиеПолное.
51 nodrama
 
08.08.22
14:15
смысл что бы перенести ее всю, так как есть в правильные папки и подпапки и подпапки под папки.
картинки и т.д. это потом из другого места
52 Ёпрст
 
08.08.22
14:31
(0) примитивный запрос на булке перенесёт секунд за 30, наверное
53 Ёпрст
 
08.08.22
14:32
4.5 млн это ни о чем..даже примитивный insert into select справится за несколько минут
54 yopQua
 
08.08.22
14:57
жахнуть через скл напрямую
55 yopQua
 
08.08.22
14:58
(52) +1, булккопи тоже должен решать быстро
56 mikecool
 
08.08.22
15:05
(11) недавно как раз столкнулся с https://its.1c.ru/db/v8std/content/725/hdoc
через объектную модель не грузит
57 kauksi
 
08.08.22
15:09
Вариант грузить только те позиции, что есть на остатке, либо только те, по которым было движение в течении года-двух, поставив предварительно галку какую то. Запихать в табличный документ со всеми реквизитами, а дальше на 10 потоков распараллелить чтение и запись.
58 YFedor
 
08.08.22
15:12
(56) Я фигею с 1с очередной раз ...

Неправильно:

Также неправильно:

Запрос = Новый Запрос;
Запрос.Текст =
  "ВЫБРАТЬ
  | Номенклатура.Ссылка,
  | Номенклатура.Наименование,
  | Номенклатура.ВидНоменклатуры
  |ИЗ
  | Справочник.Номенклатура КАК Номенклатура";

РезультатЗапроса = Запрос.Выполнить();
// Обход результата запроса
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
  // Обработка элемента выборки
  // ...
КонецЦикла;

Нафига тогда вообще запросы нужны
59 СеменовСемен
 
08.08.22
15:12
(58) не каждый запрос правильный.
само наличие запроса не панацея
60 mikecool
 
08.08.22
15:14
(58) дальше почитай, правильно "Выбрать первые 1000"
61 mTema32
 
08.08.22
15:28
(0) Мне кажется странной такая задача. Может дело не в скорости выгрузки, а в постановке задачи?
62 mikecool
 
08.08.22
15:30
помнится приходилось с таким сталкиваться, но решение приняли такое - есть обмен, которым в дальнейшем будем пользоваться , он отлажен
нового ничего не изобретаем , грузим пачками в несколько потоков
закончится через неделю - ничего, зато не будем огребать каких либо ошибок
63 mikecool
 
08.08.22
15:31
изобретать велосипед, отлаживать, грузить, потом проверять перенос - в тот же срок может выйти, а то и дольше при каких либо логических ошибках
64 yopQua
 
08.08.22
15:36
(62) ну ему видимо надо первичное заполнение сделать, потом по мере появления новых позиций они будут плавно перетекать в другую базу по обмену. а сейчас как всегда надо срочно и быстро.
скл спасет, перекодирование все той же многострадальческой номенклатуры в около 150тыс. позиций у меня сделал за секунды две. ну с полдня потратить придется наверно
65 Krendel
 
08.08.22
15:38
(64) Ну 7 элементов справочника в секунду это долго
66 Фрэнки
 
08.08.22
15:41
(65) но еще и скрыто на какой типовой все эти кувырки происходят.
Может там и не типовая уже давным-давно, а потому нужно отрубить кучу всякого ненужного, что происходит в обработчиках и подписках вокруг записи элемента
67 Eiffil123
 
08.08.22
15:41
кроме вышепредложенных, запись по 1000 новых элементов в транзакции и монопольно поможет ускорить выполнение
68 Фрэнки
 
08.08.22
15:48
при желании, можно прямо в коде замеры времени получать и регулировать количество элементов в транзакции в большую сторону, пока оценка не начнет ухудшаться
ЗамерВремени/Количество можно сравнивать с предыдущим. Начальное значение большое, а дальше вычислять.
69 СеменовСемен
 
08.08.22
15:50
(67) а оно реально работает? кто-нибудь делал тесты?
70 Фрэнки
 
08.08.22
15:51
(69) работает
71 Жан Пердежон
 
08.08.22
15:51
(0) грузи сразу в скуль
72 Фрэнки
 
08.08.22
15:52
(69) но там другие недостатки, что лучше пользоваться транзакциями для ускорения только в монопольном режиме, т.к. другие сеансы могут получать блокировки в самых неожиданных местах.
73 СеменовСемен
 
08.08.22
15:55
(70) что-то я тестов никак не могу найти. Интересно делал ли кто-нибудь?
74 СеменовСемен
 
08.08.22
15:57
(73) и на 1с нет такой рекомендации для 8.
75 Krendel
 
08.08.22
16:40
(73) да
76 СеменовСемен
 
08.08.22
16:42
(75) и что какие результаты. во сколько раз ускорение?
77 Krendel
 
08.08.22
16:44
(76) запрещено к публичному разглашению
78 scanduta
 
08.08.22
16:45
(0) Поле артикул проиндексировано ?
Через что грузишь ? помоему через конвертацию такое точно в разы быстрее должно делаться как минимум
79 Fynjy
 
08.08.22
16:47
(0) что тебе мешает на уровне SQL перенести таблицу?
80 Garykom
 
гуру
08.08.22
17:29
1. Запись в транзакции порциями по N элементов
2. Фоновые в несколько потоков
3. Сначала во внешнюю базу выкинуть оба справочника и там сравнить запросом оставив только те что надо записывать. Результат в CSV и читать из него по N.
81 Garykom
 
гуру
08.08.22
17:31
(80)+ 4. ОбменДанными.Загрузка = Истина при необходимости
82 nodrama
 
08.08.22
17:32
Попробовал через УниверсальнуюЗагрузкуВыгрузку xml с отбрром по группе (выбрал 1 группу для теста).
Но не понятно там есть функция FastInfoSet . типо быстрее работает.
Выгрузка через xml выгрузилось и загрузилось норм... выгрузка шла секунд 20. одной группы.
Далее попробовал с галочкой фатсинфосет. выгрузилось секунд за 10.. то есть результат на лицо... А при попытки загрузки тут же выкинуло с ошибкой чтение xml и далее куча кода... при условии что быза типовые и обработка типовая и все типовое.
83 Garykom
 
гуру
08.08.22
17:33
Еще более быстрые варианты это писать напрямую в sql базу что сложно.
Если база небольшая то выгрузка в DT (или "Выгрузить данные для перехода в сервис") добавить строчки и загрузить назад.
84 Garykom
 
гуру
08.08.22
17:34
(82) гыгыгыгы
85 nodrama
 
08.08.22
17:40
(83) ну как не большая.. в базе 4.5 миллиона номенклатуры (без учета остальных документов, приходов, реализаций, и т.д.). как думаешь не большая ?
зачем фирме 4.5 миллиона позиций. если у них 1 реализация в год))))
86 Garykom
 
гуру
08.08.22
17:46
(80) п.3 это например https://habr.com/ru/post/547448/
или ms access если к mssql нет доступа и умений
87 Garykom
 
гуру
08.08.22
17:46
(85) Автозапчасти там номенклатуры может быть еще больше а реализаций не много
DT сколько гигов?
88 Kassern
 
08.08.22
17:46
(85) ну может у вас военка какая-нибудь и вы ведете учет НЗ на складах? Там вам несколькими доками наполнили склады и все, лет на 30 закрыли на клюшку)
89 nodrama
 
08.08.22
17:51
(87) я ни разу не пробовал выгружать базу в ДТ, в sql 180 гигов весит. сколько в ДТ беспонятия
90 Kassern
 
08.08.22
17:52
(89) примерно столько же, сколько бекап скуля сжатый в архиве.
91 lodger
 
08.08.22
18:00
(82) гыгыгыгы x2
92 Конструктор1С
 
08.08.22
18:45
(0) >>В среднем за 1 секунду, вижу что создается 5-7 новых позиций

Как-то чрезвычайно медленно. Стрельни замером. Может там тупые проверки в каких-нибудь подписках на события сидят. Или какая-нибудь тупая регистрация на обмен
93 Конструктор1С
 
08.08.22
18:46
(89) это маленькая база
94 VladZ
 
08.08.22
18:57
(0) "4.500.000" - зачем столько?
95 RomanYS
 
08.08.22
19:07
(92) скорее тупой поиск по артикулу
96 Злопчинский
 
08.08.22
20:03
(95) поиск по индексу артикула по сравнению с записью объектов - на порядки быстрее должен быть...
97 RomanYS
 
08.08.22
20:42
(96) Если он идёт непосредственно в базе по каждому артикулу, то не на порядки.
98 d4rkmesa
 
08.08.22
20:55
(85) Ну про автозапчасти пример правильный, там действительно 1 реализация может быть. ) Маня не даст соврать. Кстати, он на этих загрузках номенклатуры собаку съел.
99 Krendel
 
09.08.22
08:39
(85) ценообразование сделать и на сайт отправить
100 mistеr
 
09.08.22
09:43
(82) Попробуй теперь через ЗагрузкаДанныхИзТабличногоДокумента, с поиском.
101 ptiz
 
09.08.22
09:52
(0) Ты сейчас пытаешься "сделать что-нибудь и как-нибудь" вместо обдумывания самой задачи в комплексе. Для чего эти переносы вообще? Исходи из постановки задачи.
102 Krendel
 
09.08.22
11:35
(101) Уже начал бы перегрузку, пока думает как решать задачу ;-)
103 Salimbek
 
09.08.22
13:24
(0) Запросом выбери всю Номенклатуру -> Артикула, которые есть у тебя в базе, положи это в Структуру.
Далее, перебирая свой файл смотри, есть ли твой элемент в этой Структуре. Это намного быстрее кучи запросов к базе. Вместо СТруктуры можно воспользоваться Таблицей значений и создать на ней Индекс по полю "Артикул".
Создание элементов оберни в цикл, типа так:
НачатьТранзакцию()
Счетчик = 0;
Цикл
Счетчик = Счетчик + 1;
Если Счетчик%50000 = 0 Тогда <- тут можно поиграться с размером
ЗафиксироватьТранзакцию()
НачатьТранзакцию()
КонецЕсли
КонецЦикла
ЗафиксироватьТранзакцию()