Чем заменить ЭтотОбъект в общем модуле при режиме совместимости 8.2 в 1С?

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

При переносе кода из типовых конфигураций или разработке асинхронных вызовов в клиентских общих модулях разработчики 1С часто сталкиваются с ошибкой компиляции: «Переменная не определена (ЭтотОбъект)». Эта проблема возникает при попытке сформировать конструктор ОписаниеОповещения в конфигурациях, работающих в режиме совместимости с версией 8.2.

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

Причина возникновения ошибки

В платформе «1С:Предприятие 8.3» контекстное свойство ЭтотОбъект было добавлено в клиентских общих модулях для удобной передачи текущего модуля в качестве обработчика асинхронных вызовов. Однако при включенном режиме совместимости с версией 8.2 платформа блокирует использование свойства ЭтотОбъект в общих модулях, из-за чего возникает ошибка проверки синтаксиса.

Способ 1. Явное указание имени общего модуля

Самый простой и эффективный вариант решения — указать имя клиентского общего модуля напрямую в качестве второго параметра конструктора ОписаниеОповещения. Вместо ключевого слова ЭтотОбъект следует прописать имя общего модуля как идентификатор (без кавычек).

Рассмотрим пример правильного создания оповещения:


// Неправильно для режима 8.2:
// Оповещение = Новый ОписаниеОповещения("ПоказатьВопросЗавершение", ЭтотОбъект, ОписаниеОповещенияОЗакрытии);

// Правильно:
Оповещение = Новый ОписаниеОповещения("ПоказатьВопросЗавершение", ОбщегоНазначенияКлиент, ОписаниеОповещенияОЗакрытии);

Важное условие: Процедура-обработчик оповещения (в данном примере — ПоказатьВопросЗавершение), находящаяся в общем модуле, обязательно должна содержать ключевое слово Экспорт.


Процедура ПоказатьВопросЗавершение(Результат, ДополнительныеПараметры) Экспорт
    // Обработка результата
КонецПроцедуры

Способ 2. Передача контекста формы (переменная ЭтаФорма)

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

Выясним, как выглядит данный подход на практике:


// В модуле формы передаем контекст ЭтаФорма:
ОбщегоНазначенияКлиент.ЗапроситьУстановкуРасширения(ЭтаФорма);

// В клиентском общем модуле используем полученный контекст:
Процедура ЗапроситьУстановкуРасширения(ФормаКонтекст) Экспорт
    
    ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеНаФорме", ФормаКонтекст);
    // Вызов асинхронной функции платформы...
    
КонецПроцедуры

В этом случае процедура ЗавершениеНаФорме должна быть объявлена с экспортом в модуле самой формы.

Способ 3. Переход на синхронный метод

Если решение не предназначено для работы в веб-клиенте и используется только в тонком или толстом клиенте, в режиме совместимости 8.2 допустимо использовать классические синхронные методы. Это позволяет избежать создания объекта ОписаниеОповещения.

Посмотрим пример синхронного вызова:


Если Не УстановитьРасширениеРаботыСФайлами() Тогда
    // Логика при отказе установки
КонецЕсли;

Обратите внимание: для работы в веб-клиенте этот вариант не подходит, так как современные браузеры блокируют синхронные модальные вызовы. В веб-клиенте единственным корректным решением остается Способ 1.

Рекомендации по доработке

Сформулируем порядок действий при исправлении ошибки:

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