|
XML-сериализация и RLS | ☑ | ||
---|---|---|---|---|
0
UnsavedSoul
03.06.16
✎
16:05
|
Я разрабатываю отчет, отображающий данные сторонней информационной базы, получаемые через COM-соединение. Отчет собирает данные в таблицу значений и выводит ее средствами СКД. Ссылки в ИБ-источнике сериализую в XML, далее получаю ссылку в ИБ-приемнике с помощью XMLЗначение:
[CODE] ОстаткиНоменклатуры = Новый ТаблицаЗначений; ОстаткиНоменклатуры.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура")); ОстаткиНоменклатуры.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число")); Пока ВыборкаCOMОбъект.Следующий() Цикл Строка = ОстаткиНоменклатуры.Добавить(); Строка.Номенклатура = XMLЗначение(Тип("СправочникСсылка.Номенклатура"), COMОбъект.XMLСтрока(ВыборкаCOMОбъект.Номенклатура)); Строка.Количество = ВыборкаCOMОбъект.Количество; КонецЦикла; [/CODE] Ссылки на элементы справочника совпадают, между информационными настроен обмен данными. Если код выполняется под пользователем, у которого согласно RLS нет прав на чтение элемента, получаемого из XML, вместо представления объекта система возвращает <объект не найден>. Это логично. Вопрос в том, можно ли как-то после получения данных из XML и до передачи их (в виде таблицы значений в моем случае) процессору компоновки наложить на них RLS? |
|||
1
FIXXXL
03.06.16
✎
16:11
|
(0) попробовать прокатить таблицу через запрос с ВЫБРАТЬ РАЗРЕШЕННЫЕ?
|
|||
2
pessok
03.06.16
✎
16:11
|
сегодня пятница, поставь костыль! :)
Если XMLЗначение(Тип("СправочникСсылка.Номенклатура"), COMОбъект.XMLСтрока(ВыборкаCOMОбъект.Номенклатура)).Наименование = "объект не найден" Тогда Продолжить; КонецЕсли |
|||
3
UnsavedSoul
03.06.16
✎
16:23
|
(1)
|
|||
4
UnsavedSoul
03.06.16
✎
16:29
|
(1)
Первое, что попробовал:) Поместил ТЗ во временную, временную выбрал с ключевым словом РАЗРЕШЕННЫЕ. Не отсеялись. Оно и понятно: для платформы источник запроса - это временная таблица со ссылками на несуществующие объекты (2) Да вот ведь все пятничное настроение отчет испортил:) Так все красиво получалось |
|||
5
Cyberhawk
03.06.16
✎
16:35
|
Подключайся к базе-источнику под тем же пользователем
|
|||
6
UnsavedSoul
03.06.16
✎
16:36
|
(1)(2)
И в качестве костыля, кстати, есть еще одно решение: в запросе из временной таблицы выбирать вложенное поле, например, Номенклатура.Ссылка. В таком случае будет возвращен Null. Ну а Null уже элементарно отсечь. Минус один, как и в случае с костылем из (2): если в ходе получения данных десериализуется действительно битая ссылка, например, объект, отсутствующий в ИБ-приемнике, то эти данные тоже отсеются. А хотелось бы, чтобы пользователь обратил на них внимание и сообщил разработчику, при этом те элементы, на которые у него действительно нет доступа - не увидел:) |
|||
7
UnsavedSoul
03.06.16
✎
16:39
|
(5)
В ограничения RLS срабатывают именно на стороне приемника, на стороне источника ограничений для пользователя нет. Включить их просто не удастся: это нетиповые ограничения, конфигурации в базах разные. |
|||
8
Cyberhawk
03.06.16
✎
16:47
|
(7) Тогда у тебя плохо сделаны RLS в главной базе...
Почитай первый пост v8: RLS Объект ГДЕ ЛОЖЬ и <объект не найден> в запросе тут, например |
|||
9
UnsavedSoul
03.06.16
✎
17:14
|
(8) Возможно, но только при выборе запросом напрямую из таблицы справочника, RLS отрабатывает корректно.
|
|||
10
Pistol
03.06.16
✎
17:47
|
(4) выбрать разрешенные справочникноменклатура.ссылка из справочник.номенклатура как справочникноменклатура внутреннее соединение временнаятаблица по временнаятаблица.ссылка = справочникноменклатура.
|
|||
11
Pistol
03.06.16
✎
17:50
|
или прямо в скд два набора данных, один из таблицы, второй из справочника
установить связь по ссылке и поставить отбор на зависимую таблицу будет внутреннее соединение с выборкой разрешенных |
|||
12
UnsavedSoul
08.06.16
✎
17:56
|
(10) Да, это один из вариантов решения. Только он также отсекает и те элементы, которых попросту нет в базе-приемнике. Сложность задачи именно в том, чтобы отделить те позиции <объект не найден>, на которые после десериализации у пользователя нет прав доступа, от тех, которых в принципе нет в базе.
|
|||
13
UnsavedSoul
08.06.16
✎
18:00
|
В итоге так и плюнул на эти "отделения", просто после преобразования значения в ссылку отсекаю запросом все <объект не найден>, без разделения на элементы без прав доступа и на действительно отсутствующие в базе.
Большое спасибо всем откликнувшимся! |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |