Быстрая функция поиска ссылки по УИД(GUID)

11.04.20

Разработка - Инструментарий разработчика

Простая, а самое главное быстрая функция поиска ссылки на объект в информационной базе по УИД(GUID) через запрос.

Скачать файлы

Наименование Файл Версия Размер
Быстрая функция поиска ссылки по УИД(GUID):
.epf 8,25Kb
423
.epf 8,25Kb 423 Скачать

Простая, а самое главное быстрая функция поиска ссылки на объект в информационной базе через запрос.

Часто встречаются задачи, когда по УИД необходимо определить, каким объектом информационной базы он является. Самый простой способ сделать это:

  1. Перебрать все метаданные имеющие ссылки;
  2. Проверить полученную ссылку на существование.

Если с п.1 никаких проблем, так как обход и формирование ссылки происходит довольно быстро,
то вот для п.2 есть сложность, так как стандартный подход, что я встречал было получение объекта и проверка его существования (.ПолучитьОбъект()), что было очень долго для больших конфигураций и по факту приводило к запросу в цикле, так как каждый раз когда проверялось существование  объекта шел запрос к БД на его поиск.

Что сделал я? Все существующие объекты метаданных 1С, у которых возможна ссылка, имеют ряд общих реквизитов. Самый простой пример - «ПометкаУдаления».  Таким образом, мы можем просто составить таблицу всех ссылок и проверить имеет ли «ПометкаУдаления» значение «NULL»:

  • если ДА, значит, она не является валидной ссылкой;
  • если НЕТ, значит, ссылка на объект успешно найдена.

Метаданные, которые могут иметь ссылки:    

  • Справочники;
  • Документы;
  • ПланыВидовХарактеристик;
  • ПланыВидовРасчета;
  • ПланыСчетов;
  • ПланыОбмена;
  • БизнесПроцессы;
  • Задачи;

Чуть ниже в спойлере сама функция, кому этого не хватит, может скачать обработку с примером работы функции (Обработка тестировалась на платформах 8.3.14,15,16 но должна стабильно работать на всех 8x).

 

 

// Осуществляет поиск ссылки по УИД(GUID) или массиву УИДов(GUID)
//
// Параметры:
//   УИД - Строка - Идентификатор строкой.
//       - Массив - Массив идентификаторов строкой.
//
//Возвращаемое значение:
//	- Неопределено - Если не удалось определить ни одну ссылку по параметру УИД.
//	- ЛюбаяСсылка - Если в параметр "УИД" была передана строка.
//	- ТаблицаЗначений  - Если в параметр "УИД" был передан массив строк.
//		* УИД - Строка - Содержит идентифкатор строкой по которому удалось определить ссылку.
//		* Ссылка - ЛюбаяСсылка - Содержит ссылку на объект.
//
// Пример:
// РезультатПоиска = НайтиСсылкуПоУИД("31f35109-f60a-4777-a555-f8a46c5a165d") ...
//
Функция НайтиСсылкуПоУИД(знач УИД) Экспорт
    
    ЭтоМассив = ТипЗнч(УИД) = Тип("Массив");
    
    МассивУидов = Новый Массив;
    Если ЭтоМассив Тогда
        МассивУидов = УИД;
    Иначе
        МассивУидов.Добавить(УИД);
    КонецЕсли;
    
	Результат = Неопределено;
    
    МассивМетаданных = Новый Массив;    
	МассивМетаданных.Добавить(Справочники);
	МассивМетаданных.Добавить(Документы);
	МассивМетаданных.Добавить(ПланыВидовХарактеристик);
	МассивМетаданных.Добавить(ПланыСчетов);
	МассивМетаданных.Добавить(ПланыВидовРасчета);
	МассивМетаданных.Добавить(ПланыОбмена);
	МассивМетаданных.Добавить(БизнесПроцессы);
	МассивМетаданных.Добавить(Задачи);
    
    МассивТипов = Новый Массив; 
    
    Для Каждого СтрМетаданное Из МассивМетаданных Цикл
        Для Каждого Стр Из СтрМетаданное.ТипВсеСсылки().Типы() Цикл
            МассивТипов.Добавить(Стр);
        КонецЦикла;
    КонецЦикла;
        
    ТаблицаСсылок = Новый ТаблицаЗначений;
    ТаблицаСсылок.Колонки.Добавить("УИД"    , Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(36)));
    ТаблицаСсылок.Колонки.Добавить("Ссылка" , Новый ОписаниеТипов(МассивТипов));
    
    Для Каждого СтрМетаданное Из МассивМетаданных Цикл
        Для Каждого Менеджер Из СтрМетаданное Цикл   
            Для Каждого СтрУИД Из МассивУидов Цикл
                Попытка
                    НовСтр = ТаблицаСсылок.Добавить();
                    НовСтр.Ссылка = Менеджер.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрУИД));
                    НовСтр.УИД    = СтрУИД;
                Исключение
                КонецПопытки;
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;
            
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ТаблицаСсылок.Ссылка КАК Ссылка,
        |   ТаблицаСсылок.УИД КАК УИД
        |ПОМЕСТИТЬ ВТ
        |ИЗ
        |   &ТаблицаСсылок КАК ТаблицаСсылок
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |   ВТ.Ссылка КАК Ссылка,
        |   ВТ.УИД КАК УИД
        |ИЗ
        |   ВТ КАК ВТ
        |ГДЕ
        |   НЕ ВТ.Ссылка.ПометкаУдаления ЕСТЬ NULL";
    
    Запрос.УстановитьПараметр("ТаблицаСсылок",ТаблицаСсылок);
    РезультатЗапроса = Запрос.Выполнить();
    
    Если Не РезультатЗапроса.Пустой() Тогда
        Если ЭтоМассив Тогда
            Результат = РезультатЗапроса.Выгрузить(); 
        Иначе
            ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
            ВыборкаДетальныеЗаписи.Следующий();
            
            Результат = ВыборкаДетальныеЗаписи.Ссылка;
        КонецЕсли;
    КонецЕсли;
    
	Возврат Результат;
		
КонецФункции // НайтиСсылкуПоУИД 

 

 

См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    122268    673    389    

715

SALE! 25%

Infostart PrintWizard

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

18000 15300 руб.

06.10.2023    7323    22    6    

39

SALE! 20%

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

10000 8000 руб.

10.11.2023    3567    11    1    

34

SALE! 30%

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

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

3600 2520 руб.

14.01.2013    177771    1074    0    

849

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99364    239    97    

296

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

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

3000 руб.

27.08.2019    18128    6    8    

40

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28115    3    10    

15

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

В процессе работы в 1С часто возникает потребность получить данные из другой базы.  Обычно это делается через COM-соединение, и время выполнения запроса при этом оставляет желать лучшего. В данной публикации представлено универсальное решение, позволяющее практически моментально выполнить произвольный код или запрос с параметрами в другой информационной базе через Web-сервис.

2400 руб.

24.09.2019    23605    15    15    

32
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. CheBurator 3119 12.04.20 04:14 Сейчас в теме
найдет несколько разных объектов - например Справочник.Склады и Справочник.Контрагенты - если у них одинаковый GUID?
SergeRSA; +1 Ответить
2. Kondratenko.as 564 12.04.20 05:52 Сейчас в теме
(1)Да. Если у них одинаковый УИД то вы получите 2 ссылки. Но такого в штатном режиме работы быть не может.
3. awk 741 12.04.20 07:09 Сейчас в теме
(2) Может. Когда есть обмен ситуация достаточно штатная.
bmugem; Dmitri93; fatman78; DrAku1a; SergeRSA; ivanov660; vdscom; user774630; dsdred; CheBurator; +10 Ответить
4. CheBurator 3119 12.04.20 12:36 Сейчас в теме
(3) Именно. когда в КИС - склад. а в, например. ВМС - он и внешний контрагент, и склад.
5. Danil.Potapov 514 13.04.20 09:00 Сейчас в теме
 
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|   ВТ.Ссылка КАК Ссылка,
|   ВТ.УИД КАК УИД
|ИЗ
|   ВТ КАК ВТ
|ГДЕ
|   НЕ ВТ.Ссылка.ПометкаУдаления ЕСТЬ NULL";
Показать


лимит СУБД на количество соединений таблиц не останавливает?
7. Kondratenko.as 564 13.04.20 10:35 Сейчас в теме
(5)УТ, ЗУП, БП, УНФ - все ок.
Можете скинуть ссылку на мануал где это описывается и как это применимо к 1С? (не уверен, что разработчики платформы не учли этот момент)
10. PerlAmutor 129 13.04.20 11:13 Сейчас в теме
(7) Это особенность работы SQL сервера. Не рекомендуют делать больше 15 соединений в запросе (считай 15 типов ссылок). Оптимизатор запросов SQL такое не любит.
12. VKislitsin 960 13.04.20 21:33 Сейчас в теме
(7)
Можете скинуть ссылку на мануал где это описывается и как это применимо к 1С? (не уверен, что разработчики платформы не учли этот момент)

https://its.1c.ru/db/v8316doc#bookmark:dev:TI000001289
Microsoft SQL Server
● В запросе можно использовать не более 256 таблиц (для версий Microsoft SQL Server 2000 и Microsoft SQL Server 2005)

На SQL Server 2014 и тестовой базе "Управление холдингом" (700Гб) у меня получился запрос с 975-ю соединениями. Отработал корректно. Правда "быстрым" назвать язык не поворачивается - работало 4 минуты (поиск одной ссылки). Перебором менеджеров срабатывает за несколько секунд.
13. Kondratenko.as 564 13.04.20 22:56 Сейчас в теме
(12)Спасибо за информацию. Можете если есть время конечно, сделать замер на поиск 10,100 - ссылок. Очень интересно отвалится или нет + сравнить с перебором. насколько разница по времени. Есть идея разбить на порции (не одним запросом, а скажем по ограниченному количеству метаданных). К сожалению у меня максимальная база это УТ на 180 гб. И можно узнать характеристики сервера и саму платформу?

Мои:
CPU: 8 core Intel Xeon E3-1270 v6 3.8 GHz
RAM: 30 ГБ
Debian 8
8.3.16.1148
PG 11.6
14. VKislitsin 960 13.04.20 23:48 Сейчас в теме
(13) Я думаю, тут оборудованием измерять нет смысла. Я выполнял на таком: 24 * E5-2690 v4 * 2.6GHz, RAM 256 Гб, Win Server 2012r2, 8.3.10.2561, MS SQL Server 2014.

Проводить дальнейшие тесты, к сожалению, сейчас нет возможности. У меня задачи по массовому поиску ссылок нет.

Что касается путей совершенствования - если это делалось для ИсторииДанных, то на мой взгляд, лучше ограничить типы метаданных только теми, для которых включено использование Истории.
15. Kondratenko.as 564 14.04.20 03:29 Сейчас в теме
(14) "Для которых включено использование Истории" - не все так просто, в пользовательском интерфейсе можно выключить использование Истории и при этом версии не удалятся и будут висеть мертвым грузом. Я думаю на след недели напишу статью по истории данных, как ток дождусь ответа от 1С, по поводу ошибки платформы которую им скинул. Но спасибо за ваш комментарий.
16. VKislitsin 960 14.04.20 07:56 Сейчас в теме
(15) Андрей, а зачем получать объект с целью проверки существования ссылки?
для п.2 есть сложность, так как стандартный подход, что я встречал было получение объекта и проверка его существования (.ПолучитьОбъект()),

Вот такой код работает быстро:
ТекстЗапроса = "
        |ВЫБРАТЬ
        |    Ссылка
        |ИЗ
        |    Справочник.ИмяСправочника КАК Таблица
        |ГДЕ
        |    Ссылка = &Ссылка
        |";
			
    Запрос = Новый Запрос;
    Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("Ссылка", ИскомаяСсылка);
Возврат НЕ Запрос.Выполнить().Пустой();
Показать

И если надо пакетно, то можно собрать циклом километровый запрос со всеми типами через ОБЪЕДИНИТЬ ВСЕ. По крайней мере, это избавит от кучи левых соединений.
Mails79; Kondratenko.as; bulpi; +3 Ответить
19. Kondratenko.as 564 14.04.20 12:31 Сейчас в теме
(16)Вы правы тоже уже к подобному пришел, вчера экспериментировал. Работает на порядок быстрее.
20. AneJIbcuH 37 14.04.20 16:51 Сейчас в теме
в БСП есть функция
ОбщегоНазначения.СсылкаСуществует(ПроверяемаяСсылка)
Там запрос, почти как в (16)
21. Kondratenko.as 564 14.04.20 19:18 Сейчас в теме
(20)Она в данном случаи не подходит. Там используется конструкция "Ссылка.Метаданные().ПолноеИмя()" - чтобы определить саму таблицу для обращения, что в данном случаи лишняя операция и ее использование это запрос в цикле будет.
36. NoRazum 29 18.10.21 12:11 Сейчас в теме
(12) в ЕРП у меня запрос еще дольше выполнялся. Слишком много соединений.
9. PerlAmutor 129 13.04.20 11:09 Сейчас в теме
(5) Кстати дельное замечание. В ERP при поиске документа по штрих-коду приблизительно та же ситуация возникает, если пользователи отбор не выставили на форме. SQL сервер таких издевательств не выдерживает и просит упростить запрос, ошибка на английском, что-то типа "query too complex". Также возникает, когда составляют кривые запросы для РегистраБухгалтерии, где Субконто имеет большое количество возможных типов.

Подобные запросы могут быстро отрабатываться, а могут вообще не отрабатываться, висеть неделями. Причем это зависит от многих факторов, а не только от данных в ИБ.
11. Kondratenko.as 564 13.04.20 15:22 Сейчас в теме
(9)Спасибо. Учту в дальнейших разработках.
6. Evg-Lylyk 4580 13.04.20 09:13 Сейчас в теме
(0) А перечисление? ПометкаУдаления почему не Ссылка.Ссылка
Интересно, а для какой задачи это нужно?
8. Kondratenko.as 564 13.04.20 10:47 Сейчас в теме
(6) Перечисление создается в конфигураторе, вы не сможете его получить через метод "ПолучитьСсылку()".
Можно и ссылку и "ВерсияДанных" - главное это узнать что он не null.
Тут не принципиально.


"Интересно, а для какой задачи это нужно?"

Я ее реализовал когда писал обработку по работе с Историей данных (новый механизм платформы).
17. bulpi 215 14.04.20 11:58 Сейчас в теме
Не понял. А что мешает просто проверить Ссылка.Пустая() ?
18. nomad_irk 71 14.04.20 12:01 Сейчас в теме
(17)Тем что "битая" ссылка - не пустая, "пустой" - объект по этой ссылке.
Азверин; Kondratenko.as; +2 Ответить
22. lvictor58 135 21.04.20 10:02 Сейчас в теме
А разве нельзя проверить на "битую" ссылку используя ПолучитьОбъект()? И не городить весь этот огород с запросами.
23. nomad_irk 71 21.04.20 11:04 Сейчас в теме
(22)Просто представьте, что записей в 1-ой таблице 1Миллиард, битых ссылок при этом - 100к.
Чтобы узнать битые ссылки придется проверять весь 1Миллиард записей.
24. lvictor58 135 21.04.20 11:44 Сейчас в теме
На объект мы проверяем конкретную ссылку полученную по конкретному УИДу. И насколько я себе представлял сущность самого уид-а - это его уникальность. Даже из миллиарда объектов не должно быть нескольких с одинаковым. Какой же он тогда нах... УНИКАЛЬНЫЙ!
25. Kondratenko.as 564 21.04.20 22:42 Сейчас в теме
(24) Уникальность гарантируется только в 1 базе. Если вы делаете обмен между несколькими базами с сохранением оригиналов УИД. То такое может быть и бывает часто.
26. nomad_irk 71 21.04.20 22:53 Сейчас в теме
(24)Их не будет в одной таблице несколько, а вот в разных таблицах - запросто.
Вы, видимо, слабо себе представляете, сколько потребуется времени на проверку 1Миллиарда записей на битые ссылки.
27. lvictor58 135 22.04.20 13:16 Сейчас в теме
(26) Действительно слабо...
по крайней мере сколько не пытался по УИД-у получить объект всегда получал ожидаемый, а не понятно какой из случайно выбранной таблицы.
(24). А если Вы делаете обмен между разными базами, то ежу понятно, что поиск объекта надо проводить не по внутреннему ИД. Что бы потом не выгребать косяки, и не получать по башке за такую организацию работ по обмену данными.
Ну да ладно, не та это тема, что бы ее 2 дня мусолить.
28. Skotarev 15 27.05.21 19:22 Сейчас в теме
А возможно ли определить тип объекта по guid?
Столкнулся с проблемой при работе в web-клиенте.
Поясню проблему, в тонком клиенте открываем форму документа - все хорошо, открываем ее же в веб - падает в ошибку и ссылается на какой-то тип данных, но указан только идентификатор.
29. kembrik 10 04.06.21 15:28 Сейчас в теме
(28) Наверное неактуально уже, но я в такой ситуации обработочку маленькую держу наготове, туда - ссылку на косячный док, и вывожу в текстовое поле его уже сериализованный в Json

СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, КосячныйОбъект, НазначениеТипаXML.Явное);
СериализованнаяСтрока = ЗаписьJSON.Закрыть();

А там уже поиск по косячному GUID и вуаля, "все деньги на экране")
30. Skotarev 15 05.06.21 10:07 Сейчас в теме
(29) Актуально, очень даже.
Только это совсем не документ, скорее всего.
В частности, УТ 11, клиент-серверная, серверная часть на Debian.
Проявляется в форме списка документа "Заказ клиента", справочника "Номенклатура".
31. kembrik 10 07.06.21 12:49 Сейчас в теме
(30) А киньте ошибочку, посмотрим

На раз речь идёт про форму списка, скорее всего динамическую, тут можно запрос динамического списка в конструктор запросов запросов кинуть и галочку "вместо ссылок показывать GUID", а там уже поиском

опять же, можно обойти все метаданные, и по Гуиду попробовать получить объект, где получит там и искомое. Но это мы практически вернемся к топику обсуждения
32. Skotarev 15 07.06.21 13:20 Сейчас в теме
(31) Скриншот приложил.
Прикрепленные файлы:
34. kembrik 10 07.06.21 16:15 Сейчас в теме
(32) Тут непросто всё, тут Гуид как тип пробует выступить, что то у вас в клиент-серверной сериализации сбоит. Есть "Информация для технической поддержки" там получим примерное место падение, ну или в технологическом журнале посмотреть. Ладно, это уже беседа не в рамках темы, в ЛС лучше
35. Skotarev 15 07.06.21 16:55 Сейчас в теме
(34) Буду очень признателен за помощь.
В "Информация для технической поддержки" ровно то же что и в сообщении.
В л/с написать почему-то не удается.
33. Skotarev 15 07.06.21 13:36 Сейчас в теме
(31) Скорее это какой-то объект формы, но понять какой - не могу, в тонком клиенте все ведь хорошо.
37. zabaluev 461 01.12.21 22:23 Сейчас в теме
Совсем не быстрая функция поиска.
Прикрепленные файлы:
38. romulanin 24.12.21 10:59 Сейчас в теме
Долго выполняется поиск. В разы дольше чем через привычной получить объект. Поиск делал подразделения обычным способом секунд 10, а через ваш вариант больше 3 минут
39. andrey_sag 20 13.12.22 10:29 Сейчас в теме
Слямзил часть кода, вроде наоборот упростил. Зачем запрос? Почему исключено брать помеченные на удаление?
 Для Каждого СтрМетаданное Из МассивМетаданных Цикл
        Для Каждого Менеджер Из СтрМетаданное Цикл   
            Для Каждого СтрУИД Из МассивУидов Цикл
				Попытка
					НайденнаяСсылка = Менеджер.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрУИД));
					Если СтрНайти(Строка(НайденнаяСсылка), "Объект не найден") = 0 Тогда
	                    НовСтр = ТаблицаСсылок.Добавить();
	                    НовСтр.Ссылка = НайденнаяСсылка;
					КонецЕсли;
                Исключение
                КонецПопытки;
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;
Возврат ТаблицаСсылок.ВыгрузитьКолонку("Ссылка");
Показать
Прикрепленные файлы:
НайтиСсылку.epf
nagaitseff; +1 1 Ответить
40. ILNIK 30 15.12.22 09:34 Сейчас в теме
(39) это не исключение брать помеченные на удаление, а проверка на существование объекта , видимо
mihuilka; +1 Ответить
41. AneJIbcuH 37 22.12.22 06:01 Сейчас в теме
(39) СтрНайти(Строка(НайденнаяСсылка), "Объект не найден") = 0

Не оптимально при большом количестве объектов. Строка(НайденнаяСсылка) - это неявный запрос на получение представления, а значит запрос в цикле.
42. Alex Y 177 14.02.23 15:21 Сейчас в теме
Взял обработку "как есть". Запустил на небольшой БП3. После нескольких минут получил:

Невосстановимая ошибка
Ошибка при выполнении запроса POST к ресурсу /e1cib/logForm:
по причине:
Ошибка СУБД:
Microsoft SQL Server Native Client 11.0: При оптимизации запроса обработчик запросов исчерпал пространство стека. Упростите запрос.
HRESULT=80040E14, SQLSrvr: SQLSTATE=42000, state=1, Severity=11, native=8621, line=1
43. Green_Mann 18.04.23 12:15 Сейчас в теме
Пробовал предложенный автором алгоритм на ERP, окончания не дождался.
Скомуниздил немного идею и чуть переработал, отрабатывает за секунды.
Вдруг кому-то пригодится.

Большое спасибо автору за материал!

Если Не ЗначениеЗаполнено(GUID) Тогда
		Возврат;
	КонецЕсли;
	
	СоответствиеМетаданных = Новый Соответствие;    
	
	СоответствиеМетаданных.Вставить("Справочники",				Справочники);
	СоответствиеМетаданных.Вставить("Документы",				Документы);
	СоответствиеМетаданных.Вставить("ПланыВидовХарактеристик",	ПланыВидовХарактеристик);
	СоответствиеМетаданных.Вставить("ПланыСчетов",				ПланыСчетов);
	СоответствиеМетаданных.Вставить("ПланыВидовРасчета",		ПланыВидовРасчета);
	СоответствиеМетаданных.Вставить("ПланыОбмена",				ПланыОбмена);
	СоответствиеМетаданных.Вставить("БизнесПроцессы",			БизнесПроцессы);
	СоответствиеМетаданных.Вставить("Задачи",					Задачи);
	
	Объект.Ссылки.Очистить();
	
	УИДляПоиска	= Новый УникальныйИдентификатор(СокрЛП(GUID));
	
	Для Каждого ОбъектМетаданных Из СоответствиеМетаданных Цикл
		
		Для Каждого Стр Из Метаданные[ОбъектМетаданных.Ключ] Цикл
			НайденнаяСсылка	= ОбъектМетаданных.Значение[Стр.Имя].ПолучитьСсылку(УИДляПоиска);
			Если ОбщегоНазначения.СсылкаСуществует(НайденнаяСсылка) Тогда
				Объект.Ссылки.Добавить().Ссылка	= НайденнаяСсылка;
			КонецЕсли;
		КонецЦикла;
		
	КонецЦикла;
	
	ОбщегоНазначения.СообщитьПользователю("Конец");
Показать
Прикрепленные файлы:
ПоискСсылкиПоGUID.epf
kabantus; Хвостатос; kpdozer; +3 Ответить
44. Hans 2 31.05.23 10:49 Сейчас в теме
(43) Кривая поделка у автора. А у тебя норм.
47. Serg2000mr 311 24.10.23 23:44 Сейчас в теме
(43) Так будет в 2 раза быстрее:
Код
45. Hans 2 31.05.23 10:56 Сейчас в теме
Автор зачем то сделал

| ВТ КАК ВТ
|ГДЕ
| НЕ ВТ.Ссылка.ПометкаУдаления ЕСТЬ NULL";

И пошло соединение со всеми таблицами базы.
46. user1274184 28.09.23 09:40 Сейчас в теме
Криво. Роняет базу с ошибкой:

Невосстановимая ошибка
Ошибка при выполнении запроса POST к ресурсу /e1cib/logForm:
по причине:
Ошибка СУБД:
54000: ERROR: joins can have at most 32767 columns
48. simuljakr 203 23.01.24 19:06 Сейчас в теме
Переделал под обычные формы.
Не возражаете, если запощу от своего имени ? (со ссылкой на Вашу разработку)
49. Smilk 26.01.24 14:38 Сейчас в теме
    Для Каждого СтрМетаданное Из МассивМетаданных Цикл
        Для Каждого Менеджер Из СтрМетаданное Цикл   
            Для Каждого СтрУИД Из МассивУидов Цикл
				
				Попытка 
					СсылкаНаОбъект = Менеджер.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрУИД));
					
					Если СтрНайти(СсылкаНаОбъект,"<Объект не найден>") = 0 Тогда 
						Если ОбщегоНазначения.СсылкаСуществует(СсылкаНаОбъект) Тогда
							НовСтр = ТаблицаСсылок.Добавить();
							НовСтр.Ссылка = СсылкаНаОбъект;
							НовСтр.УИД    = СтрУИД;
						КонецЕсли;
					КонецЕсли; 
					
                Исключение
				КонецПопытки; 
				
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;
Показать


Вот так работает тоже быстро.
50. adeptis 10 05.03.24 14:49 Сейчас в теме
Хорошая штука, работает. Только добавил возможность добавления вместо GUID прямо строки с ошибкой типа:
<Объект не найден> (84:bf5600145e3710ab11dda4c605dbe824).

Вообще хорошо стало!
Оставьте свое сообщение