Как правильно сослаться на процедуру в модуле при создании ОписаниеОповещения?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке в среде 1С:Предприятие 8 часто возникает необходимость выполнить определенное действие после завершения асинхронного события — например, после закрытия модального окна, выбора файла или окончания длительной операции. Для реализации такой логики мы используем объект ОписаниеОповещения. Однако у многих разработчиков возникает вопрос: как правильно указать модуль, в котором находится вызываемая процедура, чтобы не прописывать имя модуля жестко и сохранить гибкость кода?

Разбираемся с контекстом вызова

Основная сложность заключается в правильной передаче параметров в конструктор объекта ОписаниеОповещения. Конструктор выглядит следующим образом: Новый ОписаниеОповещения(ИмяПроцедуры, Модуль, ДополнительныеПараметры). Часто разработчики пытаются передать туда имя модуля строкой, но при работе с расширениями или общими модулями это не всегда удобно.

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

Использование ЭтотОбъект для ссылки на текущий модуль

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

Посмотрим на конкретный пример реализации:


// В коде модуля, где необходимо создать оповещение:
ПараметрыОповещения = Новый Структура("Ключ", Значение);
Описание = Новый ОписаниеОповещения("ИмяЭкспортнойПроцедуры", ЭтотОбъект, ПараметрыОповещения);

// Далее вызываем действие, которое требует коллбэка, например:
ОткрытьФорму("Документ.ЗаказКлиента.ФормаОбъекта", , , , , , Описание);

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

Почему могут возникать ошибки?

Если при попытке использовать ЭтотОбъект вы получаете ошибку «Процедура не найдена» или «Неопознанный контекст», проанализируем возможные причины:

  1. Процедура не является экспортной: Проверьте, добавлено ли ключевое слово Экспорт в заголовке процедуры. Это самая частая причина ошибок.
  2. Контекст вызова: Убедитесь, что вы находитесь в модуле, который поддерживает контекстное выполнение (модуль формы, модуль объекта, общий модуль).
  3. Опечатки: Проверьте правильность написания имени процедуры, передаваемого в виде строки в конструктор ОписаниеОповещения.
  4. Расширения конфигурации: Если вы используете расширения, убедитесь, что процедура доступна в том же контексте. При работе с расширениями, если вы расширяете общий модуль, ЭтотОбъект корректно указывает на текущий расширенный модуль.

Когда стоит избегать сложных конструкций?

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

Подобные «костыли» имеют ряд существенных недостатков:

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

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

← На главную