Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

8.3 Выполнить действие/вызвать событие элемента формы без Выполнить()

8.3 Выполнить действие/вызвать событие элемента формы без Выполнить()
Я
   sima
 
14.04.18 - 22:28
Доброго времени суток.
На форме переназначаю элементу типовое действие(событие) "ПриИзменении", связку  элемент+имя типового метода предварительно сохраняю при помощи ПолучитьДействие("ПриИзменении").

После выполнении нетипового действия для элемента нужно вызвать типовой метод.
Очень просится использовать Выполнить(<ИмяТиповогоМетода>), но в синтаксис-помощнике имеется грустный повод этого не делать:

Примечание:
В режиме запуска веб-клиент оператор не поддерживается, при его вызове будет сгенерировано исключение.

Расширения использовать не могу по условиям задачи.
Что же делать-то?
 
 
   Cyberhawk
 
1 - 14.04.18 - 22:37
Просто вызываешь метод
   sima
 
2 - 14.04.18 - 22:45
(1) Исполняемся на клиенте, на руках три строки:
-имя элемента на форме
-имя события  
-имя метода

как просто вызвать этот метод без Выполнить()?
   sima
 
3 - 15.04.18 - 00:17
Хочется продолжить логическую цепочку методов

ПолучитьДействие()
УстановитьДействие()

методом

ВыполнитьДействие()

возможно, существует какой-то хитрый способ?
   Cyberhawk
 
4 - 15.04.18 - 09:44
Если у оригинального метода один параметр (элемент формы) и в параметры оригинального метода можешь добавить еще один параметр (доп. параметры), то через описание оповещения сделай, указывая имя оригинального метода.
Ну и ВыполнитьОбработкуОповещения читай в СП.
   sima
 
5 - 15.04.18 - 11:01
(4) нет, не могу в параметры оригинального типового метода добавлять свои нетиповые параметры.
   Cyberhawk
 
6 - 15.04.18 - 12:03
Почему?
   drei
 
7 - 15.04.18 - 12:41
Экспорт + ЭтотОбъект.Обработчик(...)

Если ты по условиям задачи не можешь модифицировать код формы, то можешь курить бамбмук по причине требований к расположению обработчика действия.
   sima
 
8 - 15.04.18 - 13:20
(7) Согласен. Жесткое расположение кода обработчика - отдельная неприятная песня.
Что означает Экспорт + ЭтотОбъект.Обработчик(...)?

(6) По условиям задачи я могу модифицировать код формы, но только добавляя новые методы, не модифицируя типовые.
   drei
 
9 - 15.04.18 - 13:30
(8) Если ты можешь добавлять свой код в контекст формы, то какая религия запрещает тебе просто вызвать эту процедуру, находящуюся в этом же контексте?
   sima
 
10 - 15.04.18 - 14:27
(9) А религия простая - при очередном обновлении типовой конфигурации, типовая процедура может испариться без следа.
Или же возникнет новая в одном из элементов, к которому я добавил свои события.
 
 Рекламное место пустует
   hhhh
 
11 - 15.04.18 - 15:11
(10) да уж. Вместо простого обновления, вы напридумывали невероятнейшую хрень.
   sima
 
12 - 15.04.18 - 15:24
(11) ну-ну. Видимо вы давно не занимались обновлениями типовых объектов, снятых с поддержки кривыми руками.
   drei
 
13 - 15.04.18 - 16:56
(12) Желание добавить к наследию кривых рук порождения разума того-же радиуса - бесценно. Наблюдаю в немом восхищении.
   Tateossian
 
14 - 15.04.18 - 17:01
(11) Автор молодец, а вы говорите хрень. Он хочет сделать УНИВЕРСАЛЬНОЕ решение, чтобы использовать некий обработчик, который не сломается после очередного обновления.
   sima
 
15 - 15.04.18 - 17:27
(13)Вы забываете, что методы реализации конкретной прикладной задачи программистом бывают ограничены постановкой. У вас не так? Вы рубите что хотите? Сочувствую вашим клиентам.
И, что бы закончить вашу неконструктивную ветку, ежу понятно что оптимумом было бы использование расширений.

Теперь о том, как решается такая задача при помощи Выполнить().
Процедура ПриСозданииНаСервере(Форма)//перехват в общем модуле


                //программный реквизит для доступа к типовым событиям с клиента

        мТипов.Добавить(Тип("СписокЗначений"));
        
        мНовыйРеквизит     = Новый Массив;        
        НовыйРеквизит     = Новый РеквизитФормы("exp_СобытияЭлементовФормы",Новый ОписаниеТипов(мТипов));
        
        мНовыйРеквизит.Добавить(НовыйРеквизит);
        Форма.ИзменитьРеквизиты(мНовыйРеквизит);

        элПодразделение = Форма.Элементы.Найти("Подразделение"); 
        Если элПодразделение <> Неопределено Тогда
            
            элПодразделениеДействие    = элПодразделение.ПолучитьДействие("ПриИзменении");
            Если элПодразделениеДействие <> "" Тогда
                //кешируем событие в дополнительных свойствах объекта

                Форма["exp_СобытияЭлементовФормы"].Добавить(элПодразделение.Имя,элПодразделениеДействие);
            КонецЕсли;
            элПодразделение.УстановитьДействие("ПриИзменении","exp_Подключаемый_ДляПодписантовПриИзменении");
            
        КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура exp_Подключаемый_ДляПодписантовПриИзменении(Элемент)
    
    exp_ОбновитьПараметрыВыбораРуководителя();
    
    //вызов типового метода для события, если такое есть

    _событие = ЭтаФорма["exp_СобытияЭлементовФормы"].НайтиПоЗначению(Элемент.Имя);
    Если _событие<>Неопределено Тогда
        Выполнить(_событие.Представление+"(Элемент)");
    КонецЕсли;
КонецПроцедуры
   sima
 
16 - 15.04.18 - 17:37
Собственно, осталось совсем немножко подумать.

Предложение Cyberhawk сработало бы, будь у метода ПриИзменении(Элемент) два параметра (если закрыть глаза на то, что придет в параметр "Элемент" вместо элемента).

Например ПоказатьПредупреждение() требует в описании оповещения процедуры с одним параметром, но оно выводит что-то на экран, к сожалению.

Вот если бы можно было бы как-то дернуть определенное интерактивное событие определенного элемента программно, всё бы получилось.
   Cyberhawk
 
17 - 15.04.18 - 19:49
ПоказатьОповещениеПользователя заюзай, никто особо не заметит
   drei
 
18 - 15.04.18 - 19:57
(14) Универсализм - говно. На тебе сценарий - в одном из обновлений приезжает:

Процедура ПодразделениеПриНачалеВыбора(...
    СтандартнаяОбработка = Ложь;
    Подразделение = РезультатВыбора(...
КонецПроцедуры

Гениальный код тихо курит в сторонке, печатаются документы, предприятие работает. И через полгодика выясняется, что что-то не так.
Измененный код падает сразу, на вызове несуществующего, вызывается специалист, выписывается животворящий, и все снова работает.
Не надо закладывать теракт. "Сочувствую вашим" и дальше по тексту.
   TormozIT
 
19 - 15.04.18 - 20:34
   Cyberhawk
 
20 - 15.04.18 - 20:50
(19) Через "Выполнить" любой дурак может )) А у ТС веб-клиент, где "Выполнить" не работает
   drei
 
21 - 15.04.18 - 21:14
(19) Духом постов Serginio1 повеяло (:
   drei
 
22 - 15.04.18 - 21:15
(19) Рассказал бы лучше маленькому ТС про подход со специальной формой (:
   sima
 
23 - 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) Это тот подход, где простыню кода можно день листать? :) Программная генерация формы, кеширование методов событий в свойствах самих элементах формы. И Выполнить()? :)
   drei
 
24 - 15.04.18 - 23:47
(23) Нет, я не даю ссылки на свои статьи, не разобравшись в проблеме.
   sima
 
25 - 16.04.18 - 00:24
(17) тепло! но, теперь мешает ограничение на обязательное наличие Экспортности процедуры для Оповещения. Типовая процедура, сюрприз, не экспортная.

Коллеги, правда что-ли нету правильной платформенной методы?
На что постановщики продавливаются охотнее? На использование расширений? Использование внешних библиотек?
   TormozIT
 
26 - 16.04.18 - 14:16
Согласен, невнимательно читал про Выполнить().
Тогда можно попробовать http://catalog.mista.ru/public/16985/ . Сначала устанавливаем свой обработчик, вызываем событие ПриИзменении, затем возвращаем старый обработчик, вызываем событие ПриИзменении, затем возвращаем свой обработчик.
   НЕА123
 
27 - 16.04.18 - 14:30
Вычислить()
?
   НЕА123
 
28 - 16.04.18 - 14:33
(27)
неа. сведется к выполнить().
сторно.
   Buster007
 
29 - 16.04.18 - 14:48
судя по всему 8ка еще сыровата.
   sima
 
30 - 18.04.18 - 20:54
(26) Интересный метод, спасибо!
У меня, почему-то, не завелось :(

ФормаИнициатор.ВладелецФормы = ЭлементУправления;
ФормаИнициатор.ОповеститьОВыборе(Значение);

Код отрабатывает без ошибок, но событие не инициализируется, хоть у элемента-владельца оно установлено.

1С:Предприятие 8.3 (8.3.11.3034)
Зарплата и управление персоналом КОРП, редакция 3.1 (3.1.5.171)
   drei
 
31 - 18.04.18 - 21:08
(30)
ФормаИнициатор.ВладелецФормы = ЭлементУправления;

Не надо так. Надо указывать владельца параметром при открытии формы.
   sima
 
32 - 18.04.18 - 22:04
(31) владельцем при получении (не открытии) я тоже пробовал - все равно не срабатывает событие. Ну и исходя из комментария к статье, создавать в памяти новую форму накладнее, чем использовать уже созданную.
   Cyberhawk
 
33 - 19.04.18 - 05:11
Ты все-таки с новой формой попробуй
 
 
   sima
 
34 - 19.04.18 - 10:29
(33) попробовал, не срабатывает. Возможно это должна быть какая-то особая форма? Может ее нужно именно открыть?
   Вафель
 
35 - 19.04.18 - 10:31
Если Имя = "Метод1" Тогда 
  Метод1() 
...

   Cyberhawk
 
36 - 19.04.18 - 13:13
(35) Имя метода заранее неизвестно (и получается динамически)
   TormozIT
 
37 - 20.04.18 - 09:43
Поле формы должно быть вне таблицы формы или же таблица формы должна находиться в режиме редактирования строки.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует