gifts2017

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

Опубликовал Александр Венгер (venger) в раздел Программирование - Инструментарий

Ликбез для «штатных» программистов по классу «Перехватчик» внешней компоненты «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


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

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

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

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

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

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

См. также

Подписаться Добавить вознаграждение

Комментарии

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

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

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


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


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

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


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


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

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

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

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


Вы что - издеваетесь? Там черным по серому описывается как организовать все во внешних файлах;-)))
54. Антон (anton.fly7) 02.08.10 22:24
(53) я имел ввиду событие ПослеОбработкиПроведения
55. Александр Венгер (venger) 03.08.10 10:36
(54) После нет, есть до. Тут в предидущих комментах описано как или в мануале к перехватчику - ссылка в статье...
56. Александр Венгер (venger) 03.08.10 13:57
(33),(54) А вот, как и обещал в 34-м посте, новая подсистема, которая и событие "ОбработкаПроведения" ловит, в том числе:
Универсальная подсистема «Подписи/согласования документов»
http://infostart.ru/public/73774/
57. fastwriter (fastwriter) 09.08.10 09:26
Плюсанул. Статьи, подобные этой, кроме всего прочего, способствуют профессиональному росту широких масс 1ц-программистов. Спасибо авторам.
58. Евгений Михайлов (Борода) 20.10.10 23:55
(47) (49) я правильно понял, что по умолчанию ускорение модулей отключено ? :o
(0) растолкуйте параметры при перехвате ошибок исполнения и как его правильно подключить. Что-то не взлетает... :(
59. nicolas eliseev (nicxxx) 02.11.10 09:06
Если грузится еще turbomd.dll, то ее надо грузить до 1С++, иначе - не отлавливается событие ПриЗаписи
60. Артур Аюханов (artbear) 02.11.10 10:19
(59) Это ты откуда взял? какая версия turbomd.dll у тебя?
61. nicolas eliseev (nicxxx) 02.11.10 13:45
62. Артур Аюханов (artbear) 02.11.10 14:57
(61) это старая версия. Иди на форум 1cpp.ru, раздел 1С++, ТурбоМД и прочие, в верхних прикрепленных ветках есть спец.ветка.
ЗЫ нужна версия 1.0.0.1 (обрати внимание на номер, это верно) от 2006 года.
63. nicolas eliseev (nicxxx) 03.11.10 02:51
а, ну я уже обратил внимание :) а почему он меньше в 4 раза стал?
64. jojo nll (nll.jojo) 20.01.12 15:21
65. simply1 Very Simply (simply1) 16.11.12 13:05
Тем, кто до сих пор поддерживает 7.7 - описание очень актуально и доходчиво!

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

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

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

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