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