При разработке в среде 1С:Предприятие 8 часто возникает необходимость выполнить определенное действие после завершения асинхронного события — например, после закрытия модального окна, выбора файла или окончания длительной операции. Для реализации такой логики мы используем объект ОписаниеОповещения. Однако у многих разработчиков возникает вопрос: как правильно указать модуль, в котором находится вызываемая процедура, чтобы не прописывать имя модуля жестко и сохранить гибкость кода?
Основная сложность заключается в правильной передаче параметров в конструктор объекта ОписаниеОповещения. Конструктор выглядит следующим образом: Новый ОписаниеОповещения(ИмяПроцедуры, Модуль, ДополнительныеПараметры). Часто разработчики пытаются передать туда имя модуля строкой, но при работе с расширениями или общими модулями это не всегда удобно.
Давайте рассмотрим, как упростить эту задачу с помощью использования ключевого слова ЭтотОбъект.
Если процедура, которую вы планируете вызвать после оповещения, находится в том же модуле, где вы создаете объект ОписаниеОповещения, вам не нужно указывать имя модуля явно. Достаточно передать ЭтотОбъект. Это позволяет платформе самостоятельно определить контекст выполнения.
Посмотрим на конкретный пример реализации:
// В коде модуля, где необходимо создать оповещение:
ПараметрыОповещения = Новый Структура("Ключ", Значение);
Описание = Новый ОписаниеОповещения("ИмяЭкспортнойПроцедуры", ЭтотОбъект, ПараметрыОповещения);
// Далее вызываем действие, которое требует коллбэка, например:
ОткрытьФорму("Документ.ЗаказКлиента.ФормаОбъекта", , , , , , Описание);
Важно помнить одно критическое условие: процедура, которую вы указываете первым параметром, обязательно должна быть помечена ключевым словом Экспорт. Без этого модификатора платформа не сможет обнаружить процедуру, даже если вы правильно передали ссылку на текущий модуль.
Если при попытке использовать ЭтотОбъект вы получаете ошибку «Процедура не найдена» или «Неопознанный контекст», проанализируем возможные причины:
Экспорт в заголовке процедуры. Это самая частая причина ошибок.ОписаниеОповещения.ЭтотОбъект корректно указывает на текущий расширенный модуль.Иногда у разработчиков возникает соблазн использовать сложные приемы, такие как анализ стека вызовов через ИнформацияОбОшибке или генерацию исключений для того, чтобы «автоматически» узнать имя модуля. Мы настоятельно рекомендуем отказаться от таких методов.
Подобные «костыли» имеют ряд существенных недостатков:
Использование ЭтотОбъект является стандартом платформы, рекомендованным к применению в промышленной разработке. Это наиболее быстрый, безопасный и корректный способ обращения к экспортным процедурам внутри того же модуля, где формируется оповещение.
Таким образом, для большинства задач по созданию асинхронных вызовов достаточно простого и чистого кода, который делает вашу программу понятной и легкой в обслуживании.