Книга знаний

1С:Предприятие / v8 / Объекты конфигурации

v8: Как определить, что запись вызвана программно (из привилегированного модуля)

Как сообщить объекту, что его нужно записать без контроля прав доступа.Автор статьи: Гений 1С | Редакторы: Волшебник,
Последняя редакция №3 от 31.03.06 | История
URL: http://kb.mista.ru/article.php?id=132

К сожалению, в 8-ке нельзя отличить программную запись от интерактивной. К счастью, ситуации, когда требуется отличить программную запись от интерактивной нечасты, поэтому можно предполагать, что любая запись - интерактивная, а если требуется явное указание программной записи

В данном контексте под программной записью предполагается, что это запись, которая осуществляется без контроля прав доступа, как бы в привилегерованном модуле. Однако если у нас весь контроль сосредоточен в процедуре ПередЗаписью, то нужно как-то передать в эту процедуру сведения о том, что объект записывается без контроля прав доступа.

Например, это можно сделать так. В привилегерованном модуле объявляем процедуру:
Процедура ЗаписатьПрограммно(Объект, РежимЗаписи=Неопределено, РежимПроведения=Неопределено) Экспорт
    Если РежимЗаписи=Неопределено И РежимПроведения=Неопределено Тогда
        Объект.Записать();
    ИначеЕсли РежимПроведения=Неопределено Тогда
        Объект.Записать(РежимЗаписи);
    Иначе
        Объект.Записать(РежимЗаписи, РежимПроведения);
    КонецЕсли;
КонецПроцедуры


Далее, заводим какую-нибудь служебную константу, например п_ДляКонтроляПравДоступаПривилегированногоМодуля, отключаем доступ к ней у всех пользователей.

Далее в общем непривилегерованном модуле объявляем функцию:
Функция РаботаетПривилегированныйМодуль() Экспорт

    Возврат ПравоДоступа ("Чтение", Метаданные.Константы.п_ДляКонтроляПравДоступаПривилегированногоМодуля);
КонецФункции;


У объекта, у которого нужно отличать программную запись от интерактивной меняем в процедуре ПриЗаписи код:
Процедура ПередЗаписью(Отказ, Режим записи, Режим проведения) Экспорт
    Если РаботаетПривилегированныйМодуль() Тогда
        Возврат;
    КонецЕсли;
    //Дальше идет код проверки при интерактивном доступе
КонецПроцедуры


Ну и наконец, чтобы отметить именно программный вызов записи, пишем не Объект.Записать(), а ЗаписатьПрограммно(Объект).

Ребята, извините, немного наврал. ПравоДоступа наверное для текущего модуля и в привилигерованном модуле и в обычном модуле наверное будет одинаково ложь. Лучше использовать не константу, а недоступный всем параметр сеанса и не проверять право доступа на него, а пробовать прочитать в блоке Попытка-Исключение.

Допроверю, допишу, но тем не менее такую информацию получить можно.

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика