|   |   | 
| 
 | Заполнение ресурса регистра в котором 1.5 млн записей | ☑ | ||
|---|---|---|---|---|
| 0
    
        zippygrill 10.01.24✎ 14:04 | 
        Привет,
 Пытаюсь заполнить новый ресурс регистра сведений (независимый, непериодческий) в котором 1.5 млн записей. Генерирую 20 потоков которые обрабатывают по n-количество записей (1.5млн/20) в фоне в каждый поток. Примерно через ~10 минут все 20 фоновые задания завершаются аварийно. Сама процедура заполнения и сохранения записи https://pastebin.com/VzL6GWfM Сперва делал через транзакцию и блокировку управляему. Потом убрал это их, вроде шестрее стало, но без блокировки по измерению боюсь в какой-то момент появится конкурирующий процесс и возможны коллизии если выполнить код в рабочее время? | |||
| 1
    
        Лефмихалыч 10.01.24✎ 14:08 | 
        Какие измерения есть у регистра?     | |||
| 2
    
        Лефмихалыч 10.01.24✎ 14:09 | 
        для чего ты читаешь запись, если все ее данные у тебя есть до чтения?     | |||
| 3
    
        Волшебник 10.01.24✎ 14:10 | 
        Оставьте 1 поток на ночь     | |||
| 4
    
        Лефмихалыч 10.01.24✎ 14:10 | 
        нахрена "ручная" транзакция там, где платформа и так транзакцию создает?     | |||
| 5
    
        Лефмихалыч 10.01.24✎ 14:11 | 
        есть основания полагать, что регистр можно просто trancate table и просто начисто перезаполнить, раз данные его вычисляются из бизнес процесса. Нахрена он вообще нужен такой?     | |||
| 6
    
        zippygrill 10.01.24✎ 14:12 | 
        (1) https://prnt.sc/7RP_RP9coXwF
 (2) Почему бы читать что есть и дополнительно заполнить новый ресурс? (3) будет перерасход памяти и вырубится как всегда и до этого пытался в один поток это сделать. | |||
| 7
    
        zippygrill 10.01.24✎ 14:16 | 
        (5) Это будет крайний метод, придется разобраться в логике заполнения из БП..
 (4) А в каких примерах надо тогда явную транзакцию, со ссылкой на ИТС? | |||
| 8
    
        Табуретко 10.01.24✎ 14:18 | 
        (6) чтоб небыло перерасхода памяти, не нужно все пихать в одну транзакцию...     | |||
| 9
    
        Лефмихалыч 10.01.24✎ 14:19 | 
        (6) завершен - измерение?.. о_0 аднака
 правильный ответ на 2 - потому, что есть еще 100500 ресурсов. Итого, убери свою транзакцию и оставь на ночь в одном потоке. А память у тебя кончается потому, что утечка в коде, который вызывает твою ОбработатьПорциюЗаполненияШаблонаДанныеБизнесПроцессов() | |||
| 10
    
        Волшебник 10.01.24✎ 14:20 | 
        (6) Не будет     | |||
| 11
    
        Лефмихалыч 10.01.24✎ 14:24 | 
        (10) будет-будет. Раз падает, значит утечка есть, просто в том месте, которое он не показывает     | |||
| 12
    
        Волшебник 10.01.24✎ 14:27 | 
        (11) Ну тогда добавить ещё одно задание-менеджер, которое перезапускает рабочее, если оно упало.     | |||
| 13
    
        zippygrill 10.01.24✎ 14:29 | 
        (8) Транзакция в цикле, те для каждой записи (в закомментированном коде)     | |||
| 14
    
        zippygrill 10.01.24✎ 14:31 | 
        (9) Подготовка данных для запуска фз https://pastebin.com/0zQz8EjZ     | |||
| 15
    
        zippygrill 10.01.24✎ 14:34 | 
        (9) Убрать транзакцию и блокировку. Те в текущем варианте? https://pastebin.com/VzL6GWfM     | |||
| 16
    
        Лефмихалыч 10.01.24✎ 14:37 | 
        ты в этих своих потоках один и те же бизнес-процессы обрабатываешь     | |||
| 17
    
        Лефмихалыч 10.01.24✎ 14:38 | 
        понлы биздесь, конечно...     | |||
| 18
    
        Лефмихалыч 10.01.24✎ 14:40 | 
        И НЕ ДанныеБизнесПроцессов.БизнесПроцесс.Шаблон ЕСТЬ NULL
 это условие всегда истинно а вот это может быть истинным только, если этот УК_Шаблон имеет составной тип ДанныеБизнесПроцессов.УК_Шаблон = НЕОПРЕДЕЛЕНО | |||
| 19
    
        Лефмихалыч 10.01.24✎ 14:42 | 
        удали просто весь свой код полностью     | |||
| 20
    
        Лефмихалыч 10.01.24✎ 14:42 | 
        в нем проблема     | |||
| 21
    
        zippygrill 10.01.24✎ 14:43 | 
        (17) почему?
 (18) УК_Шаблон - имеет составной тип - поэтому и условие ДанныеБизнесПроцессов.УК_Шаблон = НЕОПРЕДЕЛЕНО | |||
| 22
    
        Волшебник 10.01.24✎ 14:42 | 
        Наверное имелось в виду
 И ДанныеБизнесПроцессов.БизнесПроцесс.Шаблон <> ЗНАЧЕНИЕ(Справочник.ШаблоныБП.ПустаяСсылка) | |||
| 23
    
        Лефмихалыч 10.01.24✎ 14:43 | 
        (21) я тебе говорю - это условие всегда истинно потому, что NULL 1С хранить не умеет, нул может только в соединении появиться     | |||
| 24
    
        Smit1C 10.01.24✎ 14:43 | 
        (0) сколько ядер на процессоре ?     | |||
| 25
    
        Лефмихалыч 10.01.24✎ 14:45 | 
        если там несколько типов, то 
 И НЕ ДанныеБизнесПроцессов.БизнесПроцесс.Шаблон.Ссылка ЕСТЬ NULL однако, исходя из того, что ты добавил ресурс и хочешь его заполнить, условие неправильное, оно как раз выбирает те записи, которые тебе не нужны, то есть, в которых всё заполнено | |||
| 26
    
        zippygrill 10.01.24✎ 14:46 | 
        (23) Результат запроса этого поле говорит что там null https://prnt.sc/ijdDlFs-MKSS     | |||
| 27
    
        zippygrill 10.01.24✎ 14:46 | 
        (24) Нет такой инфы     | |||
| 28
    
        Smit1C 10.01.24✎ 14:47 | 
        (27) без этой цифры нет особого смысла параллелить вычисления.     | |||
| 29
    
        Лефмихалыч 10.01.24✎ 14:49 | 
        (26) не правда. Там Неопределено     | |||
| 30
    
        zippygrill 10.01.24✎ 14:50 | 
        (25) Те ссылку надо сравнить с null, а не реквизит составной?     | |||
| 31
    
        Лефмихалыч 10.01.24✎ 14:50 | 
        пойду убьюсь об стенку     | |||
| 32
    
        Волшебник 10.01.24✎ 14:53 | 
        (30) Гляньте (22)     | |||
| 33
    
        Лефмихалыч 10.01.24✎ 14:54 | 
        короче, у тебя код и запрос - хрень. Ты разным потокам выдаешь пакеты с одними и теми же ссылками и выполняешь повторную обработку сотни тысяч раз.
 Многопоточная обработка делается не так. Ты сначала должен выбрать всё из БД, потом побить на окна и отправить все куски на обработку. Твой же код не учитывает, что между твоими запросами еще не все записи из предыдущих окон успели обработаться. | |||
| 34
    
        Лефмихалыч 10.01.24✎ 14:55 | 
        (32) нет. Раз тип составной, значит там могут быть и еще справочники, а значит такой запрос соберет и заполненные ссылки тоже, которые заполнены, но ссылкой на другой справочни     | |||
| 35
    
        zippygrill 10.01.24✎ 14:57 | 
        (32) В моем случае неправильно будет указать .ПустаяСсылка() тк ДанныеБизнесПроцессов.БизнесПроцесс.Шаблон - СправочникСсылка.ШаблоныИсполнения, СправочникСсылка.ШаблоныСогласования, и тд..     | |||
| 36
    
        zippygrill 10.01.24✎ 14:59 | 
        (33) Твой же код не учитывает, что между твоими запросами еще не все записи из предыдущих окон успели обработаться -- Зачем ждать обработку предыдущих окон, если я разбил все записи по определенной Дате?     | |||
| 37
    
        zippygrill 10.01.24✎ 15:00 | 
        (32) значит так должно быть И ДанныеБизнесПроцессов.БизнесПроцесс.Шаблон <> НЕОПРЕДЕЛЕНО     | |||
| 38
    
        Лефмихалыч 10.01.24✎ 15:01 | 
        .ПустаяСсылка() в запросе отсутствует.
 Друг, а чем ты занимался последние 13 лет? Это ж чертова база. В общем, удали свои фоновые задания и обрабатывай одним потоком. | |||
| 39
    
        Лефмихалыч 10.01.24✎ 15:03 | 
        (36) подумай. Просто прими факт, что вдруг я прав и подумай, при каких условиях так может быть с учетом твоего кода.     | |||
| 40
    
        Волшебник 10.01.24✎ 15:04 | 
        (38) >> обрабатывай одним потоком
 Я так и сказал в (3) | |||
| 41
    
        Timon1405 10.01.24✎ 15:06 | 
        (29) если ДанныеБизнесПроцессов.БизнесПроцесс пустая ссылка, то там нулл.
 нул может только в соединении появиться БизнесПроцесс.Шаблон - и есть соединение, которое вы не увидели откуда такое недоверие к ТС? он же проверил запрос в консоли перед тем как совать его в обработку данных | |||
| 42
    
        СвинТуз 10.01.24✎ 15:08 | 
        (0)
 Мудрено как то. Спешишь куда то? Если не спешишь, выбирай порциями хоть по 100 штук, ночами. Заполняй набор и пиши. | |||
| 43
    
        Лефмихалыч 10.01.24✎ 15:09 | 
        (41) хмм.. да, точно, пропустил
 ТС не в курсе, как хранятся составные типы, откуда мне знать, отличает ли он нул от неопределено в выборке. Да. Условие "И НЕ ДанныеБизнесПроцессов.БизнесПроцесс.Шаблон ЕСТЬ NULL" действительно не является всегда истинным. Только в (33) это ничего не меняет | |||
| 44
    
        СвинТуз 10.01.24✎ 15:11 | 
        (42)
 И пока не кончаться не заполненные. | |||
| 45
    
        Волшебник 10.01.24✎ 15:12 | 
        (42) Набор по 100 штук не сработает. Тут вам не там     | |||
| 46
    
        СвинТуз 10.01.24✎ 15:14 | 
        (45)
 Возьми 1 000. Надо писать. Если упадет, заполнение то останется. | |||
| 47
    
        СвинТуз 10.01.24✎ 15:16 | 
        (46)
 Если конечно нужно просто заполнить. Писать порциями. Выбирать не заполненные. Пусть падает. | |||
| 48
    
        zippygrill 10.01.24✎ 15:16 | 
        (43) Твой же код не учитывает, что между твоими запросами еще не все записи из предыдущих окон успели обработаться. -- ты тут описываешь последовательная обработка данных. 
 Я же запускаю паралельную обработку порций данных, которых я ранее разбил по дате. | |||
| 49
    
        Garykom 10.01.24✎ 15:17 | 
        (0) В твоем узком случае проще создать несколько записей тестовых из 1С
 А затем напрямую прямыми запросами фигачить в субд | |||
| 50
    
        zippygrill 10.01.24✎ 15:17 | 
        (47) В продуктивах то надо одним ходом заполнить, а не растягивать по времени..     | |||
| 51
    
        СвинТуз 10.01.24✎ 15:17 | 
        (45)
 Мощность множества не более чем счетно. Кончится быстро. | |||
| 52
    
        Garykom 10.01.24✎ 15:18 | 
        (49)+ Тебе же надо просто https://learn.microsoft.com/ru-ru/sql/t-sql/queries/update-transact-sql?view=sql-server-ver16     | |||
| 53
    
        СвинТуз 10.01.24✎ 15:18 | 
        (50)
 И что? запускай хоть раз в 10 секунд и долби. | |||
| 54
    
        zippygrill 10.01.24✎ 15:20 | 
        (49) Да вроде получается и потоками в ФЗ это сделать. Просто хочется чтобы код 1С был безопастным и корректным     | |||
| 55
    
        СвинТуз 10.01.24✎ 15:20 | 
        (50)
 + все трудности от большого объема записываемых данных. Нужно уменьшить. | |||
| 56
    
        СвинТуз 10.01.24✎ 15:21 | 
        (54)
 Ну раз нет желания обойти, то удачи. Нормальные герои всегда идут в обход. | |||
| 57
    
        Garykom 10.01.24✎ 15:21 | 
        (54) У тебя "УК_Шаблон = КлючЗнч.Шаблон" всегда разное или повторяется для разных записей?     | |||
| 58
    
        zippygrill 10.01.24✎ 15:24 | 
        (57) Шаблонов от силы 5-7. Хочешь предложить разбить порцию по шаблонам? Можно но зачем, всего лишь другой критерий разделения.     | |||
| 59
    
        СвинТуз 10.01.24✎ 15:24 | 
        (0)
 Вариант для крутых. Пиши в СКЛ_Сервер прямым запросом ночью. | |||
| 60
    
        Garykom 10.01.24✎ 15:25 | 
        Ну и зачем по одной записи?
 Когда общепринято (в типовых например) использовать ТЗ и СоздатьНаборЗаписей ... Загрузить(ТЗ) ... Записать() | |||
| 61
    
        СвинТуз 10.01.24✎ 15:25 | 
        (0)
 И зачем каждый раз заполнять уже заполненное? Есть такая необходимость? Ты же каждый раз с начала начинаешь? | |||
| 62
    
        zippygrill 10.01.24✎ 15:25 | 
        (59) Да нет у меня доступа к инфраструктуре)     | |||
| 63
    
        Garykom 10.01.24✎ 15:26 | 
        (58) Да. Выгрузить из РС в ТЗ по фильтру.
 Заполнить колонку УК_Шаблон, Загрузить и Записать | |||
| 64
    
        zippygrill 10.01.24✎ 15:27 | 
        (60) А как мне Набор поможет если в каждой записи измерение разное?     | |||
| 65
    
        СвинТуз 10.01.24✎ 15:28 | 
        (62)
 36 лет. Вроде большой мальчик? Не пускают? Договорись. | |||
| 66
    
        Garykom 10.01.24✎ 15:28 | 
        (64) кто мешает в (63) фильтру составную?     | |||
| 67
    
        СвинТуз 10.01.24✎ 15:28 | 
        (64)
 Иногда желание решить задачу как задумал сильнее здравого смысла. Удачи. | |||
| 68
    
        Garykom 10.01.24✎ 15:31 | 
        (66)+ В несколько потоков раздельное чтение (только чтение, без записи) блокировки таблиц не происходит     | |||
| 69
    
        Garykom 10.01.24✎ 15:30 | 
        (68)+ Вот подобрать размер ТЗ (количество записей) для записи в РС это уже на практике, чтобы в несколько потоков блокировки были минимальны     | |||
| 70
    
        СвинТуз 10.01.24✎ 15:30 | 
        Кстати у метода "Записать" есть параметр.
 Отбор можно и не ставить. Не важно. Возможно путаю )))) Сами разберетесь. | |||
| 71
    
        Garykom 10.01.24✎ 15:35 | 
        Групповые методы (НаборЗаписей) обычно всегда шустрей чем одиночные (МенеджерЗаписи) в цикле     | |||
| 72
    
        Лефмихалыч 10.01.24✎ 15:38 | 
        (71) для этого регистра набор записей будет записываться точно так же по одной строке, по этому прироста на практике заметного не будет.     | |||
| 73
    
        Garykom 10.01.24✎ 15:40 | 
        (72) Надо проверять
 В какие запросы sql это будет транслироваться и как сервером 1С | |||
| 74
    
        Волшебник 10.01.24✎ 15:41 | 
        (70) Сейчас Вы насоветуете до уничтожения регистра. Идите уже     | |||
| 75
    
        Лефмихалыч 10.01.24✎ 15:43 | 
        (73) я проверял :)     | |||
| 76
    
        Garykom 10.01.24✎ 15:44 | 
        (74) Это уже советовали, сохранить данные из РС, грохнуть таблицу и заново создать с заполнением ))     | |||
| 77
    
        Лефмихалыч 10.01.24✎ 15:45 | 
        Я бы (без обид, я из лучших побуждений) не советовал ТСу в скуль лезть. Так можно из одной проблемы две сделать очень легко.     | |||
| 78
    
        Garykom 10.01.24✎ 15:45 | 
        (75) Т.е. там нет на низком уровне потерь от цикла на ЯП 1С?
 Когда вместо него передается ТЗ сразу? | |||
| 79
    
        Лефмихалыч 10.01.24✎ 15:45 | 
        (76) первым делом     | |||
| 80
    
        Лефмихалыч 10.01.24✎ 15:46 | 
        (78) на низком уновне запись большого набора независимого регистра с заменой транслируется в построчное delete from + insert into     | |||
| 81
    
        Волшебник 10.01.24✎ 15:51 | 
        (78) Эти потери меркнут на фоне транзакции на запись в БД.     | |||
| 82
    
        СвинТуз 10.01.24✎ 16:02 | 
        (74)
 Оно просто не запишется. Если запись есть уже. | |||
| 83
    
        kauksi 10.01.24✎ 16:09 | 
        А может вообще данные этого регистра во внешний источник данных вынести? и там средствами языка SQL делать что то с данными? а из 1с уже обращаться к ним?     | |||
| 84
    
        Волшебник 10.01.24✎ 16:09 | 
        (82) Остыньте. Ваша идея с наборами уже отвергнута.     | |||
| 85
    
        СвинТуз 10.01.24✎ 16:11 | 
        (74)
 Он просто работать не хочет. Хочет на Мисте общаться. Цените. 1 500 000 записей на наборы по 1 000 записей = 1 500 наборов. Если запускать один набор в минуту это чуть больше суток работы. Отбирать не заполненные. При записи набора из 1 000 записей упасть не должно. Можно писать поштучно, тогда даже в случае падения останется меньше. | |||
| 86
    
        OldCondom 10.01.24✎ 16:11 | 
        А какой смысл делать несколько потоков на записи с идентичными измерениями? Только упадет скорость. 
 В один поток, транзакциями 10-100 или сколько удобно штук записей и все ок будет. 1.5млн не особо серьезно. | |||
| 87
    
        Волшебник 10.01.24✎ 16:14 | 
        (85) Здесь набор не прокатит, потому что измерения разные, см. (64)
 Даже 2 записи в набор не запихнёте | |||
| 88
    
        СвинТуз 10.01.24✎ 16:23 | 
        (87)
 Менеджер. Выбирать запросом первые 1 000 не заполненные. И по одной. Блокировка ему не нужна. за 25 часов обработка перелопатит при запуске раз в минуту. Если брать по 2 000 за 12,5 часов. | |||
| 89
    
        СвинТуз 10.01.24✎ 16:25 | 
        Можно индекс для скорости на реквизит поставить.
 После заполнения убить. | |||
| 90
    
        СвинТуз 10.01.24✎ 16:31 | 
        Как ИМХО так ТС тупит страшно.
 Каждый раз сначала начинает. Но я старый с маразмом. ))) Молодежи виднее. | |||
| 91
    
        СвинТуз 10.01.24✎ 16:34 | 
        (29)
 Потому что тип не выбран. | |||
| 92
    
        zippygrill 10.01.24✎ 16:36 | 
        Спасибо,
 Код по ссылке в самом начале за ~30 мин заполнил все мои интересующие записи. | |||
| 93
    
        СвинТуз 10.01.24✎ 16:39 | 
        (29)
 NULL это когда "Использование" у реквизита справочника только для родителя, например, а обращаешься не к группе. (87) Но это только новисы знают ))). Так же как и про параметр у метода. Насипова про то "за что увольняют" все слышали, а в хелп не все смотрели. Не важно. Пойду посплю. Всем хорошего и успехов в работе. | |||
| 94
    
        Лефмихалыч 10.01.24✎ 16:44 | ||||
| 95
    
        СвинТуз 10.01.24✎ 16:50 | 
        (94)
 Да сомнительно. Выигрыш в скорости запроса. Проигрыш при записи. Потому что пишем большой объем данных построчно, и индекс тоже перезаписывается. Все не интересно. | |||
| 96
    
        Волшебник 10.01.24✎ 20:32 | 
        (95) Сдавайтесь. Вам не победить этот сабж.     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |