На клиенте или на сервере (описание оповещения)

Публикация № 1105534

Программирование - Практика программирования

26
Описание оповещения на сервере, да еще и не экспорт? Возможно все...

Всем привет.

Поискал на Инфостарте и не нашел подобной темы, надеюсь, что это не "баян". Итак, друзья. 

Ковыряясь в конфигураторе, случайно допустил, как мне казалось, ошибку в коде, используя в качестве процедуры описания оповещения серверную не экспортную процедуру, но, как оказалось, это работает.

При этом, если обратиться к ИТС, то станет очевидно, что процедура обязательно должна быть экспортной, однако работает и так. Если же использовать клиентскую процедуру, то "экспорт" обязателен. Обновление: на платформе 8.13 и далее экспорт писать обязательно.

Кроме того, есть возможность использовать сразу серверную процедуру, если того требует задача, без промежуточного "клиентского" звена - это тоже оказалось неожиданным, так как во всех мануалах, да и на ИТС во всех скриншотах указывается, что процедура используется "&НаКлиенте" и с экспортом. Оказывается, все не так однозначно.

Объект встроенного языка ОписаниеОповещения

Назначение этого объекта - указать точку конфигурации, с которой должно быть продолжено исполнение кода после того, как пользователь закроет блокирующее окно. Этот объект содержит имя экспортируемой процедуры, которая начнёт выполняться, а также указание на модуль, в котором находится эта процедура.

Если процедура находится в том же модуле, в котором создаётся описание оповещения, то для указания на этот модуль используется значение ЭтотОбъект. Это новое свойство, реализованное для управляемой формы, команды командного интерфейса и общего модуля. Именно в этих модулях может находиться процедура обработки оповещения. Пример есть в разделе Вопрос в модуле команды, формы или в общем модуле.

Иногда возникает необходимость разместить обработчик оповещения не в том модуле, в котором создаётся описание оповещения, а в другом, например, в общем модуле. В таком случае вместо ЭтотОбъект можно указать имя общего модуля. Пример можно посмотреть в разделе Вопрос в модуле управляемого приложения.

Кроме этих параметров описание оповещения может содержать структуру с произвольными данными. Передача этих данных в обработчик оповещения может понадобиться для того, чтобы алгоритм, выполняемый после реакции пользователя, мог использовать значения, вычисленные перед открытием блокирующего окна. Такой пример можно посмотреть в разделе Как передать дополнительную информацию в форму, открываемую в блокирующем режиме.

ИЛИ

Особенность этого примера заключается в том, что нет возможности сослаться на модуль приложения с помощью свойства ЭтотОбъект. Поэтому процедуру, обрабатывающую оповещение, нужно располагать, например, в неглобальном клиентском общем модуле. В конструкторе описания оповещения на такой модуль можно сослаться, просто указав его имя:

 

Данная особенность обнаружена на платформе 8.3.12.1790, 8.3.13.1865 и 8.3.15.1534, но скорее всего появилась намного раньше, работает в тонком и толстом клиенте.

26

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. json 2333 08.08.19 14:17 Сейчас в теме
Да, есть такая тема.
Метод на сервере формы всегда экспортный.
Об этом даже статья была у Аrtbear

А вот про то, что в описании оповещения можно использовать серверную процедуру - это новость для меня.
Интересно

И картинка, кстати, зачетная)
koln; Jokemas; CyberCerber; +3 Ответить
2. VmvLer 08.08.19 14:30 Сейчас в теме
(1) В СП ничего не сказано о контекстах методов

Новый ОписаниеОповещения(<ИмяПроцедуры>, <Модуль>, <ДополнительныеПараметры>, <ИмяПроцедурыОбработкиОшибки>, <МодульОбработкиОшибки>)

Параметры:
<ИмяПроцедуры> (необязательный)
Тип: Строка, Неопределено. Имя экспортируемой процедуры модуля, которая будет вызвана.

<Модуль> (необязательный)
Тип: ФормаКлиентскогоПриложения, КомандаКомандногоИнтерфейса, ОбщийМодуль, Строка, Неопределено. Программный модуль, процедура которого будет вызвана.
При использовании типа ФормаКлиентскогоПриложения будет вызван метод модуля указанной формы
3. Jokemas 83 08.08.19 14:31 Сейчас в теме
(1) Спасибо за разъяснение. Буду знать =)
4. Ilya_138 08.08.19 15:03 Сейчас в теме
Это баг платофрмы. На 13 платформе этот код работать не будет, поэтому не рекомендую использовать такие конструкции.
6. Jokemas 83 08.08.19 16:05 Сейчас в теме
(4) Вранье. Проверил на 8.3.13.1865 и 8.3.15.1534 - работает как вверху написано.
check2; CyberCerber; +2 Ответить
8. Ilya_138 08.08.19 16:46 Сейчас в теме
(6) совместимость значит осталась с 12 платформой или ниже. На голой конфе созданной в 13 платформе (8.3.13.1865) такой финт ушами уже не работает.
+ в патч-нотах 13 платформы есть описания изменений, связанных с экспортными функциями форм. Там что-то другое было, не связанное с оповещениями, но какие-то доработки были.

upd: Как и говорил, на 13 без совместимости - не работает, на 13 в режиме совместимости с 12 - работает.
Мораль: избегать использование недокументированных особенностей плаформы, если хочется писать стабильный код (:
Прикрепленные файлы:
Danila-Master; ltfriend; ZLENKO; saroman; CyberCerber; Evg-Lylyk; +6 Ответить
9. Jokemas 83 08.08.19 17:33 Сейчас в теме
(8) Проверил, да экспорт нужен 15 платформа, но на сервере работает:
Прикрепленные файлы:
5. Denis_CFO 26 08.08.19 15:20 Сейчас в теме
а для чего это &НаСервере? Там же нет работы с пользователем. ОписаниеОповещения - это же чисто интерактивные процедуры, которые серверу не нужны.
Поправьте, если ошибаюсь.
7. Jokemas 83 08.08.19 16:08 Сейчас в теме
(5) бывает запрос надо выполнить по возвращении данных из открытой формы, например, либо еще какие серверные "дела провернуть". Согласен, бывает редко.
10. vandalsvq 1113 11.08.19 09:22 Сейчас в теме
В данном случае это можно считать не багом, а фичей ))))
14. Yashazz 2502 12.08.19 10:42 Сейчас в теме
(5) С помощью "ОписанияОповещения" можно перекидывать процедуру в процедуру, контекст в контекст, и даже попробовать кодить в духе Java
И это совершенно необязательно на клиенте.
11. Yashazz 2502 11.08.19 10:25 Сейчас в теме
Знаю, сталкивался. Тоже сначала обалдел - как это, на сервере, да ещё и не экспортный... А вот так)

Единственно, не понял, зачем ради этого тему на ИС создавать.
13. &rew 7 12.08.19 06:20 Сейчас в теме
(11)Да нормально, пусть будет. Многие уважаемые 1с ники на это спотыкались, решали и дальше пошли. А вот те, кто еще не сталкивался, очень будут благодарны, т.к. ИС в топе запросов на эту тему будет
12. Eret1k 567 11.08.19 18:34 Сейчас в теме
Спасибо автору, буду знать, может когда-нибудь воспользуюсь данной возможностью.
15. markers 240 15.08.19 07:31 Сейчас в теме
Тоже как-то давно решил проверить работоспособность варианта вызова сразу на сервере оповещения (требовалось задачей) и оказалось что работает без проблем, у меня 8.3.10. Вообще я ни чуть этому не удивлен, так как по завершению, происходит обычный вызов процедуры, а уж в каком контексте она это уже не важно, только главное чтобы она была видима с клиента.
Оставьте свое сообщение