RLS по табличной части #804548


#0 by SHAS
Не чувствую себя уверенно в RLS, поэтому прошу совета, как сделать наиболее оптимально, чтоб поменьше тормозило. Задача: Запретить чтение документов ПоступлениеТоваровУслуг, если табличная часть "Товары" не пустая. Работают, вроде как, такие варианты: 1. ПоступлениеТоваровУслуг ИЗ #ТекущаяТаблица КАК ПоступлениеТоваровУслуг     ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары     ПО ПоступлениеТоваровУслуг.Ссылка = ПоступлениеТоваровУслугТовары.Ссылка ГДЕ ПоступлениеТоваровУслугТовары.Номенклатура ЕСТЬ NULL 2. ПоступлениеТоваровУслуг ГДЕ НЕ ПоступлениеТоваровУслуг.Товары.Номенклатура.Наименование Подобно "%" ==== Нужен совет - какой вариант лучше, и может есть какой-то более правильный вариант. Мне казалось, что по аналогии со вторым вариантом, должен работать вариант: ПоступлениеТоваровУслуг ГДЕ ПоступлениеТоваровУслуг.Товары.Номенклатура ЕСТЬ NULL но в этом варианте пропадают все документы. Почему?
#1 by Cyberhawk
Обращайся к реквизиту ТЧ, только не к наименованию номенклатуры, а к НомерСтроки
#2 by Cyberhawk
А еще лучше хранить признак того, пустая ТЧ или не пустая, в шапке документа или в регистре сведений
#3 by Cyberhawk
И условие /соединение в RLS уже делать только по шапке и/или этому регистру
#4 by AlvlSpb
"но в этом варианте пропадают все документы. Почему?" Попробуй: ГДЕ ПоступлениеТоваровУслуг.Товары.Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
#5 by RS2017
тоже бред: это совсем другое условие
#6 by zak555
Скрой тч и всё
#7 by Tateossian
То есть, предполагается, что документ - либо по услугам, либо по оборудованию? Самый простой и правильный вариант - добавь служебный реквизит в документ с булевом или перечислением, скажем, "ЕстьТовары", при записи документа его устанавливай. А потом просто в RLS проверяй этот реквизит. Вот, как киберсокол говорит. Есть вариант посложнее, проверять на первую строчку ТЧ, вот так:             И ПоступлениеТоваровУслугТовары.НомерСтроки = 1) ГДЕ ПоступлениеТоваровУслугТовары.Ссылка ЕСТЬ NULL
#8 by SHAS
Спасибо всем за идеи! Возьму на вооружение доп. реквизит в шапке, спасибо Cyberhawk, курочить конфу больше, но всяко быстрее будет работать. Задача проста - не дать ни в коем случае увидеть документ, в котором есть заполненная часть "Товары". Но очень нужно видеть документы с услугами (если в них нет товаров). Спасибо за вариант, кажется тоже пошустрее моего. Но для понимания РЛС таки остался вопрос: Почему не работает вариант: ПоступлениеТоваровУслуг ГДЕ ПоступлениеТоваровУслуг.Товары.Номенклатура ЕСТЬ NULL ? Также не работает: ПоступлениеТоваровУслуг ГДЕ ПоступлениеТоваровУслуг.Товары.НомерСтроки Есть Null Это тоже не работает:  ГДЕ ПоступлениеТоваровУслуг.Товары.Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка), но это вроде как понятно. А вот пункт 2 из работает! Этот вариант отличается ещё одним джоином с Номенклатурой, конечно, но всё равно непонятно, что там, если не Нулл? Сейчас тестирую на файловой версии, доступа к СКЛ нет, даже профайлер не запустишь, чтоб  на мысль натолкнул.
#9 by Cyberhawk
"для понимания РЛС таки остался вопрос" // Так консоль запросов тебе в помощь, там выполняешь запрос к таблице документов и смотришь, что в результате имеешь (какие документы видишь)
#10 by Tateossian
// А вот пункт 2 из работает! что там, если не Нулл Это равносильно ПоступлениеТоваровУслуг ГДЕ Истина Там - ложь
#11 by SHAS
Возможно, я что-то не догоняю в запросах... Как мне это: "ПоступлениеТоваровУслуг ГДЕ ПоступлениеТоваровУслуг.Товары.Номенклатура ЕСТЬ NULL" превратить в запрос? Если вот так: ВЫБРАТЬ     ПоступлениеТоваровУслуг.Ссылка ИЗ     Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг ГДЕ     ПоступлениеТоваровУслуг.Товары.Номенклатура Есть Null то запрос возвращает пустоту. а вот этот:     ПоступлениеТоваровУслуг.Ссылка ИЗ     Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг ГДЕ     НЕ ПоступлениеТоваровУслуг.Товары.Номенклатура.Наименование ПОДОБНО "%" выдаёт нужные мне документы без товаров. Т.е. ситуация повторяется с РЛС. Но ясности не добавляет. Я никогда раньше не использовала вот это обращение к табличной части через точку и не понимаю. На выходе получаем вложенный результат запроса и как его в запросе проверить на пустоту - хез. В общем, на просторах же Мисты обнаружено вот такое изящное решение: ПоступлениеТоваровУслуг ГДЕ НЕ ПоступлениеТоваровУслуг.Товары.НомерСтроки В Оно мне прям нравится, аж доп. реквизит добавлять не хочется.
#12 by SHAS
Не понял... Где Истина? Где Ложь?
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С