Имя: Пароль:
1C
1С v8
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

Если Имя = "Метод1" Тогда
  Метод1()
...
36 Cyberhawk
 
19.04.18
13:13
(35) Имя метода заранее неизвестно (и получается динамически)
37 TormozIT
 
гуру
20.04.18
09:43
Поле формы должно быть вне таблицы формы или же таблица формы должна находиться в режиме редактирования строки.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн