Работа с функциями НайтиПоССылкам и УдалитьОбъекты
В базе УТ 10 обычные формы (естественно) файловая размером 5 ГБ накопилось очень много помеченных на удаление документов - порядка 200 000. Стандартное "Удаление помеченных объектов" виснет на контроле на сутки. Написал свою обработку. Функция НайтиПомеченныеНаУдаление работает очень хорошо. Все объекты она нашла за 40 секунд. А вот функции НайтиПоСсылкам или Удалить объекты работают крайне медленно. Я им подсовываю по одному документу, чтобы хоть как-то контролировать процесс. Других вариантов у 1С не нашел.
Господа форумчане! Прошу поделитесь пожалуйста своим опытом по работе с данными функциями или альтернативным решением.(Просьба решения с нарушением логической целостности не предлагать).
Неужели нет способа проверить есть ли ссылки на документ без получения этих дурацких таблиц ссылок?
Господа форумчане! Прошу поделитесь пожалуйста своим опытом по работе с данными функциями или альтернативным решением.(Просьба решения с нарушением логической целостности не предлагать).
Неужели нет способа проверить есть ли ссылки на документ без получения этих дурацких таблиц ссылок?
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(3) Думаю, будет быстрее. НайтиПоСсылкам же Массив требует.
Но допустим всё работает быстро, как вы будете разруливать конфликты удаления? Что делать с объектами или записями в регистрах при наличии ссылки на удаляемый объект?
Хотя тема не про НайтиПоСсылкам, всё-таки, а про УдалитьОбъекты. Она же выдаст ссылки, которые содержат удаляемый объект при включении контроля целостности.
Но допустим всё работает быстро, как вы будете разруливать конфликты удаления? Что делать с объектами или записями в регистрах при наличии ссылки на удаляемый объект?
Хотя тема не про НайтиПоСсылкам, всё-таки, а про УдалитьОбъекты. Она же выдаст ссылки, которые содержат удаляемый объект при включении контроля целостности.
(4) С конфликтами можно будет потом разобраться. Главное убрать основную массу помеченных. Забыл написать, что документы все пустые - специально зачистил, чтобы не было ссылок между ними. Движений соответственно тоже нет. Все делается быстро, кроме удаления - 30 секунд на 1 документ - это мой массив документов будет удаляться месяц!!!
(6) Ну у меня это дело идет в цикле. Что-то удаляется, что-то нет. Мне бы понять может он и на 100 документов будет 30 секунд тратить? Я в НайтиПоСсылкам как-то организацию засунул (на не чищенной базе) - функция пахала сутки, а потом мне надоело. Так от чего ее время критично зависит?
От количества в массиве или количества ссылок?
От количества в массиве или количества ссылок?
(7) Поиск ссылок на документ и Организацию – две большие разницы. Организация присутствует почти везде, поэтому поиск всех объектов, содержащих организацию, намного дольше, чем поиск ссылок на документ.
Но я вот чего не могу понять: какой смысл бороться с долгим поиском ссылок, если УдалитьОбъекты всё равно не даст удалить документ, на который кто-то ссылается. Я ведь поэтому и спросил про разруливание конфликтов. Какой смысл ждать несколько дней, чтобы просто получить ответ о невозможности удалить какие-либо объекты из-за контроля ссылочной целостности? Сразу необходимо решить, что делать с объектами, содержащими удаляемый документ.
Я бы на вашем месте удалил документы без контроля ссылочной целостности, а потом через ТиИ очистил был битые ссылки.
Но я вот чего не могу понять: какой смысл бороться с долгим поиском ссылок, если УдалитьОбъекты всё равно не даст удалить документ, на который кто-то ссылается. Я ведь поэтому и спросил про разруливание конфликтов. Какой смысл ждать несколько дней, чтобы просто получить ответ о невозможности удалить какие-либо объекты из-за контроля ссылочной целостности? Сразу необходимо решить, что делать с объектами, содержащими удаляемый документ.
Я бы на вашем месте удалил документы без контроля ссылочной целостности, а потом через ТиИ очистил был битые ссылки.
(1)
Сделать тестовую, оставить удаление на неделю, проанализировать. Загрузить в постгрес и запустить там, проанализировать. 5 гб ни о чем, щас БП 3.0 постая под 2 гб весит, типовухой все решается, действие одноразовое, не благодарно под него писать.
Ну и плюс - оборудование видать херовое, 200 000 это ни о чем, если ссд, м2, памяти 16+ и хотя-бы i-5 нечему тормозить
В базе УТ 10 обычные формы (естественно) файловая размером 5 ГБ накопилось очень много помеченных на удаление документов - порядка 200 000. Стандартное "Удаление помеченных объектов" виснет на контроле на сутки
Сделать тестовую, оставить удаление на неделю, проанализировать. Загрузить в постгрес и запустить там, проанализировать. 5 гб ни о чем, щас БП 3.0 постая под 2 гб весит, типовухой все решается, действие одноразовое, не благодарно под него писать.
Ну и плюс - оборудование видать херовое, 200 000 это ни о чем, если ссд, м2, памяти 16+ и хотя-бы i-5 нечему тормозить
(9) железо действительно старое, но очень надежное. Да и памяти 4 Гб. Но напрягов на железо нет. Проц жрется максимум на 50%, и памяти кушает всего 88Мб. Это я все на тестовой и пробую. И нет у меня недели. Как буду готов дадут базу на 2 суток. В пятницу возьму, а в понедельник все уже должны работать. Но с такими скоростями функции, я думаю - недели не хватит. Прикинул - оптимально.по 50 документов за раз - где-то 6 секунд на документ (при увеличении это соотношение не растет), а их 200000. 200000*6/60/60/24 получаем 13 с небольшим дней. При том, что на свертку и очистку всех этих документов ушло 10 часов на моем старом железе. Вот и скорость удаления документов.
Что реально нет никаких альтернатив этим функциям? Да за 5 секунд можно по всем метаданным пролазить.
Что реально нет никаких альтернатив этим функциям? Да за 5 секунд можно по всем метаданным пролазить.
(1) базу в sql, получить список для удаления через НайтиПомеченныеНаУдаление, поделить например на 10 частей (получится 20к в порции) и каждую через фоновое задание, или через отдельный процесс 1с
+ на время арендовать сервер например у клиентов, или игровой комп у клиентов,знакомых, родственников. Я обычно тяжеловесные процедуры запускаю по ночам у одного из своих клиентов (ryzen 3900x/64 озу/2x256 nvme)
+ на время арендовать сервер например у клиентов, или игровой комп у клиентов,знакомых, родственников. Я обычно тяжеловесные процедуры запускаю по ночам у одного из своих клиентов (ryzen 3900x/64 озу/2x256 nvme)
(17) Думаете дело в железе? Ну естественно с живой базой я буду работать на другом компе. Просто перед тем как сюда написать, я пол интернета пролазил - на многих форумах пишут, что работа этих функций просто жутко медленная.На многих даже поясняется, что 1с при работе делает огромные таблицы для этих функций сравнивает их и выдает результат в результат функций. Вот и ищу способ или как то их ускорить или вообще обойтись без без этих функций. Ведь для того, чтобы не удалять документ - нужно найти всего 1 ссылку, а не целую таблицу!
Проще говоря, я ищу решение, которое будет приемлемо работать на любом компьютере! Поделитесь опытом, кто решал подобные задачи.
Проще говоря, я ищу решение, которое будет приемлемо работать на любом компьютере! Поделитесь опытом, кто решал подобные задачи.
(18)
Можно было бы вариативно придумать настройку, чтобы искать поочередно в каждой таблице, и при первом нахождении останавливать поиск. Чтобы пользователь сам решал.
Кстати, интересная алгоритмическая задача...
нужно найти всего 1 ссылку
Но для этого может потребоваться перелопатить сотню таблиц... И лучше сразу получить результат по всем таблицам, чтобы в цикле не лопатить их заново. Логика такая.
Можно было бы вариативно придумать настройку, чтобы искать поочередно в каждой таблице, и при первом нахождении останавливать поиск. Чтобы пользователь сам решал.
Кстати, интересная алгоритмическая задача...
Поэкспериментировал немного с УдалитьОбъекты. Средние показатели количество документов в секундах:
1 - 35 10 - 85 20 - 125 50 - 240 100 - 465
Последовательность несколько нелинейная. Подозреваю, что все-таки все зависит от количества ссылок, получаемых функцией.
Даже в БСП есть функция ЕстьСсылкиНаОбъект, где применяется НайтиПоСсылкам с ее тормозами.
1 - 35 10 - 85 20 - 125 50 - 240 100 - 465
Последовательность несколько нелинейная. Подозреваю, что все-таки все зависит от количества ссылок, получаемых функцией.
Даже в БСП есть функция ЕстьСсылкиНаОбъект, где применяется НайтиПоСсылкам с ее тормозами.
Глобальный контекст (Global context)
УдалитьОбъекты (DeleteObjects)
Синтаксис:
УдалитьОбъекты(<СписокСсылок>, <Проверять>, <НайденныеДанные>, <ОбластьПоиска>, <ВключитьОбъекты>, <ИсключитьОбъекты>)
Параметры:
<СписокСсылок> (обязательный)
Тип: Массив.
Список ссылок на объекты, которые нужно удалить.
<Проверять> (необязательный)
Тип: Булево.
Определяет, выполнять ли контроль ссылочной целостности при выполнении процедуры. Истина - перед удалением проверяется, нет ли ссылок на удаляемый объект. Если есть, то объект не удаляется, а ссылки помещаются в таблицу значений <НайденныеДанные>. Ложь - проверка не выполняется.
Значение по умолчанию: Ложь.
<НайденныеДанные> (необязательный)
Тип: ТаблицаЗначений.
Содержит ссылки на найденные объекты в виде ТаблицаЗначений, состоящей из колонок с индексами: 0 - искомая ссылка; 1 - ссылка на объект, если найденная ссылка соответствует объектной таблице или значение, идентифицирующее запись необъектной таблицы; 2 - объект метаданных, которому соответствуют данные, в которых найдена ссылка.
В таблицу выводятся только непосредственно препятствующие удалению объекты (без рекурсии).
<ОбластьПоиска> (необязательный)
Тип: Массив.
Определяет область поиска объектов, которые следует удалить. Область устанавливается комбинацией разделителей, в состав которых включены объекты метаданных, среди данных которых следует выполнять поиск.
Элемент массива имеет тип Массив.
Элемент вложенного массива имеет тип:
Объект метаданных – Общий реквизит, разделяющий данные.
Строка – имя общего реквизита, разделяющего данные.
По умолчанию имеет значение Неопределено.
Допустимые значения:
Неопределено,
Массив с комбинациями разделителей, определяющий область поиска,
Пустой массив - область поиска определяется параметрами метода <ВключитьОбъекты> и <ИсключитьОбъекты>.
Примечание. Если комбинация разделителей содержит повторы, то вызывается исключение, т.к. в конфигурации не может быть объектов метаданных, дважды включенных в состав одного разделителя.
Значение по умолчанию: Неопределено.
<ВключитьОбъекты> (необязательный)
Тип: Массив.
Позволяет явно указать объекты метаданных, которые должны присутствовать в области поиска ссылок на объекты.
Элементом массива могут быть:
Объект метаданных.
Строка – полное имя объекта метаданных.
Допустимые значения:
Неопределено,
Пустой массив,
Массив объектов метаданных.
Значение по умолчанию: Неопределено.
<ИсключитьОбъекты> (необязательный)
Тип: Массив.
В качестве элементов массива могут выступать:
Объект метаданных,
Строка – полное имя объекта метаданных.
Свойство позволяет явно указать объекты метаданных, которые следует исключить из области поиска ссылок на объекты.
Допустимые значения:
Неопределено
Пустой массив (нет объектов, которые необходимо дополнительно включить в область поиска).
Массив объектов метаданных.
Значение по умолчанию: Неопределено.
Описание:
Удаляет объекты, ссылки на которые переданы в параметре <СписокСсылок>.
При проверке ссылочной целостности поиск осуществляется среди всех данных, из которых могут быть ссылки на переданные объекты. Если на какой-либо объект нет доступа, то вызывается исключение.
Требует монопольного режима доступа к базе данных.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Вызов метода выполняет обращение к серверу.
Примечание:
Ответственность за удаление объектов, на которые, возможно, имеются ссылки в недоступных данному сеансу данных, возлагается на вызывающего метод.
Если выполняется контроль ссылочной целостности, поиск ссылок выполняется в области данных, определенной параметрами <ОбластьПоиска>, <ВключитьОбъекты> и <ИсключитьОбъекты>.
Ссылки на найденные объекты возвращаются в таблице значений со следующими колонками:
Поле 1 - Исходная ссылка;
Поле 2 - Ссылка на объект (для объектных данных) или значение (для необъектных данных);
Поле 3 - Объект метаданных, которому соответствуют данные, в которых найдена ссылка;
Поле 4 - Комбинации разделителей, идентифицирующих подобласть, в данных которой найдена ссылка на объект.
Если необходимо осуществлять поиск ссылок на объекты в подобластях, то необходимо в параметре <ОбластьПоиска> указывать комбинации разделителей с использованием неустановленных в сеансе разделителей. Если в комбинации разделителей будут указаны только реквизиты, разделяющие данные в режиме НезависимоИСовместно (помимо любых реквизитов, установленных в сеансе), то поиск будет выполняться в этих объектах, как среди доступных данных и результаты будут записаны в поле 2. Если хотя бы один неустановленный в сеансе реквизит, разделяет данные в режиме Независимо, то будет выполнена проверка наличия ссылок в подобласти и возвращены значения разделителей, идентифицирующих подобласть. Результат будет записан в поле 4.
Требования к реквизитам, разделяющим данные, но не используемые в сеансе:
У текущего пользователя должен быть доступ на чтение реквизита.
У текущего пользователя должен быть доступ на запись параметров сеанса, отвечающих за использование и за значение реквизита.
Этот реквизит не является безопасным. - Требование актуально для информационных баз, опубликованных на веб-сервере.
В разделенном режиме метод не устанавливает монопольного режима доступа, а использует управляемые блокировки с учетом текущего разделения.
На мобильной платформе параметры <ОбластьПоиска>, <ВключитьОбъекты>, <ИсключитьОбъекты> игнорируются.
Пример:
// удаление помеченных объектов с контролем ссылочной целостности
Помеченные = НайтиПомеченныеНаУдаление();
Найденные = 0;
УдалитьОбъекты(Помеченные, Истина, Найденные);
Для каждого Ссылка из Найденные Цикл
СтрСообщения = "Объект не удален: " + СокрЛП(Ссылка[0]);
СтрСсылка = ", используется в " + СокрЛП(Ссылка[1]);
Сообщить (СтрСообщения + СтрСсылка);
КонецЦикла;
Использование в версии:
Доступен, начиная с версии 8.0.
ПоказатьУдалитьОбъекты (DeleteObjects)
Синтаксис:
УдалитьОбъекты(<СписокСсылок>, <Проверять>, <НайденныеДанные>, <ОбластьПоиска>, <ВключитьОбъекты>, <ИсключитьОбъекты>)
Параметры:
<СписокСсылок> (обязательный)
Тип: Массив.
Список ссылок на объекты, которые нужно удалить.
<Проверять> (необязательный)
Тип: Булево.
Определяет, выполнять ли контроль ссылочной целостности при выполнении процедуры. Истина - перед удалением проверяется, нет ли ссылок на удаляемый объект. Если есть, то объект не удаляется, а ссылки помещаются в таблицу значений <НайденныеДанные>. Ложь - проверка не выполняется.
Значение по умолчанию: Ложь.
<НайденныеДанные> (необязательный)
Тип: ТаблицаЗначений.
Содержит ссылки на найденные объекты в виде ТаблицаЗначений, состоящей из колонок с индексами: 0 - искомая ссылка; 1 - ссылка на объект, если найденная ссылка соответствует объектной таблице или значение, идентифицирующее запись необъектной таблицы; 2 - объект метаданных, которому соответствуют данные, в которых найдена ссылка.
В таблицу выводятся только непосредственно препятствующие удалению объекты (без рекурсии).
<ОбластьПоиска> (необязательный)
Тип: Массив.
Определяет область поиска объектов, которые следует удалить. Область устанавливается комбинацией разделителей, в состав которых включены объекты метаданных, среди данных которых следует выполнять поиск.
Элемент массива имеет тип Массив.
Элемент вложенного массива имеет тип:
Объект метаданных – Общий реквизит, разделяющий данные.
Строка – имя общего реквизита, разделяющего данные.
По умолчанию имеет значение Неопределено.
Допустимые значения:
Неопределено,
Массив с комбинациями разделителей, определяющий область поиска,
Пустой массив - область поиска определяется параметрами метода <ВключитьОбъекты> и <ИсключитьОбъекты>.
Примечание. Если комбинация разделителей содержит повторы, то вызывается исключение, т.к. в конфигурации не может быть объектов метаданных, дважды включенных в состав одного разделителя.
Значение по умолчанию: Неопределено.
<ВключитьОбъекты> (необязательный)
Тип: Массив.
Позволяет явно указать объекты метаданных, которые должны присутствовать в области поиска ссылок на объекты.
Элементом массива могут быть:
Объект метаданных.
Строка – полное имя объекта метаданных.
Допустимые значения:
Неопределено,
Пустой массив,
Массив объектов метаданных.
Значение по умолчанию: Неопределено.
<ИсключитьОбъекты> (необязательный)
Тип: Массив.
В качестве элементов массива могут выступать:
Объект метаданных,
Строка – полное имя объекта метаданных.
Свойство позволяет явно указать объекты метаданных, которые следует исключить из области поиска ссылок на объекты.
Допустимые значения:
Неопределено
Пустой массив (нет объектов, которые необходимо дополнительно включить в область поиска).
Массив объектов метаданных.
Значение по умолчанию: Неопределено.
Описание:
Удаляет объекты, ссылки на которые переданы в параметре <СписокСсылок>.
При проверке ссылочной целостности поиск осуществляется среди всех данных, из которых могут быть ссылки на переданные объекты. Если на какой-либо объект нет доступа, то вызывается исключение.
Требует монопольного режима доступа к базе данных.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Вызов метода выполняет обращение к серверу.
Примечание:
Ответственность за удаление объектов, на которые, возможно, имеются ссылки в недоступных данному сеансу данных, возлагается на вызывающего метод.
Если выполняется контроль ссылочной целостности, поиск ссылок выполняется в области данных, определенной параметрами <ОбластьПоиска>, <ВключитьОбъекты> и <ИсключитьОбъекты>.
Ссылки на найденные объекты возвращаются в таблице значений со следующими колонками:
Поле 1 - Исходная ссылка;
Поле 2 - Ссылка на объект (для объектных данных) или значение (для необъектных данных);
Поле 3 - Объект метаданных, которому соответствуют данные, в которых найдена ссылка;
Поле 4 - Комбинации разделителей, идентифицирующих подобласть, в данных которой найдена ссылка на объект.
Если необходимо осуществлять поиск ссылок на объекты в подобластях, то необходимо в параметре <ОбластьПоиска> указывать комбинации разделителей с использованием неустановленных в сеансе разделителей. Если в комбинации разделителей будут указаны только реквизиты, разделяющие данные в режиме НезависимоИСовместно (помимо любых реквизитов, установленных в сеансе), то поиск будет выполняться в этих объектах, как среди доступных данных и результаты будут записаны в поле 2. Если хотя бы один неустановленный в сеансе реквизит, разделяет данные в режиме Независимо, то будет выполнена проверка наличия ссылок в подобласти и возвращены значения разделителей, идентифицирующих подобласть. Результат будет записан в поле 4.
Требования к реквизитам, разделяющим данные, но не используемые в сеансе:
У текущего пользователя должен быть доступ на чтение реквизита.
У текущего пользователя должен быть доступ на запись параметров сеанса, отвечающих за использование и за значение реквизита.
Этот реквизит не является безопасным. - Требование актуально для информационных баз, опубликованных на веб-сервере.
В разделенном режиме метод не устанавливает монопольного режима доступа, а использует управляемые блокировки с учетом текущего разделения.
На мобильной платформе параметры <ОбластьПоиска>, <ВключитьОбъекты>, <ИсключитьОбъекты> игнорируются.
Пример:
// удаление помеченных объектов с контролем ссылочной целостности
Помеченные = НайтиПомеченныеНаУдаление();
Найденные = 0;
УдалитьОбъекты(Помеченные, Истина, Найденные);
Для каждого Ссылка из Найденные Цикл
СтрСообщения = "Объект не удален: " + СокрЛП(Ссылка[0]);
СтрСсылка = ", используется в " + СокрЛП(Ссылка[1]);
Сообщить (СтрСообщения + СтрСсылка);
КонецЦикла;
Использование в версии:
Доступен, начиная с версии 8.0.
Это из ситаксис- помошника. И что замечательно - это пример. Никто не хочет свой компьютер на мощность проверить? Интересно сколько времени займет, к примеру, удаление 1 организации?
(22) Ну к примеру я там нигде не нашел, что требуется Монопольный режим, а он требуется!
Вот пример кода
Вот пример кода
ТабСсылок = 0;
сбСообщениеСвертки("Время начало:",Истина);
ВремяНачала = ТекущаяДата();
УстановитьМонопольныйРежим(Истина);
УдалитьОбъекты(МассивУдаляемого,Истина,ТабСсылок);
УстановитьМонопольныйРежим(Ложь);
сбСообщениеСвертки("Время окончания:",Истина);
Сообщить("Время выполнения "+(ТекущаяДата() - ВремяНачала));
Добавочно. Функция УдалитьОбъекты тормозит даже когда запускается без проверки ссылочной целостности. Зачем вообще придумали такую нелепость?
О своей проблеме - сделал цикл с обходом по метаданным. Работает во много раз быстрее. Все 200 000 документов удалось удалить за 6 часов без нарушения ссылочной целостности.
О своей проблеме - сделал цикл с обходом по метаданным. Работает во много раз быстрее. Все 200 000 документов удалось удалить за 6 часов без нарушения ссылочной целостности.
(32) А самим додуматься сложно? Я же пояснил - Цикл по метаданным с условием по типу. (В моем случае - это регистры, документы, справочники). Если есть такой тип в метаданных (к примеру в измерениях регистра) делаем по ним запрос с условием по ссылке, если в запросе не пусто, значит есть ссылка - возвращаем истину, если после пробега ничего не нашли - возвращаем ложь. Если ложь - удаляем, если истина - пропускаем. Работает намного быстрее, чем УдалитьОбъекты.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот