Как определить объект не найдет

<Объект не найдет>, как красиво проверить?

Я
   Pro1001C

23.08.19 — 15:13

Получил ссылку по гуид, как красиво и правильно проверить, что это существующая ссылка, а не <Объект не найден>?

   ДНН

1 — 23.08.19 — 15:15

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

   RomanYS

2 — 23.08.19 — 15:17

(0) либо запросом, либо (1)

+С правами могут быть нюансы

   KnightAlone

3 — 23.08.19 — 15:23

СсылкаНаДок = Документы.ВедомостьНаВыплатуЗарплатыВБанк.ПолучитьСсылку(УИД);

НашлийНужныйТип = СсылкаСуществует(СсылкаНаДок);

//проверяем, получили ли по UID объект или нет

Функция СсылкаСуществует(ЛюбаяСсылка) Экспорт

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

    |ВЫБРАТЬ

    |    Ссылка КАК Ссылка

    |ИЗ

    |    [ИмяТаблицы]

    |ГДЕ

    |    Ссылка = &Ссылка

    |»;

    
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, «[ИмяТаблицы]», ЛюбаяСсылка.Метаданные().ПолноеИмя());

    
    Запрос = Новый Запрос;

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

    Запрос.УстановитьПараметр(«Ссылка», ЛюбаяСсылка);

    
    Возврат НЕ Запрос.Выполнить().Пустой();

    
КонецФункции

   Pro1001C

4 — 23.08.19 — 15:29

Спасибо!

   1Садовник

5 — 23.08.19 — 15:36

(0) ЗначениеЗаполнено(Ссылка.ВерсияДанных)

   GGDots

6 — 23.08.19 — 15:42

   Oftan_Idy

7 — 23.08.19 — 16:03

(0) Самый быстрый способ это привести к Строке, и в строке найти слово «<объект не найден»

   lodger

8 — 23.08.19 — 16:10

(7) все равно чтение базы для получения представления сделает. поэтому разница в между условно 19 и 20 мс.

   RomanYS

9 — 23.08.19 — 16:13

(7) быстрее запроса?

   lodger

10 — 23.08.19 — 16:18

(9) для 1 ссылки может и быстрее. лучше рассмотрите случай с тысячей ссылок.

   dezss

11 — 23.08.19 — 16:21

(10) А разве получение представления — это не запрос к базе? О_о

Или ты про то, что может быть кэшировано?

   lodger

12 — 23.08.19 — 16:24

(11)

сумма операций с явным кастомным запросом

Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр(«Ссылка», ЛюбаяСсылка); + НЕ Запрос.Выполнить().Пустой();

всегда тяжелее в выполнении чем с неявным запросом

Строка(НекаяСсылка)

   Cyberhawk

13 — 23.08.19 — 16:48

(3) Привилегированный режим забыл

   Cyberhawk

14 — 23.08.19 — 16:48

(5) Это уже вариация (1), объект один хрен будет зачитываться целиком

   Cyberhawk

15 — 23.08.19 — 16:49

(7) *овнокод. Может быть и англоязычная нотация.

   Cyberhawk

16 — 23.08.19 — 16:50

(10) (12) Если проверить сразу несколько тогда уж программно собрать кусочный запрос и единоразово его выполнить

   fimanich

17 — 23.08.19 — 17:34

(7) Строку проверить на объект не найден — не самый надежный. Например, в другой локализации (на др. языке) слов таких может не быть.

   Tonik992

18 — 23.08.19 — 17:44

Я считаю, что неверно поставлена цель.

Не «как красиво проверить», а «как эффективно».

На мой взгляд самый эффективный способ в (3).

   RomanYS

19 — 23.08.19 — 17:52

(18) «эффективно» расшифруй.

(3) похоже на «правильно»

(5) похоже на «красиво»

(7) как ни удивительно реально быстро

   Tonik992

20 — 23.08.19 — 17:59

Эффективный с точки зрения обращения к базе данных.

Эффективный с точки зрения скорости выполнения.

   RomanYS

21 — 23.08.19 — 18:14

(20) замер на простом (с точки зрения структуры) справочнике показывает как ни (очень!) странно, что он самый медленный

    Для инд = 1 по 1000 Цикл

        Ссылка = Справочники.Банки.ПолучитьСсылку();

        
        Запрос = Новый Запрос;//2%

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

        «ВЫБРАТЬ

        |    Банки.код

        |ИЗ

        |    Справочник.Банки КАК Банки

        |ГДЕ

        |    Банки.Ссылка = &Ссылка»;

        
        Запрос.УстановитьПараметр(«Ссылка», Ссылка);

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

        
        Есть = НЕ РезультатЗапроса.Пустой();

        
        Ссылка = Справочники.Банки.ПолучитьСсылку();

        Есть = Ссылка.ПолучитьОбъект() <> Неопределено;//25%

        
        Ссылка = Справочники.Банки.ПолучитьСсылку();

        Есть = Найти(«»+Ссылка, «<Объект не») = 0;//16%

        
        Ссылка = Справочники.Банки.ПолучитьСсылку();

        Есть = ЗначениеЗаполнено(Ссылка.ВерсияДанных);//24%

    КонецЦикла;

В комментах результат замера на файловой базе.

   RomanYS

22 — 23.08.19 — 18:15

(21) комментарии про один запрос на тысячу ссылок не принимаются. В такой ситуации всё должно быть очевидно

   palsergeich

23 — 23.08.19 — 18:19

ОбщегоНазначения.СсылкаСуществует

   palsergeich

24 — 23.08.19 — 18:20

(21) А Вы я смотрю знатный изобретатель велосипедов

   RomanYS

25 — 23.08.19 — 18:22

(24) скорее собиратель: все велосипеды из этой ветки

   RomanYS

26 — 23.08.19 — 18:23

(23) там же (3) или что-то альтернативное?

   palsergeich

27 — 23.08.19 — 18:23

(21) Потому что есть подозрение что в этот момент Справочники.Банки.ПолучитьСсылку() платформа что то кеширует, и дальше ты без обращения к БД делаешь быструю операцию, по этому запрос медленнее

   palsergeich

28 — 23.08.19 — 18:23

(26) Одно и то же, он просто еще и листинг привел

   RomanYS

29 — 23.08.19 — 18:26

(27) Не понял.

Справочники.Банки.ПолучитьСсылку() там перед каждой проверкой, ссылки каждый раз разные, что кэширует?

   palsergeich

30 — 23.08.19 — 18:27

(25) + в запросе выбери не код, а ссылку, платформа ужас как не любит обращатся к лкластерному индексу, как бы там не было обращение к этому индексу Код + Ссылка

   palsergeich

31 — 23.08.19 — 18:28

(30) Ой SQL точнее

  

RomanYS

32 — 23.08.19 — 18:31

(30) заменил, результат не поменялся. Было 28.02 стало 27.69

(31) замер на файловой базе

Содержание:

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

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

    КонецЕсли;

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

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

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

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

Перейти к содержимому

Пример:

Ссылка = Справочники.Партнеры.ПолучитьСсылку(Новый УникальныйИдентификатор("d8e9518f-4737-11ea-baa9-ecaa1256a417"));
Если Найти(Строка(Ссылка), "<Объект не найден> (") <> 0 тогда 
	Сообщить("Ссылка битая");
Иначе 
	Сообщить("Ссылка НЕ битая");
КонецЕсли;

Еще пример:

Ссылка = Справочники.Партнеры.ПолучитьСсылку(Новый УникальныйИдентификатор("d8e9518f-4737-11ea-baa9-ecaa1256a417"));
ОбъектПартнер = Ссылка.ПолучитьОбъект();
если ОбъектПартнер = неопределено тогда
	Сообщить("Ссылка битая");
Иначе 
	Сообщить("Ссылка НЕ битая");
КонецЕсли;

Когда кто-то удаляет данные из базы без проверки ссылок на эти объекты, то везде где этот объект использовался появляется сообщение вида: <Объект не найден> (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С:Предприятие сталкивался с такой битой ссылкой* («Объект не найден») хотя бы раз.


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


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

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

  • 1.   Непосредственное удаление объектов без пометки на удаление и контроля ссылочной целостности

В программе 1С:Предприятие при стандартном удалении объектов производится контроль ссылочной целостности, предусматривающий удаление объекта в два этапа:

1) установка пометки на удаление;

2) удаление стандартной процедурой с контролем ссылочной целостности.

Однако этот механизм можно обойти, имея право непосредственного удаления объектов без пометки на удаление и контроля ссылочной целостности (в правах пользователя — право «Интерактивное удаление»). Такое удаление производится сочетанием клавиш «SHIFT + DELETE». В результате непосредственного удаления ссылка на объект становится битой и при ее наличии в других объектах отображается как «Объект не найден».

Решение:

Восстановить объект в этой базе невозможно, поэтому можно воспользоваться одним из способов:

  • При наличии резервных копий информационной базы восстановить последнюю (если она была сделана недавно и от текущей она не отличается) и работать в ней;
  • Если пользователь знает, какой объект был удален: найти копию базы, где присутствует этот объект, воспользоваться обработкой «Выгрузка и загрузка данных XML», которая находится в свободном доступе в интернете, перенести объект из старой базы в новую с помощью данной обработки. Битые ссылки заменятся этим объектом. Если неизвестно, какой объект был удален – можно найти его по уникальному идентификатору в старой базе и перенести его обработкой «Выгрузка и загрузка данных XML».

Рекомендации:

Чтобы избежать таких ошибок в дальнейшем, как вариант — запретить пользователям интерактивное удаление. Также необходимо обеспечить регулярное резервное копирование Информационной базы 1С: Предприятие, чтобы всегда иметь возможность восстановить поврежденные или удаленные данные.

  • 2.  Объект из другой базы. Имеет место обмен с другой информационной базой (Стандартный обмен, обмен в Распределенной информационной базе «РИБ», Универсальный обмен)
  •         2.1  Объект не был выгружен из базы – источника

Решение

В этом случае можно выгрузить объект из Базы – Источника заново,  в результате чего этот объект заменит собой все пустые ссылки.

Используем в качестве примера обмен между базами: 1С: Управление торговлей 11.2 и 1С: Бухгалтерия Предприятия 3.0.

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

Если таких объектов немного, можно найти их в базе-источнике и зарегистрировать к обмену еще раз (например, написать комментарий к объекту и сохранить изменения, тогда он зарегистрируется к обмену автоматически и выгрузится при следующей синхронизации данных).

Также можно зарегистрировать объекты к выгрузке через стандартную обработку «Регистрация изменений для обмена данными». Для этого нужно из списка настроенных синхронизаций данных сначала найти обмен с базой, в которой есть ненайденные объекты, затем выбрать «Состав отправляемых данных» (или найти обработку «Регистрация изменений для обмена данными» во «Всех функциях»).

В обработке нужно выбрать необходимые объекты в дереве с помощью флажков и зарегистрировать:

— все объекты выбранных типов — можно выбрать объект и все его подчиненные объекты;

— объекты выбранных типов с авторегистрацией;

— одиночные объекты (выбрать из списка);

— объекты при помощи отбора (задать отбор для элементов).

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

В результате обмена данными ссылки восстановятся.

Рекомендации:

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

  • 2.2           Распределенная информационная база «РИБ».

Объект был удален

Из периферийной информационной базы в Центральную выгрузили объект с пометкой на удаление, а затем сняли ее. В Центральной базе объект с пометкой был удален, а затем выгружен в периферийную как «Объект не найден».

Решение

Как и при непосредственном удалении без контроля ссылочной целостности, в этом случае можно воспользоваться восстановлением объекта из резервной копии базы данных посредством обработки «Выгрузка и загрузка данных XML» (поставляется в составе конфигурации «Конвертация данных, редакция 2» и находится в свободном доступе в Интернете).

ТЕСТИРОВАНИЕ И ИСПРАВЛЕНИЕ ИНФОРМАЦИОННОЙ БАЗЫ 1С

Если данный объект не нужно восстанавливать, то необходимо удалить все ссылки на него посредством стандартного функционала 1С.

Для удаления ссылок на несуществующие объекты можно воспользоваться тестированием и исправлением информационной базы (предварительно сделав резервную копию базы). Для этого необходимо зайти в Конфигуратор – Администрирование – Тестирование и исправление.

В новом окне появятся несколько вариантов проверок и режимов, которые необходимо выбрать.

Реиндексация таблиц информационной базы — это перестроение индексов таблиц базы данных. В информационной базе строится индекс для ускорения поиска по определенным реквизитам. Эта операция приводит к ускорению и оптимизации работы информационной базы, поэтому рекомендуется выполнять ее хотя бы раз в месяц.

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

Проверка ссылочной целостности информационной базы — проверка тех самых ссылок на несуществующие объекты в базе данных.

Необходимо выбрать один из трех вариантов исправления таких ошибок:

Создавать объекты — система создает элементы, которые потом нужно заполнить;

Очищать ссылки — ссылки будут очищены;

Не изменять – будут показаны ошибки, ссылки не изменятся. 

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

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

Реструктуризация таблиц информационной базы – создание идентичных таблиц базы данных и перенос имеющихся данных в изменённые таблицы.

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

После окончания тестирования вопрос с несуществующими объектами будет решен.

Рекомендации:

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

2.3      «Объект не найден» после Универсального обмена данными

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

Фирма «1С» активно развивает формат EnterpriseData и его использование во все большем количестве приложений.

При таком обмене иногда могут возникать ошибки, связанные с конвертацией объектов одного типа (базы – источника) в объекты другого типа (базы – приемника).

Например, при обмене между базами 1С: Управление торговлей 11.2 и 1С: Бухгалтерия Предприятия 3.0. документ «Передача товаров между организациями» из «Управление торговлей» переносится в «Бухгалтерию Предприятия» как Документ «Поступление (акт, накладная)» или Документ «Реализация (акт, накладная)». При этом одна организация переносится в «Бухгалтерию Предприятия» как контрагент. Данное преобразование предусмотрено фирмой «1С» в правилах конвертации данных. Но, несмотря на это, иногда происходят ошибки при переносе разнотипных объектов между базами. Это может быть вызвано долгим отсутствием обновления какой-либо базы – участника обмена и как следствие – старыми правилами формата обмена, которые не гарантируют правильного переноса данных.

Решение

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

Используемую версию формата можно изменить в настройках обмена на вкладке «Служебная информация»:

Если после этих действий ссылки «Объект не найден» не были заменены правильными объектами, необходимо настроить сопоставление данных вручную.

Для этого нам понадобится регистр «Публичные идентификаторы синхронизируемых объектов» (Найти его можно через «Все функции» — «Регистры сведений». Он используется для сопоставления объектов при синхронизации через универсальный формат. Ввиду большого количества записей открытие регистра может занять продолжительное время.

Регистр имеет следующую структуру:

В регистре можно обнаружить ссылки на несуществующие объекты:

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

Как получить ссылку на любой элемент информационной базы 1С:

В 1С есть очень полезный функционал – можно получить ссылку на любой объект базы и также перейти к объекту.

Ссылки, представленные во второй колонке регистра, не были найдены в базе, соответственно, эти объекты не были созданы. 

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

В нашем примере битые ссылки находятся в документе «Реализация товаров». Вместо контрагента <Объект не найден> (18:805910bf4888a98211e4f89df8b22aab). Находим этот документ в базе-источнике и определяем Организацию, которую необходимо перенести в качестве контрагента. Затем ищем такого же контрагента в базе-приемнике, при его отсутствии – создаем.

После создания или нахождения нужного объекта в ИБ нужно задать сопоставление в регистре «Публичные идентификаторы синхронизируемых объектов». Находим строку, содержащую битую ссылку <Объект не найден> (18:805910bf4888a98211e4f89df8b22aab) и сопоставляем ей необходимого контрагента. В примере: объект с идентификатором «f8b22aab-f89d-11e4-8059-10bf4888a982» будет выгружен в базу как «Моя Организация» в не зависимости от типа объекта источника. В базе – источнике необходимо зарегистрировать такие объекты к обмену заново и запустить  синхронизацию данных. После обмена не найденные объекты заменятся согласно сопоставлениям, сделанным  в регистре.

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

Рекомендации:

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

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Как найти девушек для клипа
  • Как исправить ошибку в icloud
  • Как найти файл по названию линукс
  • Как найти кеш на опера
  • Как в триколоре найти программу

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии