Многопоточное удаление объектов



Обработка предназначена для ускорения процедуры удаления объектов

Обработка предназначена для ускорения процедуры удаления большого количества объектов.

Не претендую на изобретение велосипеда, но суть примерно такая: запускаем дочерние процессы обработки (сама себя) по количеству ядер процессора.

В итоге в файловом режиме реальный прирост в 2 раза(!) и более. На SQL — 15%

Зачем это нужно? Предположим, у вас база, в которой штук 10 юриков. Учредители, разбегаясь, решили поделить бизнес, и вам надо в базе удалить 9 организаций из 10. Или вы решили свернуть (схлопнуть) базу. В общем, не суть: кто сталкивался с задачей удаления большого количества объектов, тот меня поймёт.

Писалась под 8.3 (только толстый клиент!!!), но на скорую руку добавила поддержку 8.2 (кому надо, код открыт, разберетесь).

При первом запуске обработки нужно её же указать в окошке «Путь к обработке».

19 Comments

  1. aspirator23

    Странно, что только в 2 раза. Аналогично делал на SQL — ускорение в количество фоновых процессов. Не точно, но почти. Т.е. на 10 примерно получалось в 7-8 раз.

    Reply
  2. zzz_natali

    (1) aspirator23, Ну, если по-чесноку, то статистику не собирала. Субъективно прикинула … к носу — вроде в 2 с небольшим раза быстрее.

    Reply
  3. Sl@v@

    На УТ 3.0 для Украины 1С 8.3.4 выдает —

    {Форма.Форма.Форма(141)}: Получение элемента по индексу для значения не определено

    МассивФорма[Сч-1][ИмяРеквизита] = ЭтотОбъект[ИмяРеквизита];

    Как можно побороть?

    Reply
  4. zzz_natali

    (3) Sl@v@,

    КАк надыбаю УТшку для Украины, гляну. Вы точно уверены, что ваша конфигурация запускается в толстом клиенте?

    Reply
  5. Sl@v@

    ДД.

    Да, в Толстом клиенте обычные формы.

    Инсталляция конфигурации — https://yadi.sk/d/T-ypcOGosVFzc

    Cf конфигурации — https://yadi.sk/d/F8J9CpDSsVJQ8

    Reply
  6. echo77

    (6) Не надо снимать с поддержки. Надо просто в параметрах запуска 1С дописать /RunModeOrdinaryApplication

    https://helpf.pro/faq83/view/1735.html

    Reply
  7. Xershi

    (7) или же в режиме отладки выбрать запуск обычное приложение, но не факт что взлетит.

    Reply
  8. zzz_natali

    (7) У него какая-то хитромудрая конфа. У мя не получилось её толкнуть в режиме ранмодеординари

    Reply
  9. echo77

    У меня все запускается

    Reply
  10. zzz_natali

    (10) Х.з. на тот момент может мне какую другую редакцию конфы пихнули.

    Больше года уже прошло…

    «Не жнаю, вопчем: само приползло» (с) из анека

    Reply
  11. Sl@v@

    Доброе время суток.

    У меня тоже запускается в обычном режиме из конфигуратора, но после выполнить выдает старую ошибку —

    «{Форма.Форма.Форма(141)}: Получение элемента по индексу для значения не определено

    МассивФорма[Сч-1][ИмяРеквизита] = ЭтотОбъект[ИмяРеквизита];

    «

    Reply
  12. zzz_natali

    (12) Попробуйте заремить 141ю строчку — должно заработать.

    Reply
  13. Sl@v@

    Заремил, но не сильно продвинулся в многопоточном удалении —

    «Ошибка разделенного доступа к информационной базе»

    Reply
  14. zzz_natali

    (14) Давайте с самого начала. Ошибка проявляется только на одной базе или на всех(даже если взять обычную бухню-демку)?

    ЗЫ. Уехала поливать огурцы. На след неделе продолжим…

    Reply
  15. Sl@v@

    Я только на этой пробовал.

    Reply
  16. starik-2005

    (1)

    Аналогично делал на SQL — ускорение в количество фоновых процессов.

    Имеется ввиду на клиент-серверной архитектуре? На скуле это делается в 1 поток раз в 1000000000 быстрее, чем на 1С.

    Тут что-то есть об этом. Если UPDATE поменять на DELETE, а в WHERE прописать _Marked = 1, то удалится только в путь )))

    Reply
  17. zzz_natali

    (16) Может конфа базовая? Не дает несколько подключений к базе…

    Reply
  18. zzz_natali

    (17)

    У вас есть готовый универсальный T-SQL скрипт по непосредственному удалению помеченных на удаление объектов? Была бы очень признательна.

    Reply
  19. starik-2005

    (19)

    У вас есть готовый универсальный T-SQL скрипт

    Т.к. имена в разных базах разные, то универсальный скрипт достаточно проблематично запилить (но можно). Основная проблема — удаление движений в регистрах по удаленным объектам. Ну и 1С может поменять структуру БД, что может привести к неработоспособности скрипта.

    Если данные нужно удалить из небольшого количества связанных таблиц, то скрипт написать будет весьма простой задачей. получаете имена таблиц и имена табличных частей. Удаляете данные основной таблицы по признаку _Marked = 1, удаляете табличные части по NULL в соединении с основной таблицей, удаляете данные регистров по NULL в соединении с регистратором. Если регистраторов много, то поле типа «RTRef » содержит номер таблицы, т.е. добавляете условие по этому полю и номеру документа. 10 минут скрипт писать.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *