Как найти битую ссылку в регистре

Выявление битых ссылок в регистре сведений реестр документов

Я
   NIGHTHUNTER

30.08.22 — 11:57

Подскажите пожалуйста, как найти битые ссылки в регистре сведений реестр документов?

Из за них, сбивается список документов Конфигурация ERP, Казначейство -> Взаимозачеты задолженности.

   6awkup_true

1 — 30.08.22 — 12:02

1) запросом

2) получением объекта и сравнением с неопределено

3) приведения ссылки к строке и поиском текста «Объект не найден»

   NIGHTHUNTER

2 — 30.08.22 — 12:03

(1) в консоле можно это сделать?

   RomanYS

3 — 30.08.22 — 12:04

(2) в консоли запросов точно можно выполнить запрос

   6awkup_true

4 — 30.08.22 — 12:07

вот пример запроса

ВЫБРАТЬ

    РегистрСБитымиСсылками.Организация КАК Организация

ИЗ

    РегистрСведений.РаботникиОрганизаций КАК РегистрСБитымиСсылками

        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации КАК ОбъектБитыхСсылок

        ПО РегистрСБитымиСсылками.Организация = ОбъектБитыхСсылок.Ссылка

ГДЕ

    НЕ РегистрСБитымиСсылками.Организация ЕСТЬ NULL

    И РегистрСБитымиСсылками.Организация.Код ЕСТЬ NULL

   Галахад

5 — 30.08.22 — 12:07

(0) В запросе проверяй реквизит документа на NULL. Например обязательный реквизит «Номер».

   СеменовСемен

6 — 30.08.22 — 12:08

(5) лучше ссылку

   NIGHTHUNTER

7 — 30.08.22 — 12:08

Что я могу в нем выявить, или как его нужно доработать?

ВЫБРАТЬ

    РеестрДокументов.Ссылка КАК Ссылка,

    РеестрДокументов.ДатаДокументаИБ КАК ДатаДокументаИБ

ИЗ

    РегистрСведений.РеестрДокументов КАК РеестрДокументов

ГДЕ

    РеестрДокументов.ДатаДокументаИБ >= &ДатаДокументаИБ

            И РеестрДокументов.ДатаДокументаИБ <= &ДатаДокументаИБ

   6awkup_true

8 — 30.08.22 — 12:08

(6) ссылка должна быть не NULL, а вот реквизит по ссылке — NULL

   NIGHTHUNTER

9 — 30.08.22 — 12:10

ничего не выбирается

ВЫБРАТЬ

    РеестрДокументов.Ссылка КАК Ссылка,

    РеестрДокументов.ДатаДокументаИБ КАК ДатаДокументаИБ

ИЗ

    РегистрСведений.РеестрДокументов КАК РеестрДокументов

ГДЕ

    РеестрДокументов.ДатаДокументаИБ >= &ДатаДокументаИБ

    И РеестрДокументов.ДатаДокументаИБ <= &ДатаДокументаИБ

    И РеестрДокументов.Ссылка ЕСТЬ NULL

   RomanYS

10 — 30.08.22 — 12:10

(7) где  РеестрДокументов.Ссылка.Ссылка Есть NULL

   СеменовСемен

11 — 30.08.22 — 12:11

(8) как раз и была речь про реквизит. который называется Ссылка

   RomanYS

12 — 30.08.22 — 12:11

(9) РеестрДокументов.Ссылка может быть битой, но не может быть NULL

   NIGHTHUNTER

13 — 30.08.22 — 12:15

Я нашел их

http://joxi.ru/KAgREMdc5P8Jo2

что и как сейчас с ними нужно сделать? Подскажите пожалуйста?

Как от них избавиться?

   6awkup_true

14 — 30.08.22 — 12:16

(13) ТиИ с исправлением битых ссылок

   NIGHTHUNTER

15 — 30.08.22 — 12:16

В самом же регистре если поставить этот период их нет.

Как сейчас нужно их правильно обработать?

   NIGHTHUNTER

16 — 30.08.22 — 12:17

(14) То есть запускать в конфигураторе ТиИ ?

Это на сколько времени? С какими галками?

   NIGHTHUNTER

17 — 30.08.22 — 12:17

(14) Другими способами можно решить?

   RomanYS

18 — 30.08.22 — 12:19

(17) удали записи, если они не нужны

   NIGHTHUNTER

19 — 30.08.22 — 12:20

С какими галками? http://joxi.ru/DmBK7Equqn7ya2

Мне это нужно делать в тестовой, потом в рабочей.

   NIGHTHUNTER

20 — 30.08.22 — 12:20

(18)  Конечно не нужны, они же мешают, битые ссылки.

Как я их удалю? Я и спрашиваю как, в списке регистра сведений то их нет.

   NIGHTHUNTER

21 — 30.08.22 — 12:25

Я даже знаю номер документа по полю НомерДокументаИБ и его тип.

То есть это эти документы которые нужно удалить что бы не сбоило?

А как так, документы есть, а какие то ссылки битые?

Как сейчас лучше сделать?

   NIGHTHUNTER

22 — 30.08.22 — 12:31

То есть есть 2 документа.

Ссылка — Объект не найден.

Подскажите мне как это устранить? Я не знаю!

   NIGHTHUNTER

23 — 30.08.22 — 12:32

http://joxi.ru/n2YpYzvCklE8xm

Как это получилось?

Что с этим можно сделать?

   RomanYS

24 — 30.08.22 — 12:33

(20) >>Как я их удалю?

Создать набор записей, установить отбор, записать набор. Не перепутай!

   1Сергей

25 — 30.08.22 — 12:33

В регистре должны быть. Как-то не так смотришь

   NIGHTHUNTER

26 — 30.08.22 — 12:34

(25) руками тогда и удалить?

   NIGHTHUNTER

27 — 30.08.22 — 12:40

(25) да нашел, но там не написано что это объект не обнаружен

   NIGHTHUNTER

28 — 30.08.22 — 12:40

(25) виид документа стоял другой

   Фрэнки

29 — 30.08.22 — 12:41

Как устранить… Ты их видишь в форме списка — проваливаешься в форму записи — там кнопка Еще и доступна Удалить

Если точно известно, допустим, что через сравнение списков глазками увидели, что документ Задолженность есть, а в Реестре его нет — перезаписываем документ и он там появится.

Ссылки в реестре с отметками «объект не найден» это точно не те документы, которые есть, но ссылка из не находит. Когда ссылка от этого объекта, не найти свой объект невозможно.

Блин… ну что за мистазависимость такая

   NIGHTHUNTER

30 — 30.08.22 — 12:42

(25) Хотя нет я ничего не нашел, там висит, а нашел я их в журнале самом этих документов

   NIGHTHUNTER

31 — 30.08.22 — 12:43

Все я их нашел в регистре сведений реестр документов. но они там задвоены. И даты разные.

   NIGHTHUNTER

32 — 30.08.22 — 12:44

(31) Точнее время, пара документов провелась в одну и туже секунду

   NIGHTHUNTER

33 — 30.08.22 — 12:45

   Фрэнки

34 — 30.08.22 — 12:45

Найти битые ссылки запросом. Этот вопрос много раз задавался и гуглится прекрасно.

Суть в том, что битая ссылка в реестре документов просто никак и нигде не отображается. Поэтому выявленные можно просто удалять. Любым известным способом.

   NIGHTHUNTER

35 — 30.08.22 — 12:46

(34) вот они выявлены http://joxi.ru/n2YpYzvCklE8xm

я не знаю что с ними можно дальше делать

   Фрэнки

36 — 30.08.22 — 12:49

(33) я бы все записи этого вида документов отобрал и удалил, не заморачиваясь дубли это или что-то еще.

И можно пересоздать все записи для вида документа, например перезаписью документов групповой обработкой. Но это как кувалдой муху пришлопнуть.

Или написать маленькую обработку. Тогда будет как микроскопом муху пришлопнуть.

   МимохожийОднако

37 — 30.08.22 — 13:08

(36) ОФФ. А есть что-нибудь вместо кувалды или микроскопа? )) Народ волнуется.

   NIGHTHUNTER

38 — 30.08.22 — 13:09

Всего 2 документа.

   NIGHTHUNTER

39 — 30.08.22 — 13:09

Я в ручную сделаю, понимать бы что. я запутался.

   МимохожийОднако

40 — 30.08.22 — 13:10

(39) Эта пАнимаИшь со временем иногда приходит

   NIGHTHUNTER

41 — 30.08.22 — 13:10

От куда при формировании вот этого списка документов Конфигурация ERP, Казначейство -> Взаимозачеты задолженности,

помешали ссылки на документы ЭтапПроизводства2_2 ?

   Галахад

42 — 30.08.22 — 13:22

Набор = РегистрыСведений.ТвойРег.СоздатьНаборЗаписей();

Набор.Отбор.Регистратор.Установить(ТутБитаяСсылка);

Набор.Записать(Истина);

   Джинн

43 — 30.08.22 — 13:24

Жители планеты Извр! Откройте для себя Инструменты разработчика.

   Галахад

44 — 30.08.22 — 13:24

(43) Думаешь осилит?

  

NIGHTHUNTER

45 — 30.08.22 — 14:22

(43) Они есть для ERP, управляемых форм?

 +6 

   

Распечатать

Как в запросе отобрать битые ссылки, поиск Битых Ссылок

Когда объект был удален непосредственно, то все ссылки на него в справочниках, в документах, в регистрах стали битыми и отображаются следующим образом:<Объект не найден> (16:bca8000c6efdd52111d8eaba7c9706eb)
Битая ссылка не является пустой. Т.е. метод Пустая() возвращает Ложь. Определить, что ссылка битая можно так:

Код 1C v 8.х

 Если Ссылка.ПолучитьОбъект() = Неопределено Тогда 
//битая ссылка
КонецЕсли;
// или так (НО ненадежно):
Если Лев(СокрЛП(Ссылка),18) = "<Объект не найден>" Тогда

Код 1C v 8.х

 // Еще вариант (действует для обьектов, которые имеют ссылку)
Попытка
обьект=Ссылка.Ссылка;
Исключение
сообщить("битая");
КонецПопытки;

И последний вариант для проверки в запросах:
ГДЕ Объект.РеквизитОбъекта ЕСТЬ NULL И Не Объект=&ПустаяСсылкаОбъекта

Ниже дана программа для удаления записей регистров, у которых регистратор — битая ссылка, т.е. не существует в базе.

Код 1C v 8.х

 Процедура УдалениеБитыхСсылок(ИмяРегистра,ТипРегистра,ТипРегистраЗ)
МенеджерРегистра = ТипРегистра[ИмяРегистра];

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

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Набор = ТипРегистра[ИмяРегистра].СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(Выборка.Регистратор);
Набор.Записать();
ОбработкаПрерыванияПользователя();
Состояние(""+ТипРегистра+" "+ИмяРегистра);
КонецЦикла;
КонецПроцедуры

Процедура КнопкаВыполнитьНажатие(Кнопка)

Для Каждого пРегистр из Метаданные.РегистрыСведений Цикл
Подчинен = (пРегистр.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.ПодчинениеРегистратору);
Если Подчинен Тогда
УдалениеБитыхСсылок(пРегистр.Имя,РегистрыСведений,"РегистрСведений")
КонецЕсли;
КонецЦикла;

Для Каждого пРегистр из Метаданные.РегистрыБухгалтерии Цикл
УдалениеБитыхСсылок(пРегистр.Имя,РегистрыБухгалтерии,"РегистрБухгалтерии")
КонецЦикла;

Для Каждого пРегистр из Метаданные.РегистрыРасчета Цикл
УдалениеБитыхСсылок(пРегистр.Имя,РегистрыРасчета,"РегистрРасчета")
КонецЦикла;

Для Каждого пРегистр из Метаданные.РегистрыНакопления Цикл
УдалениеБитыхСсылок(пРегистр.Имя,РегистрыНакопления,"РегистрНакопления")
КонецЦикла;

КонецПроцедуры

  • Главная
  •  / 
  • Статьи
  •  / 
  • Программирование на 1С:Предприятие
  •  / 
  • Проверка на битую ссылку в 1С 8

Если речь идет о регистре, допустим, о пустом значении одного из его измерений, то в запросе поможет подобная инструкция:


	...
ИЗ    
РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах ГДЕ     ПартииТоваровНаСкладах.ДокументОприходования.Ссылка ЕСТЬ NULL

Такой запрос поможет, если необходимо проверить на пустую ссылку измеренияДокументОприходования.

В некоторых случаях необходимо проверять на NULL не саму ссылку, а ее представление:

ГДЕ ПартииТоваровНаСкладах.ДокументОприходования.Ссылка.Представление ЕСТЬ NULL

Рассмотрим другие способы проверки на битые ссылки на платформе 1С

Cпособ через конвертацию в строку:

Найти(Строка(Ссылка),"<Объект не найден>") <> 0

Есть еще способ через функцию ПолучитьОбъект():

Ссылка.ПолучитьОбъект() = Неопределено

Это будет выполняться только в случае, если ссылка битая.

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

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

Читайте также: Удаление битых и пустых ссылок в 1С

Возврат к списку

рубрики: Разное | Дата: 11 мая, 2017

Сегодня поговорим о причинах возникновении битых ссылок в 1С, их поиске и возможном исправлении. Многие сталкивались с ситуацией, когда в каком-нибудь из реквизитов документа, справочника, регистра и т.д. вместо ожидаемого наименования объекта можно увидеть вот такую надпись:


Это говорит о том, что в поле текущего объекта записана ссылка на какой-то объект базы данных, но физически этого объекта в базе данных не существует.
Как правило это говорит о том, что объект базы данных был удален без предварительной проверки ссылок на него.

Искусственное создание битой ссылки.

Давайте искусственно воспроизведем данную ситуацию. Пусть у нас есть справочник Товары и регистр сведений Цены, в котором хранятся записаны цены товаров. И есть товар Дырокол с соответствующей ценой:


А теперь напишем и выполним процедуру, которая удалит элемент Дырокол из справочника Товары




&НаСервереБезКонтекста
Процедура СоздатьБитуюСсылкуНаСервере()

	СправочникОбъект = Справочники.Товары.НайтиПоНаименованию("Дырокол").ПолучитьОбъект();
	СправочникОбъект.Удалить();

КонецПроцедуры

В результате получаем битую ссылку в регистре сведений Цены


Поэтому, если есть острая необходимость не просто пометить какие-либо объекты на удаление, а программно удалить их насовсем из базы данных, необходимо предварительно выполнить поиск ссылок на эти объекты с помощью функции НайтиПоСсылкам(<МассивСсылок>). В качестве обязательного параметра в эту функцию передается массив со ссылками на проверяемые объекты. Можно также передавать дополнительные параметры, которые позволяют сузить область поиска. Возвращает эта функция таблицу значений со списком объектов, в которых были найдены ссылки на искомые объекты.
Также можно воспользоваться функцией УдалитьОбъекты(<МассивСсылок>), которая удаляет из базы данных объекты, переданные в массиве, но только те на которые не найдено ссылок. А еще лучше пользоваться стандартной схемой удаления объектов из базы данных, т.е. сначала помечать их на удаление, а потом уже удалять окончательно при помощи стандартной обработки, в которую уже встроен контроль ссылочной целостности.

Ситуацию по созданию битой ссылки можно воспроизвести и в пользовательском режиме, без использования программного кода. Это становится возможным, когда у пользователя есть роль в которой для данного типа объекта (в нашем случае это справочник Товары) отмечены права Удаление и одно из следующих прав: Интерактивное удаление, Интерактивное удаление помеченных, Интерактивное удаление предопределенных, Интерактивное удаление помеченных предопределенных.


В этом случае у пользователя появляется возможность не просто установить пометку удаления, а используя горячие клавиши Shift + Delete Удалить объект из базы данных без контроля ссылочной целостности. Поэтому, как правило, эти права отключены даже для администраторов.

Поиск битых ссылок

Допустим, что мы предполагаем наличие битых ссылок в каком-либо объекте. Сразу же возникает вопрос их поиска. Рассмотрим два варианта как это можно сделать программными средствами.

1. С использованием метода ПолучитьОбъект()

Рассмотрим самый простой пример — поиск битых ссылок в реквизите справочника. Пусть в справочнике Товары у нас есть реквизит Поставщик. И есть подозрение, что кто-то удалил поставщика без проверки. Переберем все товары и в каждом товаре проверим поставщика. Суть метода заключается в том, что ссылка у нас есть, а по сути ссылка — это уникальный идентификатор объекта, но самого объекта нет, поэтому метод ПолучитьОбъект() вернет Неопределено.




ВыборкаТовары = Справочники.Товары.Выбрать();

Пока ВыборкаТовары.Следующий() Цикл

	ПоставщикСсылка = ВыборкаТовары.Поставщик;

	Если НЕ ПоставщикСсылка.Пустая() И ПоставщикСсылка.ПолучитьОбъект() = Неопределено Тогда

		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = "Найдена битая ссылка на поставщика в товаре: " + ВыборкаТовары.Наименование;
		Сообщение.Сообщить();

	КонецЕсли;

КонецЦикла;

2. С использованием языка запросов 1С

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




Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	Товары.Представление КАК Товар
|ИЗ
|	Справочник.Товары КАК Товары
|ГДЕ
|	Товары.Поставщик.Ссылка ЕСТЬ NULL 
|	И Товары.Поставщик <> ЗНАЧЕНИЕ(Справочник.Поставщики.ПустаяСсылка)";

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл

	Сообщение = Новый СообщениеПользователю;
	Сообщение.Текст = "Найдена битая ссылка на поставщика в товаре: " + Выборка.Товар;
	Сообщение.Сообщить();

КонецЦикла;

Исправление битых ссылок

Чисто теоретически мы можем программно создать объект с тем же самым уникальным идентификатором который хранится в соответствующем поле записи с битой ссылкой. Немного модифицируем код, где мы искали битую ссылку. Получим запросом ссылку на несуществующий объект, при обходе выборки найдем его уникальный идентификатор и создадим нового поставщика с тем же самым уникальным идентификатором:




Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	Товары.Поставщик КАК Поставщик
|ИЗ
|	Справочник.Товары КАК Товары
|ГДЕ
|	Товары.Поставщик.Ссылка ЕСТЬ NULL
|	И Товары.Поставщик <> ЗНАЧЕНИЕ(Справочник.Поставщики.ПустаяСсылка)";

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл

	УИД = Выборка.Поставщик.УникальныйИдентификатор();
	ПоставщикСсылка	= Справочники.Поставщики.ПолучитьСсылку(УИД);

	ПоставщикОбъект	= Справочники.Поставщики.СоздатьЭлемент();
	ПоставщикОбъект.УстановитьСсылкуНового(ПоставщикСсылка);
	ПоставщикОбъект.Наименование = "ООО Канцтовары";
	ПоставщикОбъект.Записать();

КонецЦикла;

Конечно на практике это вряд ли можно применить, т.к. необходимо будет заполнить все реквизиты вновь созданного объекта, которые нам неизвестны. Этот пример скорее показателен в плане создания объекта с заданным уникальным идентификатором.

Более реалистичным выглядит вариант с восстановлением резервной копии базы данных и переносом из нее удаленных объектов в рабочую базу. В частности можно попытаться сделать это с помощью стандартной обработки с диска ИТС ВыгрузкаЗагрузкаДанныхXML.

Содержание:

  1. Выборка объектов с помощью запроса
  2. Использование объектной модели
  3. Поиск подстроки 1С «Объект не найден» в представлении ссылки

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

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

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

1.    Выборка объектов с помощью запроса

Первый способ: выборка объектов информационной базы с «битыми» ссылками в 1С с помощью запроса.

ТекстЗапроса =

    «ВЫБРАТЬ

    |       ПеремещениеТоваров.Ссылка КАК Ссылка

    |ИЗ

    |       Документ.ПеремещениеТоваров КАК ПеремещениеТоваров

    |ГДЕ

    |       НЕ ПеремещениеТоваров.СкладОтравитель ЕСТЬ NULL

    |       И ПеремещениеТоваров.СкладОтравитель.Ссылка ЕСТЬ NULL».

В данном случае мы с помощью запроса производим поиск документов «Перемещение товаров», у которых «битая» ссылка на склад-отправитель. Для этого в условии отбора убеждаемся, что ссылка на склад-отправитель в принципе не пустая(часть условия «ГДЕ»: «НЕ ПеремещениеТоваров.СкладОтравитель ЕСТЬ NULL») и, если это так, то проверяем ссылку на «битость»(часть условия «ГДЕ»: «ПеремещениеТоваров.СкладОтравитель.Ссылка ЕСТЬ NULL»).

Во второй части условия «ГДЕ» («ПеремещениеТоваров.СкладОтравитель.Ссылка ЕСТЬ NULL») вместо «Ссылка» можно использовать другие реквизиты склада-отправителя, например, «Код» («ПеремещениеТоваров.СкладОтравитель.Код ЕСТЬ NULL») – в таком случае мы также сможем отобрать перемещения с «битыми» ссылками на склад-отправитель.

Следует оговорить ситуацию, когда нужно произвести выборку объектов с битыми ссылками в 1С, но при этом поле объекта, в котором возможна «битая» ссылка, имеет составной тип, а нам требуется найти «битые» ссылки только определенного типа. Например, если в нашем случае склад-отправитель имеет составной тип «Склады» + «Подразделения организаций», а нам нужно отобрать только перемещения с «битыми» складами-отправителями типа «Подразделения организаций», в текст нашего запроса в условие «ГДЕ» добавится часть «ПеремещениеТоваров.СкладОтравитель ССЫЛКА Справочник.ПодрадзделенияОрганизаций». Запрос примет следующий вид:

«ВЫБРАТЬ

    |       ПеремещениеТоваров.Ссылка КАК Ссылка

    |ИЗ

    |       Документ.ПеремещениеТоваров КАК ПеремещениеТоваров

    |ГДЕ

    |       ПеремещениеТоваров.СкладОтравитель ССЫЛКА Справочник.ПодрадзделенияОрганизаций

    |       И НЕ ПеремещениеТоваров.СкладОтравитель ЕСТЬ NULL

    |       И ПеремещениеТоваров.СкладОтравитель.Ссылка ЕСТЬ NULL».  

2.    Использование объектной модели

Второй способ: определение «битой» ссылки с использованием объектной модели данных 1С.

При данном способе для поиска «битых» ссылок используется метод ПолучитьОбъект() платформы 1С по ссылке на объект информационной базы, который возвращает «Неопределено» в случаях с «битыми» ссылками:

Если ЗначениеЗаполнено(ДокументПеремещения.СкладОтправитель) И (ДокументПеремещения.СкладОтправитель.ПолучитьОбъект() = Неопределено) Тогда

// Здесь выполняется требуемый код обработки найденного объекта с «битой» ссылкой.

КонецЕсли;

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

Если (ТипЗнч(Объект.СкладОтравитель) = Тип(«СправочникСсылка.ПодрадзделенияОрганизаций»)) И ЗначениеЗаполнено(ДокументПеремещения.СкладОтправитель) И (ДокументПеремещения.СкладОтправитель.ПолучитьОбъект() = Неопределено) Тогда

        // Здесь выполняется требуемый код обработки найденного объекта с «битой» ссылкой.

    КонецЕсли.  

3.    Поиск подстроки «Объект не найден» в представлении ссылки

Третий способ: поиск подстроки «Объект не найден» в представлении ссылки.

    Если СтрНайти(ДокументПеремещения.СкладОтправитель, «Объект не найден») > 0 Тогда

        // Здесь выполняется требуемый код обработки найденного объекта с «битой» ссылкой.

    КонецЕсли;

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

При это нужно быть аккуратным – используя в коде поиск «битых» ссылок по подстроке «Объект не найден», нужно учитывать, что подстрока «Объект не найден» в представлении «битой» ссылки может изменяться в зависимости от языка, используемого в «региональных установках информационной базы».

Специалист компании «Кодерлайн»

Аскер Жансуев

Понравилась статья? Поделить с друзьями:
  • Оловянное что это за ошибка как исправить
  • Как найти аву для стандофф
  • Xpath как найти второй элемент
  • Как найти людей проводников
  • Ошибка а01 котел ферроли как исправить