Как в запросе выполнить отбор по «объект не найден» (1С: 8.1: Программисту)

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

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

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

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

Дополнение

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

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

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

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

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

4 thoughts on “Как в запросе выполнить отбор по «объект не найден» (1С: 8.1: Программисту)

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

      Хорошо бы проанализировать эту задачу на самых различных данных.

      Будем рады любым дополнительным отзывам и сведениям от всех, кто с этим еще столкнется.

      • Думается мне, что нюанс тут… есть, но только в формулировке и ее понимании.
        «нужно проверять на NULL значение ссылки» — неточная и/или неверная формулировка.
        Речь идет о том, чтобы условие в запросе выглядело так:
        ГДЕ Чек.Номенклатура.Ссылка ЕСТЬ NULL
        А это почти равнозначно условию
        ГДЕ Чек.Номенклатура.Представление ЕСТЬ NULL
        (Почему почти? Я знаю пока одно различие: если есть, скажем, в регистре измерение Операция с типом ПеречислениеСсылка, так в запросе Операция.Ссылка использовать можно, а вот Операция.Представление вызывает ошибку! По крайней мере на платформе 8.2.16.)

  1. По регистру сведений «АналитикаУчетаЗатрат» данный подход не работает ни по ссылке, ни по «Ссылка.Представление», если — тип СправочникСсылка.КлючиАналитикиУчетаЗатрат.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.