Почему перехватчик 1С++ не перехватывает форму операции в 1С 7.7 и как это обойти?

Программист 1С v7.7 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При разработке глобальных механизмов аудита, контроля прав или запрета редактирования объектов конфигурации на платформе 1С:Предприятие 7.7 с использованием внешней компоненты 1С++ разработчики часто сталкиваются с проблемой: класс Перехватчик корректно обрабатывает документы и справочники, но полностью игнорирует форму операции (ручные проводки и операции документов).

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

Причины проблемы и внутренние ограничения платформы

Проанализируем архитектурные особенности платформы 1С 7.7, приводящие к сбоям в перехвате событий:

  1. Специфика внутреннего класса «Операция»: В ядре 1С 7.7 операции реализованы не как стандартные документы, а через отдельные низкоуровневые классы. Из-за этого вызовы создания контекста не транслируются в глобальную цепочку перехвата, и событие СобытиеГМ_СозданиеКонтекста не срабатывает.
  2. Разделение типов операций: Операция документа управляется самим документом, в то время как ручная операция имеет собственный контекст формы, обходящий стандартный пайплайн записи документов. В результате обработчики Событие_ПриЗаписи(Конт) и СобытиеГМ_ПриЗаписи(Конт) не получают управление.
  3. Особенности передачи параметров: Если сигнатура метода в перехватчике не совпадает в точности с внутренним вызовом для конкретного типа объекта, платформа молча пропускает обработку.

Способ 1. Перехват через события открытия и локальная инициализация

Выясним, как зафиксировать обращение к форме операции через доступные альтернативные события компоненты 1С++.

Поскольку СобытиеГМ_СозданиеКонтекста не вызывается, перенесем логику подключения перехватчика в обработчики СобытиеГМ_ПриОткрытии или СобытиеГМ_ВводНового:


// В классе-перехватчике глобальных событий
Процедура СобытиеГМ_ПриОткрытии(Конт)
    Если Конт.Вид() = "Операция" Тогда
        // Подключаем локальный перехват событий формы операции
        ПерехватитьСобытияГК(Конт, ОбъектПерехватчик);
    КонецЕсли;
КонецПроцедуры

Обратите внимание: для гарантированной работы перехватчика в глобальном модуле при старте системы необходимо включить флаг обработки групповых контекстов:


// При начале работы системы в Глобальном модуле
УправлениеНастройками = СоздатьОбъект("УправлениеНастройками");
УправлениеНастройками.Установить("ПерехватитьСобытияГК", 1);

Способ 2. Штатная обработка в модуле формы операции

Если задача заключается в установке запрета на редактирование или фиксации изменений, а события записи через 1С++ не отрабатывают, наиболее стабильным решением является использование штатных процедур непосредственно в модуле формы операции.

Рассмотрим реализацию запрета редактирования через штатные предопределенные процедуры ПриОткрытии и ПриЗаписи:


// В модуле формы операции
Процедура ПриОткрытии()
    // Проверяем условия запрета редактирования (например, дату запрета или права)
    Если глПроверитьЗапретРедактирования(ТекущийДокумент()) = 1 Тогда
        Форма.ТолькоПросмотр(1);
        Форма.КнопкаЗаписать.Доступность(0);
    КонецЕсли;
КонецПроцедуры

Процедура ПриЗаписи()
    Если глПроверитьЗапретРедактирования(ТекущийДокумент()) = 1 Тогда
        Предупреждение("Редактирование операции запрещено!");
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;
    
    // Регистрируем изменения в журнале или служебных таблицах
    глЗарегистрироватьИзменение(ТекущийДокумент(), "ЗаписьОперации");
КонецПроцедуры

Способ 3. Альтернативные варианты запрета и регистрации изменений

Разберем другие практические подходы к решению задачи аудита и защиты данных:

  1. Перехват событий клавиатуры: Для предотвращения сохранения можно перехватывать нажатия горячих клавиш (например, Ctrl+Enter) через обработчик ПриНажатииКнопкиКлавиатуры, устанавливая флаг стандартной обработки в значение 0.
  2. Логирование через события журнала регистрации: Для надежного аудита изменений используйте системные методы компоненты 1С++ Событие_ЗаписьСобытияЖурналаРегистрации или Событие_ЗаписьПользовательскогоСобытияЖурналаРегистрации. Они срабатывают на системном уровне независимо от типа открытой формы.
  3. Триггеры на уровне СУБД: При работе 1С 7.7 в связке с Microsoft SQL Server фиксацию изменений в проводках и ручных операциях можно вынести на уровень базы данных с помощью триггеров на системные таблицы _1SOPER, _1SENTRY и _1SJOURN. Это гарантирует 100% фиксацию любых правок, минуя ограничения интерфейсных модулей.
← На главную