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