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

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

Всем привет.

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

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

При этом, если обратиться к ИТС, то станет очевидно, что процедура обязательно должна быть экспортной, однако работает и так. Если же использовать клиентскую процедуру, то "экспорт" обязателен. Обновление: на платформе 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 не будет опубликован. Обязательные поля помечены *