Работа с функциями НайтиПоССылкам и УдалитьОбъекты

1. Fox_65 1 10.08.24 15:03 Сейчас в теме
В базе УТ 10 обычные формы (естественно) файловая размером 5 ГБ накопилось очень много помеченных на удаление документов - порядка 200 000. Стандартное "Удаление помеченных объектов" виснет на контроле на сутки. Написал свою обработку. Функция НайтиПомеченныеНаУдаление работает очень хорошо. Все объекты она нашла за 40 секунд. А вот функции НайтиПоСсылкам или Удалить объекты работают крайне медленно. Я им подсовываю по одному документу, чтобы хоть как-то контролировать процесс. Других вариантов у 1С не нашел.
Господа форумчане! Прошу поделитесь пожалуйста своим опытом по работе с данными функциями или альтернативным решением.(Просьба решения с нарушением логической целостности не предлагать).
Неужели нет способа проверить есть ли ссылки на документ без получения этих дурацких таблиц ссылок?
Найденные решения
12. user1880116 11.08.24 02:06 Сейчас в теме
(10)
Да за 5 секунд можно по всем метаданным пролазить
Ну и лазь тогда, что ты нас спрашиваешь?
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. SlavaKron 10.08.24 17:32 Сейчас в теме
(1) Пытался сделать быстрые альтернативы для НайтиПоСсылкам, но практика показала, что платформенный НайтиПоСсылкам будет быстрее и дотошнее.
3. Fox_65 1 10.08.24 17:35 Сейчас в теме
(2) Может есть варианты? Может подсовывать туда не по одному документу, а десяток или сотню? Может будет быстрее обрабатывать?
4. SlavaKron 10.08.24 17:39 Сейчас в теме
(3) Думаю, будет быстрее. НайтиПоСсылкам же Массив требует.
Но допустим всё работает быстро, как вы будете разруливать конфликты удаления? Что делать с объектами или записями в регистрах при наличии ссылки на удаляемый объект?
Хотя тема не про НайтиПоСсылкам, всё-таки, а про УдалитьОбъекты. Она же выдаст ссылки, которые содержат удаляемый объект при включении контроля целостности.
5. Fox_65 1 10.08.24 17:54 Сейчас в теме
(4) С конфликтами можно будет потом разобраться. Главное убрать основную массу помеченных. Забыл написать, что документы все пустые - специально зачистил, чтобы не было ссылок между ними. Движений соответственно тоже нет. Все делается быстро, кроме удаления - 30 секунд на 1 документ - это мой массив документов будет удаляться месяц!!!
6. SlavaKron 10.08.24 18:07 Сейчас в теме
(5) Хорошо, вызвали УдалитьОбъекты для одного документа с включенным параметром "Проверять". В итоге документ удалился?
7. Fox_65 1 10.08.24 18:50 Сейчас в теме
(6) Ну у меня это дело идет в цикле. Что-то удаляется, что-то нет. Мне бы понять может он и на 100 документов будет 30 секунд тратить? Я в НайтиПоСсылкам как-то организацию засунул (на не чищенной базе) - функция пахала сутки, а потом мне надоело. Так от чего ее время критично зависит?
От количества в массиве или количества ссылок?
26. SlavaKron 11.08.24 14:23 Сейчас в теме
(7) Поиск ссылок на документ и Организацию – две большие разницы. Организация присутствует почти везде, поэтому поиск всех объектов, содержащих организацию, намного дольше, чем поиск ссылок на документ.
Но я вот чего не могу понять: какой смысл бороться с долгим поиском ссылок, если УдалитьОбъекты всё равно не даст удалить документ, на который кто-то ссылается. Я ведь поэтому и спросил про разруливание конфликтов. Какой смысл ждать несколько дней, чтобы просто получить ответ о невозможности удалить какие-либо объекты из-за контроля ссылочной целостности? Сразу необходимо решить, что делать с объектами, содержащими удаляемый документ.

Я бы на вашем месте удалил документы без контроля ссылочной целостности, а потом через ТиИ очистил был битые ссылки.
28. Fox_65 1 11.08.24 14:32 Сейчас в теме
(26) Метод не плох, но ТиИ потрет документы ввода остатков, если в них есть ссылки, а мне этого не надо. Задача простая - если есть ссылки на документ - пусть остается, если нет - удаляем.
29. SlavaKron 11.08.24 14:37 Сейчас в теме
(28)
если есть ссылки на документ - пусть остается, если нет - удаляем
Тогда лучше, действительно сделать свой алгоритм, по типу того, как сказано в (19), так как поиск всех ссылок на удаляемый объект вам не нужен.
9. karamazoff 118 11.08.24 00:39 Сейчас в теме
(1)
В базе УТ 10 обычные формы (естественно) файловая размером 5 ГБ накопилось очень много помеченных на удаление документов - порядка 200 000. Стандартное "Удаление помеченных объектов" виснет на контроле на сутки

Сделать тестовую, оставить удаление на неделю, проанализировать. Загрузить в постгрес и запустить там, проанализировать. 5 гб ни о чем, щас БП 3.0 постая под 2 гб весит, типовухой все решается, действие одноразовое, не благодарно под него писать.
Ну и плюс - оборудование видать херовое, 200 000 это ни о чем, если ссд, м2, памяти 16+ и хотя-бы i-5 нечему тормозить
Zevzm; user1880116; +2 Ответить
10. Fox_65 1 11.08.24 02:03 Сейчас в теме
(9) железо действительно старое, но очень надежное. Да и памяти 4 Гб. Но напрягов на железо нет. Проц жрется максимум на 50%, и памяти кушает всего 88Мб. Это я все на тестовой и пробую. И нет у меня недели. Как буду готов дадут базу на 2 суток. В пятницу возьму, а в понедельник все уже должны работать. Но с такими скоростями функции, я думаю - недели не хватит. Прикинул - оптимально.по 50 документов за раз - где-то 6 секунд на документ (при увеличении это соотношение не растет), а их 200000. 200000*6/60/60/24 получаем 13 с небольшим дней. При том, что на свертку и очистку всех этих документов ушло 10 часов на моем старом железе. Вот и скорость удаления документов.
Что реально нет никаких альтернатив этим функциям? Да за 5 секунд можно по всем метаданным пролазить.
12. user1880116 11.08.24 02:06 Сейчас в теме
(10)
Да за 5 секунд можно по всем метаданным пролазить
Ну и лазь тогда, что ты нас спрашиваешь?
14. Fox_65 1 11.08.24 02:11 Сейчас в теме
(12) Ну я и спрашиваю - поделитесь пожалуйста опытом, может есть альтернатива этим тормозам.
Ведь просто удалить без учета ссылок думаю хватит пары часов. Вся заковырка в поиске ссылок.
15. Fox_65 1 11.08.24 02:47 Сейчас в теме
(12) Натолкнули меня на замечательную идею. Главное чтобы остались ссылки в документах ввода остатков, а остальные ссылки все равно удалять надо будет.
17. independ 1544 11.08.24 05:13 Сейчас в теме
(1) базу в sql, получить список для удаления через НайтиПомеченныеНаУдаление, поделить например на 10 частей (получится 20к в порции) и каждую через фоновое задание, или через отдельный процесс 1с
+ на время арендовать сервер например у клиентов, или игровой комп у клиентов,знакомых, родственников. Я обычно тяжеловесные процедуры запускаю по ночам у одного из своих клиентов (ryzen 3900x/64 озу/2x256 nvme)
18. Fox_65 1 11.08.24 12:45 Сейчас в теме
(17) Думаете дело в железе? Ну естественно с живой базой я буду работать на другом компе. Просто перед тем как сюда написать, я пол интернета пролазил - на многих форумах пишут, что работа этих функций просто жутко медленная.На многих даже поясняется, что 1с при работе делает огромные таблицы для этих функций сравнивает их и выдает результат в результат функций. Вот и ищу способ или как то их ускорить или вообще обойтись без без этих функций. Ведь для того, чтобы не удалять документ - нужно найти всего 1 ссылку, а не целую таблицу!
Проще говоря, я ищу решение, которое будет приемлемо работать на любом компьютере! Поделитесь опытом, кто решал подобные задачи.
19. user2033930 11.08.24 12:52 Сейчас в теме
(18)
нужно найти всего 1 ссылку
Но для этого может потребоваться перелопатить сотню таблиц... И лучше сразу получить результат по всем таблицам, чтобы в цикле не лопатить их заново. Логика такая.
Можно было бы вариативно придумать настройку, чтобы искать поочередно в каждой таблице, и при первом нахождении останавливать поиск. Чтобы пользователь сам решал.
Кстати, интересная алгоритмическая задача...
20. Fox_65 1 11.08.24 13:07 Сейчас в теме
(19) Как идея, насчет того, чтобы отыскать все места по типу документа. А потом для каждого искать в этих местах? Может быстрее получиться? Или это будет повторение подхода 1с с большой таблицей?
8. Fox_65 1 10.08.24 23:32 Сейчас в теме
Поэкспериментировал немного с УдалитьОбъекты. Средние показатели количество документов в секундах:
1 - 35 10 - 85 20 - 125 50 - 240 100 - 465
Последовательность несколько нелинейная. Подозреваю, что все-таки все зависит от количества ссылок, получаемых функцией.
Даже в БСП есть функция ЕстьСсылкиНаОбъект, где применяется НайтиПоСсылкам с ее тормозами.
11. user1880116 11.08.24 02:05 Сейчас в теме
(9)
постгрес
MSSQL.
Экспресс сейчас 10 гб переваривает.
independ; +1 Ответить
13. Fox_65 1 11.08.24 02:08 Сейчас в теме
(11) Не думаю, что сильно работу ускорит. Если только у SQL есть другие функции по удалению.
16. Fox_65 1 11.08.24 03:49 Сейчас в теме
Вот дела. Есть и другие ссылки
21. Fox_65 1 11.08.24 13:33 Сейчас в теме
Глобальный контекст (Global context)
УдалитьОбъекты (DeleteObjects)
Синтаксис:
УдалитьОбъекты(<СписокСсылок>, <Проверять>, <НайденныеДанные>, <ОбластьПоиска>, <ВключитьОбъекты>, <ИсключитьОбъекты>)
Параметры:
<СписокСсылок> (обязательный)
Тип: Массив.
Список ссылок на объекты, которые нужно удалить.
<Проверять> (необязательный)
Тип: Булево.
Определяет, выполнять ли контроль ссылочной целостности при выполнении процедуры. Истина - перед удалением проверяется, нет ли ссылок на удаляемый объект. Если есть, то объект не удаляется, а ссылки помещаются в таблицу значений <НайденныеДанные>. Ложь - проверка не выполняется.
Значение по умолчанию: Ложь.
<НайденныеДанные> (необязательный)
Тип: ТаблицаЗначений.
Содержит ссылки на найденные объекты в виде ТаблицаЗначений, состоящей из колонок с индексами: 0 - искомая ссылка; 1 - ссылка на объект, если найденная ссылка соответствует объектной таблице или значение, идентифицирующее запись необъектной таблицы; 2 - объект метаданных, которому соответствуют данные, в которых найдена ссылка.
В таблицу выводятся только непосредственно препятствующие удалению объекты (без рекурсии).
<ОбластьПоиска> (необязательный)
Тип: Массив.
Определяет область поиска объектов, которые следует удалить. Область устанавливается комбинацией разделителей, в состав которых включены объекты метаданных, среди данных которых следует выполнять поиск.
Элемент массива имеет тип Массив.
Элемент вложенного массива имеет тип:
Объект метаданных – Общий реквизит, разделяющий данные.
Строка – имя общего реквизита, разделяющего данные.
По умолчанию имеет значение Неопределено.
Допустимые значения:
Неопределено,
Массив с комбинациями разделителей, определяющий область поиска,
Пустой массив - область поиска определяется параметрами метода <ВключитьОбъекты> и <ИсключитьОбъекты>.
Примечание. Если комбинация разделителей содержит повторы, то вызывается исключение, т.к. в конфигурации не может быть объектов метаданных, дважды включенных в состав одного разделителя.
Значение по умолчанию: Неопределено.
<ВключитьОбъекты> (необязательный)
Тип: Массив.
Позволяет явно указать объекты метаданных, которые должны присутствовать в области поиска ссылок на объекты.
Элементом массива могут быть:
Объект метаданных.
Строка – полное имя объекта метаданных.
Допустимые значения:
Неопределено,
Пустой массив,
Массив объектов метаданных.

Значение по умолчанию: Неопределено.
<ИсключитьОбъекты> (необязательный)
Тип: Массив.
В качестве элементов массива могут выступать:
Объект метаданных,
Строка – полное имя объекта метаданных.
Свойство позволяет явно указать объекты метаданных, которые следует исключить из области поиска ссылок на объекты.
Допустимые значения:
Неопределено
Пустой массив (нет объектов, которые необходимо дополнительно включить в область поиска).
Массив объектов метаданных.

Значение по умолчанию: Неопределено.
Описание:
Удаляет объекты, ссылки на которые переданы в параметре <СписокСсылок>.
При проверке ссылочной целостности поиск осуществляется среди всех данных, из которых могут быть ссылки на переданные объекты. Если на какой-либо объект нет доступа, то вызывается исключение.
Требует монопольного режима доступа к базе данных.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Вызов метода выполняет обращение к серверу.
Примечание:
Ответственность за удаление объектов, на которые, возможно, имеются ссылки в недоступных данному сеансу данных, возлагается на вызывающего метод.

Если выполняется контроль ссылочной целостности, поиск ссылок выполняется в области данных, определенной параметрами <ОбластьПоиска>, <ВключитьОбъекты> и <ИсключитьОбъекты>.
Ссылки на найденные объекты возвращаются в таблице значений со следующими колонками:
Поле 1 - Исходная ссылка;
Поле 2 - Ссылка на объект (для объектных данных) или значение (для необъектных данных);
Поле 3 - Объект метаданных, которому соответствуют данные, в которых найдена ссылка;
Поле 4 - Комбинации разделителей, идентифицирующих подобласть, в данных которой найдена ссылка на объект.
Если необходимо осуществлять поиск ссылок на объекты в подобластях, то необходимо в параметре <ОбластьПоиска> указывать комбинации разделителей с использованием неустановленных в сеансе разделителей. Если в комбинации разделителей будут указаны только реквизиты, разделяющие данные в режиме НезависимоИСовместно (помимо любых реквизитов, установленных в сеансе), то поиск будет выполняться в этих объектах, как среди доступных данных и результаты будут записаны в поле 2. Если хотя бы один неустановленный в сеансе реквизит, разделяет данные в режиме Независимо, то будет выполнена проверка наличия ссылок в подобласти и возвращены значения разделителей, идентифицирующих подобласть. Результат будет записан в поле 4.

Требования к реквизитам, разделяющим данные, но не используемые в сеансе:
У текущего пользователя должен быть доступ на чтение реквизита.
У текущего пользователя должен быть доступ на запись параметров сеанса, отвечающих за использование и за значение реквизита.
Этот реквизит не является безопасным. - Требование актуально для информационных баз, опубликованных на веб-сервере.
В разделенном режиме метод не устанавливает монопольного режима доступа, а использует управляемые блокировки с учетом текущего разделения.

На мобильной платформе параметры <ОбластьПоиска>, <ВключитьОбъекты>, <ИсключитьОбъекты> игнорируются.
Пример:
// удаление помеченных объектов с контролем ссылочной целостности

Помеченные = НайтиПомеченныеНаУдаление();
Найденные = 0;
УдалитьОбъекты(Помеченные, Истина, Найденные);
Для каждого Ссылка из Найденные Цикл
СтрСообщения = "Объект не удален: " + СокрЛП(Ссылка[0]);
СтрСсылка = ", используется в " + СокрЛП(Ссылка[1]);
Сообщить (СтрСообщения + СтрСсылка);
КонецЦикла;
Использование в версии:
Доступен, начиная с версии 8.0.
Показать


Это из ситаксис- помошника. И что замечательно - это пример. Никто не хочет свой компьютер на мощность проверить? Интересно сколько времени займет, к примеру, удаление 1 организации?
22. user2033930 11.08.24 13:41 Сейчас в теме
(21) Я вроде умею и сам пользоваться СП, спасибо огромное.
23. Fox_65 1 11.08.24 14:02 Сейчас в теме
(22) Ну к примеру я там нигде не нашел, что требуется Монопольный режим, а он требуется!
Вот пример кода
			ТабСсылок = 0;  
				сбСообщениеСвертки("Время начало:",Истина);
				ВремяНачала = ТекущаяДата();
				УстановитьМонопольныйРежим(Истина);
				УдалитьОбъекты(МассивУдаляемого,Истина,ТабСсылок);
				УстановитьМонопольныйРежим(Ложь);
				сбСообщениеСвертки("Время окончания:",Истина);
				Сообщить("Время выполнения   "+(ТекущаяДата() - ВремяНачала));
24. user1880116 11.08.24 14:15 Сейчас в теме
(23)
я там нигде не нашел, что требуется Монопольный режим, а он требуется!
А ты вообще сам-то читал, что в (21) сюда накопипастил?
25. user1880116 11.08.24 14:17 Сейчас в теме
(21)
Никто не хочет свой компьютер на мощность проверить? Интересно
А что ты собираешься делать с полученными цифрами - расстраиваться еще сильнее, что у тебя всё медленно? Ну так для этого тебе чужие замеры, собственно, и не нужны.
27. Fox_65 1 11.08.24 14:27 Сейчас в теме
(25) Да нет. Это собственно мой сарказм по поводу синтаксис-помошника.
И если кого-то интересуют мои эксперименты с УдалитьОбъекты, то выводы следующие - в массив лучше выдавать порцию в 50 элементов - дальше скорость в пересчете на 1 элемент не растет.
30. Fox_65 1 11.08.24 15:07 Сейчас в теме
Добавочно по экспериментам. Если в массив попадают элементы без ссылок, скорость возрастает. Значит все зависит от результирующей таблицы! Сейчас скорость возросла до 50 -175 секунд.
31. Fox_65 1 20.08.24 08:28 Сейчас в теме
Добавочно. Функция УдалитьОбъекты тормозит даже когда запускается без проверки ссылочной целостности. Зачем вообще придумали такую нелепость?
О своей проблеме - сделал цикл с обходом по метаданным. Работает во много раз быстрее. Все 200 000 документов удалось удалить за 6 часов без нарушения ссылочной целостности.
32. Zevzm 20.08.24 09:06 Сейчас в теме
(31) Показали бы свой код, чтобы народ не пользовался нелепостью.
33. Fox_65 1 20.08.24 17:27 Сейчас в теме
(32) А самим додуматься сложно? Я же пояснил - Цикл по метаданным с условием по типу. (В моем случае - это регистры, документы, справочники). Если есть такой тип в метаданных (к примеру в измерениях регистра) делаем по ним запрос с условием по ссылке, если в запросе не пусто, значит есть ссылка - возвращаем истину, если после пробега ничего не нашли - возвращаем ложь. Если ложь - удаляем, если истина - пропускаем. Работает намного быстрее, чем УдалитьОбъекты.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот