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

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

Всем привет.

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

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

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

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

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

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

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

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

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

ИЛИ

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

 

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

18 Comments

  1. json

    Да, есть такая тема.

    Метод на сервере формы всегда экспортный.

    Об этом даже статья была у Аrtbear

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

    Интересно

    И картинка, кстати, зачетная)

    Reply ↓
  2. VmvLer

    (1) В СП ничего не сказано о контекстах методов

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

    Параметры:

    <ИмяПроцедуры> (необязательный)

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

    <Модуль> (необязательный)

    Тип: ФормаКлиентскогоПриложения, КомандаКомандногоИнтерфейса, ОбщийМодуль, Строка, Неопределено. Программный модуль, процедура которого будет вызвана.

    При использовании типа ФормаКлиентскогоПриложения будет вызван метод модуля указанной формы

    Reply ↓
  3. Jokemas

    (1) Спасибо за разъяснение. Буду знать =)

    Reply ↓
  4. Ilya_138

    Это баг платофрмы. На 13 платформе этот код работать не будет, поэтому не рекомендую использовать такие конструкции.

    Reply ↓
  5. Denis_CFO

    а для чего это &НаСервере? Там же нет работы с пользователем. ОписаниеОповещения — это же чисто интерактивные процедуры, которые серверу не нужны.

    Поправьте, если ошибаюсь.

    Reply ↓
  6. Jokemas

    (4) Вранье. Проверил на 8.3.13.1865 и 8.3.15.1534 — работает как вверху написано.

    Reply ↓
  7. Jokemas

    (5) бывает запрос надо выполнить по возвращении данных из открытой формы, например, либо еще какие серверные «дела провернуть». Согласен, бывает редко.

    Reply ↓
  8. Ilya_138

    (6) совместимость значит осталась с 12 платформой или ниже. На голой конфе созданной в 13 платформе (8.3.13.1865) такой финт ушами уже не работает.

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

    upd: Как и говорил, на 13 без совместимости — не работает, на 13 в режиме совместимости с 12 — работает.

    Мораль: избегать использование недокументированных особенностей плаформы, если хочется писать стабильный код (:

    Reply ↓
  9. Jokemas

    (8) Проверил, да экспорт нужен 15 платформа, но на сервере работает:

    Reply ↓
  10. vandalsvq

    В данном случае это можно считать не багом, а фичей ))))

    Reply ↓
  11. Yashazz

    Знаю, сталкивался. Тоже сначала обалдел — как это, на сервере, да ещё и не экспортный… А вот так)

    Единственно, не понял, зачем ради этого тему на ИС создавать.

    Reply ↓
  12. Eret1k

    Спасибо автору, буду знать, может когда-нибудь воспользуюсь данной возможностью.

    Reply ↓
  13. &rew

    (11)Да нормально, пусть будет. Многие уважаемые 1с ники на это спотыкались, решали и дальше пошли. А вот те, кто еще не сталкивался, очень будут благодарны, т.к. ИС в топе запросов на эту тему будет

    Reply ↓
  14. Yashazz

    (5) С помощью «ОписанияОповещения» можно перекидывать процедуру в процедуру, контекст в контекст, и даже попробовать кодить в духе Java

    И это совершенно необязательно на клиенте.

    Reply ↓
  15. markers

    Тоже как-то давно решил проверить работоспособность варианта вызова сразу на сервере оповещения (требовалось задачей) и оказалось что работает без проблем, у меня 8.3.10. Вообще я ни чуть этому не удивлен, так как по завершению, происходит обычный вызов процедуры, а уж в каком контексте она это уже не важно, только главное чтобы она была видима с клиента.

    Reply ↓
  16. vkozak

    Спасибо автору, дал толчок к пониманию.

    Попытался оповещением воспользоваться для выбора файла:

    &НаКлиенте
    Процедура Обработчик_Завершения_Загрузки(Результат, ДополнительныеПараметры) Экспорт
    
    
    
    КонецПроцедуры // Обработчик_Завершения_Загрузки()
    
    
    &НаКлиенте
    Процедура ФайлНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка=ложь;
    //#Если ВебКлиент Тогда
    ДиалогОткрытия = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ДиалогОткрытия.Заголовок = «Собственный заголовок диалога загрузки файла»;
    ДиалогОткрытия.ПолноеИмяФайла = «»;
    Фильтр = «XBase, *.dbf|*.DBf»;
    ДиалогОткрытия.Фильтр = Фильтр;
    ДиалогОткрытия.МножественныйВыбор = ложь;
    ОбработкаОкончанияЗагрузки = Новый ОписаниеОповещения(«Обработчик_Завершения_Загрузки», ЭтотОбъект, ДиалогОткрытия);
    НачатьПомещениеФайла(ОбработкаОкончанияЗагрузки, , ДиалогОткрытия, Истина, УникальныйИдентификатор);
    

    Показать

    При вызове Обработчика_Завершения_Загрузки выдает ошибку, что ожидает 4 параметра.

    Вопрос:

    Каких параметров не хватает?

    Reply ↓
  17. ImHunter

    (16) Написано ведь в СП для НачатьПомещениеФайла:

    …

    <ОписаниеОповещенияОЗавершении> (необязательный)

    Тип: ОписаниеОповещения.

    Содержит описание процедуры, которая будет вызвана после завершения помещения файла со следующими параметрами:

    <Результат> — Ложь — в параметре <Интерактивно> установлен интерактивный режим (Истина) и пользователь отказался от выполнения операции в диалоге выбора файла,

    <Адрес> — расположение нового файла,

    <ПомещаемыйФайл> — Через этот параметр возвращается путь к файлу, указанный в диалоге выбора файла. Для неинтерактивного режима выбранное имя файла соответствует начальному имени файла. В веб-клиенте значение параметра зависит от типа браузера. Для Microsoft Internet Explorer возвращаемое значение зависит от настройки текущей зоны. Подробности: http://msdn.microsoft.com/en-us/library/ms535128(VS.85).aspx,

    <ДополнительныеПараметры> — значение, которое было указано при создании объекта ОписаниеОповещения.

    Вот, 4 пар-ра

    Reply ↓
  18. vkozak

    (17) Спасибо!

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *