0. Vladimir Litvinenko 16.11.13 22:14 Сейчас в теме

Поиск битых ссылок запросом. Универсальный алгоритм и обработка-пример.

Каждому специалисту 1С рано или поздно приходится решать задачу поиска битых ссылок в базе с целью их замены или восстановления объектов. Распространенные в сети описания метода поиска битых ссылок запросом оказались далеки от универсальности или содержали ошибки. В этой публикации рассматривается универсальный алгоритм, подходящий для любой таблицы базы данных 1С Предприятия. Приводится пример формирования запроса вручную и автоматически.

Перейти к публикации

Комментарии
Избранное Подписка Сортировка: Древо
2. B2B 260 17.11.13 21:36 Сейчас в теме
(0) Как ваш запрос дружит с RLS? Какова будет реакция, если в запрос попадет объект не доступный из-за RLS?
3. Vladimir Litvinenko 18.11.13 02:20 Сейчас в теме
(2) B2B,
Цель публикации - описать алгоритм и предоставить обработку-шаблон, которую можно менять под свои нужды.

Если так получилось, что поиском битых ссылок и восстановлением объектов для них у вас занимается пользователь с ограниченными правами, то нужно изменить код в зависимости от ситуации. Либо добавить в начало метода НайтиСсылкиНаСервере вызов УстановитьПривилегированныйРежим, либо добавить в запрос слово РАЗРЕШЕННЫЕ.

Также результат запроса будет содержать данные всех записей таблицы, в которых обнаружены битые ссылки. Если цель - именно восстановление объектов, то нужно обеспечить уникальность ссылок - выгружать битые ссылки в таблицу значений и сворачивать таблицу по ним, либо модифицировать запрос c этой целью. Это уже вам решать.
11. wunderland 199 18.11.13 19:27 Сейчас в теме
(2) B2B, Битые ссылки, обычно, интересуют тех, на кого RLS не распространяются :)
4. yuraos 955 18.11.13 06:08 Сейчас в теме
Ценю фундаментальность!
Особенно глобальную!!!
---
Вот еще один способ, не такой глобально-фундаментальный,
но тоже универсальный
Как узнать, является значение ссылочного типа «битой ссылкой» или нет?
5. Makushimo 154 18.11.13 06:45 Сейчас в теме
Нужно ли добавлять номер строки, где есть битая ссылка, в случае перебора табличной части объекта?
6. Vladimir Litvinenko 18.11.13 09:04 Сейчас в теме
(5) Makushimo,
Нужно ли добавлять номер строки, где есть битая ссылка, в случае перебора табличной части объекта

Это имеет смысл, если вы хотите делать замену битой ссылки на другую или просто увидеть глазами, где именно она была использована.

В этом случае необходимо также выбирать все поля, которые составляют ключ таблицы БД. Для объекта - это Ссылка, для табличной части Ссылка+НомерСтроки, для независимых регистров - комбинация их измерений и т.д.

Хотя замена ссылки или поиск объектов, где она была использована, обычно производятся глобально и для этого используются другие методы.
7. TheGrr 139 18.11.13 12:07 Сейчас в теме
Чтобы не делать трехэтажные выборки можно получить представление полей со ссылочным типом и выгрузить в ТЗ. Затем эту таблицу значений поместить во временную таблицу и вторым запросом выбрать с условием ПОДОБНО "%<Объект не найден>%".
9. Vladimir Litvinenko 18.11.13 17:26 Сейчас в теме
(7) TheGrr,
Чтобы не делать трехэтажные выборки можно получить представление полей со ссылочным типом и выгрузить в ТЗ. Затем эту таблицу значений поместить во временную таблицу и вторым запросом выбрать с условием ПОДОБНО "%<Объект не найден>%".

Ого! Или я неправильно понял, или Вы предлагаете прочитать всю таблицу и не фильтруя записи передать ее из SQL в 1С. Затем передать обратно из 1С в SQL в качестве параметра. Создать из нее временную таблицу и поместить в нее все эти данные, раздувая tempdb. Затем еще раз пробежаться по ней оператором ПОДОБНО и передать результат из SQL в 1С. Это точно оптимальный алгоритм? :)
10. TheGrr 139 18.11.13 17:33 Сейчас в теме
(9) а я не говорил, что алгоритм оптимальнее. Я говорил, что выборка будет читабельнее :D
30. sanek_gk 99 28.11.13 12:52 Сейчас в теме
(10) TheGrr, насколько она будет читабельнее в базе 150 ГБ и более ещё неизвестно, особо когда обработка будет выполняться неопределённо долгое время и потребует неопределенное количество ресурсов для выполнения алгоритма (очень похожего на китайский)
8. the1 388 18.11.13 16:25 Сейчас в теме
Не хватает колонки "Ссылка", чтобы оперативно увидеть в каком документе/справочнике обнаружена битая ссылка. А так да, заслуженный плюс
12. peterxx 19 19.11.13 10:24 Сейчас в теме
Хороший алгоритм. Плюс без разговоров.
13. CaSH_2004 354 19.11.13 17:45 Сейчас в теме
(0) Даже глянув наискосок видно что написано супер, уважаю такой подход, да и тема актуальная
14. seermak 660 20.11.13 04:17 Сейчас в теме
(0) есть несколько пожеланий: 1. в выборку попадают не только ссылочные объекты, но и простые(типа Число, Дата и т.д.)-это плохо 2. "Не царское это дело" выбирать 3х этажную конструкцию сначала Справочник.Класс, Справочник.Объект,Справочник.Таблица - проще выбрать класс и прогнать по всему классу, а потом уже копаться в отдельно взятом (в табличную часть обработки добавить ссылку на объект)
16. 7OH 32 20.11.13 11:05 Сейчас в теме
Претензия на универсальность была бы уместна, если бы был список метаданных (документы, справочники, регистры), в которых искать с галочками.
А искать по каждой таблице отдельно, тем более в УПП - шутка ли ?
17. Vladimir Litvinenko 20.11.13 11:21 Сейчас в теме
(16) 7OH,
Да без проблем. Подкорректировал заголовок. Слово "универсальность" относилось к алгоритму, поскольку он применим для любой таблицы базы данных. Обработка - просто пример его реализации (см. комментарий №3)
18. romansun 189 20.11.13 21:29 Сейчас в теме
выбрать *
из справочник.контрагенты
где ссылка не в (выбрать ссылка
из справочник.контрагенты)
19. Жолтокнижниг 248 25.11.13 16:26 Сейчас в теме
Столько восхищений удивлений, а Битые ссылки. Поиск, удаление, восстановление. разве никто не видел?
Vladimir Litvinenko; +1 Ответить
22. webester 29 28.11.13 04:23 Сейчас в теме
(19)Потому что здесь запрос?
23. Vladimir Litvinenko 28.11.13 05:32 Сейчас в теме
(22) webester,
Желтокнижник привел ссылку на очень хорошую универсальную обработку и в ней битые ссылки ищутся похожим методом. Но там не описан сам алгоритм и если спросить Яндекс или Гугл про поиск битых ссылок запросом, то на эту обработку вы не выйдите. Не вышел и я, поэтому и появилась эта публикация.
24. Жолтокнижниг 248 28.11.13 09:24 Сейчас в теме
(22) webester, он и там(запрос), причем как мне помниться алгоритм точно такой же.
25. webester 29 28.11.13 09:43 Сейчас в теме
(24)ок, замечательная действительно обработка, зато здесь код сразу в статье, можно не тратить $m (если это для кого то критично), а самому собрать велосипед. По моему тоже имеет право на жизнь.
(23)либо у нас с вами гугл разный, либо вы им пользоваться не умеете, третья сверху ссылка.
26. Жолтокнижниг 248 28.11.13 09:54 Сейчас в теме
(25) webester, у кого нет $m таких велосипедов насобирают.
27. webester 29 28.11.13 09:58 Сейчас в теме
(26)В целом согласен, но у человека может просто не быть здесь аккаунта. Как например у моих коллег, почему то не считают нужным, почему не знаю.
28. Vladimir Litvinenko 28.11.13 10:21 Сейчас в теме
(25) webester, Вы прям напугали картинкой. Думал инфостарт глючит :) По такому запросу будут десятки результатов. Вы забыли добавить одно ключевое слово к запросу :)
29. webester 29 28.11.13 10:40 Сейчас в теме
(28) я сначала посмотрел бы все варианты, а потом начал сужать круг. Но это же неважно по вашему запросу, все тоже отлично находится
20. yurets86 26.11.13 01:48 Сейчас в теме
а разве силами самого конфигуратора не можно тоже самое сделать? я с 1с-кой только знакомлюсь и как раз только вчера вылавливал битые ссылки, и с помощью конфигуратора - отлично все получается
21. webester 29 28.11.13 04:20 Сейчас в теме
(20)Вы имеете ввиду ТиИ? Это не тоже самое :) У меня в базе очень часто бывает, что нет ссылок ибо РИБ и ходят не все объекты, ТиИ натворит такой бардак, что страшно подумать. Поэтому иногда удобнее бить прицельно. То есть я знаю, где ссылка реально битая, а где она заменится объектом после обмена. Еще это имеет смысл, для перерегистрации объектов. То есть в этой базе они битые, зато в другой базе живые, если это РИБ просто перезаписал найденные ссылки в другой базе, если бэкап, выгрузил и загрузил в боевую. И как бы не всегда надо их исправлять, иногда к примеру их надо просто исключить из обработки.
31. sanek_gk 99 28.11.13 13:01 Сейчас в теме
От себя добавлю, Афтор исправь алгоритм в обработке, будет работать неправильно при следующих условиях:
Проверяемое поле Имеет составной тип: несколько ссылочных, и один или более простых. По текущему алгоритму проверяется значение ссылки на null (наличие самой ссылки) но если там указан простой тип то её и не будет и не должно быть - однако такое значение успешно пройдёт проверку и вывалится в итоге как битая ссылка чем она в принципе не является.
32. isn 13 13.07.15 12:49 Сейчас в теме
Хотелось бы вариант обработки для обычного приложения а не только для управляемых форм.
33. ZhokhovM 386 03.10.16 17:08 Сейчас в теме
Вопрос по управляемой форме, может ли эта обработка найти битые ссылка в отчетах? Например, в отборе характеристики в отчете аптеки стоит "<Объект не найден> (480:aee70015e9b8c48d11e01fecb9c33de3)".
34. docerman 47 03.04.18 15:50 Сейчас в теме
А где-же в результате сами объекты в которых есть битые ссылки?
36. fieryfist 15 31.10.18 22:51 Сейчас в теме
(34)Сами объекты можно найти например обработкой Универсальный подбор и обработка объектов (через поиск ссылок на объект). Знаю, что битую ссылку не добавить для поиска, но немного доработав обработку, это можно сделать.
35. EvgenURNN 68 22.05.18 14:20 Сейчас в теме
Такой алгоритм не будет работать на большой базе, где есть реквизит типа "Любая ссылка" и много-много разных ссылочных таблиц. Придется:
1. разбивать на подзапросы
2. делать явное левое соединение либо ВЫРАЗИТЬ
fieryfist; +1 Ответить
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Нижний Новгород
зарплата от 80 000 руб. до 130 000 руб.
Полный день

Программист 1С
Москва
зарплата от 150 000 руб. до 180 000 руб.
Полный день

Программист 1С
Москва
зарплата до 160 000 руб.
Полный день

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

Ведущий программист 1С
Санкт-Петербург
зарплата от 130 000 руб.
Полный день