При разработке глобальных механизмов аудита, контроля прав или запрета редактирования объектов конфигурации на платформе 1С:Предприятие 7.7 с использованием внешней компоненты 1С++ разработчики часто сталкиваются с проблемой: класс Перехватчик корректно обрабатывает документы и справочники, но полностью игнорирует форму операции (ручные проводки и операции документов).
Разберем детально, почему это происходит, какие события ядра платформы не доходят до компоненты и как правильно обойти эти ограничения.
Проанализируем архитектурные особенности платформы 1С 7.7, приводящие к сбоям в перехвате событий:
СобытиеГМ_СозданиеКонтекста не срабатывает.Событие_ПриЗаписи(Конт) и СобытиеГМ_ПриЗаписи(Конт) не получают управление.Выясним, как зафиксировать обращение к форме операции через доступные альтернативные события компоненты 1С++.
Поскольку СобытиеГМ_СозданиеКонтекста не вызывается, перенесем логику подключения перехватчика в обработчики СобытиеГМ_ПриОткрытии или СобытиеГМ_ВводНового:
// В классе-перехватчике глобальных событий
Процедура СобытиеГМ_ПриОткрытии(Конт)
Если Конт.Вид() = "Операция" Тогда
// Подключаем локальный перехват событий формы операции
ПерехватитьСобытияГК(Конт, ОбъектПерехватчик);
КонецЕсли;
КонецПроцедуры
Обратите внимание: для гарантированной работы перехватчика в глобальном модуле при старте системы необходимо включить флаг обработки групповых контекстов:
// При начале работы системы в Глобальном модуле
УправлениеНастройками = СоздатьОбъект("УправлениеНастройками");
УправлениеНастройками.Установить("ПерехватитьСобытияГК", 1);
Если задача заключается в установке запрета на редактирование или фиксации изменений, а события записи через 1С++ не отрабатывают, наиболее стабильным решением является использование штатных процедур непосредственно в модуле формы операции.
Рассмотрим реализацию запрета редактирования через штатные предопределенные процедуры ПриОткрытии и ПриЗаписи:
// В модуле формы операции
Процедура ПриОткрытии()
// Проверяем условия запрета редактирования (например, дату запрета или права)
Если глПроверитьЗапретРедактирования(ТекущийДокумент()) = 1 Тогда
Форма.ТолькоПросмотр(1);
Форма.КнопкаЗаписать.Доступность(0);
КонецЕсли;
КонецПроцедуры
Процедура ПриЗаписи()
Если глПроверитьЗапретРедактирования(ТекущийДокумент()) = 1 Тогда
Предупреждение("Редактирование операции запрещено!");
СтатусВозврата(0);
Возврат;
КонецЕсли;
// Регистрируем изменения в журнале или служебных таблицах
глЗарегистрироватьИзменение(ТекущийДокумент(), "ЗаписьОперации");
КонецПроцедуры
Разберем другие практические подходы к решению задачи аудита и защиты данных:
Ctrl+Enter) через обработчик ПриНажатииКнопкиКлавиатуры, устанавливая флаг стандартной обработки в значение 0.Событие_ЗаписьСобытияЖурналаРегистрации или Событие_ЗаписьПользовательскогоСобытияЖурналаРегистрации. Они срабатывают на системном уровне независимо от типа открытой формы._1SOPER, _1SENTRY и _1SJOURN. Это гарантирует 100% фиксацию любых правок, минуя ограничения интерфейсных модулей.