|
v7: А можно ли глобально перехватить открытие формы? Ø (Волшебник 11.02.2024 17:18) |
☑ | ||
---|---|---|---|---|
0
Chai Nic
08.02.24
✎
21:50
|
Задача - не давать открывать определенные документы по определенному условию, без программирования в каждой форме документа.
В formex есть глобальные процедуры ПослеОткрытия и ПослеСозданияФормы. В них доступен контекст формы. И как бы можно сделать Конт.Форма.Закрыть(), но при этом успевает прорисоваться содержимое документа и если в ПриОткрытии вылетит Предупреждение, то документ останется видимым с модальным предупреждением, что не надо. Есть ли способ сделать глобальный перехватчик аналогично ПриОткрытии со СтатусВозврата(0) из модуля формы, то есть чтобы можно было отказаться от открытия окна до его создания? |
|||
1
Волшебник
08.02.24
✎
22:06
|
ПриОткрытии закрыть?
Что за дурдом? |
|||
2
АЛьФ
08.02.24
✎
22:20
|
2(0) Можно с помощью 1С++: https://www.1cpp.ru/docum/icpp/html/Hooker.html#id38
|
|||
3
Злопчинский
08.02.24
✎
22:39
|
"Ты меня не путай!"
. если в ПриОткрытии вылетит Предупреждение - то будет висеть только Предупреждение. Без окна. |
|||
4
Злопчинский
08.02.24
✎
22:40
|
(1) Уууу, это сильное колдунство!
|
|||
5
Chai Nic
08.02.24
✎
22:52
|
(2) "только для классов-перехватчиков ГМ"
То есть, в нормальном глобальнике это не работает? |
|||
6
АЛьФ
08.02.24
✎
23:11
|
2(5) не работает.
|
|||
7
Chai Nic
09.02.24
✎
06:42
|
(6) А есть какой-нибудь howto с примерами по использованию этих самых классов-перехватчиков с минимальными жертвами?
|
|||
8
Chai Nic
09.02.24
✎
06:57
|
(6) Кстати, в формексе обнаружился какой-то таинственный глобальный метод ПриОткрытииФормыДокумента, но ему в качестве параметров передаются не объекты, а какие-то непонятные ИДы. Как из этих ИДов получить нечто вменяемое?
|
|||
9
Bigbro
09.02.24
✎
08:07
|
а как же статусВозврата(0) ?
|
|||
10
Chai Nic
09.02.24
✎
08:28
|
(9) В ПриОткрытии он работает, но эта процедура не глобальная, а в модуле формы.
|
|||
11
АЛьФ
09.02.24
✎
09:11
|
2(0) Попробую на этих выходных добавить в FormEx транслирование локальных предопределенных процедур в глобальный модуль.
|
|||
12
АгентБезопасной Нацио
09.02.24
✎
09:21
|
(7) дай мыло, скину пример из какой-то старой базы
|
|||
13
Ёпрст
09.02.24
✎
09:41
|
(7)
На вот, не faq не претендует, но даст понятие, как работает перехватчик https://infostart.ru/1c/tools/79515/ https://infostart.ru/1c/tools/20885/ Где-то валялась конфа на его основе, как раз для правки прав на-лету. |
|||
14
uno-group
09.02.24
✎
10:11
|
А че не юзать стандартный механизм. Во всех документах прописана процедура ГлПроверкаДаты() при открытии.
или в эту процедуру добавить вызов своей процедуры или поиском и заменой поменять вызов одной процедуры на две. |
|||
15
АЛьФ
09.02.24
✎
10:10
|
2(14) Потому что таковы начальные условия задачи: "без программирования в каждой форме документа".
|
|||
16
mishaPH
09.02.24
✎
10:13
|
(11) +++
|
|||
17
Aleksey
09.02.24
✎
10:15
|
(15) Так он и предлагает писать в процедуру ГлПроверкаДаты
|
|||
18
АгентБезопасной Нацио
09.02.24
✎
10:38
|
(15) Ты ж для этого писал Инсертер, если память не изменяет?
|
|||
19
Chai Nic
09.02.24
✎
11:00
|
(14) "Во всех документах прописана процедура ГлПроверкаДаты()"
Не во всех. Самописка поскольку. Опять таки и проверку даты хотелось бы оглобальнить) |
|||
20
АЛьФ
09.02.24
✎
11:35
|
2(18) Неожиданно... Не думал, что кто-то еще помнит. Сначала хотел его предложить, но именно требования не вмешиваться в формы документов заставило отказаться от этого совета. Сабжевая задача может ведь возникать и при внешней доработке, когда в конфигу лучше не вмешиваться либо когда она предназначена для разных конфиг.
|
|||
21
АгентБезопасной Нацио
09.02.24
✎
11:45
|
(20) "я не злопамятный - просто злой, и память хорошая"©
У него самописЬка, поэтому может и наинсертить. ну а если не хочет - есть перехватчик, его более чем достаточно (сейчас посмотрел - в той старой конфиге подсистема хранения сканов документов с инфостарта прицеплена, все на перехвате, без модификаций форм) |
|||
22
Chai Nic
09.02.24
✎
11:57
|
(21) Перехватчик и классы 1с++ это какая-то высшая математика. Слишком сложно для простой задачи.
|
|||
23
alyuev
09.02.24
✎
12:11
|
(18) А что за Инсертер?
|
|||
24
АЛьФ
09.02.24
✎
12:13
|
||||
25
Ёпрст
09.02.24
✎
13:07
|
(22) На самом деле, это просто, как грабли. Тем более, что всё задокумментировано и есть кучка примеров.
|
|||
26
Ёпрст
09.02.24
✎
13:08
|
Да и в перехватчике самом, всего-то пара методов.
|
|||
27
Ёпрст
09.02.24
✎
13:12
|
На вот, еще пример попроще на Перехватчике
https://infostart.ru/1c/tools/141197/ |
|||
28
Chai Nic
09.02.24
✎
14:56
|
(27) Непонятно, с чего начинать. В том примере - откуда эта "АляВосьмерка" взялась? Почему внешнюю обработку можно загружать через СоздатьОбъект? Откуда 1с об этом узнает, если там даже пути к ней нет?
|
|||
29
Ёпрст
09.02.24
✎
15:28
|
(28) ничего не понял))
|
|||
30
Ёпрст
09.02.24
✎
15:29
|
Начать с чтения доки к классу Перехватчик. На форуме 1cpp есть целая ветка с обсуждением
|
|||
31
Ёпрст
09.02.24
✎
15:32
|
(28) >>>>откуда аля 8ка взялась
Дык в примере, валяется сам класс, рамположенный во внешнем файле, помещенный в каталог иб, там же, файл с описанием класса. |
|||
32
АгентБезопасной Нацио
09.02.24
✎
15:35
|
(28) откуда эта "АляВосьмерка" взялась - руками написана.
Почему внешнюю обработку можно загружать через СоздатьОбъект?- потому, что в ней содержится описание класса. Ты создаешь объект класса "АляВосьмерка" (так же, как СоздатьОбъект("Документ.Реализация") создает объект класса Документ.Реализация) Откуда 1с об этом узнает, если там даже пути к ней нет?-оттуда, что есть файлик DefCls.prm в каталоге базы, в котором написано: класс АляВосьмерка = АляВосьмерка.ert{}; При запуске 1с++ читает этот фалик и знает, какие классы есть, в каом файле описана их реализация... |
|||
33
Ёпрст
09.02.24
✎
15:38
|
Как написать простейший класс, тут
https://www.script-coding.com/1cpp.html Дока перехватчика тут https://www.1cpp.ru/docum/html/Hooker.html Сами классы можно хранить в самой конфе, можно хранить снаружи в файлах, можно на-ходу загрузить из строки, например, предварительно проверив, что такой класс еще не загружен. |
|||
34
mishaPH
09.02.24
✎
15:41
|
(18) это есть не гуд. 1 раз да прописал. сам им пользовался как-то . Но потом разработка идет новые доки и т.п. и забываешь.
|
|||
35
mishaPH
09.02.24
✎
15:41
|
а если чтото глобальное будет при открытии формы. это хорошо. можно очень легко построить систему прав на формы.
|
|||
36
Злопчинский
09.02.24
✎
15:52
|
а по (8) - ?
|
|||
37
АЛьФ
09.02.24
✎
15:58
|
2(36) Процедура ПриОткрытииФормыДокумента_(
ФлагСтандартнойОбработки, идВидаОткрываемогоДокумента, идОткрываемогоОбъекта, идТекущегоЖурнала, п4, идКопируемогоОбъекта, идВидаТекущегоВЖурнале, флВводНаОсновании, идВидаДокументаОснования, флРежимПросмотра, п10, п11, п12, п13, ПараметрФормы) ... ИначеЕсли идТекущегоЖурнала <> 0 Тогда Найден = 0; Для инд = 1 По Метаданные.Журнал() Цикл мдЖурнал = Метаданные.Журнал(инд); Если идТекущегоЖурнала = objMetaDataWork.GetMetaDataID(мдЖурнал) Тогда Найден = 1; Прервать; КонецЕсли; КонецЦикла; Если Найден = 1 Тогда ... ИначеЕсли флВводНаОсновании = 1 Тогда ДокументОснование = ЗначениеИзСтрокиВнутр("{""O"",""0"",""0"",""" + идВидаДокументаОснования + """,""0"",""0"",""" + идКопируемогоОбъекта + """}"); //глSQLПолучитьОбъектПоID("Документ", "", _IdToStr(идКопируемогоОбъекта)); |
|||
38
АЛьФ
09.02.24
✎
15:59
|
*(37) без подчеркивания в имени процедуры, конечно.
|
|||
39
Злопчинский
09.02.24
✎
16:00
|
капец, ничего не понял без напряжения извилин.. ;-)
. для чего эта процедура задумывалась? какое назначение ее? . и что такое пNN |
|||
40
АгентБезопасной Нацио
09.02.24
✎
19:04
|
(34) (35) Значит, юзай перехватчик. Там перехватил событие, и делай что нужно. Как раз как ты хочешь. Например
Функция Событие_ПослеОткрытия() Экспорт Если ТипОбъекта="Документ" Тогда ТекДок = КонтФормы.ТекущийДокумент(); ДобавитьФлажкиУчета(КонтФормы); ИначеЕсли ТипОбъекта="Справочник" Тогда ТекДок=КонтФормы.ТекущийЭлемент(); КонецЕсли; Если ЗакладкиСканов.ЗакладкиСканов_РазрешеныСканыОбъекта(ПолныйТипОбъекта)=1 Тогда ЗакладкиСканов.ЗакладкиСканов_СоздатьЗакладку(КонтФормы); КонецЕсли; Если ТипОбъекта="Документ" Тогда КонтФормы.Форма.Обновить(); //!! ФормаРасш.СбросМодифицированности(); КонецЕсли; Возврат Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтФормы,"ПослеОткрытия"); КонецФункции Т.е. Когда форма (любая) создалась физически (ПослеОткрытия), перехватывается это событие перехватчиком, если это форма документа (добавляются на форму два флажка - по каким видам учета отражать), затем для форм документов и справочников (при необходимости) на форму добавляется закладка "прикрепленных документов". Ну и затем выполняется событие ПослеОткрытия, описанное в модуле отрытой формы. |
|||
41
Ёпрст
09.02.24
✎
16:04
|
(39) судя по параметрам, для выяснения, откуда форма дока открылась - с журнала, с ввода на основании или с реквизита с типом
|
|||
42
Arbuz
09.02.24
✎
16:11
|
(39) вот тут ещё есть про это Обновление FormEx. Версия 2.5.0.115.#261
|
|||
43
Ёпрст
09.02.24
✎
16:23
|
(42) древность какая, прочитал свой камент и понял, что это не нужно. Тем более, что этот ввод "почти штатно" ловится везде и красившее - т.е само платформенно, перехватывать не обязательно
|
|||
44
АЛьФ
09.02.24
✎
16:47
|
2(41) На самом деле я эту процедуру забахал когда интерактивное копирование документа копал. На практике ее применение не прижилось.
|
|||
45
АЛьФ
09.02.24
✎
16:48
|
2(42) Хе! Как раз там та же сама процедура скинута :)
|
|||
46
АЛьФ
09.02.24
✎
16:50
|
+(45) Офигеть как уже давно оказывается КопироватьОбъект() сделана была. И только недавно допилил на работу этого метода со справочниками.
|
|||
47
Злопчинский
09.02.24
✎
16:55
|
(46) Лентяй, наверное ;-)
|
|||
48
АЛьФ
09.02.24
✎
17:00
|
2(47) Да ваще! Казалось только на чашечку чая отвлекся...
|
|||
49
Arbuz
09.02.24
✎
17:05
|
(46) О, а оно уже работает со справочниками тоже 0_О
|
|||
50
АЛьФ
09.02.24
✎
17:10
|
2(49) Работает. Но в полной мере я это дело не тестил. У меня в базе работает в нужном месте, на том и остановился.
|
|||
51
Злопчинский
09.02.24
✎
18:58
|
(50) ну, вариантов не так уж и много: копирование элемента простого справочника, копирование элемента подчиненного справочника, копирование элементов справочника с периодическими реквизитами.
|
|||
52
АЛьФ
09.02.24
✎
19:10
|
2(51) копирование группы, копирование элемента в группе, копирование в форме списка.
|
|||
53
АЛьФ
10.02.24
✎
16:48
|
2(0) Добавил в FormEx перенаправление событий в глобальный модуль.
Как-то так теперь можно: Процедура ПриОткрытии(КонтекстФормы) РасширениеФормы= СоздатьОбъект("РасширениеФормы"); РасширениеФормы.УстановитьФорму(КонтекстФормы.Форма); Сообщить(РасширениеФормы.ПолныйТипОбъекта()); КонецПроцедуры // ПриОткрытии |
|||
54
Chai Nic
10.02.24
✎
21:01
|
(53) Спасибо! Попробую в понедельник!
|
|||
55
Chai Nic
11.02.24
✎
14:23
|
(53) Новая версия ломает работу штатного обработчиков ПриУдаленииЭлемента и ПриУдаленииДокумента в глобальнике. При установке пометки удаления обработчик вызывается дважды, причем в первый раз в первом параметре пустое значение, а вместо параметра Режим - ссылка на удаляемый объект. Во второй раз вызывается штатно.
|
|||
56
Злопчинский
11.02.24
✎
14:51
|
(53) инфу по (55) подтверждаю, наблюдается такое на 192 релизе, проверял только ПриУдаленииЭлемента(). На скрине - задвоение при пометке и снятии пометки.
. на 191 релизе отрабатывает норм.
|
|||
57
АЛьФ
11.02.24
✎
14:58
|
2(55) Сейчас поправлю.
|
|||
58
mishaPH
11.02.24
✎
15:08
|
так еще раз можно объяснить, как теперь в глобальнике отлавливать предопределенные форм других. не прописывая в них ничего
для тупых |
|||
59
Djelf
11.02.24
✎
15:14
|
(58) Через Сервис.ДобавитьГлобальныйМодуль(ТекстМодуля) в обработке.
|
|||
60
Злопчинский
11.02.24
✎
15:18
|
(58) (59) вообще ничего не понял, это вы про что?
|
|||
61
АЛьФ
11.02.24
✎
15:22
|
2(58) Добавить в глобальный модуль процедуру по типу (53).
Предлагаю перейти в ветку FormEx: Новая версия FormEx 2.5.0.185 |
|||
62
Злопчинский
11.02.24
✎
16:17
|
..так когда уже убивцу 1С писать кто начнет?
|
|||
63
АЛьФ
11.02.24
✎
16:18
|
2(62) Много раз уже начинали. Зачем?
|
|||
64
Злопчинский
11.02.24
✎
16:26
|
(63) может быть - чтобы закончить?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |