Имя: Пароль:
1C
1С v8
Как быстро создать 5 млн номенклатур
, , , ,
0 moneyget
 
25.11.20
14:55
Добрый день

Есть задача сделать 5 000 000 товаров
Делаю так (код ниже) но делается очень медленно, где 2000шт мин, т.е. 30 шт\сек
Делал замер производительности, все довольно равномерное распределено... для примера, проверка защиты конфигурации занимает 10% а сохранение справочника 15% времени и всякие другие хоть как-то значимые "проверки" от 1 до 4%... вот думаю куда копать? чтобы ускорить это код.
Проверял на файловой базе (загрузку проца дает 100%)

Пробовал на серверной базе, но там как-то спорно, то быстрее то медленней... но максимум в 3 раза быстрее выходило... и то, через 4 часа создало гдето 70 000шт вылетела ошибка.

Просто ждать 3 дня пока создает 5 млн товаров, не айс... т.к. мне в идеале для теста на в 10 раз больше


КолСтр    = 5000000;
    
    
     ПоискПроизводитель = НайтиПроизв("нет");
     вид = Перечисления.ВидыНоменклатуры.Товар;
     тип = Справочники.ТипыНоменклатуры.Штучный;
     базед = Справочники.КлассификаторЕдиницИзмерения.шт;
     страна = ПоискПроизводитель.СтранаПроисхождения;
     валют = Справочники.Валюты.Валюта643();
     ндсс  = Справочники.СтавкиНДС.БезНДС;
     едззз = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("шт").Ссылка;

      Для Сч=1 По КолСтр Цикл        
      АртикулСтр ="А1-"+сч;    
      ТоварСтр = АртикулСтр;

        СпрНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
        СпрНоменклатура.Наименование =  ТоварСтр;
        СпрНоменклатура.НаименованиеПолное =  ТоварСтр;
        СпрНоменклатура.НаименованиеИностранное =  ТоварСтр;
        СпрНоменклатура.Артикул = АртикулСтр;
        СпрНоменклатура.Производитель = ПоискПроизводитель;
        СпрНоменклатура.СтранаПроисхождения = страна;
                    
        СпрНоменклатура.ВидНоменклатуры = вид;
        СпрНоменклатура.ТипНоменклатуры  = тип;
        СпрНоменклатура.БазоваяЕдиницаИзмерения = базед;
        СпрНоменклатура.ОсновнаяЕдиницаИзмерения = едззз;
        СпрНоменклатура.СтавкаНДС = ндсс;
        СпрНоменклатура.ВалютаУчета = валют;
        СпрНоменклатура.КратностьПоставок = 1;
                    
        СпрНоменклатура.Записать();
    КонецЦикла
1 Галахад
 
гуру
25.11.20
14:58
Начать с простого
СпрНоменклатура.ОбменДанными.Загрузка = Истина
2 Timon1405
 
25.11.20
14:59
ДлительныеОперации.ВыполнитьПроцедуру() в N потоках
3 H A D G E H O G s
 
25.11.20
15:01
1) Убрать индексы у реквизитов, можно отключить у кода и наименования в SQL
2) ОбменДанными.Загрузка возможно.
3) Отключить запись в ЖР
4) ФоновыеЗадания по числу ядер CPU с УстановитьСсылкуНового(ПолучитьСсылку(Новый UUID()))
4 Юрий Лазаренко
 
25.11.20
15:04
Создавать в транзакции порциями. Например, по 500 штук за одну транзакцию.
5 moneyget
 
25.11.20
15:09
Огромное Спасибо! щас попробую...
6 moneyget
 
25.11.20
15:16
ооо... прям полетело
7 Krendel
 
25.11.20
15:21
Плюс, запустить несколько потоков
8 Dmitrii
 
гуру
25.11.20
15:21
(0) >> через 4 часа создало где то 70 000шт вылетела ошибка.

А что за ошибка?
А точно 70 000, а не 700 000? А то как-то не сходится с утверждением про скорость в 2000шт/мин.

В остальном присоединяюсь к коллегам.
Обязательно отключить контроль записи - ОбменДанными.Загрузка = Истина. В особенности, если в базе реально настроены какие-либо обмены. Если конфигурация из каких-то типовых, то проверить не включено ли БСП-шное версионирование и если включено, то либо временно отключить, либо установить соответствующий параметр перед записью - ДополнительныеСвойства.Вставить("ПропуститьЗаписьВерсииОбъекта", Истина). Убедиться, что запись производится в привилегированном режиме - УстановитьПривилегированныйРежим(Истина).
9 ДНН
 
25.11.20
15:22
пиши напрямую в таблицы СУБД. За час сделаешь
10 1Сергей
 
25.11.20
15:25
(9) Гранаты разрешили раздавать приматам?
11 H A D G E H O G s
 
25.11.20
15:28
12 Dmitrii
 
гуру
25.11.20
15:31
(10) А почему бы и не "да"?
Вряд ли автор ветки занимается подобными безобразиями в продуктивной базе.

Лицензионному соглашению 1С прямой доступ к таблицам и записям СУБД безусловно противоречит.
Но если автор осознаёт все риски и берёт их на себя, то сможет реально сэкономить кучу времени.
13 Dmitrii
 
гуру
25.11.20
15:32
(11) 😂🤣👍
14 arsik
 
гуру
25.11.20
15:33
(12) Ты это реально?
>Лицензионному соглашению 1С прямой доступ к таблицам и записям СУБД безусловно противоречит.
Ну бред же. Я понимаю, что возможно где то это в соглашении и прописано, но всем на это насрать.
15 Dmitrii
 
гуру
25.11.20
15:35
(14) >>  возможно где то это в соглашении и прописано.

Именно об этом я и говорю.
А бред это или нет и как к этому относиться - личное дело каждого. ;)
16 Garykom
 
гуру
25.11.20
15:52
(4) +1

Но размер в транзакции надо подбирать замерами времени
17 vova1122
 
25.11.20
17:23
Интересно сколько такая база весить будет, где только самых товаров будет около 50 лямов.....
18 Anton1307
 
25.11.20
17:45
Отключи версионирование объектов
19 moneyget
 
25.11.20
18:14
На сервере 1С:Предприятия произошла неисправимая ошибка. Приложение будет закрыто
20 moneyget
 
25.11.20
18:16
гдето на 200 000 такое вылетело
21 moneyget
 
25.11.20
18:18
платформа 8.3.17.1549
22 Фрэнки
 
25.11.20
18:28
А как определил, что на 200 000 вылетело?
23 Фрэнки
 
25.11.20
18:30
И там же какой-то код был придуман, кроме того что в ноль, в котором ускорение процедуры записи было предложено ранее в этой ветке, что там в коде?
24 moneyget
 
25.11.20
21:10
СпрНоменклатура.ОбменДанными.Загрузка = Истина
не генерит Код... поэтому пришлось отказаться
и с ним кстати вылетело

Остально
1. Отключить запись в ЖР
2. УстановитьПривилегированныйРежим(Истина).

больше ничего
25 b_ru
 
25.11.20
21:13
АртикулСтр ="А1-"+Формат(сч,"ЧГ=");
26 Tatitutu
 
25.11.20
22:52
Внешняя база более 5000 000 позиций товара
Наименование, артикул, штрихкод

https://magazkat.ru/samouchitel-instruktsiya-polzovatelya/uroki-po-magazka/item/430-urok-29-vneshnyaya-baza-shtrikhkodov-5-000-000-uproshchaem-vvod-naimenovaniya-tovara
27 Dmitrii
 
гуру
26.11.20
02:18
(24) >> не генерит Код... поэтому пришлось отказаться.
Ну так сгенери код самостоятельно. Кто запрещает написать СпрНоменклатура.Код = ТоварСтр? Десткий сад какой-то.
28 camousmen
 
26.11.20
04:19
Сколько штук говорите? 5 мулльионов нужно? У вас создается 2000шт/мин, за 100 мин - 200000шт. Если хотите создать 5 мульенов номенклатуры за 100 минут, вам нужен компуктер в 25 раз мощнее - рузен тридриппер ждет вас в ближайшем магазине.
29 Bigbro
 
26.11.20
04:37
а что собственно тестировать надо?
если для теста надо 5 млн а в реале потребуется 50?
30 camousmen
 
26.11.20
04:43
(29) походу какую-то архисложную структуру собираются тестировать они..
31 Bigbro
 
26.11.20
04:57
вряд ли, создает то простейшие структуры просто много.
слишком много, что намекает на решение задачи не теми средствами.
32 Trance_1C
 
26.11.20
05:40
SQL запросом такое выполняется за 30 сек.
33 piter3
 
26.11.20
07:58
Кстати если задача разовая то почему бы и нет,всяко быстрее будет
34 Фрэнки
 
26.11.20
09:39
(33) А знаешь почему для этой процедуры нет?
Потому что знаний SQL у исполнителя просто нет. И он догадаться не может, по отсутствию опыта, скорей всего, что нужно просто обратиться к соотв. спецам в той же конторе и они сделают эту операцию на самой СУБД.

Затем останется другая задача - для уже созданных элементов справочников нужно будет указывать актуальные наименования элементов и прочие значения полей и перезаписывать их в базу.

И будет снова такая же точно проблема: что получать ссылки на объекты и затем перезаписывать миллионы объектов не получается за адекватное время обработки данных
35 piter3
 
26.11.20
09:40
(34) Да это понятно.Может и хорошо,а то наломает дров.
Я все равно не понял это разовая задача или постоянный обмен?
36 Фрэнки
 
26.11.20
09:41
Я как-то не очень тестировал, но вроде бы запись новых или перезапись существующих по времени практически одинаково выполняются.
37 piter3
 
26.11.20
09:42
(36) Если только у него в конфе нет проверок при изменении реквизитов.Тогда может и дольше перезапись
38 Bigbro
 
26.11.20
09:57
(35) это создание базы для тестов с 1/10 от реального объема данных.
вот только что за база откуда такие объемы и что тестируем - неизвестно.
39 Garykom
 
гуру
26.11.20
10:12
5 лямов номенклатур держать в типовой конфе это изврат.

Такие объемы бывают в разных инженерных или автозапчасти областях, но там это решается выносом полных каталогов наружу из 1С или внутри но отдельные справочники.

А в Номенклатура только то что реально закупали и продавали, ну или заказываем.
40 Garykom
 
гуру
26.11.20
10:13
(39)+ Чтобы база не слишком пухла делается регулярная свертка базы, с чисткой номенклатуры.
История доступна в архивных копиях, но она редко нужна за пределами предыдущего года или двух.
41 moneyget
 
26.11.20
10:59
Непонятны обсуждения типа - а зачем оно тебе?
Задача - сделать. А зачем... блин, у людей 30 млн авто товаров, хотят 1С понять как оно будет на 1С.

Про SQL... задача не так горит, чтобы разбираться что там откуда идет, а потом понять, что Х количество связяй не нашел, и забыл указать.
42 Bigbro
 
26.11.20
11:03
хреново будет.
43 Garykom
 
гуру
26.11.20
11:07
(41) Ха я угадал.

"у людей 30 млн авто товаров" - они у них тупо в каталоге или реально их заказывают, они поступают на склад и отгружаются/продаются?
44 Фрэнки
 
26.11.20
11:08
Когда речь идет об авто-товарах, т.е. тех, которые для автомобилей идут, то подобного рода опыт автоматизации уже существует.

И что-то сомнительно, чтобы там именно количество элементов справочника Номенклатура было в порядке миллионов
45 Garykom
 
гуру
26.11.20
11:08
(43)+ Короче попробуй запись в РС этих 5 лямов офигеешь.
46 Фрэнки
 
26.11.20
11:09
Каталог заказываемых позиций там не делают равным по количеству позиций со справочником Номенклатура
47 Garykom
 
гуру
26.11.20
11:10
(44) Это "номенклатура поставщиков" со всеми аналогами.
В справочник Номенклатура засовывать нет никакого смысла, отдельные (в РС оптимально) или внешние и при необходимости перенос в Номенклатуру по кнопке оператором.
48 Serg_1960
 
26.11.20
11:12
(41) Что в 1С, что в SQL, задача может быть гораздо проще решена: создать всего одну запись, а потом её размножить копированием, изменяя только нужные поля. Оригинал создаётся в 1С, размножается - в SQL. При таком подходе требуется минимум знаний SQL.
PS: имхо, разумеется.
49 Garykom
 
гуру
26.11.20
11:51
(48) ну давай минимальными знаниями sql скажи как уникальные УИД сделать
50 ikea
 
26.11.20
12:01
(0) Правильно посоветовали, что номенклатура должна быть только та, по которой будет оборот. Таких позиций будет 50-70 тысяч с ходу, остальное в течение нескольких лет доберется.
Про 50 млн. - это со всеми аналогами. Аналоги нужно делать через регистр сведений.
В свое время баловался загрузкой прайсов поставщиков автозапчастей - на обыкновенном домашнем ПК(обычный HDD) загрузка прайса около 1 млн. позиций занимала менее 10 минут в файловом варианте.
Нужна правильная организация архитектуры.
Регистры сведений - аналоги и прайсы поставщиков.
И все будет работать.
51 moneyget
 
26.11.20
13:14
(48) советовать то что сам никогда не делал - проще всего
смотрел я базу в SQL... лезь туда пока нет желания

(47) спасибо за идею!
52 Фрэнки
 
26.11.20
13:42
(51) только это не решает проблему о создании овердофига элементов справочника
53 Garykom
 
гуру
26.11.20
14:31
(52) Имхо на типовых это легко решается, где есть https://1cfresh.com/articles/data_fromlocal
54 VladZ
 
26.11.20
15:09
(0) "Есть задача сделать 5 000 000 товаров"...

Помню, в первом / втором классе наша классуха так на нас орала... Мы-то думали, она нас люто ненавидит. Оказывается, она нас жизни учила.
До сих пор помню ее любимую фразу "Заставь дурака Богу молиться - он себе лоб расшибет!"

Сделай себе такой плакат и повесь на самом видном месте.
Это решение избавит тебя от кучи других подобных задач.
55 Serg_1960
 
27.11.20
08:57
(49) Ну, давай, расскажи кто и что запрещает генерировать GUIDы в 1С для SQL?
56 ДенисЧ
 
27.11.20
09:00
(49) Это что, рокет сайнс теперь? О_о
57 Garykom
 
гуру
27.11.20
09:05
(55) Еврей?
Никто не запрещает но это уже не совсем "размножается - в SQL"

Все же ответь как без 1С (или еще чего внешнего) "минимальными знаниями sql" сделать "уникальные УИД" ?
58 Garykom
 
гуру
27.11.20
09:06
(56) Это первая из множества проблем если прямыми запросами в базу 8-ки ползти.
59 ДенисЧ
 
27.11.20
09:07
(57) select newid()
?
60 Garykom
 
гуру
27.11.20
09:07
(58)+ В смысле не говорю что так нельзя, но не всегда получится, сложнее и потребует некоторых знаний и времени.

Например допсведения как для номенклатуры?
61 Garykom
 
гуру
27.11.20
09:08
(59) Уверен что там разрядность и формат те же самые? Что и 1С генерит
62 Garykom
 
гуру
27.11.20
09:09
(60)+ В случае расширений которые метаданные того будет особенно весело ))
63 ДенисЧ
 
27.11.20
09:15
(61) Что значит "разрядность и формат"? GUID - он и в Африке guid. И даже на Селезнёвке - тоже guid, как ни странно это звучит
64 Serg_1960
 
27.11.20
09:16
(57) Не еврей. Но и не утверждал, что всё делается в SQL одни запросом. Не помню такого. Обладая минимальными знаниями, в SQL можно в цикле создавать и изменять записи в таблицах, формируя команды непосредственно в 1С. Это всё равно будет быстрее, чем запись справочника в 1С.
65 Garykom
 
гуру
27.11.20
09:17
(64) Не совсем.
Надо учитывать время которое потребуется для изучения чтобы быстро сделать.

В случае разовой задачи "Лучше день потерять, потом за 5 минут долететь!" не всегда оптимально.
66 Garykom
 
гуру
27.11.20
09:20
(63) Как бы сказать попроще то. УИД можно в разных видах в БД хранить.
Во времена древней mysql приходилось в CHAR или VARCHAR хранить, ибо длины числовых не хватало а спецтипа для GUID не было.

Т.е. хранить УИД можно как спецтип (если есть в БД), как строку (вопрос с "-" или без них) или как очень длинное число (если есть тип в БД нужной разрядности).

Короче не все так просто.
67 Garykom
 
гуру
27.11.20
09:21
(66)+ А еще можно как несколько числовых хранить да. Правда составной ключ это изврат.
68 ДенисЧ
 
27.11.20
09:21
(66) Открой базу 1с в скуле и посмотри на тип ID-поля. Я думаю, вопросы уйдут.
69 Garykom
 
гуру
27.11.20
09:22
(66)+ Сорри забыл что CHAR оно же до 32 коды символов имеет.
Можно конвертить из 16-ричной в коды и писать в строку. Тот еще изврат если в БД нет поддержки.
70 Garykom
 
гуру
27.11.20
09:24
(68) Зачем мне это? Согласен что скорее все достаточно просто.

Но если база на PostgreSQL или еще каком IBM DB2 или Oracle Database?
Короче хочу сказать что решение с прямыми запросами слишком узкое и специфичное.
71 ДенисЧ
 
27.11.20
09:29
(66) (67) (69) Остапо несло течением. Неумолимо и неостановимо. Волны стремительным домкратом перехлёстывали его утомлённую рабочей неделей голову и их звон навевал мрачные мысли о тщете всего бренного...
72 Garykom
 
гуру
27.11.20
09:30
(71) :)
73 Garykom
 
гуру
27.11.20
09:35
(71) Как бы сказать но:

"Что значит "разрядность и формат"? GUID - он и в Африке guid. И даже на Селезнёвке - тоже guid, как ни странно это звучит"

Слишком категоричное утверждение относительно способа хранения в базах данных ))
74 Serg_1960
 
27.11.20
09:38
(65) "Надо учитывать время которое потребуется для изучения чтобы быстро сделать." - или погуглить пол-часа, чтобы узнать как это сделать в SQL из-под 1С. У автора есть альтернатива - "Просто ждать 3 дня пока создает 5 млн товаров" :)
75 Garykom
 
гуру
27.11.20
09:42
(74) На практике хрен кто рядовому 1Снику скажет логин/пароль от SQL ))
76 ДенисЧ
 
27.11.20
09:43
(73) У меня посгресса и оракля под рукой нет, но в мссскуле моё утверждение точнее, чем результаты выборов в Беларуси, не говоря уже о САСШ...
77 ДенисЧ
 
27.11.20
09:43
(75) РЯдовому 1снику в голову не придёт создавать 5 лямов номенклатуры в рабочей базе.
78 Bigbro
 
27.11.20
10:50
(75) ну как сказать, у нас на практике для 1с был отдельный скуль всегда (и не один), который сами 1сники ставили админили настраивали, от админов только дистриб получали.
и все вопросы с ним решали тоже самостоятельно
потому что когда админы пытались им рулить - это очень быстро задалбывало и их и нас и пользователей.
Программист всегда исправляет последнюю ошибку.