v8: Как определить, что запись вызвана программно (из привелигированного модуля) К сожалению, в 8-ке нельзя отличить программную запись от интерактивной. К счастью, ситуации, когда требуется отличить программную запись от интерактивной нечасты, поэтому можно предполагать, что любая запись - интерактивная, а если требуется явное указание программной записи
В данном контексте под программной записью предполагается, что это запись, которая осуществляется без контроля прав доступа, как бы в привелигерованном модуле. Однако если у нас весь контроль сосредоточен в процедуре ПередЗаписью, то нужно как-то передать в эту процедуру сведения о том, что объект записывается без контроля прав доступа.
Например, это можно сделать так. В привелигерованном модуле объявляем процедуру:
Процедура ЗаписатьПрограммно(Объект, РежимЗаписи=Неопределено, РежимПроведения=Неопределено) Экспорт
Если РежимЗаписи=Неопределено И РежимПроведения=Неопределено Тогда
Объект.Записать();
ИначеЕсли РежимПроведения=Неопределено Тогда
Объект.Записать(РежимЗаписи);
Иначе
Объект.Записать(РежимЗаписи, РежимПроведения);
КонецЕсли;
КонецПроцедуры
Далее, заводим какую-нибудь служебную константу, например п_ДляКонтроляПравДоступаПривелигированногоМодуля, отключаем доступ к ней у всех пользователей.
Далее в общем непривелигерованном модуле объявляем функцию:
Функция РаботаетПривелигированныйМодуль() Экспорт
Возврат ПравоДоступа ("Чтение", Метаданные.Константы.п_ДляКонтроляПравДоступаПривелигированногоМодуля);
КонецФункции;
У объекта, у которого нужно отличать программную запись от интерактивной меняем в процедуре ПриЗаписи код:
Процедура ПередЗаписью(Отказ, Режим записи, Режим проведения) Экспорт
Если РаботаетПривелигированныйМодуль() Тогда
Возврат;
КонецЕсли;
//Дальше идет код проверки при интерактивном доступе
КонецПроцедуры
Ну и наконец, чтобы отметить именно программный вызов записи, пишем не Объект.Записать(), а ЗаписатьПрограммно(Объект). |