1с проверить существование ссылки

Обновлено: 06.07.2024

Для 8.х НайтиПоСсылкам (FindDataByRef)
Синтаксис:
НайтиПоСсылкам (< Список ссылок> )
Параметры:
<Список ссылок> Обязательный
Тип: Массив. Массив со списком ссылок на объекты, ссылки на которые нужно найти.
Возвращаемое значение:
Тип: ТаблицаЗначений. Таблица значений, состоящая из ко­лонок с индексами: 0 - Искомая ссылка; 1 - Ссылка на объект, который содержит искомую ссылку.
Описание:
Осуществляет поиск ссылок на объекты.
Код 1C v 8.х
Функция НайтиПоСсылке имеет особенность: для корректной её работы необходимо, чтоб все объекты были доступны на чтение. Если у вас есть роли, имеющие ограничение на чтение, то вызов функции НайтиПоСсылке можно выполнять только в привилегированном модуле, иначе может возникать ошибка такого рода:
НайтиПоСсылкам(Ссылки) : Ошибка при вызове метода контекста (НайтиПоСсылкам): У пользователя недостаточно прав на исполнение операции над базой данных.

Для 7-рки - НайтиСсылки
Находит ссылки на объекты, переданные в списке значений.
Синтаксис:
НайтиСсылки(<Объекты>,<Ссылки>)
Англоязычныйсиноним:
FindReferences
Параметры:
<Объекты> Конкретное значение объекта илиобъект типа СписокЗначений, в котором данной процедуре передаются объекты, по которым надо найти ссылки.
<Ссылки> Идентификатор объекта типа ТаблицаЗначений, в который данная процедура помещает найденные ссылки на объекты. Таблица значений состоит из 3 колонок: 1. Объект — объект, на который ссылаются; 2. Ссылка — объект, который содержит ссылку; 3. Комментарий — комментарий кссылке.
Описание:
Процедура НайтиСсылки находит ссылки на переданные в списке объекты, и помещает их в таблицу значений.
Код 1C v 7.x

Разместил: E_Migachev  Версии: | 7.x | 8.x |  Дата: 05.04.2010   Прочитано: 78995

Распечатать

Похожие FAQ

Еще в этой же категории

Полнотекстовый поиск в 1С (что это и пример использования)  22
Полнотекстовый поиск - позволит найти текстовую информацию, размещенную практически в любом месте используемой конфигурации. При этом искать нужные данные можно либо по всей конфигурации в целом, либо сузив область поиска до нескольких объектов Формат, функция форматирования значений  21
//Функция формирует удобное для чтения представление значений. // Примеры форматирования чисел ЗначФормат = Формат(123456.789, " ЧЦ=10; ЧДЦ=2" ); // ЗначФормат = " 123 456,79" ЗначФормат = Формат(123456.789, " ЧГ=0; ЧДЦ=2" ); // Знач УстановитьСсылкуНового  11
Установить ссылку нового это специальный механизм программиста, который позволяет присваивать новому объекту нужную ссылку. В основном это задача обмена, во многих типовых обменах используется синхронизация по UID объекта. Рассмотрим этот метод на к Обработчики событий при записи объектов. Зачем и что за чем?  11
Программисту, имеющего немного опыта на платформе 1С 8.2, бывает сложно разобраться: ПередЗаписью, ПриЗаписи, ПослеЗаписи, на сервере, на клиенте, в модуле формы, в модуле объекта, а-а-а-а-аааа. Именно такое сложное чувство непонимания МоментВремени, получение остатков до и после проведения  9
" Момент времени" - виртуальное поле, не хранится в базе данных. Содержит объект МоментВремени (который включает в себя дату и ССЫЛКУ НА ДОКУМЕНТ) В 7.7 было понятие ПозицияДокумента, а в 8.x Момент времени Для получения Остатков, Движений: М Посмотреть все в категории Встроенные Функции

К сожалению, у обеих платформ нет встроенных средств, позволяющих непосредственно узнать, является ли ссылка «битой» или нет.
Сразу хочется заметить, что кроме «битых ссылок» в системе имеются специальные значения «пустых ссылок» и их следует отличать друг от друга.

Предлагаю простые решения этой задачи (без построения запросов к базе данных), полученные эмпирическим путём:

1) Для платформы 1С-7.7:
- Для «битой» ссылки метод Ссылка . Выбран () и функция ПустоеЗначение () возвращают ноль;
- Для «пустой» ссылки метод Ссылка . Выбран () возвращает ноль, а функция ПустоеЗначение () единицу;
- Для «нормальной» ссылки метод Ссылка . Выбран () возвращает единицу, а функция ПустоеЗначение () ноль;

Таким образом, с точки зрения 1С-7.7 «битая» ссылка – это не пустое значение, которое не является выбранным .

2) Для платформы 1С-8.x:
Все обстаит несколько сложней.
В обоих случаях (для «битых» и «нормальных» ссылок) метод Ссылка . Пустая () и функция ЗначениеЗаполнено () ведут себя одинаково:
первый возвращает Ложь , а второй Истина .

Простоте решение было найдено случайно, при отладке ошибок времени исполнения:

- Для «битой» ссылки метод Ссылка . ПолучитьОбъект () возвращает значение Неопределено;
- Для «пустой» ссылки» метод Ссылка . ПолучитьОбъект () выбрасывает исключение:
«Ошибка при вызове метода контекста (ПолучитьОбъект): Элемент не выбран!» ;
- Для «нормальной» ссылки метод Ссылка . ПолучитьОбъект () возвращает значение согласно документации;

Таким образом, с точки зрения 1С-8.х «битая» ссылка – это не пустое значение ссылочного типа,
для которого возвращается значение объекта равное Неопределено .

При этом особняком стоят ссылки на значения перечислений. У них нет метода Ссылка . ПолучитьОбъект () .
И трудно вообще представить себе ситуацию, когда ссылка на перечисление может оказаться «битой».
Например, если удалить значение в конфигураторе, то при восстановлении значения функцией ЗначениеИзФайла () возвращается пустая ссылка.
Поэтому будем считать любые ссылки на перечисления «небитыми».

В архиве файла поставки находятся текстовые файлы с примерами реализации функции IsEmpty () для платформ 1С-7.7 и 1С-8.x,
возвращающей признак пустого значения и флаг «битой ссылки» для произвольного значения.

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

(1) В БСП есть функция

Andrei_Ivanov; houpl; user1232941; Fales; v3n7; unknown181538; GonziK_KIV; malikov_pro; Jivchic; ram3; TeMochkiN; maxunov95; байт; kimskiysanya; mickey.1cx; Batman; zfr475; user659168_xec8787; anchovy; 7OH; treedo; McLer; Alien_job; 1v7; rusmil; adhocprog; serezhenko; Gladkov_Anton; azazana; gaspard; alex-l19041; Патриот; Kesak; HEKPOH; Dr.ZIG; keypax; + 36 – Ответить (9) Вопрос . ИмяТаблицыПоСсылке(ЛюбаяСсылка) - это что за функция? Каким образом она возвращает имя таблицы? Это же не встроенная процедура или функция. maxunov95; zfr475; drygina; McLer; 1v7; adhocprog; rayastar; Патриот; nodalt; + 9 – Ответить vlm88; olololeg; Rustavelli; Hamsik; Восьмой; adhocprog; + 6 – Ответить

Похоже ничего лучше чем

Если БИТАЯССЫЛКА.ПолучитьОбъект() = Неопределено тогда

(3) Arch_1,
<quote>
Похоже ничего лучше чем

Если БИТАЯССЫЛКА.ПолучитьОбъект() = Неопределено тогда

уже не найти.
</quote>
в любом случае, чтобы определить битая ссылка или нет необходимо попытаться "пройти" по этой ссылке

Думаю как вариант банально анализировать представление формируемое платформой 1С

(4) ksb, just for lulz:

TreeDogNight; Brawler; leaguener; CnupT; fst; CyberCerber; 7OH; adhocprog; temdj; + 9 – 1 Ответить (13) Блин, хоть ветка старая, но. Чуваки и чувихи, которые ищут объекты не найденные скорее всего это делают относительно не часто, и вряд ли им попадется маньяк, который так будет делать. Понимаю что учитывать надо, но ровно с той же вероятностью, даже кстати меньшей, чем то что конфа будет в режиме совместимости с 8.3.5 и ниже. "Найти" там, вся фигня. Еще есть вариант запроса, и он будет вероятно быстрее работать. (6) Arch_1,
<quote>
Еще есть вариант запроса, и он будет вероятно быстрее работать.
</quote>
наврядли..одинаково отработают. но запрос или ПолучитьОБъект() это уже на выбор автора))

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

(12) Простите, что "оживляю" мертвую ветку.
Только что наступил на еще одну граблю в пользу запроса (из функции СсылкаСуществует) против Ссылка.ПолучитьОбъект() = Неопределено.
Получение объекта, кроме зачитывания из БД кучи табличных частей и движений документа, еще и выполняет код инициализации модуля объекта. А некоторые доброжелатели (из разработчиков типовых конфигураций) там ТАКИХ сюрпризов наоставлять могут, что вся производительность в ноль уйдет. В запросе условием что-то типа такого: Где Номенклатура.Ссылка ЕСТЬ NULL

Извиняюсь за некропост, но с некоторой версии платформы появился встроенный реквизит ссылочного объекта "ВерсияДанных", который заполняется системой в момент записи объекта. Значит если объекта нет, то это значение будет не заполнено.

pvlunegov; TreeDogNight; zhuntovda; Jivchic; anchovy; Enya_06; falsepilot; + 7 – Ответить

(17), с тем же успехом можно проверить любой другой реквизит Ссылки.

И ПустаяСтрока - это не комильфо, НЕ ЗначениеЗаполнено работает быстрее.

А почему не так ?

(20) Замеры показывают, что Ссылка.ВерсияДанных, Ссылка.Номер, Ссылка.ЛюбойРеквизит - выполняются по времени соизмеримо с Ссылка.ПолучитьОбъект().
И это правильно, т.к. если вспоминать мат. часть, то выяснится, что для получения реквизита через точку, платформа зачитывает в память весь объект, со всеми табличными частями и движениями (если это документ), и получает от него реквизит. И кстати, сам объект какое-то время висит в кэш-памяти - на случай, если надо будет от него через точку еще какие-нибудь реквизиты получать.
Посему вывод: функция СсылкаСуществует - самый быстрый способ проверки (особенно если еще и саму функцию в кэшируемый модуль поместить). в запросе однозначно лучше всего и проверено, например проверить документы с битой ссылкой на контрагент: Документ.Контрагент.Ссылка ЕСТЬ NULL обязательно надо добавлять .Ссылка чтобы там NULL получился у битой ссылке. А не подскажете как проверить что по COM-соединению битая ссылка? Чтоб оптимально было. Столкнулся например что группа справочника в базе-источнике это битая ссылка (25)Спасибо, туплю в первый день. Там же и проверять по КОМ. Как выяснилось эксперементальным путем для проверки на "Объект не найден" быстрее работает конструкция

Применял в конвертации данных на стадии выгрузки набора движений документа на очень больших объемах данных где в единичных случаях попадались битые ссылки и процесс прерывался.

Через COM такой подход тоже будет работать только типа

(27) конечно быстрее. Получить объект это тяжелая операция, а сравнение строки легкая. Но тяжелая операция гарантированный результат. А поиск по строке с вероятностью не даст результат. Как поломать этот алгоритм уже писали. Запрос = Новый Запрос("Выбрать Таб.Ссылка ИЗ "+СтрЗаменить(СериализаторXDTO.XMLТипЗнч(СсылкаНаОбъект).ИмяТипа,"Ref.",".") +" КАК Таб ГДЕ Таб.Ссылка = &СсылкаНаОбъект");

Совершенно согласен с подходом. Поясню.
Здесь много говорили о производительности. И запросом ссылку проверять быстрее и правильнее, не загружая объект в память.
Однако, ни кто не обратил внимание на составную функции СсылкаСуществует()
Там используется другая функция ИмяТаблицыПоСсылке(), которая берет Метаданные() объекта.

Замерил, - это примерно 10 раз медленнее чем XMLТипЗнч() (на цикле в 10000).
Проверить может каждый. Замер времени делал просто - обернул код вызова ТекущаяУниверсальнаяДатаВМиллисекундах() и узнал разницу.

Да, XMLТипЗнч() изменяет описание объекта. Вместо "Справочник.Номенклатура" она возвращает "CatalogRef.Номенклатура", поэтому приходится использовать дополнительно СтрЗаменить(). Для запроса не играет роли как мы обзываем тип объекта, - "Catalog." или "Справочник.".

Поэтому переписал функцию. Мне же потом и пригодится. Помещу здесь новый вариант:

Суть во внешней БД (Приемник) создается элемент(или документ) по ГУИД базы Источника. И соответственно нужно проверить это новая ссылка или уже есть такой объект. Проверяю так:

СсылкаПриемник = ПолучитьВнешниюСсылкуПоГУИД(пВидВПриемнике,пГУИД_Источника);
Если СсылкаПриемник.ПолучитьОбъект() = Неопределено Тогда
.

Может есть какой другой способ проверить, не нравится использования тяжелого метода ПолучитьОбъект(), тем более объект и не нужен, нужна проверка.

(1) а точно это будет быстрее работать в цикле, чем ПолучитьОбъект() ?

(2) если объект не новый, то гарантированно быстрее. ПолучитьОбъект() тянет на клиента все реквизиты и табличные части объекта.

Но вообще, такие вещи в цикле делать не надо.

(5) На какого клиента тянет? вся обработка выполняется в модуле объекта на сервере. И как без цикла ? Запросом выбираются нужные данные, и в цикле обходит выборку проверят создан объект в Приемнике или нет. Не создан, создает, все ссылочные реквизиты создаются рекурсивно, поэтому выбрать сразу ссылки для проверки нет возможности
(1) Протестирую этот способ посмотрю замеры, отпишусь! Может еще какие интересные варианты?
(0) Надеюсь, кэш уже пройденных GUID и найденных/созданных объектов есть?
(0) Пройдись первый раз без записи, просто накопи ГУИДы в разрезе видов объектов, запроси их в базе, результат сохрани в Соответствии, но даже я бы забил и остановился на (1)
90% времени у тебя будет тратится на повторную обработку уже обработанного, если нет кэша (12)
(13) вот кстати, после того как скопипастил это - подумал о кэше
(9) Пустая() всегда будет возвращать ЛОЖЬ, не зависимо есть объект в БД или нет! Проверено
(18) И как это относится к (0)? вернет одинаковое значение есть ли эта ссылка в базе или нет ее
Проверяй по номеру документа. Если такого документа нет, то и реквизиты полученной ссылки будут не заполнены:
Если НЕ ЗначениеЗаполнено(СсылкаПриемник.Номер) Тогда
.

(22) Я уже удивлен, что ещё никто не предложил проверенный временем способ:

(23) Ты знаешь, что скажут сотрудники фирмы 1С, если ты им такое предложишь? (0) Рекомендую (18).

(24) Ну хорошо, убедил:

Если Найти(Ссылка, "Объект не найден") > 0 Или Найти(Ссылка, "Object not found") > 0 Тогда

Пойдет? Я теперь всегда так писать буду!

2. Никто не гарантирует, что завтра представление битой ссылки не изменится
(26) Хорошо! Я вынесу код проверки в отдельную функцию и буду ее постоянно рефакторить!
(29) А как это называется? Есть же умное слово, я в тетрадку записывал!

Рефакторинг - процесс изменения внутренней структуры программы, не затрагивающий её внешнего поведения и имеющий целью облегчить понимание её работы
(32) Извиняюсь сразу не весь код развернул, поэтому в (20) комментировал "Ссылка.Метаданные().ПолноеИмя()". Но а так тоже самое что и в (1), но все равно спасибо.

(25) Кстати, вы в курсе, что неявное приведение к булево быстрее сравнения на количество в среднем на 5-7%:

(7) ну, значит, - на сервер приложений, а не на клиента.
Без цикла - собрать все ссылки в таблицу значений, эту таблицу значение один раз в запросе соединить левым соединением с основной таблицей документа и получить за один запрос по всем статус новый/старый.

Если перечень ссылок для проверки известен до цикла, то проверять их запросов в цикле - грубейшая ошибка

(36) Нет слов. Воспользуюсь словами другого человека:

Боль в меня вгрызалась змеей голодной,
И хочу, чтоб ангел с душой холодной
Отравился ядом моей любви.

В данных печати не всегда есть "ДокументОснование.ЗаказКлиента", поэтому вылезает ошибка "Поле объекта не обнаружено (ДокументОснование)".

Нужна проверка "если этих полей не существует".. Помогите

PS: ЗначениеЗаполнено естественно не работает

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

Проверка на существование треугольника, вычисление площади и периметра
Необходимо написать программу, вообщем сгенерировать три случайных числа (стороны треугольника).

Проверка на существование Задачи
Подскажите пожалуйста, как можно проверить существует ли уже эта задача, перед записью новой


Существование обьекта и получение ссылки
Доброго времени суток. Есть приложение, в котором вызываются dll(№1). В приложении подключена.

Проверка на существование
есть таблица Client со столбцами (Name,LastName,MobilePhoneNumber,Email) и нужно проверить на.

Burkaton, вообще проверка на пустую ссылку в реквизите ссылочного типа, проверяется следующем образом.

Но у вас ДокументОснование составной тип (Скорее всего, проверьте конфигураторе). Вам необходимо с начало отобрать все документы которые имеют реквизит ЗаказКлиента. А потом уже обращаться к данному реквизиту.

Не получается. А нельзя что-то типа такого?:
ДанныеПечати.Ссылка.Найти("ДокументОснование.ЗаказКлиента")
или
ДанныеПечати.Ссылка.Свойство("ДокументОснование.ЗаказКлиента ")

вы вопрос до конца дочитали?

Проверка на заполненность значения подразумевает, что ссылка ТОЧНО есть. А вопрос был в том, как проверить есть-ли она или нет?

Проверка на заполненность значения подразумевает, что ссылка ТОЧНО есть. Откуда такой вывод? Volexovich, дал дельный совет, да и dggrom, дал правильное направление
Если ЗначениеЗаполнено(ДанныеПечати.Ссылка.ДокументОснование) И ТипЗнч(ДанныеПечати.Ссылка.ДокументОснование) = Тип("ДокуменТСсылка.ЗаказКлиента") Тогда
Если НЕ ДанныеПечати.Ссылка.ДокументОснование.ЗаказКлиента = Документы.ЗаказКлиента.ПустаяСсылка();
Тогда // ух тогда
КонецЕсли;
КонецЕсли; Да нельзя обращаться к ДанныеПечати.Ссылка.ДокументОснование ! Потому, как если его фактически нет, то будет ошибка! Только если попытаться найти его.

Решение

Если ДанныеПечати.Ссылка.Метаданные().Реквизиты.Найти("ДокументОс нование")<>Неопределено // Есть ли реквизит ДокументОснование

Проверка на существование
Есть один txt-файл. В нем построчно написаны файлы и их вес в байтах. Пример: files.rar 12345678.

Проверка файла на существование
Добрый день! Подскажите пожалуйста как проверить файл на существование по пути, прописанному в.

Проверка на существование переменной
Всем доброго времени суток! Подскажи существует ли в JS аналог проверки на существование.

Проверка на существование треугольника
Не знаю, как сделать проверку, внутри кнопки try не работает,как можно сделать её? private void.

Проверка листа на существование
Ребята подскажите как узнать существует лист или нет. Делаю так: Sub Добавление_листа() .

Проверка на существование БД MySQL
Здравствуйте! Подскажите пожалуйста. Я создаю базу MySQL с помощью mysql_create_db. А как.

Читайте также: