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