Всем привет.
Поискал на Инфостарте и не нашел подобной темы, надеюсь, что это не "баян". Итак, друзья.
Ковыряясь в конфигураторе, случайно допустил, как мне казалось, ошибку в коде, используя в качестве процедуры описания оповещения серверную не экспортную процедуру, но, как оказалось, это работает.
При этом, если обратиться к ИТС, то станет очевидно, что процедура обязательно должна быть экспортной, однако работает и так. Если же использовать клиентскую процедуру, то "экспорт" обязателен. Обновление: на платформе 8.13 и далее экспорт писать обязательно.
Кроме того, есть возможность использовать сразу серверную процедуру, если того требует задача, без промежуточного "клиентского" звена — это тоже оказалось неожиданным, так как во всех мануалах, да и на ИТС во всех скриншотах указывается, что процедура используется "&НаКлиенте" и с экспортом. Оказывается, все не так однозначно.
Объект встроенного языка ОписаниеОповещения
Назначение этого объекта — указать точку конфигурации, с которой должно быть продолжено исполнение кода после того, как пользователь закроет блокирующее окно. Этот объект содержит имя экспортируемой процедуры, которая начнёт выполняться, а также указание на модуль, в котором находится эта процедура.
Если процедура находится в том же модуле, в котором создаётся описание оповещения, то для указания на этот модуль используется значение ЭтотОбъект. Это новое свойство, реализованное для управляемой формы, команды командного интерфейса и общего модуля. Именно в этих модулях может находиться процедура обработки оповещения. Пример есть в разделе Вопрос в модуле команды, формы или в общем модуле.
Иногда возникает необходимость разместить обработчик оповещения не в том модуле, в котором создаётся описание оповещения, а в другом, например, в общем модуле. В таком случае вместо ЭтотОбъект можно указать имя общего модуля. Пример можно посмотреть в разделе Вопрос в модуле управляемого приложения.
Кроме этих параметров описание оповещения может содержать структуру с произвольными данными. Передача этих данных в обработчик оповещения может понадобиться для того, чтобы алгоритм, выполняемый после реакции пользователя, мог использовать значения, вычисленные перед открытием блокирующего окна. Такой пример можно посмотреть в разделе Как передать дополнительную информацию в форму, открываемую в блокирующем режиме.
ИЛИ
Особенность этого примера заключается в том, что нет возможности сослаться на модуль приложения с помощью свойства ЭтотОбъект. Поэтому процедуру, обрабатывающую оповещение, нужно располагать, например, в неглобальном клиентском общем модуле. В конструкторе описания оповещения на такой модуль можно сослаться, просто указав его имя:
Данная особенность обнаружена на платформе 8.3.12.1790, 8.3.13.1865 и 8.3.15.1534, но скорее всего появилась намного раньше, работает в тонком и толстом клиенте.
Да, есть такая тема.
статья была у Аrtbear
Метод на сервере формы всегда экспортный.
Об этом даже
А вот про то, что в описании оповещения можно использовать серверную процедуру — это новость для меня.
Интересно
И картинка, кстати, зачетная)
(1) В СП ничего не сказано о контекстах методов
Новый ОписаниеОповещения(<ИмяПроцедуры>, <Модуль>, <ДополнительныеПараметры>, <ИмяПроцедурыОбработкиОшибки>, <МодульОбработкиОшибки>)
Параметры:
<ИмяПроцедуры> (необязательный)
Тип: Строка, Неопределено. Имя экспортируемой процедуры модуля, которая будет вызвана.
<Модуль> (необязательный)
Тип: ФормаКлиентскогоПриложения, КомандаКомандногоИнтерфейса, ОбщийМодуль, Строка, Неопределено. Программный модуль, процедура которого будет вызвана.
При использовании типа ФормаКлиентскогоПриложения будет вызван метод модуля указанной формы
(1) Спасибо за разъяснение. Буду знать =)
Это баг платофрмы. На 13 платформе этот код работать не будет, поэтому не рекомендую использовать такие конструкции.
а для чего это &НаСервере? Там же нет работы с пользователем. ОписаниеОповещения — это же чисто интерактивные процедуры, которые серверу не нужны.
Поправьте, если ошибаюсь.
(4) Вранье. Проверил на 8.3.13.1865 и 8.3.15.1534 — работает как вверху написано.
(5) бывает запрос надо выполнить по возвращении данных из открытой формы, например, либо еще какие серверные «дела провернуть». Согласен, бывает редко.
(6) совместимость значит осталась с 12 платформой или ниже. На голой конфе созданной в 13 платформе (8.3.13.1865) такой финт ушами уже не работает.
+ в патч-нотах 13 платформы есть описания изменений, связанных с экспортными функциями форм. Там что-то другое было, не связанное с оповещениями, но какие-то доработки были.
upd: Как и говорил, на 13 без совместимости — не работает, на 13 в режиме совместимости с 12 — работает.
Мораль: избегать использование недокументированных особенностей плаформы, если хочется писать стабильный код (:
(8) Проверил, да экспорт нужен 15 платформа, но на сервере работает:
В данном случае это можно считать не багом, а фичей ))))
Знаю, сталкивался. Тоже сначала обалдел — как это, на сервере, да ещё и не экспортный… А вот так)
Единственно, не понял, зачем ради этого тему на ИС создавать.
Спасибо автору, буду знать, может когда-нибудь воспользуюсь данной возможностью.
(11)Да нормально, пусть будет. Многие уважаемые 1с ники на это спотыкались, решали и дальше пошли. А вот те, кто еще не сталкивался, очень будут благодарны, т.к. ИС в топе запросов на эту тему будет
(5) С помощью «ОписанияОповещения» можно перекидывать процедуру в процедуру, контекст в контекст, и даже попробовать кодить в духе Java
И это совершенно необязательно на клиенте.
Тоже как-то давно решил проверить работоспособность варианта вызова сразу на сервере оповещения (требовалось задачей) и оказалось что работает без проблем, у меня 8.3.10. Вообще я ни чуть этому не удивлен, так как по завершению, происходит обычный вызов процедуры, а уж в каком контексте она это уже не важно, только главное чтобы она была видима с клиента.
Спасибо автору, дал толчок к пониманию.
Попытался оповещением воспользоваться для выбора файла:
Показать
При вызове Обработчика_Завершения_Загрузки выдает ошибку, что ожидает 4 параметра.
Вопрос:
Каких параметров не хватает?
(16) Написано ведь в СП для НачатьПомещениеФайла:
http://msdn.microsoft.com/en-us/library/ms535128(VS.85).aspx ,
…
<ОписаниеОповещенияОЗавершении> (необязательный)
Тип: ОписаниеОповещения.
Содержит описание процедуры, которая будет вызвана после завершения помещения файла со следующими параметрами:
<Результат> — Ложь — в параметре <Интерактивно> установлен интерактивный режим (Истина) и пользователь отказался от выполнения операции в диалоге выбора файла,
<Адрес> — расположение нового файла,
<ПомещаемыйФайл> — Через этот параметр возвращается путь к файлу, указанный в диалоге выбора файла. Для неинтерактивного режима выбранное имя файла соответствует начальному имени файла. В веб-клиенте значение параметра зависит от типа браузера. Для Microsoft Internet Explorer возвращаемое значение зависит от настройки текущей зоны. Подробности:
<ДополнительныеПараметры> — значение, которое было указано при создании объекта ОписаниеОповещения.
Вот, 4 пар-ра
(17) Спасибо!