Рассмотрим часто возникающую задачу в разработке на платформе 1С 7.7: необходимо выполнить программный контроль и, при невыполнении определенных условий, отменить операцию при снятии документа с проведения или при его пометке на удаление. При этом действия пользователя производятся непосредственно из контекста журнала документов. Разберем по шагам, какие системные события платформы мы можем использовать и как правильно их обрабатывать.
Если пользователь пытается пометить документ на удаление или удалить его безвозвратно из журнала, система обращается к глобальному модулю. Проанализируем, как перехватить это действие.
В глобальном модуле конфигурации платформы 1С 7.7 предусмотрена специальная системная процедура ПриУдаленииДокумента. Она принимает два важных параметра:
Документ — ссылка на удаляемый объект, позволяющая проверить его вид и реквизиты.РежимУдаления — числовой флаг, который помогает точно идентифицировать тип выполняемой операции. Значение 0 означает стандартную установку или снятие пометки на удаление. Значение 1 указывает на попытку непосредственного (безвозвратного) удаления объекта из базы данных (например, при нажатии комбинации Shift+Delete).Если в результате проверок мы понимаем, что пользователю нельзя удалять данный документ, мы можем прервать операцию платформы. Для запрета операции необходимо использовать функцию СтатусВозврата(0). Вызов этой функции отменит дальнейшее платформенное действие.
Посмотрим на пример реализации в глобальном модуле:
Процедура ПриУдаленииДокумента(Документ, РежимУдаления)
Если Документ.Вид() = "ЗаказКлиента" Тогда
Если РежимУдаления = 1 Тогда
Сообщить("Безвозвратное удаление заказов запрещено!");
СтатусВозврата(0);
Возврат;
ИначеЕсли Документ.Проведен() = 1 Тогда
Сообщить("Сначала снимите заказ с проведения!");
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Важно: Так как процедура находится в глобальном модуле и срабатывает для каждого документа базы данных, внутри нее обязательно нужно выполнять проверку вида объекта через Документ.Вид(), чтобы случайно не заблокировать работу с документами других типов.
При отмене проведения документа из журнала у нас есть два пути перехвата этого события: на уровне документа и на уровне глобального модуля. Рассмотрим подробнее каждый из них.
1. Обработчик в модуле документа
Когда мы отменяем проведение из журнала, в первую очередь отрабатывает процедура модуля самого документа ОбработкаУдаленияПроведения(). Здесь мы можем разместить всю внутреннюю логику проверок. Для отмены распроведения также используется СтатусВозврата(0).
Главная особенность этого метода в том, что ОбработкаУдаленияПроведения() срабатывает в любых ситуациях: как при ручном (интерактивном) снятии с проведения, так и при программном распроведении документа. Однако важно учитывать, что этот обработчик выполняется уже внутри открытой транзакции базы данных.
2. Обработчик в глобальном модуле
Второй вариант — использовать глобальную процедуру ПриОтменеПроведенияДокумента(Документ). Выясним причину, по которой иногда предпочтительнее использовать именно ее.
Главный плюс глобального обработчика заключается в том, что он вызывается до старта системной транзакции и до блокировки таблиц базы данных. Если проверка занимает время или требует взаимодействия с пользователем, лучше выполнять её здесь, чтобы не держать таблицы заблокированными.
Пример использования в глобальном модуле:
Процедура ПриОтменеПроведенияДокумента(Документ)
Если Документ.Вид() = "РасходнаяНакладная" Тогда
Если Документ.Отгружен = 1 Тогда
Сообщить("Товар уже отгружен, распроведение запрещено!");
СтатусВозврата(0);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Разберем специфические нюансы, с которыми можно столкнуться при реализации:
ПриУдаленииДокумента и ПриОтменеПроведенияДокумента срабатывают только при интерактивных действиях пользователя (нажатие кнопок на клавиатуре или выбор пунктов меню в интерфейсе). Если вы программно меняете состояние документов (например, через групповую обработку с вызовом методов Удалить() или СделатьНеПроведенным()), эти глобальные обработчики инициированы не будут.FormEx. Они позволяют напрямую перехватывать нажатия горячих клавиш (Del, Shift+Del) в окне активного журнала или программно скрывать кнопки на панели инструментов, предотвращая саму попытку пользователя запустить транзакцию изменения документа.