На форме расположил дерево значений, чтобы сузить область поиска ссылок. Потом в серверной процедуре пишу код:
Дерево = РеквизитФормыВЗначение("Объект.МетаданныеПоиска");
ВключитьОбъекты = Новый Массив;
Для Каждого Строка Из Дерево.Строки Цикл
Для Каждого СубСтрока Из Строка.Строки Цикл
Если Не СубСтрока.Выбран Тогда
Продолжить;
КонецЕсли;
ВключитьОбъекты.Добавить(Метаданные.НайтиПоПолномуИмени(СубСтрока.ПолноеИмя));
КонецЦикла;
КонецЦикла;
ТзНайденныхСсылок = НайтиПоСсылкам(МассивЗаменяемых,,ВключитьОбъекты);
Показать
Получаю ошибку, хотя массив заполнен корректно (содержит только объекты метаданных всех справочников). Что делаю не так?
находит вообще ВСЕ ссылки, не только указанные в МВключаемые (т.е. не работает).
А если переставить в исключенные:
ТабЗнч = НайтиПоСсылкам(МИскомых, МОбластьПоиска, новый Массив, МВключаемые);
то получаем все ссылки за исключением указанных в МВключаемые (работает как и должно быть)
Что за ё-моё. Ну и как на этот метод опираться в разработках. Сегодня работает, завтра нет ((
p.s. режим совместимости не используется.
Не могу найти, где же это требовалось, но тестовый пример работает как надо (платформа 8.3.6.2152):
МВключаемые = Новый Массив;
МВключаемые.Добавить(Метаданные.Документы.ПлатежноеПоручение);//например
ТабСсылок = НайтиПоСсылкам(Ссылки, Новый Массив, МВключаемые, Новый Массив);
Ввел в заблуждение пост (7), где у вас все работает без указания четвертого параметра.
ну и на том спасибо))) что то я в теме не нашел никого больше кто бы объяснил работу новой формы метода, а теперь мне же и пишут что я ввел в заблуждение:) Здорово, что...
(14) Дык, наоборот! В теме это было единственное решение, которое работало, отплюсованное, да еще и "отосланное" к аналам в СП. Я на него и ориентировался - раз все уже работало. За это спасибо. Обидеть не хотел.
p.s. Пусть будет стыдно тем людям, которые в СП пишут без указания полного синтаксиса/вариантов использования и главное(!) без исчерпывающих примеров.
(15) kraynev-navi, да ладно, я ж прикалываюсь:)
а насчет СП... это все же СП, а не самоучитель... своего рода напоминалка, хотя используем мы его как раз, как единственный источник)))
Тип: Массив.
Определяет область поиска объектов. Область устанавливается комбинацией разделителей, в состав которых включены объекты метаданных, среди данных которых следует выполнять поиск.
Элемент массива имеет тип Массив.
Элемент вложенного массива имеет тип:
Объект метаданных – Общий реквизит, разделяющий данные.
Строка – имя общего реквизита, разделяющего данные.
По умолчанию имеет значение Неопределено.
Допустимые значения:
Неопределено,
Массив с комбинациями разделителей, определяющий область поиска,
Пустой массив - область поиска определяется параметрами метода ВключитьОбъекты и ИсключитьОбъекты.
(8) m-serg74,
Нетривиальное решение: чтобы заработали 3 и 4 параметры во 2-ой параметр необходимо запихнуть пустой массив. Оставить параметр пустой - работать не будет, кинуть туда неопределено - тоже не будет работать...
Давно это было и я не помню пробовали ли мы во второй параметр запихнуть пустой массив. Может на той версии платформы не работала данная функция, или мы проглядели этот нюанс в СП... Не суть - главное работает сейчас, правильный ответ плюсанул.
Все перепробовал. Наверно проблема в том что режим совместимости. Пришлось использовать обычный отбор на форме, вместо вытягивания только данных соответствующих отбору.
Актуально :) Нужно найти только список документов в которых указана заданная номенклатура, делаю так:
ВключаемыеОбъекты = Новый Массив;
Для Каждого ОбъектМетаданных Из Метаданные.Документы Цикл
ВключаемыеОбъекты.Добавить(ОбъектМетаданных);
КонецЦикла;
СписокПоиска = Новый Массив;
СписокПоиска.Добавить(УказаннаяНоменклатура.Ссылка);
РезультатПоиска = НайтиПоСсылкам(СписокПоиска, Новый Массив, ВключаемыеОбъекты, Новый Массив);
Показать
В результате находит все ссылки (и справочники, и регистры). Точно так же, как выполнить НайтиПоСсылкам(СписокПоиска); без дополнительных параметров. Конфигурация УТ 10.3, Платформа 8.3.6.2152. Сама конфигурация в режиме совместимости - может тут и зарыта собака?
то началось то, что ранее уже, возможно, описывалось - исключение по справочнику продолжило работать, а вот документы все равно оказывались в результате поиска. Была сделана ради эксперимента попытка поменять в МассивеИсключений порядок элементов, но это на конечный результат поиска не повлияло: так же исключались ЕдиницыИзмерения, но оставались УстановкиЦенНоменклатуры.
Поэтому был добавлен участок кода на обусловленное удаление из РезультатаПоиска (Таблицы значений) строк, содержащих в данных ссылку на документ типа "Установка цен номенклатуры". Больше просто не хотелось заморачиваться. Падение производительности, конечно, но задача разовая, поэтому так.
Потратил кучу времени что бы разобраться.
Судя по всему, где-то есть некий массив метаданных, где осуществляется поиск. 3ий параметр этот массив дополняет, а 4ый уменьшает.
Например, что-бы найти все ссылки на контрагента в документ.РеализацияТоваровУслуг нужно 2 и 3 параметр заполнить "Новый Массив" в 4ый передать массив всех метаданных где есть контрагент, кроме документ.РеализацияТоваровУслуг.
Не очевидное поведение, хотя если об этом знать, то в справке написано правильно.
(31) Это не так. Я проверил НайтиПоСсылкам только с первым параметром (НайтиПоСсылкам(МассивСсылок)) – результат 75 секунд.
С 4-мя параметрами, где 3-й параметр ВключитьОбъекты – это массив с одним объектом метаданных (НайтиПоСсылкам(МассивСсылок, Новый Массив, МассивМетаданных, Новый Массив)), – результат 1 секунда. Это доказывает, что нет никакого "некоего массива метаданных", дополняемого 3-м параметром.
36.
user625107_barabambler1s
09.12.20 13:19 Сейчас в теме
<ОбластьПоиска> (необязательный)
Тип: Массив.
Определяет область поиска объектов. Область устанавливается комбинацией разделителей, в состав которых включены объекты метаданных, среди данных которых следует выполнять поиск.
Элемент массива имеет тип Массив. Элемент вложенного массива имеет тип:
Объект метаданных – Общий реквизит, разделяющий данные.
Строка – имя общего реквизита, разделяющего данные.
ОбластьПоиска = Новый Массив;
ОбластьПоиска.Добавить(Новый Массив);
Начало обсуждения: 12.05.15 Сегодня: 19.12.20 Свою обработку на этом https://infostart.ru/public/65132/ публиковал 02.02.10 Тогда тоже как и здесь потом удалял лишнее в переборе...
Пробовал на 8.3.15.1887
Есть:
МассивСсылок - Массив ссылок на элементы определенного справочника
Код
ТЗ_Ссылок = НайтиПоСсылкам(МассивСсылок);
Работает и выбирает все ссылки.
Добавляем Массив Исключений
МассивИсключений = Новый Массив;
МассивИсключений.Добавить(Метаданные.Справочники[ИмяОбъектаИсключения]);
(37) судя по всему
НайтиПоСсылкам(<СписокСсылок>, <ОбластьПоиска>, <ВключитьОбъекты>, <ИсключитьОбъекты>)
ИсключитьОбъекты это объекты метаданных не исключаемые из полученных значений, а объекты метаданных где в принципе не будет происходить поиск.
Поясню. Пример.
Ищем ссылку на номенклатуру. Она есть в Документ1. Включаем объект метаданных Документ1 в ИсключитьОбъекты. Вроде все правильно и должно работать и не получать ссылки на документы из Документ1. Но, номенклатура есть и в РН, в котором есть запись как регистратора Документ1. Вот и получается, что ссылка на Документ1 все же попадает в выборку. Если только еще и объект метаданных нужного РН не включить в ИсключитьОбъекты.
<ОбластьПоиска> (необязательный)
Тип: Массив.
Определяет область поиска объектов. Область устанавливается комбинацией разделителей, в состав которых включены объекты метаданных, среди данных которых следует выполнять поиск.
Кто мне ответит что такое РАЗДЕЛИТЕЛЬ из описания в синтаксис-помошнике
ОбъектМетаданных: ОбщийРеквизит (MetadataObject: CommonAttribute)
РазделениеДанных (DataSeparation)
Использование:
Только чтение.
Описание:
Тип: РазделениеДанныхОбщегоРеквизита.
Показывает, используется ли общий реквизит в разделении данных.
Если посмотреть полученный результат, то там как раз один из результатов этот самый РазделениеДанных
Глобальный поиск по (что было под рукой):
Бухгалтерия предприятия, редакция 2.0 (2.0.66.103)
BAS Документообіг КОРП, редакція 2.1 (2.1.3.1)
BAS ERP (2.1.15.5)
1) У меня заработал 4-й параметр только при ЯВНОМ задании 3-го.
Т.е. сначала заполнил 3-й ВСЕМИ метаданными, а потом в 4-м исключил некоторые из 3-го.
Вопрос: И зачем это нужно? (можно задать сразу нужные)
2) Режим совместимости конфигурации - не влияет (во всяком случае - Версия 8.3.12)
3) Код который заработал:
МассивИсключений = Новый Массив;
МассивИсключений.Добавить(Метаданные.Справочники.ДоговорыКонтрагентов);
МассивПоиска = Новый Массив;
Для Каждого текСтр ИЗ Метаданные.Документы Цикл
МассивПоиска.Добавить(текСтр);
КонецЦикла;
Для Каждого текСтр ИЗ Метаданные.Справочники Цикл
МассивПоиска.Добавить(текСтр);
КонецЦикла;
ТЗ_Ссылок = НайтиПоСсылкам(МассивСсылок,Новый Массив,МассивПоиска,МассивИсключений);
8.3.21.1302 в режиме совместимости с 8.3.17. Похоже не работает никак, чтобы я туда не передавал. И массивы строк с именами и массивы с метаданными. Пробовал в массив включаемых передать все объекты метаданных какие есть, а в массив исключаемых только то, что нужно исключить. Пробовал заполнять только первый массив, а второй не заполнять. Пробовал наоборот - заполнять только массив исключаемых. Ничего не работает.
А хотел в ERP поискать ссылки на значение перечисления ТипыЗатрат (Регл) "Материальные" везде, кроме регистров накопления и бухгалтерии. Уж очень в этих регистрах много ссылок.
Массивы включаемых/исключаемых объектов метаданных получаются внушительными - чуть меньше 4000 регистров.
Ссылки в общем не ищет. Ждем новых версий :(