1с как найти объект по битой ссылке

Содержание:

  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 Тогда

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

    КонецЕсли;

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

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

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

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

Когда кто-то удаляет данные из базы без проверки ссылок на эти объекты, то везде где этот объект использовался появляется сообщение вида: <Объект не найден> (84:bf5600145e3710ab11dda4c605dbe824) .
title
В данной статье я опишу пример быстрого восстановления данных.

Для пользователя:
Скачиваете эту обработку восстановления объектов по GUID :
Для 1С 8.1:
здесь или Скачивать файлы может только зарегистрированный пользователь!
Для 1С 8.2:
Скачивать файлы может только зарегистрированный пользователь!


!!! Новая Версия!!! 8.2 и 8.3 – Скачивать файлы может только зарегистрированный пользователь! Подробное описание: Объект не найден в 1С или про Битые ссылки 1С


и открываете ее в программе:
1. Копируем фразу <Объект не найден… и вставляем в поле Объект не найден, жмем на кнопку GUID -> и получаем 05dbe824-a4c6-11dd-bf56-00145e3710ab
title

2. Если Вы знаете что удалили, то можете сразу нажать кнопку Создать Объект Из GUID – Пункт 4.
3. Если Вы не знаете что удалили, тогда вам нужно поднять архивную копию базы, открыть там обработку и вставить полученный GUID в поле GUID.
далее нажать Ссылку -> и в правом поле отобразится необходимый Вам объект(в моем случае Попов Роман Владимирович).
Открыв его, узнаем что это справочник Сотрудники и всю содержащуюся в справочнике информацию. Возвращаемся в базу, где необходимо восстановить объект и жмем кнопку Создать Объект Из GUID
title
4. Из открывшегося списка выбираем Справочник Сотрудники, в открывшейся форме заполняем все поля данными из архивной базы и жмем OK. Все, данный объект восстановлен.

Для быстрого поиска всех <Объект не найден> используйте Поиск в базе битых ссылок – “объект не найден”


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

Код 1C v 8.х

  ГУИДССЫЛКИ	= СсылкаНаОбъект.УникальныйИдентификатор();    

Для того чтобы преобразовать <Объект не найден> (84:bf5600145e3710ab11dda4c605dbe824) в УникальныйИдентификатор (GUID)

Код 1C v 8.х

 	// ГУИДУдОбъкта =  <Объект не найден> (84:bf5600145e3710ab11dda4c605dbe824)
ГУИДУдОбъктаСтр = СтрЗаменить(ГУИДУдОбъкта,"<Объект не найден> (","");
ГУИДУдОбъктаСтр = СтрЗаменить(ГУИДУдОбъктаСтр,")","");
ГУИДУдОбъктаСтр = СтрЗаменить(ГУИДУдОбъктаСтр,"0x","");
ГУИДУдОбъктаСтр = Сред(ГУИДУдОбъктаСтр, Найти(ГУИДУдОбъктаСтр,":")+1, СтрДлина(ГУИДУдОбъктаСтр));
// Преобразуем GUID
ГУИД = Сред(ГУИДУдОбъктаСтр,25,8)+"-"+Сред(ГУИДУдОбъктаСтр,21,4)+"-"+Сред(ГУИДУдОбъктаСтр,17,4)+"-"+Сред(ГУИДУдОбъктаСтр,1,4)+"-"+Сред(ГУИДУдОбъктаСтр,5,12); //и получаем ГУИД = 05dbe824-a4c6-11dd-bf56-00145e3710ab

Для получения ссылки по уникальному идентификатору, используйте код:

Код 1C v 8.х

  	// ГУИД = 05dbe824-a4c6-11dd-bf56-00145e3710ab  
// Ссылка будет установлена в переменную СсылкаНаОбъектГуид
УникальныйИдентификатор = Новый УникальныйИдентификатор(ГУИД)
// все объекты по которым можно получить ссылку
Если ПолучитьСсылкуНоМенеджеруОбъекта(Справочники,УникальныйИдентификатор) Тогда
ИначеЕсли ПолучитьСсылкуНоМенеджеруОбъекта(Документы,УникальныйИдентификатор) Тогда
ИначеЕсли ПолучитьСсылкуНоМенеджеруОбъекта(ПланыВидовХарактеристик,УникальныйИдентификатор) Тогда
ИначеЕсли ПолучитьСсылкуНоМенеджеруОбъекта(ПланыСчетов,УникальныйИдентификатор) Тогда
ИначеЕсли ПолучитьСсылкуНоМенеджеруОбъекта(ПланыОбмена,УникальныйИдентификатор) Тогда
ИначеЕсли ПолучитьСсылкуНоМенеджеруОбъекта(БизнесПроцессы,УникальныйИдентификатор) Тогда
ИначеЕсли ПолучитьСсылкуНоМенеджеруОбъекта(Задачи,УникальныйИдентификатор) Тогда
КонецЕсли;

// ПолучитьСсылкуНоМенеджеруОбъекта()
Функция ПолучитьСсылкуНоМенеджеруОбъекта(ОбъектыМенеджер,УникальныйИдентификатор)
Для Каждого Менеджер Из ОбъектыМенеджер Цикл
СсылкаНаОбъектГуид = Менеджер.ПолучитьСсылку(УникальныйИдентификатор);

Если СсылкаНаОбъектГуид.ПолучитьОбъект() <> Неопределено Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции

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

Код 1C v 8.х

 	// ТекGUID = 05dbe824-a4c6-11dd-bf56-00145e3710ab 
Попытка
УникальныйИд = Новый УникальныйИдентификатор(ТекGUID);
Исключение
Возврат;
КонецПопытки;
КартинкаСпр=БиблиотекаКартинок.Справочник;
КартинкаДок=БиблиотекаКартинок.Документ;
СписокВыбора = Новый СписокЗначений;
СписокВыбора.Добавить(null,"СПРАВОЧНИКИ");
Для каждого ЭлементМетаданных Из Метаданные.Справочники Цикл
Структурка=Новый Структура;
Структурка.Вставить("Имя",ЭлементМетаданных.Имя);
Структурка.Вставить("Тип",1);
СписокВыбора.Добавить(Структурка,ЭлементМетаданных.Синоним,,КартинкаСпр);
КонецЦикла;
СписокВыбора.Добавить(null,"ДОКУМЕНТЫ");
Для каждого ЭлементМетаданных Из Метаданные.Документы Цикл
Структурка=Новый Структура;
Структурка.Вставить("Имя",ЭлементМетаданных.Имя);
Структурка.Вставить("Тип",2);
СписокВыбора.Добавить(Структурка,ЭлементМетаданных.Синоним,,КартинкаДок);
КонецЦикла;
Результат=СписокВыбора.ВыбратьЭлемент("Выберите тип ссылки");
Если Результат=Неопределено Тогда
Возврат;
КонецЕсли;
Структурка=Результат.Значение;
Если Структурка=null Тогда
Возврат;
КонецЕсли;

НовыйОбъект=Неопределено;
Если Структурка.Тип=1 Тогда
Объект=Справочники[Структурка.Имя].СоздатьЭлемент();
Объект.ОбменДанными.Загрузка=Истина;
Объект.УстановитьСсылкуНового(Справочники[Структурка.Имя].ПолучитьСсылку(УникальныйИд));
Иначе
Объект=Документы[Структурка.Имя].СоздатьДокумент();
Объект.ОбменДанными.Загрузка=Истина;
Объект.УстановитьСсылкуНового(Документы[Структурка.Имя].ПолучитьСсылку(УникальныйИд));
КонецЕсли;

Форма=Объект.ПолучитьФорму();
Форма.Открыть();

Для 1С 7.7 смотрите:
Технология восстановления удаленных объектов или элементов в 1С 7.7

еще можно получить ИдентификаторДокумента при OLE доступе:
Код 1C v 7.x

 Если Док_Источник.ВыбратьДокументы(ВыбНачПериода,ВыбКонПериода) = 1 Тогда
Пока Док_Источник.ПолучитьДокумент() = 1 Цикл
Объект = БазаОле.ЗначениеВстрокуВнутр(Док_Источник.ТекущийДокумент());
ИдентификаторДокумента = СокрЛП(ПолучитьИД(Объект));

// Для примера Объект возвращает {"O","0","0","3114","0","0"," 258156CB "},
// а ПолучитьИД(объект) = 258156CB
КонецЦикла;

Еще посмотрите метод:
ЗначениеВСтрокуВнутр(<?>);
Синтаксис:
ЗначениеВСтрокуВнутр(<Объект>)
Назначение:
Преобразование значения объекта агрегатного типа в строковое системное представление.
Возвращает: представление значения объекта в строковом системном виде.
Параметры:
<Объект> – значение объекта агрегатного типа данных которое нужно преобразовать.
Подробнее см. в документации, глава ”Системные процедуры и функции”

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

Причины, поиск и исправление битых ссылок

При возникновении любой ошибки мы стараемся не только нивелировать ее последствия, но и предотвратить ее возникновение в будущем. Чтобы не допустить повторного появления ссылок на удаленные объекты, нам необходимо понять причины их появления в базах 1С 8.3. Обычно подобные явления, называемые битыми ссылками, возникают из-за следующих нюансов:

Планшет

Приглашаем на
бесплатный вебинар!

06 июня в 11:00 мск

1 час

  1. Недостаточно безопасно настроены права, из-за чего у пользователей есть возможность прямого удаления элементов базы данных. Обычно простым пользователям не дают права на удаление во избежание подобных ситуаций;
  2. Случайное программное удаление данных. Для недопущения битых ссылок используйте функцию «УдалитьОбъекты», передавая объекты в нее в виде массива ссылок. Эта функция проверяет, есть ли в базе ссылки на удаляемые объекты, и стирает только неиспользуемые данные;
  3. Неверно настроенный обмен данными. Здесь совет один – при создании обмена между различными базами стоит быть внимательнее и проверить все ключевые реквизиты.
Рис.1 Тестирование и исправление ИБ
Рис.1 Тестирование и исправление ИБ

После того, как мы разобрались с причинами, нам предстоит исправить сложившуюся ситуацию. Для этого необходимо найти битые ссылки и удалить или исправить их. Для этих целей платформа 1С имеет функционал тестирования и исправления, встроенный в конфигуратор. Чтобы его запустить, необходимо зайти в меню «Администрирование» – «Тестирование и исправление», настроить параметры и нажать «Выполнить». Если оптимизация и ускорение работы 1С вызывает у вас сложности, обратитесь к нашим специалистам по сопровождению 1С.

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

Для программного поиска обычно используют один из двух методов – с помощью языка запросов или через функцию «ПолучитьОбъект». Рассмотрим пример, когда нам необходимо найти ссылки на удаленного поставщика в документах «ПриобретениеТоваровУслуг». Выберем все документы, где значение поля «Партнер» не равно пустой ссылке, то есть заполнено, и есть NULL. Этот метод хорош тем, что можно установить дополнительные отборы или взять сразу несколько типов документов.


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

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

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

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
         ДокументДляИсправления =ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
         ДокументДляИсправления.Партнер = Справочники.Партнеры.ПустаяСсылка();
         // код для замены на другого партнера(предварительно он должен быть создан)
         //ДокументДляИсправления.Партнер = Справочники.Партнеры.НайтиПоНаименованию("ПартнерДляБитыхСсылок");
         ДокументДляИсправления.Записать() ;
КонецЦикла;

Результатом запроса будет перечень документов с битыми ссылками. Чтобы их удалить, мы получаем объект каждого документа по ссылке, заменяем реквизит «Партнер» на пустую ссылку и записываем документ. Также можно заменить «<Объект не найден…>.» на другого партнера или попробовать восстановить данные из резервной копии.

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

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


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

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

По всем вопросам, связанным с оптимизацией работы 1С, обращайтесь за консультацией по 1С по телефону, а также оставляйте заявки на нашем сайте. Наши специалисты свяжутся с вами в кратчайшие сроки.

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

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


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

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

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


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




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

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

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

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


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

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


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

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

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

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

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




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

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

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

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

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

	КонецЕсли;

КонецЦикла;

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

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




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

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

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

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

КонецЦикла;

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

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




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

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

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

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

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

КонецЦикла;

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавить комментарий