Имя: Пароль:
1C
1С v8
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) Не понял... Где Истина? Где Ложь?