[Обучаловка] Преимущества класса «Перехватчик» внешней компоненты «1С++»

03.08.10

Разработка - Разработка внешних компонент

Ликбез для «штатных» программистов по классу «Перехватчик» внешней компоненты «1С++»

В системе 1С 7.7 при интерактивных действиях пользователя, таких как открытие формы документа или справочника, запись документа или ввод нового элемента справочника или документа, возникают одноименные системные события. Штатные средства предоставляют разработчику возможность программной обработки этих событий. Для этого в языке 1С 7.7 зарезервированы названия и синтаксис для системных предопределенных процедур. Вызов таких процедур (если они определены в конфигурации) производится неявно самой системой 1С перед обработкой того или иного интерактивного действия пользователя. Исключение составляют только предопределенные процедуры модуля документа, такие как «ОбработкаПроведения» или «ОбработкаУдаленияПроведения». Их отличие только в том, что вызываются они системой, как при интерактивных действиях, так и при программной инициации этих событий. Тело таких предопределенных процедур разработчик должен написать сам в соответствующих программных модулях конфигурации. Система же сама передает в предопределенную процедуру фактические значения принимаемых процедурой параметров, если они есть, которые можно использовать в теле этих процедур для программной обработки события, например, для выдачи предупреждающих сообщений или отмены выполнения действия того системного события (с помощью системной функции «СтатусВозврата»), которое  вызвало данную предопределенную процедуру.

Поясним сказанное на простом примере. Допустим, мы хотим, чтобы введенные документы в базу могли интерактивно изменять только авторы этих документов. Для этого в модуле формы каждого вида документа нам нужно определить (если это еще не было сделано) такую предопределенную процедуру (пока пустую):

Процедура ПриЗаписи()

КонецПроцедуры

Затем в теле этой процедуры необходимо написать примерно такой код, который будет проверять, совпадает ли автор документа с текущим пользователем системы, и если нет, то отменит выполнение действия этого системного события:

Если ((ПустаяСтрока(СокрЛП(Врег(ИмяПользователя())))=0) И (СокрЛП(Врег(ТекущийДокумент().Автор))<>Врег("<>")) И (ПустаяСтрока(СокрЛП(Врег(ТекущийДокумент().Автор)))=0)) И (СокрЛП(Врег(ТекущийДокумент().Автор))<>СокрЛП(Врег(ИмяПользователя()))) Тогда
Предупреждение("Изменение этого документа Вам запрещено, так как Вы не являетесь его автором",5);
СтатусВозврата(
0);
Возврат;
КонецЕсли;

Соответственно, когда пользователь откроет форму существующего документа другого автора и попытается его изменить, то при попытке записать этот измененный документ в базу, ему будет выведено сообщение о невозможности выполнить это действие. И изменения этого документа не будут записаны в базу.

Так это работает, но имеет ряд недостатков. Ведь в случае необходимости выполнять какие-либо свои действия при возникновении тех или иных событий в базе данных для тех или иных объектов метаданных, разработчик, использующий только штатные возможности 1С, вынужден вставлять свой код (вызов тех или иных функций глобального модуля, например, написанных разработчиком для этих целей) во все предопределенные процедуры всех необходимых объектов метаданных, коих может быть довольно много. Что довольно не удобно и нудно, если не сказать больше;-)

Но и это еще не беда. А теперь представьте, что после установки типового обновления конфигурации, разработчику каждый раз приходится заново, помимо того, что вставлять в глобальный модуль дописанные им функции, так еще и опять во все необходимые модули объектов метаданных во все нужные предопределенные процедуры опять вставлять свой код. Т.е. при типовом обновлении конфигурации (а, например, с бухгалтерией это происходит довольно часто), разработчику каждый раз приходится проделывать одну и ту же неблагодарную работу.

А при разработке новых объектов метаданных (тех же документов, справочников и т.д.) разработчику также нельзя забывать о вставке своего кода в предопределенные процедуры в модулях этих объектов.

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

Внешняя компонента «1С++» (http://www.1cpp.ru) включает в себя класс «Перехватчик», при грамотном использовании возможностей которого, разработчик может избежать всех этих проблем. Более того, построить такое решение, программно обрабатывающее системные события, например, для расширения штатных возможностей контроля прав пользователей, которое можно будет повторно устанавливать (и довольно просто) в разные конфигурации разных заказчиков, а при обновлении типовых тех же заказчиков, также просто и быстро подключать его заново.

Не говоря уже о том, что простота установки и универсальность подобных разработок позволят поставить на поток продажу этих решений, а внедрение может быть произведено и «опытными» пользователями из штата заказчика, без необходимости участия разработчика. А это значит и удешевление стоимости решения для заказчика, и увеличение прибыли для разработчика, за счет продажи не только своих услуг, но и своих готовых «коробочных» универсальных решений большому числу потенциальных покупателей вне зависимости от удаленности и местонахождения покупателя и разработчика.

Итак, покажем, как реализуется, с помощью класса «Перехватчик» внешней компоненты «1С++», тот функционал, который мы реализовали штатными возможностями в начале статьи.

Для начала нам необходимо скачать эту внешнюю компоненту с сайта http://www.1cpp.ru. Последнюю стабильную сборку можно взять тут: http://www.1cpp.ru/images/3/32/Icpp-latest.rar. Из скачанного архива нужно распаковать файл «1cpp.dll» в папку конфигурации или в папку «Bin» платформы 1С 7.7.

Затем в глобальном модуле в предопределенной процедуре «ПриНачалеРаботыСистемы()» прописываем загрузку этой внешней компоненты:

ЗагрузитьВнешнююКомпоненту("1cpp.dll");

После чего создаем обработку с именем «defcls», в теле которой пишем такой код:

//# класс КлассПерехватСобытий = КлассПерехватСобытий@MD
//# {};

Это объявление пользовательского класса 1С++, код которого будет обрабатывать системные события 1С, а экземпляры этого класса будут создаваться системной функцией «СоздатьОбъект» с параметром "КлассПерехватСобытий", а также указание того факта, что код этого класса будет находиться в обработке с именем «КлассПерехватСобытий».

Теперь собственно создаем обработку с именем «КлассПерехватСобытий», в которой и будем реализовывать весь функционал, о котором мы говорим.

Но прежде чем мы начнем, нужно еще в глобальном модуле в предопределенной процедуре «ПриНачалеРаботыСистемы()» после кода загрузки внешней компоненты написать такие строчки:

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

Т.е. этим кодом мы включаем перехват событий, создаем экземпляр нашего пользовательского класса «КлассПерехватСобытий» и назначаем его обработчиком системных событий глобального модуля, для того чтобы отлавливать этим экземпляром нашего класса события открытия форм в 1С.

Вот теперь можем заниматься реализацией самого пользовательского класса, который будет обрабатывать необходимые нам события. Т.е. открываем программный модуль обработки «КлассПерехватСобытий» и пишем такой код:

Перем КонтФормы Экспорт, Док Экспорт;

Процедура
СобытиеГМ_ПриОткрытии(Конт,ФлагЧтенияНастройки) Экспорт
КонтФормы = Конт;
Попытка
Док = КонтФормы.ТекущийДокумент();
Исключение
Возврат;
КонецПопытки;
ПерехватчикСобытийГК=СоздатьОбъект("КлассПерехватСобытий");
ПерехватчикСобытийГК.КонтФормы=КонтФормы;
ПерехватчикСобытийГК.Док=Док;
Перехватчик = СоздатьОбъект("Перехватчик");
Перехватчик.ПерехватитьСобытияГК(КонтФормы,ПерехватчикСобытийГК);
КонецПроцедуры

Функция
Событие_ПриЗаписи() Экспорт
Рез=1;
Если ((ПустаяСтрока(СокрЛП(Врег(ИмяПользователя())))=0) И (СокрЛП(Врег(Док.Автор))<>Врег("<>")) И (ПустаяСтрока(СокрЛП(Врег(Док.Автор)))=0)) И (СокрЛП(Врег(Док.Автор))<>СокрЛП(Врег(ИмяПользователя()))) Тогда
Рез=0;
Предупреждение(
"Изменение этого документа Вам запрещено, так как Вы не являетесь его автором",5);
Иначе
Перехватчик = СоздатьОбъект("Перехватчик");
Рез = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтФормы,"ПриЗаписи");
КонецЕсли;
Возврат
Рез;
КонецФункции

В данном случае идея такова, мы будем перехватывать событие открытия любых форм 1С, процедура «СобытиеГМ_ПриОткрытии» (мы помним, что в предопределенной процедуре «ПриНачалеРаботыСистемы()» мы создали экземпляр нашего класса и указали, что он будет перехватывать события глобального модуля, а соответственно и специальное событие «СобытиеГМ_ПриОткрытии»). В этой процедуре мы фактически для каждой открытой формы документа будем создавать новый экземпляр нашего пользовательского класса и назначать его обработчиком системных событий, но уже форм и только для документов. Попутно заполняя глобальные переменные этого класса контекстом формы документа и собственно документа, события которого мы перехватываем, чтобы в классе иметь возможность обращаться к тому документу и его форме. Т.е. для каждой открытой формы документа при ее открытии мы создаем новый экземпляр нашего класса, который будет обрабатывать события именно этой формы именно этого документа. Соответственно при возникновении события «ПриЗаписи», вернее перед ним, будет вызываться обработчик этого события определенный в нашем пользовательском классе, т.е. функция «Событие_ПриЗаписи()». В которой мы уже проверяем является ли текущий пользователь автором документа и в зависимости от этого, или отменяем выполнение действий данного события (возвращая ноль в функции-обработчике события «Событие_ПриЗаписи()», что эквивалентно вызову системной функции «СтатусВозврата» с параметром ноль в штатных предопределенных процедурах) и предупреждаем пользователя об этом или наоборот – разрешаем, возвращая единицу,  и выполняем те действия, что определены в штатной предопределенной процедуре формы документа «ПриЗаписи()» , если она, конечно, есть.

Вот собственно и вся реализация. Стоит, конечно, понимать, что приведенные здесь примеры кода носят чисто иллюстративный и обучающий характер, в «боевых» условиях код будет несколько сложнее и лучше организован. Во всяком случае, хотелось бы на это надеяться;-)

Итак, мы имеем две новые обработки и пару строк в глобальном модуле. Т.е. нам не надо во все модули форм всех видов документов в предопределенную процедуру «ПриЗаписи()» вписывать свой код, нам не надо, при обновлении конфигурации опять проделывать эту работу, а надо будет только вставить заново пару строк в глобальный модуль в процедуру «ПриНачалеРаботыСистемы()». Установка же в новую конфигурацию тоже будет проста, закинули файл внешней компоненты (dll’ку) в папку с конфигурацией или с платформой, вставили две обработки «defcls», «КлассПерехватСобытий» и прописали несколько строк в глобальный модуль. Т.е. человек слегка знакомый с конфигуратором вполне может это сделать и без разработчика, особенно, если разработчик написал небольшую инструкцию по установке.

Так что возможность перехватывать события 1С в пользовательских классах, определять свои обработчики этих перехваченных событий, управлять выполнением самих событий и выполнением штатных предопределенных процедур этих событий в объектах метаданных конфигурации с помощью класса «Перехватчик» внешней компоненты «1С++» предоставляет, по истине, революционные возможности для разработчика, которыми грех не воспользоваться.

Подробную документацию по классу «Перехватчик» Вы можете почитать тут:
http://www.1cpp.ru/docum/icpp/html/Hooker.html


Примеры проектов использующих возможности класса «Перехватчик»:

Универсальная подсистема «Дополнительные права для документов»
//infostart.ru/public/22202/

Универсальная подсистема «Сканы документов»
//infostart.ru/public/70831/

Универсальная подсистема «Фабрика событий» + «Доп. права доков» + «Сканы доков»
//infostart.ru/public/71084/

Универсальная подсистема «Подписи/согласования документов»
//infostart.ru/public/73774/

Undo или в помощь операторам
//infostart.ru/public/20038/

См. также

HTTP сервер 1С 7.7 + HTTP асинхронный клиент: внешние компоненты для 1С 7.7

Разработка внешних компонент WEB-интеграция Платформа 1С v7.7 Конфигурации 1cv7 Платные (руб)

Компонента HttpSrv7 позволяет создавать веб-сервисы в среде 1С 7.7 и даже, используя файлы HTML, несложные веб-сайты. С помощью нее можно обеспечить доступ к данным 1С 7.7 из браузера. Дополнительно используя компоненту HTTP_Async или синхронный клиент HTTP для 1С 7.7 (публикация № 1152364) можно наладить обмен данными между удаленными информационными базами. С помощью компоненты HTTP_Async можно параллельно посылать много запросов к сайтам, веб-сервисам (в т.ч. к HttpSrv7), а затем обрабатывать данные по мере их поступления.

2000 руб.

27.05.2022    7810    19    13    

31

Компонента ExchangeStruc (Структура Обмена). Прямой обмен данными между потоками, сессиями и окнами.

Разработка внешних компонент Платформа 1С v7.7 Платформа 1С v8.3 Платформа 1C v8.2 Платформа 1С v8.1 Россия Платные (руб)

Аддон "Структура Обмена" (ExchangeStruc) - это компонента, которая обеспечивает доступ к разделяемым процессом структурам, аналогичным структурам 1С. Обеспечивает прозрачную передачу данных примитивных типов, в том числе Двоичных данных, в режиме Реального времени между разными контекстами (формами) или потоками одного процесса. В перспективе функционал будет расширен для обмена между процессами, даже разных версий платформ. Совместим с версиями Windows рабочих станций и серверов, с платформами 1С разных версий и релизов в режиме Native начиная с 8.2, и в режиме COM начиная с версий 7.7. По скорости чтения и записи лишь немногим уступает стандартной структуре 1С. НОВОЕ: Добавлен функционал регистрации компоненты COM в качестве OLE Auto (COMОбъект) для поддержки её работы в серверах старых версий 1С: 8.0 и 8.1, где работа с компонентами исключена. Теперь можно коммуникацию с Фоновыми заданиями на этих версиях проводить.

7200 руб.

19.04.2023    4799    1    0    

3

Выбор из большого списка (для 1С 7.7)

Разработка внешних компонент Платформа 1С v7.7 Платные (руб)

Компонента для выбора значения из больших списков значений.

1200 руб.

02.12.2021    5776    2    19    

4

Форма для ввода количества товаров

Разработка внешних компонент Оптовая торговля Платформа 1С v7.7 Конфигурации 1cv7 Управленческий учет Платные (руб)

Расширяем уровень взаимодействия c пользователем с помощью новых возможностей - форма для ввода количества для перемещений и форма ввода количества с упаковками и штуками.

1200 руб.

08.09.2021    7390    0    2    

1

Внешняя компонента для преобразования файлов из/в кодировку Base64 в 1С 7.7

Разработка внешних компонент Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Эта внешняя компонента Base64.dll предназначена для платформы 1С версии 7.7. Используется для преобразования файлов из/в кодировку Base64 из встроенного языка 1С Предприятие. Компонента тестировалась на базе конфигурации Бухгалтерский учет для Казахстана, редакции 7.70.257.

10 стартмани

06.04.2021    9445    14    softmaker    12    

5

Криптография: внешняя компонента для 1С 7.7

Разработка внешних компонент Защита ПО и шифрование Платформа 1С v7.7 Абонемент ($m)

Цифровые подписи, шифрование, просмотр сертификатов ключей ЭЦП, работа с различными криптопровайдерами (в т.ч. КриптоПРО ГОСТ 2012) в 1С 7.7.

1 стартмани

08.06.2020    9048    27    mdbruyfn    10    

9

Протокол UDP: внешняя компонента для 1С 7.7

Разработка внешних компонент Платформа 1С v7.7 Абонемент ($m)

Обмен сообщениями и небольшими файлами по протоколу UDP с 1С и внешними приложениями в локальной сети или сети VPN.

1 стартмани

23.05.2020    7316    5    mdbruyfn    0    

6
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Утюг 56 21.07.10 09:33 Сейчас в теме
Отчего-то не исполняется в классе функция Событие_ПриЗаписи().
3. Утюг 56 21.07.10 10:19 Сейчас в теме
(1) Не работала на 1с++ 3.0.1.22. Скачал 3.2.1.0 - заработало.
2. marsohod 123 21.07.10 09:54 Сейчас в теме
Во многих типовых есть глобальная функция глПроверкаРазрешенияРедактирования(Контекст), которая вызывается из ПриОткрытии()
1С++ вещь хорошая, только приведенный пример использования кажется не очень удачным...
4. artbear 1448 21.07.10 10:43 Сейчас в теме
(2) Это не выход - 1) т.к данную функцию нужно вставлять в собственные документы
2) не во всех типовых, если не ошибаюсь, она есть.
А мой Перехватчик работает независимо от кода конфы :)

(3) Странно, от версии 1С++ данный код не должен зависеть.
6. Утюг 56 21.07.10 11:45 Сейчас в теме
(4) Попробовал 2.5.0.7 - тоже не работает.
7. venger 2121 21.07.10 12:25 Сейчас в теме
(6) Лучше брать свежую сборку.....
5. artbear 1448 21.07.10 10:48 Сейчас в теме
(0) ИМХО небольшая неточность
если штатный обработчик (в модуле формы документа) вернет СтатусВозврата(0), т.е. будет установлен запрет записи, то этот запрет не сработает :(
Исправить нужно так:
Функция Событие_ПриЗаписи() Экспорт
Иначе
Перехватчик = СоздатьОбъект("Перехватчик");
Рез = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтФормы,"ПриЗаписи"); // ДОБАВИЛ Рез =
КонецЕсли;
Возврат Рез;
КонецФункции
ЗЫ хотя, может быть, я уже и забыл собственную реализацию Перехватчика :)
8. venger 2121 21.07.10 12:44 Сейчас в теме
(5) Все верно, поправил. Правда стоит в штатных предопределенных писать так:

СтатусВозврата(0);
Возврат;


Так как код в штатной предопределенной после "СтатусВозврата(0);", если не будет команды выхода из процедуры "Возврат;", - выполнится.
Но это уже к 1С++ отношения не имеет - это штатные вещи;-)
9. gucci76 364 21.07.10 13:05 Сейчас в теме
А как запретить проводить документ подобным способом? Допустим кадрам можно создавать документ, а проводить нельзя.
При настройке прав, если разрешить Ввод нового, то первый раз документ сможет проводиться. А нужно чтобы совсем не проводился, но создавался.
10. gucci76 364 21.07.10 13:19 Сейчас в теме
Я так понял это ответ на мой вопрос: "Исключение составляют только предопределенные процедуры модуля документа, такие как «ОбработкаПроведения» или «ОбработкаУдаленияПроведения». Их отличие только в том, что вызываются они системой, как при интерактивных действиях, так и при программной инициации этих событий. "
т.е. никак!
11. venger 2121 21.07.10 14:00 Сейчас в теме
(10) Нет - можно, счас напишу пример, немного терпения;-)
12. gucci76 364 21.07.10 14:07 Сейчас в теме
Жду!
Держу мышку над плюсиком :)
13. venger 2121 21.07.10 14:15 Сейчас в теме
(12) Я просто немного усложнил и отредактировал условие проверки авторства документов в статье (еще и раскрасить надо было), в связи с тем, что а вдруг пользователи в системе не определены совсем. Получилось громоздко, но прикольно;-)
З.Ы. Чтобы увидеть изменения нужно жмакнуть "Очистить кеш публикации (beta)" справа в меню
14. gucci76 364 21.07.10 14:48 Сейчас в теме
что то не получается с перехватом ПриЗаписи, а про ОбработкаПроведения ваще не видно перехватчика.
15. venger 2121 21.07.10 14:53 Сейчас в теме
(14) А вот как ловить "ОбработкуПроведения":
Сначала в глобальный модуль в процедуру "ПриНачалеРаботыСистемы()" после кода включения перехвата еще надо дописать код включения перехвата событий модуля документа для всех видов доков:
Для Сч=1 По Метаданные.Документ() Цикл
	Перехватчик.СнятьПерехватСобытийПроведенияДокумента(СокрЛП(Метаданные.Документ(Сч).Идентификатор));		
	Перехватчик.ПерехватитьСобытияПроведенияДокумента(СокрЛП(Метаданные.Документ(Сч).Идентификатор),ПерехватчикСобытийГМ);
КонецЦикла;


А потом в класс перехвата событий дописать такую функцию:
Функция Событие_ОбработкаПроведения(КонтДока, ДопПарам) Экспорт
	Сообщить("Ловим: ОбработкаПроведения");
	Рез=1;
	Если КонтДока.ГрупповаяОбработка()<=0 Тогда
		Если (1=1) Тогда // Какое-то условие
	        Рез=0;
	        Предупреждение("Проводить этот документ Вам запрещено",5);
	    КонецЕсли;
	КонецЕсли;
	Если Рез=1 Тогда
		Перехватчик = СоздатьОбъект("Перехватчик");
		Рез = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтДока,"ОбработкаПроведения",ДопПарам);
	КонецЕсли;
    Возврат Рез;
КонецФункции
Показать
16. venger 2121 21.07.10 14:55 Сейчас в теме
(14) +15, Что-то плохо отобразился код включения перехвата проведения, повторю так:

Для Сч=1 По Метаданные.Документ() Цикл
Перехватчик.СнятьПерехватСобытийПроведенияДокумента(СокрЛП(Метаданные.Документ(Сч).Идентификатор));
Перехватчик.ПерехватитьСобытияПроведенияДокумента(СокрЛП(Метаданные.Документ(Сч).Идентификатор),ПерехватчикСобытийГМ);
КонецЦикла;
17. venger 2121 21.07.10 14:55 Сейчас в теме
(14) +16, Тоже обрезается, а если просто текстом:
Для Сч=1 По Метаданные.Документ() Цикл
Перехватчик.СнятьПерехватСобытийПроведенияДокумента(СокрЛП(Метаданные.Документ(Сч).Идентификатор));
Перехватчик.ПерехватитьСобытияПроведенияДокумента(СокрЛП(Метаданные.Документ(Сч).Идентификатор),ПерехватчикСобытийГМ);
КонецЦикла;
18. venger 2121 21.07.10 14:56 Сейчас в теме
(14) +17, Да что такое, хорошо, попробуем так:
Для Сч=1 По Метаданные.Документ() Цикл
	Перехватчик.СнятьПерехватСобытийПроведенияДокумента(
			СокрЛП(Метаданные.Документ(Сч).Идентификатор));		
	Перехватчик.ПерехватитьСобытияПроведенияДокумента(
		СокрЛП(Метаданные.Документ(Сч).Идентификатор),ПерехватчикСобытийГМ);
КонецЦикла;
20. venger 2121 21.07.10 15:02 Сейчас в теме
(14) Итого, все по порядку, после действий проделанных в статье, чтобы включить перехват проведения, надо в глобальный модуль в процедуру "ПриНачалеРаботыСистемы()" после кода включения перехвата еще дописать код включения перехвата событий модуля документа для всех видов доков:
Для Сч=1 По Метаданные.Документ() Цикл
	Перехватчик.СнятьПерехватСобытийПроведенияДокумента(
			СокрЛП(Метаданные.Документ(Сч).Идентификатор));		
	Перехватчик.ПерехватитьСобытияПроведенияДокумента(
		СокрЛП(Метаданные.Документ(Сч).Идентификатор),ПерехватчикСобытийГМ);
КонецЦикла;


После чего, в классе-обработке перехвата событий дописать такую процедуру:
Функция Событие_ОбработкаПроведения(КонтДока, ДопПарам) Экспорт
	Сообщить("Ловим: ОбработкаПроведения");
	Рез=1;
	Если КонтДока.ГрупповаяОбработка()<=0 Тогда
		Если (1=1) Тогда // Какое-то условие
	        Рез=0;
	        Предупреждение("Проводить этот документ Вам запрещено",5);
	    КонецЕсли;
	КонецЕсли;
	Если Рез=1 Тогда
		Перехватчик = СоздатьОбъект("Перехватчик");
		Рез = Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтДока,"ОбработкаПроведения",ДопПарам);
	КонецЕсли;
    Возврат Рез;
КонецФункции
Показать


Соответственно, при проведении какого-либо документа Вы увидите сообщение "Ловим: ОбработкаПроведения". Если да, то все Ок.

Только надо учесть, что проверка на авторство при проведении бессмысленна, так как автор сменился при записи, которое всегда перед проведением произойдет. И еще, при программном проведении документа (групповая обработка документов какая-нибудь) это событие тоже будет отлавливаться...
puh; MadDAD; SirYozha; +3 Ответить
19. gucci76 364 21.07.10 14:57 Сейчас в теме
Перехватчик.СнятьПерехватСобытийПроведенияДокумента(СокрЛП(Метаданные.Документ(Сч).Идентификатор));
{Глобальный модуль(1142)}: Поле агрегатного объекта не обнаружено (СнятьПерехватСобытийПроведенияДокумента)
:cry: :cry: :cry:
21. venger 2121 21.07.10 15:03 Сейчас в теме
(19) Вы понимаете, что я в комментах привожу код который надо дописать, к коду в статье?
22. gucci76 364 21.07.10 15:07 Сейчас в теме
Вот что у меня в глобальнике:
ЗагрузитьВнешнююКомпоненту("1CPP.dll");
НастройкиВК = СоздатьОбъект("УправлениеНастройками");
НастройкиВК.Установить("ПерехватитьСобытияГК",1);
ПерехватчикСобытийГМ = СоздатьОбъект("КлассПерехватСобытий");
Перехватчик = СоздатьОбъект("Перехватчик");
Перехватчик.ПерехватитьСобытияГлобальногоМодуля(ПерехватчикСобытийГМ);
Для Сч=1 По Метаданные.Документ() Цикл
Перехватчик.СнятьПерехватСобытийПроведенияДокумента(
СокрЛП(Метаданные.Документ(Сч).Идентификатор));
Перехватчик.ПерехватитьСобытияПроведенияДокумента(
СокрЛП(Метаданные.Документ(Сч).Идентификатор),ПерехватчикСобытийГМ);
КонецЦикла;
24. venger 2121 21.07.10 15:10 Сейчас в теме
(22) В глобальнике все верно
23. gucci76 364 21.07.10 15:07 Сейчас в теме
26. venger 2121 21.07.10 15:13 Сейчас в теме
(23) Идем далее, в обработках (объявление классов и сам класс) что?
29. gucci76 364 21.07.10 15:18 Сейчас в теме
(26) в глобальнике выдает ошибку. до обрбаотки не доходил.
25. gucci76 364 21.07.10 15:12 Сейчас в теме
Перехватчик.СнятьПерехватСобытийПроведенияДокумента(СокрЛП(Метаданные.Документ(Сч).Идентификатор));
{Глобальный модуль(1142)}: Поле агрегатного объекта не обнаружено (СнятьПерехватСобытийПроведенияДокумента)
осталась ошибка в глобальнике
27. venger 2121 21.07.10 15:14 Сейчас в теме
(25) У Вас версия ВК свежая?
28. gucci76 364 21.07.10 15:17 Сейчас в теме
31. venger 2121 21.07.10 15:20 Сейчас в теме
(28) А скиньте md'шку в почту, адрес скинул в личке...
30. gucci76 364 21.07.10 15:20 Сейчас в теме
ВРУ!
Скачать скачал, но стояла старая. Ща проверю
32. venger 2121 21.07.10 15:23 Сейчас в теме
(30) Там еще нюанс может быть при смене версий компонент, с какой-то версии изменен порядок чтения и хранения настроек ВК в реестре, если что, то говорите, будем разбираться...
33. gucci76 364 21.07.10 15:23 Сейчас в теме
Спасибо заработало.
Плюсую!!!!!
34. venger 2121 21.07.10 15:39 Сейчас в теме
(33) Пожалуста, кстати, если еще подождете (несколько дней, плюс-минус), то я как раз дописываю новую подсистему, в которой в том числе и отлов "ОбработкиПроведения" ловится и можно будет посмотреть на реальном примере, там еще кое-что интересное будет, но не буду все рассказывать, а то не интересно будет;-)
56. venger 2121 03.08.10 13:57 Сейчас в теме
(33),(54) А вот, как и обещал в 34-м посте, новая подсистема, которая и событие "ОбработкаПроведения" ловит, в том числе:
Универсальная подсистема «Подписи/согласования документов»
http://infostart.ru/public/73774/
35. Ёпрст 1063 21.07.10 15:58 Сейчас в теме
Я б всё же, для начала, все классы делал внешними.
Гораздо проще изменять и тестить.
А уж только потом, в мд встраивал.
ev-kov; dav405; venger; artbear; +4 Ответить
36. venger 2121 21.07.10 16:35 Сейчас в теме
(35) А внешние файлы чем предлагаешь редактировать - не блокнотом же?
37. Арчибальд 2706 21.07.10 16:44 Сейчас в теме
(36) Ну ты сказал :D
В одноэсине меню файл-открыть
А потом Текст-Текст модуля
39. venger 2121 21.07.10 16:49 Сейчас в теме
38. venger 2121 21.07.10 16:48 Сейчас в теме
(35), +36, Или имеется ввиду внешние отчеты/обработки?
40. Ish_2 1104 21.07.10 19:15 Сейчас в теме
Мда... "Всё равно 7.7 не брошу , потому что он хороший".
Не стал ты нашим.
За стойкость +1.
41. venger 2121 21.07.10 20:47 Сейчас в теме
(40) Не, просто, как говорится:

Пока гром не грянет – мужик не перекрестится.

Вот и я, пока не приперло, откладываю углубленное изучение снеговика, тем более лето, жара, после работы на море и т.д. и т.п.;-)
44. Ish_2 1104 22.07.10 07:49 Сейчас в теме
(41) Понял в чем дело. Слушай как надо :
Утром - море , вечером - снеговик.
Идеальный распорядок для взрослого мужчины.
46. venger 2121 22.07.10 11:18 Сейчас в теме
(44) Я пробовал утром бегать на море, но не долго это продолжалось;-) А вечером, после обеда в квартиру солнце светит через окна и жара такая в квартире, что только после 8-ми вечера можно находится;-)
42. SirYozha 222 22.07.10 05:58 Сейчас в теме
Спасибо за ликбез, классная вещь!
Только пришлось добавить одну строку в глобальном модуле, чтобы заработало - необходимо сначала включить настройку ПерехватитьСобытияГК:
НастройкиВК = СоздатьОбъект("УправлениеНастройками");
НастройкиВК.Включить("ПерехватитьСобытияГК");
НастройкиВК.Установить("ПерехватитьСобытияГК",1);
ПерехватчикСобытийГМ = СоздатьОбъект("КлассПерехватСобытий");
Перехватчик = СоздатьОбъект("Перехватчик");
Перехватчик.ПерехватитьСобытияГлобальногоМодуля(ПерехватчикСобытийГМ);
45. venger 2121 22.07.10 11:16 Сейчас в теме
(42) Установить в =1 и включить ведь одно и тоже...
43. SirYozha 222 22.07.10 06:40 Сейчас в теме
47. JohnyDeath 301 22.07.10 12:18 Сейчас в теме
ПолуОФФ
По-хорошему, надо б еще ТурбоБЛ сразу включать:
НастройкиВК.Установить("EnableTurboBL",1);
48. venger 2121 22.07.10 12:49 Сейчас в теме
(47) Это для отлова событий FormEx, насколько я понимаю?
49. artbear 1448 22.07.10 13:13 Сейчас в теме
(47) 1) ТурбоБЛ - реальное ускорение работы 1С
2) с помощью ТурбоБЛ можно обращаться к методам группового контекста - типа КонтФормы.Печать()
ЗЫ без ТурбоБЛ не мыслю работы с 1С++ :)
58. Борода 20.10.10 23:55 Сейчас в теме
(47) (49) я правильно понял, что по умолчанию ускорение модулей отключено ? :o
(0) растолкуйте параметры при перехвате ошибок исполнения и как его правильно подключить. Что-то не взлетает... :(
50. anton.fly7 173 31.07.10 10:36 Сейчас в теме
Скажите, а обработку defcls и обработки самих классов можно как то хранить не в самой конфиге, а внешними?
51. venger 2121 02.08.10 11:41 Сейчас в теме
52. anton.fly7 173 02.08.10 20:32 Сейчас в теме
(51) в мануале http://www.script-coding.info/1cpp.html не нашел, а есть ли перехват события ПослеОбработкиПроведения ?
53. venger 2121 02.08.10 20:44 Сейчас в теме
(52)
в мануале http://www.script-coding.info/1cpp.html не нашел


Вы что - издеваетесь? Там черным по серому описывается как организовать все во внешних файлах;-)))
54. anton.fly7 173 02.08.10 22:24 Сейчас в теме
(53) я имел ввиду событие ПослеОбработкиПроведения
55. venger 2121 03.08.10 10:36 Сейчас в теме
(54) После нет, есть до. Тут в предидущих комментах описано как или в мануале к перехватчику - ссылка в статье...
57. fastwriter 6 09.08.10 09:26 Сейчас в теме
Плюсанул. Статьи, подобные этой, кроме всего прочего, способствуют профессиональному росту широких масс 1ц-программистов. Спасибо авторам.
59. nicxxx 254 02.11.10 09:06 Сейчас в теме
Если грузится еще turbomd.dll, то ее надо грузить до 1С++, иначе - не отлавливается событие ПриЗаписи
60. artbear 1448 02.11.10 10:19 Сейчас в теме
(59) Это ты откуда взял? какая версия turbomd.dll у тебя?
61. nicxxx 254 02.11.10 13:45 Сейчас в теме
62. artbear 1448 02.11.10 14:57 Сейчас в теме
(61) это старая версия. Иди на форум 1cpp.ru, раздел 1С++, ТурбоМД и прочие, в верхних прикрепленных ветках есть спец.ветка.
ЗЫ нужна версия 1.0.0.1 (обрати внимание на номер, это верно) от 2006 года.
63. nicxxx 254 03.11.10 02:51 Сейчас в теме
а, ну я уже обратил внимание :) а почему он меньше в 4 раза стал?
64. nll.jojo 20.01.12 15:21 Сейчас в теме
65. simply1 6 16.11.12 13:05 Сейчас в теме
Тем, кто до сих пор поддерживает 7.7 - описание очень актуально и доходчиво!

Автору - спасибо!

ИХМО, переменная "Док" - лишняя и зря занимает память.
Если убедились, что это документ, то "КонтФормы.ТекущийДокумент()" будет достаточно.
66. vadimlp77 31 24.09.13 17:26 Сейчас в теме
не понял как при перехвате проведения отменить само проведение. Подскажите кто нить, плиз
у меня вот такое

Функция Событие_ОбработкаПроведения(Конт,ДопПараметр) Экспорт
Сообщить("ОбработкаПроведения");
Рез = ПолучитьПравоДоступаКОбъекту(Конт.ТекущийДокумент(), "ПроведениеДокумента");
Если Рез=1 Тогда
Возврат Перехватчик.ВыполнитьОригинальноеСобытиеГК(Конт, "ОбработкаПроведения", ДопПараметр);
КонецЕсли;
КонецФункции // гл

что дописать чтобы по условию можно было не проводить док ?
68. artbear 1448 24.09.13 19:47 Сейчас в теме
(66) vadimlp77,
Верни 0 в своей функции Событие_ОбработкаПроведения
и документ не проведется.
69. vadimlp77 31 24.09.13 20:49 Сейчас в теме
(68) artbear, спасибо, уже разобрался по обоим вопросам
67. vadimlp77 31 24.09.13 17:57 Сейчас в теме
подскажите плиз
как в обработке события "ПриОткрытии" определить какая конкретно форма открывается, я имею в виду, что у справочника может быть несколько форм. Мне нужно видеть какая форма открывается. Спасибо.
70. Alex_1066 03.10.14 13:25 Сейчас в теме
Спасибо за статью - понятно и доходчиво и отдельное спасибо всем за комменты...
Оставьте свое сообщение