Как найти запросом объект не найден

 0 

   

Распечатать

Как в запросе выполнить отбор по Объект не найден

Для этого используется логический оператор ЕСТЬ NULL функций языка запросов.
Например, допустим, в регистре накопления «ПартииТоваровНаСкладах» мы хотим найти записи, в которых измерение «ДокументОприходования» оказалось такой вот битой ссылкой на «объект не найден». Запрос будет выглядеть примерно так:

Код 1C v 8.х

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

Обратите внимание, если в запросе требуется получить ссылку на регистратор регистра накопления, то запрос должен быть построен не к остаткам и не к оборотам, а просто к регистру
источник

Содержание:

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

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

    КонецЕсли;

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

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

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

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

Как в запросе отобрать элементы, значение которых — «битая ссылка», т.е. «объект не найден»

Для этого используется логический оператор ЕСТЬ NULL функций языка запросов.
Например, допустим, в регистре накопления «ПартииТоваровНаСкладах» мы хотим найти записи, в которых измерение «ДокументОприходования» оказалось такой вот битой ссылкой на «объект не найден». Запрос будет выглядеть примерно так:

"ВЫБРАТЬ
|    ПартииТоваровНаСкладах.Регистратор,
|    ПартииТоваровНаСкладах.Номенклатура,
|    ПартииТоваровНаСкладах.СерияНоменклатуры,
|    ПартииТоваровНаСкладах.ДокументОприходования,
|    ПартииТоваровНаСкладах.Качество,
|    ПартииТоваровНаСкладах.Склад,
|    ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры,
|    ПартииТоваровНаСкладах.СтатусПартии,
|    ПартииТоваровНаСкладах.Заказ
|ИЗ
|    РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
|ГДЕ
|    ПартииТоваровНаСкладах.ДокументОприходования.Ссылка ЕСТЬ NULL"

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

Итог исполнения запроса:

Регистратор Номенклатура СерияНоменклатуры ДокументОприходования
Поступление товаров и услуг АМН00015703 от 26.11.2010 12:36:37 УСИЛИТЕЛЬ БАМПЕРА ЗАДНЕГО 10702030/281010/0044030, КОРЕЯ <Объект не найден> (202:8f3be61ec213fa5511dffc85b405870a)
Качество Склад ХарактеристикаНоменклатуры СтатусПартии Заказ
Некондиция 15 Основной склад <пустая ссылка Справочник ссылка: Характеристики номенклатуры> Купленный <пустая ссылка Документ ссылка: Заказ покупателя>

Дополнение

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

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

а по представлению, т.е. с использованием конструкции вида:

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

Мы думаем, что это может быть связано с различными видами «битости» ссылок. В любом случае, один из способов должен Вам помочь. Поэтому рекомендуем поэкспериментировать с обоими этими условиями.

Next Post

  • 1С: Логистика – управление складом AXELOT

  • v8

  • Пользователю Axelot

Особенности разупаковки номенклатуры, когда по одной строке «Взять» должно быть несколько строк «Положить» (1С: Логистика – управление складом Axelot: Пользователю)

Ср Июн 9 , 2010

Вопрос Как оформить документ «Переупаковка номенклатуры», когда нужно разупаковать упаковку из 100 шт на 3 упаковки по 30 шт + 10 штук? Ответ Для этого порядок строк «положить» должен быть такой: сначала 10 штук по штукам, потом 3 упаковки по 30 штук, но не наоборот. См. инструкцию

Breaking News

   Grek224

07.05.08 – 16:08

Как узнать что у реквизита значение ОБЪЕТ НЕ НАЙДЕН при сравнении через Если … Тогда

   nop

1 – 07.05.08 – 16:10

ПолучитьОбъект()

   Кураж

2 – 07.05.08 – 16:13

+(1) Объект будет равен Неопределено

   Grek224

3 – 07.05.08 – 16:14

Класс! Пацаны ну блин спасибо….. 🙂

   НЕА123

4 – 07.05.08 – 16:19

хм… не всегда удобно. если хренова туча ТЧ.

а Ссылка что даст? в запросе NULL, а в языке?

   nop

5 – 07.05.08 – 16:33

(4) недавно кто-то спрашивал “Как запросом по ТЧ найти ОБЪЕТ НЕ НАЙДЕН” и кто-то ответил “Ссылка не есть НУЛЛ и Объект есть НУЛЛ” (типа так)

   НЕА123

6 – 07.05.08 – 16:37

(5) да, запросом все же лучше, чем через получитьобъект.

но может и просто в языке Ссылка даст Неопределено?

   nop

7 – 07.05.08 – 16:39

(6) ОБЪЕТ НЕ НАЙДЕН подразумевает что ссылка есть

   НЕА123

8 – 07.05.08 – 16:42

(7) в запросе:

справик.ссылка.ссылка у битых ссылок будет NULL.

а в языке, если мы обратимся к объекту ссылочного типа Объект.Ссылка – что даст длябитой ссылки?

   nop

9 – 07.05.08 – 16:47

(8) хез

   Defender aka LINN

10 – 07.05.08 – 16:52

(8) Ошьбку даст. Объект-то “Неопределено”. А “Ссылка.Ссылка” в коде даст ту же битую ссылку.

   Широкий

11 – 07.05.08 – 16:54

В запросе можно так

ВЫБРАТЬ
   Номенклатура.Ссылка
ИЗ
   Справочник.Номенклатура КАК Номенклатура
ГДЕ
   (НЕ Номенклатура.Менеджер = &МенеджерПустаяСсылка)
   И Номенклатура.Менеджер.Ссылка ЕСТЬ NULL

   nop

12 – 07.05.08 – 16:57

Ссылка.Ссылка – это что?

   НЕА123

13 – 07.05.08 – 16:59

(10) пардон, в (5) не совсем корректно написал Объект.ссылка надо что-то типа БитаяСсылка.Ссылка;

а вот то что ‘”Ссылка.Ссылка” в коде даст ту же битую ссылку’ – не есть хорошо.

Спасибо.

   Широкий

14 – 07.05.08 – 17:03

А в коде
Найти(Ссылка,”Объект не найден”)

   НЕА123

15 – 07.05.08 – 17:05

(14) да, вроде как самый оптимальный универсальный способ.

   dimoff

16 – 07.05.08 – 17:06

В запросе прокатит

Номенклатура <> &ПустаяСсылка И Номенклатура.Наименование IS NULL

   nop

17 – 07.05.08 – 17:09

(14) тормозить не будет?

   Широкий

18 – 07.05.08 – 17:11

(17) Думаю все же полегче будет чем получать поля через точку

   dimoff

19 – 07.05.08 – 17:12

А, не заметил, в 11 по сути то же что в 16

   igork1966

20 – 07.05.08 – 17:18

(14,15) Опасный способ… ненадежный.

   Злопчинский

21 – 07.05.08 – 17:24

в 7-ке дл ябитых ссылок было

Поле.Выбран() = 0

ПустоеЗначение(Поле) = 0

   Широкий

22 – 07.05.08 – 17:25

(20) Опасного ничего нет… ненадежность только если представление объекта содержит “Объект не найден”.. но пользоваться можно

   iSeRG

23 – 07.05.08 – 18:10

(14) ну и совет.
(0) покажи код в котором ссылка в условии.

   shachneff

24 – 07.05.08 – 19:07

   igork1966

25 – 07.05.08 – 19:09

(22) Завтра фирма 1С придумает новое представление не найденного объекта….
Долго вы будете искать ошибку в коде….

  

dimoff

26 – 07.05.08 – 19:14

Не понимаю я Широкого, дал же в 11 единственно верный вариант а потом начал ерунду какую-то гнать.

Иногда в ИБ можно встретить ссылки на объекты <Объект не найден> (75:a353ac9e17b7bc7111e60238e0dc59c6), это ссылки на удаленные объекты. Получаются такие ссылки в ходе сбоев ИБ, РИБ(Распределенных Информационных Баз) или других механизмов создающих ссылки не записанных объектов(разбирал здесь).

Поиск "Объект не найден" в регистре и удаление

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

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

Поиск ссылок <Объект не найден>

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

А для удаления таких записей просто создадим наборы записей указав отборы и запишем.

&НаСервере
Процедура УдалитьПлохиеЗаписиДанныхДляОбработки()

	// Найдем записи с <Объект не найден>
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ДанныеДляОбработки.Номенклатура КАК Номенклатура
	|ИЗ
	|	РегистрСведений.ДанныеДляОбработки КАК ДанныеДляОбработки
	|ГДЕ
	|	ДанныеДляОбработки.Номенклатура.Наименование ЕСТЬ NULL";
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	// Удаление записей с <Объект не найден>
	Пока Выборка.Следующий() Цикл 
		
		НаборЗаписей = РегистрыСведений.ДанныеДляОбработки.СоздатьНаборЗаписей();
		
		НаборЗаписей.Отбор.Номенклатура.Установить(Выборка.Номенклатура);
		
		НаборЗаписей.Записывать = Истина;
		НаборЗаписей.Записать(Истина);	
				
	КонецЦикла;
	
КонецПроцедуры

После выполнения данного кода из регистра сведений будут удалены все записи со ссылками <Объект не найден>.

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