Имя: Пароль:
1C
1С v8
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
В итоге так и плюнул на эти "отделения", просто после преобразования значения в ссылку отсекаю запросом все <объект не найден>, без разделения на элементы без прав доступа и на действительно отсутствующие в базе.
Большое спасибо всем откликнувшимся!