ОписаниеОповещения

Типы · CallbackDescription

Используется для описания вызова процедуры программного модуля, который будет осуществлен при наступлении какого-либо ожидаемого события, такого как закрытие формы или немодального диалога.

Примеры платформы

Оп = Новый ОписаниеОповещения("ВыполнитьПослеОкончания", ЭтотОбъект,
    ДопПараметр, "ВыполнитьПриОшибке", ЭтотОбъект);
Полное описание, параметры и ограничения

ОписаниеОповещения (CallbackDescription)

ОписаниеОповещения (CallbackDescription)

Доступен, начиная с версии 8.3.3.

Свойства:
ДополнительныеПараметры (AdditionalParameters)
ИмяПроцедуры (ProcedureName)
ИмяПроцедурыОбработкиОшибки (ErrorHandlerProcedureName)
Модуль (Module)
МодульОбработкиОшибки (ErrorHandlerModule)

Конструкторы:
По умолчанию

Описание:

Используется для описания вызова процедуры программного модуля, который будет осуществлен при наступлении какого-либо ожидаемого события, такого как закрытие формы или немодального диалога.

Доступность:

Тонкий клиент, веб-клиент, мобильный клиент, толстый клиент, мобильное приложение (клиент).

Пример:

// Вызов процедуры клиентского модуля

Оп = Новый ОписаниеОповещения("ВыполнитьПослеОкончания", ЭтотОбъект,
ДопПараметр, "ВыполнитьПриОшибке", ЭтотОбъект);

См. также:
Глобальный контекст, метод ВыполнитьОбработкуОповещения

Использование в версии:

Доступен, начиная с версии 8.3.3.

Описание изменено в версии 8.3.22.

Методическая информация

Практические примеры

Загрузить публичный сертификат оповещением и выгрузить байты

Полный модуль формы показывает параметры обоих callbacks: созданный сертификат приходит первым аргументом инициализации, публичные байты — первым аргументом выгрузки без имени файла.

Где и как запускать

Полный модуль управляемой формы учебной обработки Windows; два callbacks и точная очистка собственного CER.

Подготовка

  1. В отдельной учебной базе создайте внешнюю обработку с пустой управляемой формой, командой УчебныйПример и кнопкой. Укажите действие УчебныйПример и вставьте весь модуль.

  2. Запускайте в Windows-клиенте 8.5.1.1343. НачатьИнициализацию принимает путь CER: поэтому этот урок создаёт ровно один уникальный собственный временный файл.

  3. Встроенный сертификат тот же публичный учебный Syntax Guide Training Only: закрытого ключа, установки в ОС и доверия нет.

  4. Используйте Windows-клиент или Windows-сервер 1С 8.5.1.1343. Проверка других ОС, веб-клиента и расширений криптографии этим уроком не подтверждена.

  5. Не заменяйте учебный сертификат рабочим для первого запуска. Код ничего не подписывает, не импортирует в хранилища, не обращается к OCSP/CRL и не просит пароль.

Перем Выполняется;

&НаКлиенте
Процедура УчебныйПример(Команда)
    Если Выполняется = Истина Тогда
        Сообщить("Дождитесь завершения своей цепочки сертификата");
        Возврат;
    КонецЕсли;
    ИмяФайла = КаталогВременныхФайлов() + "УчебныйСертификат_" + Строка(Новый УникальныйИдентификатор) + ".cer";
    Данные = Base64Значение("MIIC+jCCAeKgAwIBAgIBVTANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpTeW50YXggR3VpZGUgVHJhaW5pbmcgT25seTAeFw0yMDAxMDEwMDAwMDBaFw0zNTEyMzEwMDAwMDBaMCUxIzAhBgNVBAMMGlN5bnRheCBHdWlkZSBUcmFpbmluZyBPbmx5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkraGtF6mSMHQWI0lIdDxzNjLTB0VHmtLUYEIxXFFJepQtyMGWZ9rfpbTglFp8wpsw+Wc09FQyDFuKsNz3cBcBBx7fTmJVuYzfrXjhDECNqEoKMEf+Qrim3WsVKA/Qr8IMnzq1qdnA1pLgaaKyscfCJkw9W1yoTlLV3PmGs6h6gP1/KXwe+zKN5r3Jl0IVk8RXTLAeyqN01lCuyzaeSYm/v2YS88LdaJ/nkdFqy5QjRXfm7EOCW7eCZlCBwW0EvGhUarZxWlq04lPs9qu3aC3/6gY/scE2vY1jeZV2VpV0lLQpU5gVdjVGI4YQmfgkb8jYtV5U7FQ1KQ6Poji/ort6wIDAQABozUwMzAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEARoo1FJJKKkaZXyFl1tlYj8K7xvryXwhb+tCaFvdXuON27YC3/YIHLUT9sCF9o76VIT8dsVMpK0Qo+VV0FIvqRcB+u6SmyJ+Y7590mzd5P1CSt8Y/4BNV2LosYxhcdVczs26PWHL5GXyBMWRxtBjNsnTeMKh4/WIMrplAr0IOJCmjIeKhv0JbQacsNqhmpe7JdgtBYC4Rrn3ajdD99HZREmyLR/iJrh6W4IGqSN0MGT0xL/mLI0GsTp9JhHDF3o8bmC1yMDlLOoAZp7M072bzfDsKFPg4ATQp/hhbtsTdS/LXrd9cLehZ7ThH6ljL8y2JbALD+6HPnT6Sv+Mg0Wq0MA==");
    Состояние = Новый Структура("ИмяФайла,СвойФайл,Поток,ОжидаемыеДанные,Сертификат", ИмяФайла, Ложь, Неопределено, Данные, Неопределено);
    Выполняется = Истина;
    Попытка
        Состояние.Поток = Новый ФайловыйПоток(Состояние.ИмяФайла, РежимОткрытияФайла.СоздатьНовый, ДоступКФайлу.ЧтениеИЗапись);
        Состояние.СвойФайл = Истина;
        Состояние.ОжидаемыеДанные.Записать(Состояние.Поток);
        Состояние.Поток.Закрыть();
        Состояние.Поток = Неопределено;
        Состояние.Сертификат = Новый СертификатКриптографии;
        Состояние.Сертификат.НачатьИнициализацию(ОповещениеДля("ПослеИнициализации", Состояние), Состояние.ИмяФайла);
    Исключение
        ОсвободитьСвойФайл(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Функция ОповещениеДля(Обработчик, Состояние)
    Возврат Новый ОписаниеОповещения(Обработчик, ЭтотОбъект, Состояние, "ОшибкаОперации", ЭтотОбъект);
КонецФункции

&НаКлиенте
Процедура ПослеИнициализации(ЗагруженныйСертификат, Состояние) Экспорт
    Попытка
        Если ТипЗнч(ЗагруженныйСертификат) <> Тип("СертификатКриптографии") Тогда
            ВызватьИсключение "Оповещение не вернуло созданный сертификат";
        КонецЕсли;
        Состояние.Сертификат = ЗагруженныйСертификат;
        Сообщить(Base64Строка(Состояние.Сертификат.Отпечаток) = "tRDNiwoaiFssHhQqwyjWVlPLdns=");
        Состояние.Сертификат.НачатьВыгрузку(ОповещениеДля("ПослеВыгрузки", Состояние));
    Исключение
        ОсвободитьСвойФайл(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыгрузки(ВыгруженныеДанные, Состояние) Экспорт
    Попытка
        Если ТипЗнч(ВыгруженныеДанные) <> Тип("ДвоичныеДанные") Тогда
            ВызватьИсключение "Оповещение выгрузки не вернуло публичные байты";
        КонецЕсли;
        Сообщить(Base64Строка(ВыгруженныеДанные) = Base64Строка(Состояние.ОжидаемыеДанные));
        ОсвободитьСвойФайл(Состояние);
        ПроверкаФайла = Новый Файл(Состояние.ИмяФайла);
        Если ПроверкаФайла.Существует() Тогда
            ВызватьИсключение "Очистка собственного CER не завершилась; успешного завершения нет";
        КонецЕсли;
        Сообщить(Не ПроверкаФайла.Существует());
        Выполняется = Ложь;
        Сообщить("Учебный публичный сертификат выгружен; свой временный файл удалён");
    Исключение
        ОсвободитьСвойФайл(Состояние);
        Выполняется = Ложь;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ОшибкаОперации(Ошибка, СтандартнаяОбработка, Состояние) Экспорт
    ОсвободитьСвойФайл(Состояние);
    Выполняется = Ложь;
    СтандартнаяОбработка = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ОсвободитьСвойФайл(Состояние)
    Если Состояние.Поток <> Неопределено Тогда
        Попытка
            Состояние.Поток.Закрыть();
            Состояние.Поток = Неопределено;
        Исключение
            Сообщить("Не удалось закрыть собственный CER-поток: " + ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
    Если Состояние.СвойФайл Тогда
        Попытка
            УдалитьФайлы(Состояние.ИмяФайла);
            Состояние.СвойФайл = Ложь;
        Исключение
            Сообщить("Не удалось удалить только собственный временный CER: " + Состояние.ИмяФайла + "; " + ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
КонецПроцедуры

Разбор по шагам

  1. СоздатьНовый создаёт только новое уникальное имя; флаг собственности ставится после успешного открытия, затем поток закрывается до начала чтения.

  2. НачатьИнициализацию получает оповещение и имя файла. ПослеИнициализации(ЗагруженныйСертификат, Состояние) принимает созданный объект и сохраняет его в состоянии.

  3. НачатьВыгрузку без файлового имени возвращает данные в ПослеВыгрузки(ВыгруженныеДанные, Состояние). Сравниваем их с исходным DER.

  4. После завершения удаляем точный собственный CER под защитой флага и проверяем отсутствие. Коллекции сертификатов ОС не меняются.

  5. Флаг Выполняется препятствует повторному старту. Ошибки операции и ошибки следующего шага идут через очистку, а не через сообщение об успешном завершении.

Как проверить результат

  1. Три сравнения Истина: отпечаток, исходные DER-байты и отсутствие своего файла.

  2. При повторном нажатии до окончания ожидается сообщение дождаться своей цепочки.

  3. При отказе удаления выводится точное имя; отдельная проверка вызывает исключение до сообщения об успешном завершении.

Ожидаемый результат

Созданный результат инициализации и результат публичной выгрузки обработаны правильными callbacks.

На что обратить внимание

  1. Вариант НачатьВыгрузку с файловым именем возвращает имя, а не байты: его обработчик должен иметь соответствующий первый аргумент.

  2. Не подставляйте путь к рабочему сертификату: этот модуль должен обслуживать только созданный им CER.

  3. Нельзя удалять CER сразу после НачатьИнициализацию: асинхронная операция ещё может читать его.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Очистить учебную панель сообщений, не путая её с журналом регистрации

ОчиститьСообщения убирает сообщения клиентского сеанса, не строки базы и не журнал регистрации. Упражнение выполняется только в новом сеансе отдельной учебной базы.

Где и как запускать

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

Подготовка

  1. Создайте отдельную учебную внешнюю обработку с пустой управляемой основной формой. Каждую задачу запускайте в своей копии формы.

  2. Не добавляйте вручную реквизит ЗначениеПримера, поле ПолеПримера и команду УчебноеДействие: их создаст код.

  3. В свойствах формы → События свяжите ПриСозданииНаСервере с одноимённой процедурой. Вставьте весь модуль, включая клиентские и серверные процедуры.

  4. Сохраните учебную EPF и откройте через Файл → Открыть в тонком или толстом клиенте Windows. Рабочие данные не читаются и не записываются.

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

  6. Основной пример выполняется в тонком/толстом клиенте Windows. Доступность веб-клиента оговаривается отдельно; наличие Асинх в имени не гарантирует веб-доступность.

  7. ОБЯЗАТЕЛЬНО новый сеанс отдельной пустой учебной базы. Очистка панели сообщений необратима для её старого содержимого.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Новые = Новый Массив;
    ТипРеквизита = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(12, 2));
    Новые.Добавить(Новый РеквизитФормы("ЗначениеПримера", ТипРеквизита));
    ЭтаФорма.ИзменитьРеквизиты(Новые);
    ЭтаФорма.ЗначениеПримера = 3;
    Поле = Элементы.Добавить("ПолеПримера", Тип("ПолеФормы"));
    Поле.Вид = ВидПоляФормы.ПолеВвода;
    Поле.ПутьКДанным = "ЗначениеПримера";
    Поле.Заголовок = "Учебное количество";


    КомандаДействия = ЭтаФорма.Команды.Добавить("УчебноеДействие");
    КомандаДействия.Действие = "УчебноеДействие";
    КомандаДействия.Заголовок = "Учебная очистка сообщений";
    КомандаДействия.Подсказка = "Действие только над данными учебной формы";
    КомандаДействия.ИзменяетСохраняемыеДанные = Ложь;
    Кнопка = Элементы.Добавить("КнопкаУчебноеДействие", Тип("КнопкаФормы"));
    Кнопка.ИмяКоманды = КомандаДействия.Имя;
    Кнопка.Заголовок = КомандаДействия.Заголовок;
КонецПроцедуры

&НаКлиенте
Процедура УчебноеДействие(Команда)
    Сообщить("Первое собственное учебное сообщение");
    Сообщить("Второе собственное учебное сообщение");
    ПоказатьПредупреждение(Новый ОписаниеОповещения("ОчиститьУчебнуюПанель", ЭтаФорма),
        "После закрытия будут очищены ВСЕ сообщения этого учебного сеанса.", 0, "Только отдельная учебная база");
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьУчебнуюПанель(ДополнительныеПараметры) Экспорт
    ОчиститьСообщения();
    Сообщить("Старая панель сообщений очищена; это новое собственное сообщение");
КонецПроцедуры

Разбор по шагам

  1. Запускайте в новом сеансе собственной пустой базы, где нет нужных чужих диагностических сообщений.

  2. Добавляем два собственных сообщения, чтобы результат очистки было видно.

  3. После закрытия предупреждения одноаргументный callback очищает ВСЮ панель сеанса.

  4. Затем добавляем новое сообщение: оно не удалено предшествующей очисткой.

  5. Никаких методов ОчиститьЖурналРегистрации или удаления данных здесь нет.

Как проверить результат

  1. До закрытия предупреждения видны два собственных сообщения, после — только новое сообщение об очистке.

  2. Собственные документы/справочники не изменились; журнал регистрации не очищался.

Ожидаемый результат

На видимом результате разделены клиентские сообщения и постоянная диагностика базы.

На что обратить внимание

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

  2. Не запускайте упражнение в рабочем сеансе: нужные сообщения исчезнут и не восстановятся этой командой.

  3. Оповещения пользователя, журнал регистрации и сообщения панели — разные механизмы.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.