Имя: Пароль:
1C
1С v8
Автоматическое чтение движений документа при его открытии в обычном приложении
,
0 kabanoff
 
03.02.16
16:01
Всем привет!

Помогите решить проблему.

Есть не типовой документ, который предназначен для корректировки движений регистров сведений (подчиненных регистратору), регистров накопления и бухгалтерии. На форме документа автоматически создаются страницы с движениями по регистрам, которые есть у документа (состав вкладок настраивается пользователем).

Задача: запретить пользователям просмотр тех регистров, к которым они не имеют доступа на просмотр. Т.е. скрыть с формы те вкладки, к которым доступа нет. При этом доступ к остальным вкладкам документа должен сохраняться.

У документа есть обычная форма. При открытии формы существующего документа платформа производит автоматическое чтение движений документа. Вот тут происходит платформенное исключение - "Нарушение прав доступа!".

В управляемой форме проблема обходится снятием у коллекции "Объект.Движения" флажка "Использовать всегда" на форме.
В обычной форме - никак не получается.

Если принудительно прочитать движения документа при создании объекта документа, то движения автоматически считываться платформой не будут. Но здесь есть другая проблема - привилегированный режим. В клиент-серверной ИБ привилегированный режим на клиенте не работает. Поэтому пользователь так или иначе получит исключение.

Если использовать привилегированный режим в серверном общем модуле, то здесь встает проблема с передачей движений документа на сервер.
Как известно, объект документа и его движения передать в чистом виде нельзя из-за "мутабельности". Пробовали разные способы передачи:
- через временное хранилище - нельзя;
- через ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр() - тоже нельзя;
- через сериализатор XDTO - при передаче самого объекта происходит зацикливание (т.к. сама сериализация происходит при создании объекта документа); передавать движения документа - нельзя.

Какие еще есть варианты?
1 lxs
 
03.02.16
16:06
Через попытку никак?
2 Лефмихалыч
 
03.02.16
16:12
(0) ИМХО, единственный вариант - это сделать обычную форму произвольной. То есть грохнуть в ней реквизит ДокументОбъект или сделать его не основным. Ты потеряешь все расширения формы документа и будешь вынужден их эмулировать кодом, но зато исключений выпадать не будет.
3 lxs
 
03.02.16
16:15
(0) Покажи кусок кода, который рисует форму
4 kabanoff
 
03.02.16
16:16
(1) Сейчас попробуем, спасибо.

(2) Не хотелось бы к этому прибегнуть. Но если не останется других вариантов, то, видимо, придется идти по этому пути. Спасибо, Лев!

Мне вот интересно, есть ли возможность сериализовать объект или его движения для передачи с клиента на сервер и обратно?
5 lxs
 
03.02.16
16:16
(2) Сдается мне, этот документ срисован с обработки Корректировка движений или Операция.
6 Карупян
 
03.02.16
16:16
чтение оставь, отбери просмотр
7 DmitrO
 
03.02.16
16:17
(0)А зачем тебе вообще обычная форма, пусть управляемая и работает всегда?
8 Лефмихалыч
 
03.02.16
16:22
(5) это что-то меняет?
9 kabanoff
 
03.02.16
16:23
(3) Проблема не в рисовании формы, а в коде, который расположен в модуле документа в разделе объявления переменных. Да и сам код рисования выложить не могу - он перегружен спецификой бизнеса и слишком большой.


Процедура ПрочитатьВсеДвиженияДокумента()
    
    Если Не Ссылка.Пустая() Тогда
        
        УстановитьПривилегированныйРежим(Истина);
        
        Для Каждого НаборЗаписейРегистра Из Движения Цикл
            
            НаборЗаписейРегистра.Прочитать();
            
        КонецЦикла;
        
        УстановитьПривилегированныйРежим(Ложь);
        
    КонецЕсли;
    
КонецПроцедуры

ПрочитатьВсеДвиженияДокумента();


(6) Есть ряд регистров, к которым пользователи не должны иметь доступа даже на чтение - требование бизнеса.

(7) Использование обычной формы - необходимость, обусловленная текущей бизнес-логикой. Пока отказываться от нее нельзя.
10 Лефмихалыч
 
03.02.16
16:27
А вы XMLСтрока() и XMLЗначение() пробовали попробовать?
11 Лефмихалыч
 
03.02.16
16:27
"он перегружен спецификой бизнеса" экий высокий слог :)
12 kabanoff
 
03.02.16
16:28
(11) Ну что поделать, если так оно и есть :)

(10) Щас попробуем, спасибо.
13 kabanoff
 
03.02.16
17:00
(1) Вы не поверите, но чтение движений в Попытке решило проблему! lxs, спасибо! :)

(10) Лев, XMLСтрока() выдала "Ошибку преобразования данных XML". Думаю, можно остановиться на варианте обработки исключения.)

Всем спасибо за участие!!!
14 Serg_1960
 
03.02.16
17:17
(поздно тему увидел) Я так и не понял почему никто не предложил читать движения документа запросом ВЫБРАТЬ РАЗРЕШЕННЫЕ...документ и его форма - не типовые - "что хочу, то и делаю"(цы)
15 kabanoff
 
03.02.16
17:25
(14) А как бы это спасло от автоматического чтения платформой движений при открытии документа?
16 Serg_1960
 
03.02.16
17:27
Ну, ты же сам сказал в (0) "Если принудительно прочитать движения документа при создании объекта документа, то движения автоматически считываться платформой не будут"
17 lxs
 
04.02.16
08:35
(9) Ну так вот тебе начало:

Перем МассивНедоступных;

...

Процедура ....
      
Для Каждого НаборЗаписейРегистра Из Движения Цикл
            
    Попытка
          НаборЗаписейРегистра.Прочитать();
    Исключение
          МассивНедоступных.Добавить(<Тут имя регистра или любой другой признак, однозначно идентифицирующийнабор>);

    КонецПопытки;        
КонецЦикла;

...


А дальше, используя полученный массив, переписываешь отрисовку формы.
18 kabanoff
 
05.02.16
09:47
(16) Это произойдет только в случае, если читаем из коллекции Объект.Движения. Если их просто прочитать запросом или через набор записей менеджера регистра, то платформу это не остановит.

(17) У нас делается немного иначе. Но спасибо за совет!
19 Tateossian
 
05.02.16
09:51
(18) В (17), только используй не Попытка Исключение, а ПравоДоступа.

Еще есть вариант сделать форму произвольной и полностью программно реализовать логику.
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс