Имя: Пароль:
1C
1C 7.7
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) может быть - чтобы закончить?
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn