Имя: Пароль:
1C
1С v8
Ускорение поиска ненужных объектов (элементы справочников) без ссылок на них
0 Garykom
 
гуру
29.07.22
15:29
Собственно задачка почистить справочник ДоговорыКонтрагентов в котором уже десятки тысяч элементов

НайтиПоСсылкам() сильно медленноо пашет

Какие есть способы ускорить? Например прямые запросы sql к базе (у нас не MSSQL а PostgreSQL :()
Кто делал подобное?

Многопоточность интересно поможет? Чтобы не одним фоновым (как сча) а пулом.
1 vde69
 
29.07.22
15:35
у меня справочник банковских счетов около 100к, типовая довольно шустро удаляет если транзакция не очень большая, примерно 1000 элементов обрабатывает до 5 минут
2 СеменовСемен
 
29.07.22
15:37
Напиши свой запрос и ищи отдельпо таблицам в несколько потоков
3 Garykom
 
гуру
29.07.22
15:37
(0)+ Причем надо уточнить что нужны не только без ссылок совсем.
Но и надо отбирать для обработки объекты с "почти пустыми" ссылками, на разную бесполезную/ненужную хрень типа служебных РС и непроведенных документов.
4 Garykom
 
гуру
29.07.22
15:37
(1) В смысле предлагаешь пометить все на удаление а затем попытаться запустить типовое "Удаление помеченных объектов"?
5 vde69
 
29.07.22
15:39
(3) добавь в конфу "критерии отбора" и будет реально быстро
6 СеменовСемен
 
29.07.22
15:40
(5) это будет доп индекс по договору везде
7 Garykom
 
гуру
29.07.22
15:40
(4)+ Пробовал, виснет если помеченных на удаление больше некоторого кол-ва.
Вариант только порциями.
Но тут дурдом что без многопоточности и потом обратно пометку снимать и т.д. короче неудобно.
8 vde69
 
29.07.22
15:40
(6) да, но тут или крестик или труселя
9 Garykom
 
гуру
29.07.22
15:43
Гм.

Вопрос то был конкретный!

Как по какому критерию параллелить (разбивать на обрабатываемые в одном потоке порции) весь справочник?
10 1Сергей
 
29.07.22
15:45
Думаю, простым запросом можно сузить список всех элементов справочника до приемлемого числа подозреваемых
11 Garykom
 
гуру
29.07.22
15:46
(9)+ Тупо реквизит (можно и доп) в который номер потока предварительно записать?

Для ускорения можно не писать туда номер (флаг/признак) если запрос по наиболее частому виду доков выдает результаты например

Еще как можно это дело оптимизировать и ускорить?
12 СеменовСемен
 
29.07.22
15:49
(9) по таблице например
13 alarm2020
 
29.07.22
15:49
(0) Отобрать те, договоры, которых нет в 4 основных видах документов (деньги+, деньги-, товар+, товар-). И уже этот список прогонять через НайтиПоСсылкам()
14 Aleksey
 
29.07.22
15:50
Я в свое время делал предварительные отборы по шапке документов (там есть индексы и работает быстро) и уже работал с теми кто не попал в тот отбор (остаются к примеру из ТЧ, или РС)
15 СеменовСемен
 
29.07.22
15:52
(12) каждый поток выдост массив неиспользуемых и в финале найти пересечение
16 vde69
 
29.07.22
15:55
(11) делаешь план обмена, каждый узел - это отдельный поток.

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

а в рег заданиях работай по узлам
17 Garykom
 
гуру
29.07.22
16:29
(13) Ты понимаешь что это не лучше?
Потому что документы перебирать которых под 100к ежемесячно гм
18 vde69
 
29.07.22
16:41
(17) это доли секунды, ибо там уже есть критерий отбора "документы по договорам", попробуй запрос сделай с использование его....
19 Garykom
 
гуру
29.07.22
17:01
(18) ОК, согласен
Даже если выбрать один вид документов и прогнать за пару месяцев то список для проверки сильно сократится
20 vde69
 
29.07.22
17:07
ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 10
    ДокументыПоДоговоруКонтрагента.Ссылка КАК Ссылка
ИЗ
    КритерийОтбора.ДокументыПоДоговоруКонтрагента(&ДоговорНаПроверку) КАК ДокументыПоДоговоруКонтрагента


выполняется 0.125 сек у меня на базе в 80 гигов
21 СеменовСемен
 
29.07.22
17:09
(20) а теперь такое нужно для всех договоров
22 Garykom
 
гуру
29.07.22
17:09
(20) интересно
23 Garykom
 
гуру
29.07.22
17:11
(20)+ жаль только не все доки в критерий попадают из имеющих реквизит Договор
24 СеменовСемен
 
29.07.22
17:11
(20) ты понимаешь как работает критерий отбора?
Это просто составной селект по всем перечисленным метаданным
25 vde69
 
29.07.22
17:12
(23) так я тебе в (3) написал - сделай свой критерий отбора и потом летай :)
26 lodger
 
29.07.22
17:18
(23) но это отсеет весомый кусок - точно заюзанных договоров. и заюзанных многократно, что сильно облегчает работу НайтиПоСсылкам (оно дольше всего работает над построением таблицы всех найденных ссылок).
27 СеменовСемен
 
29.07.22
17:19
(23) проще самому запрос составить. И никакие ссылки не искать
28 СеменовСемен
 
29.07.22
17:21
НЕ СпрДоговоры.Ссылка в (выбрать договор из всех нужных таблиц)
29 DJ Anthon
 
29.07.22
17:24
есть уже обработка на инфостарте, проверил, рили раз в 100 быстрее почистила некоторые справочники, не помню точно, эта или нет
https://infostart.ru/public/557217/
30 Garykom
 
гуру
29.07.22
17:30
(29) древняя ОФшная штук, где не нашел требуемого функционала

Мне не удалить помеченные, а найти какие бы пометить на удаление ненужные
31 DJ Anthon
 
29.07.22
17:33
так все пометить, что осталось - вернуть
32 Garykom
 
гуру
29.07.22
17:34
(31) издеваешься?
33 RomanYS
 
29.07.22
17:35
(0) Вроде очевидно: сначала выбрать те, которые используются в основных таблицах запросом (например по таблицам субконто/заказам/взаимоорасчетам).
А потом оставшиеся проверять поиском ссылок порциями. Если во второй части встретятся новые частоиспользуемые таблицы - добавляем их запрос первого шага
34 Garykom
 
гуру
29.07.22
17:35
(32)+ Хотя тут не типовой удаление помеченных, может и отработает
Типовое виснет о чем писал в (7)
35 Garykom
 
гуру
29.07.22
17:41
(33) Да уже воткнул КритерийОтбора из (20) и прогресс аж на глазах, так что этого хватит
Только добавил Проведен = Истина
36 DJ Anthon
 
29.07.22
17:49
(32) нет. сам недавно под лям элементов удалил. всего одна ночь ушла, а так на тестовой неделя уходила. репу чесал, как бы ночью чистку по этапам разбить. но все ситуативно, иногда в базе такая дикая связность, что удаление там просто нереальная задача.
37 DJ Anthon
 
29.07.22
17:49
это после того, как надыбал эту обработку )
38 TormozIT
 
гуру
29.07.22
18:08
(30) В ИР можно инструментом "Удаление объектов с контролем ссылок". Закидываешь туда весь справочник. Запускаешь контроль и занимаешься своими делами. Через Х минут получишь результат.
39 TormozIT
 
гуру
29.07.22
18:10
Ну а собственно ускорение для твоего частного случая включается флажком "Минимальный поиск".
40 Garykom
 
гуру
29.07.22
18:17
(38) (39) Для РС Документы по требованию ФНС в БП3 оно правильно отработает?
41 TormozIT
 
гуру
29.07.22
18:20
(40) Она знает ничего о смысле хранимых в регистрах данных. Ты сам должен указать, какие регистры являются мусором (неблокирующие).
Забыл ссылку на фичу (39) указать https://www.hostedredmine.com/issues/938392
42 TormozIT
 
гуру
29.07.22
18:22
Если напишешь отчет с замерами о своем испытании с обозначением наиболее долгих таблиц, то подумаю над добавлением многопоточности.
43 Garykom
 
гуру
29.07.22
18:59
(41) ОФ в толстом запускать проблематично
44 TormozIT
 
гуру
29.07.22
19:02
(43) Ого. Я думал ты тут серьезную задачу решать надумал. А ты даже запустить и проверить готовый инструмент ленишься - ищешь любое оправдание чтобы не проверять.
Ну тогда тебе точно надо писать свой велосипед.
45 Жан Пердежон
 
29.07.22
19:15
некоторые (типовые) конфы могут хранить ссылочные данные в хранилище значения
46 Garykom
 
гуру
29.07.22
19:24
(44) Нет, просто не интересует неподходящий инструмент
Не спорю что ИР штука неплохая но в данном случае она недостаточно гибкая
47 Garykom
 
гуру
29.07.22
19:25
(45) Мне надо пометить на удаление, чтобы затем типовое удаление помеченных запустить
Так что пофиг
48 TormozIT
 
гуру
29.07.22
19:35
(46) В каком месте ее гибкости не хватает в твоей задаче, ты забыл объяснить, либо я не понял твое объяснение.
49 Garykom
 
гуру
29.07.22
19:56
(48) Куда там свой код вставлять?
Как сделать многопоточно?

Вот эту штуку что я сча разово делаю массово надо будет в обработку/расширение и в регламентное, чтобы в фоне по расписанию выполнялось
Зачем мне ИР?
50 Garykom
 
гуру
29.07.22
19:59
(49)+ При загрузке например из клиент-банка создаются куча "Основной договор"
Затем когда у менагеров руки и документы доходят из внешней системы падает (автоматически создается нормальный договор)
Доки на него и бухи затем переносят поступления/списания денег на правильный договор с этого "Основного"
А эти "Основной договор" надо грохать

И таких много каждый месяц
51 TormozIT
 
гуру
29.07.22
20:37
(49) Про регламентное задание (регулярное автоматическое выполнение) ты первый раз упомянул в этой теме. Я не телепат.
Про многопоточность я уже написал, что ее пока нет в (42).
> Зачем мне ИР?
Затем что там есть готовый инструмент для интерактивного решения твоей задачи. Ты его пробуешь. Убеждаешь, подходит он или нет.
Если подходит, то как опытный программист, уверен без особого труда сумеешь сделать на основе него регламентное задание, т.к. код в ИР уже почти весь двусторонний (может выполняться на клиенте и на сервере).
52 Garykom
 
гуру
29.07.22
20:59
(51) Я не очень любитель тянуть ненужные монструозные библиотеки/фреймворки/сторонние решения для задачи.
Предпочитаю алгоритмы и конкретные какие то решения/наработки брать, понимая что там внутри и как оно работает.
И в любой момент могу переписать как надо, не матерясь на чужой непривычный код.
53 СеменовСемен
 
29.07.22
23:04
(49) нету смысла в многопоточно на стороне 1с ибо скуль сам многопоточно сделает
54 Конструктор1С
 
30.07.22
07:23
(0) >>Многопоточность интересно поможет? Чтобы не одним фоновым (как сча) а пулом

Поможет, я делал так. Одно фоновое обрабатывает один объект метаданных (чтобы избежать конфилктов блокировок). Общее время замены ссылок определяется временем замены в самой большой таблице. Пока пыхтит замена на большой таблице, в других фоновых заданиях проскакивает замена по меньшим объектам
55 Конструктор1С
 
30.07.22
07:32
Самыми тормозными местами окажутся самые здоровые регистры накопления и регистр бухгалтерии. Ибо для каждого набора записей будут толкать итоги
56 Конструктор1С
 
30.07.22
07:41
(53) ты представляешь себе трудозатраты на реализацию универсальной скульной замены ссылок в таблицах? "Внезапно" выяснится, что есть всякие там итоги, планы обмена, какие-то особые случаи по данным, которые тоже нужно аккуратно обыграть. Овчинка выделки не стоит, потратишь месяцы на написание скульной замены (с реализацией всех нюансов), а выигрыша по производительности особого не получишь
57 СеменовСемен
 
30.07.22
07:42
(56) тс не нужна замена ссылок вроде.
Задача стоит найти неиспользуемые
58 СеменовСемен
 
30.07.22
07:43
(57) и решается она 1 запросом
59 Конструктор1С
 
30.07.22
07:43
(57) "Собственно задачка почистить справочник ДоговорыКонтрагентов"
60 СеменовСемен
 
30.07.22
07:44
Запрлс из (28) максимум мин за 10 отработает
(59) а где тут замена? Ветку то почитай дальше заголовка
61 Конструктор1С
 
30.07.22
07:52
(60) >>Запрлс из (28) максимум мин за 10 отработает

Разве что на карликовой базе.

>>а где тут замена? Ветку то почитай дальше заголовка

И что по-твоему будет делать ТС с найденными ссылками? Любоваться на них?
62 rphosts
 
30.07.22
07:56
(0)1.мочи порционно... сегодня сколько-то, завтра ещё сколько-то...
2. параллельно? -  да! если проца ресурсов хватает - параллель! тем более что задача прекрасно параллелится.
63 Конструктор1С
 
30.07.22
08:17
Если задача тупо проверить, используется ли где-либо ссылка на договор, то тем более не нужно заморачиваться с прямыми запросами. НайтиПоСсылкам() умеет работать по конкретным объектам метаданных. По каждому нужному объекту метаданных можно запустить отдельное фоновое задание
64 СеменовСемен
 
30.07.22
08:42
(63) ты опять ничего не прочитал. Найти по ссылкам работает слишком медленно и таки ищет связные ссылки, что в данной задаче совершенно излишне
65 СеменовСемен
 
30.07.22
08:43
(61) ссылки не используются - можно удалять
66 Конструктор1С
 
30.07.22
09:55
(64) какие ещё связные ссылки? НайтиПоСсылкам() можно ограничить конкретными объектами
67 RomanYS
 
30.07.22
10:12
(66) А смысл? Оно станет работать чем запрос к одному полю одной таблицы?
68 СеменовСемен
 
30.07.22
10:26
(66) а что по твоему делает метод найти по ссылкам?
69 СеменовСемен
 
30.07.22
10:27
Опять же есть технические таблицы, которые нужно исключить, поэтому однозначно нужно свой запрос
70 Конструктор1С
 
30.07.22
10:56
(67) смысл в меньшем количестве кода

(68) примерно то же, что будешь делать ты вручную: генерирует селекты по полям таблиц, в типах которых есть искомый тип
71 СеменовСемен
 
30.07.22
11:20
(70) вот только оно все ссылки выберет, а они не нужны
И на это съест и времени и памяти
72 Конструктор1С
 
30.07.22
11:26
(71) ты уж определись. То ты в (28) предлагаешь резмотать к чертям все ресурсы сервера БД, то начинаешь экономить на спичках
73 RomanYS
 
30.07.22
11:34
(72) Ты утверждаешь, что найтипоссылкам будет менее ресурсоемко? На примере одной таблице, допустим регистр бухгалтерии
74 СеменовСемен
 
30.07.22
11:40
(72) я предлагаю не тащить их на клиент.
75 СеменовСемен
 
30.07.22
11:42
НайтиПоСсылкам сделает тоже что и (28) плюс все найденные ссвлки вытащит на клиента
76 Конструктор1С
 
30.07.22
11:53
(73) менее ресурсоемко чем что? Профит от НайтиПоСсылкам в простоте использования. Не надо кидаться писать много кода и заниматься оптимизацией там, где это явно не требуется

(74) найти по ссылкам ничего не тащит на клиент, этим занимаетя резработчик

(75) совсем не то же
77 СеменовСемен
 
30.07.22
12:02
(76) профиь в скорости на пару порядков наверное
78 Конструктор1С
 
30.07.22
12:05
(77) абсолютно голословное утверждение
79 RomanYS
 
30.07.22
12:14
(76)  >> Не надо кидаться писать много кода и заниматься оптимизацией там, где это явно не требуется
Мы сейчас про задачу в (0) говорим? В ней требуется оптимизация? Много кода это запрос к 1 полю одной таблице?
80 СеменовСемен
 
30.07.22
12:20
(79) кода конечно много будет ибо запрос нужно собирать
81 Конструктор1С
 
30.07.22
12:22
(79) да, НайтиПоСсылкам гораздо проще использовать, чем врукопашную собирать запросы
82 RomanYS
 
30.07.22
12:26
(80) Если база бухгалтерская - бери таблицу субконто, если нет - пара таблиц взаиморасчетов + заказы. 99% договоров будут здесь отсеяны.
(81) Проще когда не знаешь где искать, но ты предлагаешь ограничивать по таблицам и тут разницы в сложности уже никакой
83 Конструктор1С
 
30.07.22
12:34
(82) разница в сложности кода будет большая
84 СеменовСемен
 
30.07.22
12:35
(83) написать составной запрос не сложная задача
85 СеменовСемен
 
30.07.22
12:40
Но и вообще задачи оптимизации не бывают простыми.
Написать многопоточную штуку будет далеко не просто
86 Конструктор1С
 
30.07.22
12:41
(84) ну, в 500 строк кода может быть уложишься. Когда через НайтиПоСсылкам и 50 строк кода было бы за глаза
87 RomanYS
 
30.07.22
12:45
(86) Ну запросы - это много строк. Никакой сложности там нет.
88 Конструктор1С
 
30.07.22
12:49
(87) и ради чего ты собрался делать лишнюю работу?
89 RomanYS
 
30.07.22
13:22
(88) десяток нажатий в конструкторе? Очевидно чтобы не ждать недели, когда отработаю стандартные механизмы с поиском всех ссылок, которые мне собственно и не нужны.
90 Конструктор1С
 
30.07.22
13:28
(89) ты собрался писать универсальный многокилометровый запрос? Там десятком нажатий в конструкторе не обойдёшься. И откуда у вас вообще страх, что поиск по ссылкам работает медленно?
91 СеменовСемен
 
30.07.22
13:31
(90) в (0) это прямым текстом сказано
92 Конструктор1С
 
30.07.22
13:36
(91) уверен, в (0) речь про поиск вообще по всей БД, без ограничений
93 RomanYS
 
30.07.22
13:44
(90) ты собрался писать универсальный многокилометровый запрос?
нет, речь конкретно про (0) и мой запрос описан в (82)
94 СеменовСемен
 
30.07.22
13:45
(93) а остальные как проверять?
95 RomanYS
 
30.07.22
13:55
(94) найти по ссылкам без ограничения метаданных
96 СеменовСемен
 
01.08.22
11:05
Накидал обработку по поиску одним запросом.
Получилось всего 170 строк. Отрабатывает примерно 1 мин на номенклатуре. База среднего размера
https://drive.google.com/file/d/1CBzki0Hqn2GyxgyXvf7IxmEcf38XYGyA/view?usp=sharing
97 СеменовСемен
 
01.08.22
11:06
не ищет по регистру бухгалтерии и исключает ведущие измерения в рег. сведений
99 lodger
 
01.08.22
11:34
(96) мысль хорошая, да. сам так делаю.
но вот структура запроса не достаточно оптимальна, имхо.
100 СеменовСемен
 
01.08.22
11:50
(98) планы обмена нет смысла проверять
101 СеменовСемен
 
01.08.22
11:51
(99) а что можно оптимизировать?
103 СеменовСемен
 
01.08.22
12:29
(102) согласен, требуется полировка.
Но лучше день потерять, потом за 5 мин долететь
104 lodger
 
01.08.22
14:50
(103) для начала убрать слово ВСЁ из инструкции объединить (чтобы раздублить список).
во вторых, сложить найденное в ВТ, а потом использовать ВТ как фильтр. индексировать ВТ.
подозреваю, инструкция "НЕ В ()" будет медленнее, чем если таблицу справочника левым соединить с ВТ и взять ВТ.Номенклатура ЕСТЬ NULL

это умозрительно пока, но есть такая чуйка.
105 СеменовСемен
 
01.08.22
14:59
(104) запрос без все аналогичен запросу со вме + операция группировки
106 Garykom
 
гуру
01.08.22
15:17
Гм товарищи вы какую то сферическую фу в вакууме начали обсуждать
У меня просто реквизита заведена в которые я пишу проверено ли и какой результат
И да никаких ВТ и прочих соединений, простейшие запросы идут по уменьшению вероятности
Когда вероятность (ссылка в очень редком документе) становится уже совсем тупо НайтиПоСсылкам()
107 Конструктор1С
 
01.08.22
15:45
(96) базу положить само то! Оно на раз-два положит сервер БД, и не учитывает множество нюансов при поиске ссылок. Поздравляю, ты "всего за 170 строк кода" изобрел нелепое подобие НайтиПоСсылкам()
108 Конструктор1С
 
01.08.22
15:51
(101) для начала стоит изучить, как работают запросы