Имя: Пароль:
1C
1С v8
У пользователя недостаточно прав на исполнение операции над базой данных
0 EndUser2022
 
16.09.22
09:11
Доброго дня, коллеги!
1С:Предприятие 8.3 (8.3.20.1710)
Конфигурация ДАЛИОН: ТРЕНД, редакция 3.0 (3.0.20.24).
Задачу решаем на файловой базе.

Суть проблемы:
Делаем для клиента обработку. В конечном итоге обработка должна открывать форму приходной накладной, для дальнейшей работы.
У клиента несколько объектов (складов), каждый товаровед (Оператор) видит только свой склад.
Если попытаться обработкой открыть форму приходной накладной - появляется ошибка "У пользователя недостаточно прав на исполнение операции над базой данных".
Конфигуратор перекидывает на строку кода обработки "ОбъектПриемник.Записать(РежимЗаписиДокумента.Запись);", Err: Ошибка при вызове метода контекста (Записать).
У Оператора включена роль "ДобавлениеИзменениеДокументаПриходнаяНакладная", где на правах приходной накладной "Чтение", "Добавление", "Изменение" стоят ограничения доступа к данным, например для "Чтение":
#ПоЗначениям( "Документ.ПриходнаяНакладная","Чтение","",
"Организации","Организация",
"ТорговыеОбъекты","Склад.ТорговыйОбъект",
"","",
"","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","" )
.

Если данные ограничения удалить - приходная накладная открывается, однако, оператор видит тогда все склады.
Задачу пытаемся решить следующим способом. Создаем профиль, у которого включена новая роль, которая даёт доступ к приходным накладным без ограничений.
Включаем этот профиль следующим кодом (пока что отдельной независимой обработкой в другом окне):
УстановитьПривилегированныйРежим(ИСТИНА);
    НовыйПрофиль = Справочники.ПрофилиГруппДоступа.НайтиПоНаименованию("НовыйПрофиль");
    УправлениеДоступом.ВключитьПрофильПользователю(ПользователиКлиентСервер.ТекущийПользователь(), "НовыйПрофиль");
    Справочники.ГруппыДоступа.ОбновитьГруппыДоступаПрофиля(НовыйПрофиль);

Результат: теперь Оператор видит все склады, но ошибка так и не уходит, форма приходной накладной не открывается. Ошибка исчезает при перезапуске программы, но Оператор видит все склады (ну это понятно).

Вопрос: принципиально можно-ли обойти эти ограничения #ПоЗначениям без перезапуска программы, в одном сеансе? Т.е. "выключить" ограничения #ПоЗначениям на момент открытия формы, а потом снова "включить" (пока других идей в голову не приходит).
Или мы вообще не туда смотрим и нужно копать БСП и разбираться там? Или еще что?
1 vicof
 
16.09.22
09:19
Запустить БСПшную обработку по изменению прав доступа?
2 Фрэнки
 
16.09.22
09:23
хм. БСП копать всегда полезно. И разбираться там тоже. Только это тут мало поможет, имхо.

Для обхода заполненных РЛС я бы попробовал применить повышение прав
https://its.1c.ru/db/v8std/content/485/hdoc
Использование привилегированного режима
3 Dmitrii
 
гуру
16.09.22
09:45
Очень много слов, но ничего не сказано о том какой склад указан в приходной накладной.
Склад в накладной входит в число доступных пользователю?
Может склад в накладной пустой (не указан)?
Уверены ли в том, что не срабатывает ограничение по другим полям (Организация, Подразделения, ...)

>> Включаем этот профиль следующим кодом.

Это вообще дичь.
После корректировки профилей и ролей пользователя необходимо, чтобы как минимум пользователь перезашел в программу. В идеале запускать БСП-ное обновление подсистемы прав доступа.

>> можно-ли обойти эти ограничения #ПоЗначениям без перезапуска программы, в одном сеансе?

Нет.

Разбирайтесь - на что именно срабатывает ограничение.
Вероятнее всего либо в накладной недоступный пользователю склад указан (или вообще никакой не указан), либо ограничение срабатывает на какое-то другое поле, а не на склад.

В привилегированном режиме можно записать документ или прочитать из него данные. Но не открыть форму.
УстановитьПривилегированныйРежим(<Включить>)
Доступность: Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
4 Ногаминебить
 
16.09.22
09:51
Ставлю на пустую Организацию.
5 PaulBC
 
16.09.22
09:55
(0) что такое ОбъектПриемник.Записать( при открытии формы накладной? Ограничение срабатывает на него похоже, а не на склад.
6 EndUser2022
 
16.09.22
10:13
(2) Видел эту статью, но не углублялся. Ограничивался одной директивой "УстановитьПривилегированныйРежим(Истина);". Попробую изучить внимательнее, спасибо.
7 EndUser2022
 
16.09.22
10:17
(3) Склад в накладной пустой. Я тоже об этом думал. За остальные советы - спасибо!
8 Фрэнки
 
16.09.22
10:30
(7) э... если склад пустой и это корректно отрабатывается по тексту модулей или запросов, то означает, что обработаны будут _все_
т.е. нужно тогда текст запроса дополнять _все_разрешенные_

И насчет открытия формы ... ПриСозданииНаСервере - там же есстественно нужно расписать получение большинства данных для их установки в реквизиты формы.
Есстественно, что часть кода для такого получения данных можно выполнить где-то под УстановитьПривилегированныйРежим
Только следующие ожидаемые грабли будут уже передзаписью данных объекта, если что-то законфликтует с РЛС
9 Dmitrii
 
гуру
16.09.22
11:19
(8) >> ПриСозданииНаСервере - там же естественно нужно расписать получение большинства данных для их установки в реквизиты формы... часть кода для такого получения данных можно выполнить где-то под УстановитьПривилегированныйРежим

Это всё так. Но автор нам не рассказывает о том что реально делает его обработка. Приходится исходить из того, что открывается пользователю форма того документа, права на который у него есть.
В противном случае получается странная логика - пользователь должен открыть любой документ и в нём в ПриСозданииНаСервере должны меняться какие-то реквизиты под требования ограничения прав.