|   |   | 
| 
 | 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) может быть - чтобы закончить?     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |