|
8.3 Выполнить действие/вызвать событие элемента формы без Выполнить() | ☑ | ||
---|---|---|---|---|
0
sima
14.04.18
✎
22:28
|
Доброго времени суток.
На форме переназначаю элементу типовое действие(событие) "ПриИзменении", связку элемент+имя типового метода предварительно сохраняю при помощи ПолучитьДействие("ПриИзменении"). После выполнении нетипового действия для элемента нужно вызвать типовой метод. Очень просится использовать Выполнить(<ИмяТиповогоМетода>), но в синтаксис-помощнике имеется грустный повод этого не делать: Примечание: В режиме запуска веб-клиент оператор не поддерживается, при его вызове будет сгенерировано исключение. Расширения использовать не могу по условиям задачи. Что же делать-то? |
|||
1
Cyberhawk
14.04.18
✎
22:37
|
Просто вызываешь метод
|
|||
2
sima
14.04.18
✎
22:45
|
(1) Исполняемся на клиенте, на руках три строки:
-имя элемента на форме -имя события -имя метода как просто вызвать этот метод без Выполнить()? |
|||
3
sima
15.04.18
✎
00:17
|
Хочется продолжить логическую цепочку методов
ПолучитьДействие() УстановитьДействие() методом ВыполнитьДействие() возможно, существует какой-то хитрый способ? |
|||
4
Cyberhawk
15.04.18
✎
09:44
|
Если у оригинального метода один параметр (элемент формы) и в параметры оригинального метода можешь добавить еще один параметр (доп. параметры), то через описание оповещения сделай, указывая имя оригинального метода.
Ну и ВыполнитьОбработкуОповещения читай в СП. |
|||
5
sima
15.04.18
✎
11:01
|
(4) нет, не могу в параметры оригинального типового метода добавлять свои нетиповые параметры.
|
|||
6
Cyberhawk
15.04.18
✎
12:03
|
Почему?
|
|||
7
drei
15.04.18
✎
12:41
|
Экспорт + ЭтотОбъект.Обработчик(...)
Если ты по условиям задачи не можешь модифицировать код формы, то можешь курить бамбмук по причине требований к расположению обработчика действия. |
|||
8
sima
15.04.18
✎
13:20
|
(7) Согласен. Жесткое расположение кода обработчика - отдельная неприятная песня.
Что означает Экспорт + ЭтотОбъект.Обработчик(...)? (6) По условиям задачи я могу модифицировать код формы, но только добавляя новые методы, не модифицируя типовые. |
|||
9
drei
15.04.18
✎
13:30
|
(8) Если ты можешь добавлять свой код в контекст формы, то какая религия запрещает тебе просто вызвать эту процедуру, находящуюся в этом же контексте?
|
|||
10
sima
15.04.18
✎
14:27
|
(9) А религия простая - при очередном обновлении типовой конфигурации, типовая процедура может испариться без следа.
Или же возникнет новая в одном из элементов, к которому я добавил свои события. |
|||
11
hhhh
15.04.18
✎
15:11
|
(10) да уж. Вместо простого обновления, вы напридумывали невероятнейшую хрень.
|
|||
12
sima
15.04.18
✎
15:24
|
(11) ну-ну. Видимо вы давно не занимались обновлениями типовых объектов, снятых с поддержки кривыми руками.
|
|||
13
drei
15.04.18
✎
16:56
|
(12) Желание добавить к наследию кривых рук порождения разума того-же радиуса - бесценно. Наблюдаю в немом восхищении.
|
|||
14
Tateossian
15.04.18
✎
17:01
|
(11) Автор молодец, а вы говорите хрень. Он хочет сделать УНИВЕРСАЛЬНОЕ решение, чтобы использовать некий обработчик, который не сломается после очередного обновления.
|
|||
15
sima
15.04.18
✎
17:27
|
(13)Вы забываете, что методы реализации конкретной прикладной задачи программистом бывают ограничены постановкой. У вас не так? Вы рубите что хотите? Сочувствую вашим клиентам.
И, что бы закончить вашу неконструктивную ветку, ежу понятно что оптимумом было бы использование расширений. Теперь о том, как решается такая задача при помощи Выполнить(). Процедура ПриСозданииНаСервере(Форма) //перехват в общем модуле //программный реквизит для доступа к типовым событиям с клиента мТипов.Добавить(Тип("СписокЗначений")); мНовыйРеквизит = Новый Массив; НовыйРеквизит = Новый РеквизитФормы("exp_СобытияЭлементовФормы",Новый ОписаниеТипов(мТипов)); мНовыйРеквизит.Добавить(НовыйРеквизит); Форма.ИзменитьРеквизиты(мНовыйРеквизит); элПодразделение = Форма.Элементы.Найти("Подразделение"); Если элПодразделение <> Неопределено Тогда элПодразделениеДействие = элПодразделение.ПолучитьДействие("ПриИзменении"); Если элПодразделениеДействие <> "" Тогда //кешируем событие в дополнительных свойствах объекта Форма["exp_СобытияЭлементовФормы"].Добавить(элПодразделение.Имя,элПодразделениеДействие); КонецЕсли; элПодразделение.УстановитьДействие("ПриИзменении","exp_Подключаемый_ДляПодписантовПриИзменении"); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура exp_Подключаемый_ДляПодписантовПриИзменении(Элемент) exp_ОбновитьПараметрыВыбораРуководителя(); //вызов типового метода для события, если такое есть _событие = ЭтаФорма["exp_СобытияЭлементовФормы"].НайтиПоЗначению(Элемент.Имя); Если _событие<>Неопределено Тогда Выполнить(_событие.Представление+"(Элемент)"); КонецЕсли; КонецПроцедуры |
|||
16
sima
15.04.18
✎
17:37
|
Собственно, осталось совсем немножко подумать.
Предложение Cyberhawk сработало бы, будь у метода ПриИзменении(Элемент) два параметра (если закрыть глаза на то, что придет в параметр "Элемент" вместо элемента). Например ПоказатьПредупреждение() требует в описании оповещения процедуры с одним параметром, но оно выводит что-то на экран, к сожалению. Вот если бы можно было бы как-то дернуть определенное интерактивное событие определенного элемента программно, всё бы получилось. |
|||
17
Cyberhawk
15.04.18
✎
19:49
|
ПоказатьОповещениеПользователя заюзай, никто особо не заметит
|
|||
18
drei
15.04.18
✎
19:57
|
(14) Универсализм - говно. На тебе сценарий - в одном из обновлений приезжает:
Процедура ПодразделениеПриНачалеВыбора(... СтандартнаяОбработка = Ложь; Подразделение = РезультатВыбора(... КонецПроцедуры Гениальный код тихо курит в сторонке, печатаются документы, предприятие работает. И через полгодика выясняется, что что-то не так. Измененный код падает сразу, на вызове несуществующего, вызывается специалист, выписывается животворящий, и все снова работает. Не надо закладывать теракт. "Сочувствую вашим" и дальше по тексту. |
|||
19
TormozIT
гуру
15.04.18
✎
20:34
|
||||
20
Cyberhawk
15.04.18
✎
20:50
|
(19) Через "Выполнить" любой дурак может )) А у ТС веб-клиент, где "Выполнить" не работает
|
|||
21
drei
15.04.18
✎
21:14
|
(19) Духом постов Serginio1 повеяло (:
|
|||
22
drei
15.04.18
✎
21:15
|
(19) Рассказал бы лучше маленькому ТС про подход со специальной формой (:
|
|||
23
sima
15.04.18
✎
23:18
|
(21) Прекрасный дух, надо сказать! Вы в повседневной работе пользуете?
(19) https://kb.mista.ru/article.php?id=268 - докуривал до Выполнить(<... Закрыл. Поторопился? http://catalog.mista.ru/public/169131 - интересные комментарии к статье: {Артем (zakov): Спасибо за статью, метод классный. Не пойму только как можно вызвать старый обработчик? pbazelyuk (pbazeliuk): zakov, к понедельнику в продолжении статьи все опишу.} Дайте угадаю. Во второй части он сделает Выполнить()? :) http://catalog.mista.ru/public/16980 - докурил до Выполнить(<... :) (20) А у WEB-клиента есть JS, где нельзя произвольный код так исполнять. Интересный запрет, правда? :) (22) Это тот подход, где простыню кода можно день листать? :) Программная генерация формы, кеширование методов событий в свойствах самих элементах формы. И Выполнить()? :) |
|||
24
drei
15.04.18
✎
23:47
|
(23) Нет, я не даю ссылки на свои статьи, не разобравшись в проблеме.
|
|||
25
sima
16.04.18
✎
00:24
|
(17) тепло! но, теперь мешает ограничение на обязательное наличие Экспортности процедуры для Оповещения. Типовая процедура, сюрприз, не экспортная.
Коллеги, правда что-ли нету правильной платформенной методы? На что постановщики продавливаются охотнее? На использование расширений? Использование внешних библиотек? |
|||
26
TormozIT
гуру
16.04.18
✎
14:16
|
Согласен, невнимательно читал про Выполнить().
Тогда можно попробовать http://catalog.mista.ru/public/16985/ . Сначала устанавливаем свой обработчик, вызываем событие ПриИзменении, затем возвращаем старый обработчик, вызываем событие ПриИзменении, затем возвращаем свой обработчик. |
|||
27
НЕА123
16.04.18
✎
14:30
|
Вычислить()
? |
|||
28
НЕА123
16.04.18
✎
14:33
|
(27)
неа. сведется к выполнить(). сторно. |
|||
29
Buster007
16.04.18
✎
14:48
|
судя по всему 8ка еще сыровата.
|
|||
30
sima
18.04.18
✎
20:54
|
(26) Интересный метод, спасибо!
У меня, почему-то, не завелось :( ФормаИнициатор.ВладелецФормы = ЭлементУправления; ФормаИнициатор.ОповеститьОВыборе(Значение); Код отрабатывает без ошибок, но событие не инициализируется, хоть у элемента-владельца оно установлено. 1С:Предприятие 8.3 (8.3.11.3034) Зарплата и управление персоналом КОРП, редакция 3.1 (3.1.5.171) |
|||
31
drei
18.04.18
✎
21:08
|
(30)
ФормаИнициатор.ВладелецФормы = ЭлементУправления; Не надо так. Надо указывать владельца параметром при открытии формы. |
|||
32
sima
18.04.18
✎
22:04
|
(31) владельцем при получении (не открытии) я тоже пробовал - все равно не срабатывает событие. Ну и исходя из комментария к статье, создавать в памяти новую форму накладнее, чем использовать уже созданную.
|
|||
33
Cyberhawk
19.04.18
✎
05:11
|
Ты все-таки с новой формой попробуй
|
|||
34
sima
19.04.18
✎
10:29
|
(33) попробовал, не срабатывает. Возможно это должна быть какая-то особая форма? Может ее нужно именно открыть?
|
|||
35
Вафель
19.04.18
✎
10:31
|
|
|||
36
Cyberhawk
19.04.18
✎
13:13
|
(35) Имя метода заранее неизвестно (и получается динамически)
|
|||
37
TormozIT
гуру
20.04.18
✎
09:43
|
Поле формы должно быть вне таблицы формы или же таблица формы должна находиться в режиме редактирования строки.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |