|
RLS по табличной части | ☑ | ||
---|---|---|---|---|
0
SHAS
09.09.17
✎
16:39
|
Не чувствую себя уверенно в RLS, поэтому прошу совета, как сделать наиболее оптимально, чтоб поменьше тормозило.
Задача: Запретить чтение документов ПоступлениеТоваровУслуг, если табличная часть "Товары" не пустая. Работают, вроде как, такие варианты: 1. ПоступлениеТоваровУслуг ИЗ #ТекущаяТаблица КАК ПоступлениеТоваровУслуг ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары ПО ПоступлениеТоваровУслуг.Ссылка = ПоступлениеТоваровУслугТовары.Ссылка ГДЕ ПоступлениеТоваровУслугТовары.Номенклатура ЕСТЬ NULL 2. ПоступлениеТоваровУслуг ГДЕ НЕ ПоступлениеТоваровУслуг.Товары.Номенклатура.Наименование Подобно "%" ==== Нужен совет - какой вариант лучше, и может есть какой-то более правильный вариант. Мне казалось, что по аналогии со вторым вариантом, должен работать вариант: ПоступлениеТоваровУслуг ГДЕ ПоступлениеТоваровУслуг.Товары.Номенклатура ЕСТЬ NULL но в этом варианте пропадают все документы. Почему? |
|||
1
Cyberhawk
09.09.17
✎
17:37
|
Обращайся к реквизиту ТЧ, только не к наименованию номенклатуры, а к НомерСтроки
|
|||
2
Cyberhawk
09.09.17
✎
17:37
|
А еще лучше хранить признак того, пустая ТЧ или не пустая, в шапке документа или в регистре сведений
|
|||
3
Cyberhawk
09.09.17
✎
17:38
|
И условие /соединение в RLS уже делать только по шапке и/или этому регистру
|
|||
4
AlvlSpb
09.09.17
✎
18:34
|
(0) "но в этом варианте пропадают все документы. Почему?"
Попробуй: ГДЕ ПоступлениеТоваровУслуг.Товары.Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) |
|||
5
RS2017
09.09.17
✎
18:47
|
(0) 1. нормально, лучше м.б. только
2. бред (4) тоже бред: это совсем другое условие |
|||
6
zak555
09.09.17
✎
19:20
|
Скрой тч и всё
|
|||
7
Tateossian
09.09.17
✎
19:39
|
(0) То есть, предполагается, что документ - либо по услугам, либо по оборудованию? Самый простой и правильный вариант - добавь служебный реквизит в документ с булевом или перечислением, скажем, "ЕстьТовары", при записи документа его устанавливай. А потом просто в RLS проверяй этот реквизит. Вот, как киберсокол говорит.
Есть вариант посложнее, проверять на первую строчку ТЧ, вот так: ТекущаяТаблица ИЗ Документ.ПоступлениеТоваровУслуг КАК ТекущаяТаблица ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары ПО (ТекущаяТаблица.Ссылка = ПоступлениеТоваровУслугТовары.Ссылка И ПоступлениеТоваровУслугТовары.НомерСтроки = 1) ГДЕ ПоступлениеТоваровУслугТовары.Ссылка ЕСТЬ NULL |
|||
8
SHAS
09.09.17
✎
21:45
|
Спасибо всем за идеи!
Возьму на вооружение доп. реквизит в шапке, спасибо Cyberhawk, курочить конфу больше, но всяко быстрее будет работать. (7) Задача проста - не дать ни в коем случае увидеть документ, в котором есть заполненная часть "Товары". Но очень нужно видеть документы с услугами (если в них нет товаров). Спасибо за вариант, кажется тоже пошустрее моего. Но для понимания РЛС таки остался вопрос: Почему не работает вариант: ПоступлениеТоваровУслуг ГДЕ ПоступлениеТоваровУслуг.Товары.Номенклатура ЕСТЬ NULL ? Также не работает: ПоступлениеТоваровУслуг ГДЕ ПоступлениеТоваровУслуг.Товары.НомерСтроки Есть Null Это тоже не работает: ГДЕ ПоступлениеТоваровУслуг.Товары.Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка), но это вроде как понятно. А вот пункт 2 из (0) работает! Этот вариант отличается ещё одним джоином с Номенклатурой, конечно, но всё равно непонятно, что там, если не Нулл? Сейчас тестирую на файловой версии, доступа к СКЛ нет, даже профайлер не запустишь, чтоб на мысль натолкнул. |
|||
9
Cyberhawk
09.09.17
✎
22:26
|
(8) "для понимания РЛС таки остался вопрос" // Так консоль запросов тебе в помощь, там выполняешь запрос к таблице документов и смотришь, что в результате имеешь (какие документы видишь)
|
|||
10
Tateossian
10.09.17
✎
00:30
|
(8)
// А вот пункт 2 из (0) работает! что там, если не Нулл Это равносильно ПоступлениеТоваровУслуг ГДЕ Истина Там - ложь |
|||
11
SHAS
10.09.17
✎
01:15
|
(9)
Возможно, я что-то не догоняю в запросах... Как мне это: "ПоступлениеТоваровУслуг ГДЕ ПоступлениеТоваровУслуг.Товары.Номенклатура ЕСТЬ NULL" превратить в запрос? Если вот так: ВЫБРАТЬ ПоступлениеТоваровУслуг.Ссылка ИЗ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг ГДЕ ПоступлениеТоваровУслуг.Товары.Номенклатура Есть Null то запрос возвращает пустоту. а вот этот: ВЫБРАТЬ ПоступлениеТоваровУслуг.Ссылка ИЗ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг ГДЕ НЕ ПоступлениеТоваровУслуг.Товары.Номенклатура.Наименование ПОДОБНО "%" выдаёт нужные мне документы без товаров. Т.е. ситуация повторяется с РЛС. Но ясности не добавляет. Я никогда раньше не использовала вот это обращение к табличной части через точку и не понимаю. На выходе получаем вложенный результат запроса и как его в запросе проверить на пустоту - хез. В общем, на просторах же Мисты обнаружено вот такое изящное решение: ПоступлениеТоваровУслуг ГДЕ НЕ ПоступлениеТоваровУслуг.Товары.НомерСтроки В (1) Оно мне прям нравится, аж доп. реквизит добавлять не хочется. |
|||
12
SHAS
10.09.17
✎
01:22
|
(10) Не понял... Где Истина? Где Ложь?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |