Почему в управляемой форме возникает ошибка «Переменная не определена (ЭтотОбъект)» и как её исправить?

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

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

Причина 1. Режим совместимости конфигурации и контекст управляемой формы

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

Начиная с версии платформы 8.3.3 (и выше), в контекст управляемой формы было добавлено свойство ЭтотОбъект как синоним ЭтаФорма. Если внешняя обработка создавалась в конфигурации с отключенным режимом совместимости (или совместимостью 8.3.3+), а затем открывается в базе с режимом совместимости «Версия 8.2.13» или «Версия 8.2.16», платформа не распознает конструкцию ЭтотОбъект в модуле формы.

Решение 1. Адаптация кода обработки: замена на «ЭтаФорма»

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

Посмотрим на пример адаптации кода:


// Вместо конструкции, вызывающей ошибку в режиме совместимости 8.2:
// ЭтотОбъект.Закрыть();
// ОповеститьОВыборе(ЭтотОбъект.Параметр1);

// Используем стандартное свойство ЭтаФорма:
ЭтаФорма.Закрыть();
ОповеститьОВыборе(ЭтаФорма.Параметр1);

Решение 2. Корректная работа с прикладным объектом на сервере

Разберем частую ошибку понимания контекста. В обычных формах ЭтотОбъект указывал на сам прикладной объект (например, ОбработкаОбъект или ДокументОбъект). В управляемых формах основной реквизит Объект имеет тип ДанныеФормыСтруктура, а свойство формы ЭтотОбъект указывает на саму форму (УправляемаяФорма), а не на прикладной объект.

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


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

Что делать с ошибками «ОбщаяКартинка.<Имя>: Имя не уникально!» при отключении совместимости?

Иногда возникает соблазн просто отключить или повысить режим совместимости конфигурации, чтобы заработали все конструкции платформы 8.3. Однако при проверке конфигурации после отключения совместимости с 8.2 часто возникает список ошибок вида: ОбщаяКартинка.Обновить: Имя не уникально!, ОбщаяКартинка.ОткрытьФайл: Имя не уникально!, ОбщаяКартинка.Сортировка: Имя не уникально!.

Выясним причину этой коллизии: в режиме платформы 8.2 системная коллекция БиблиотекаКартинок не содержала многих стандартных картинок, и разработчики конфигураций добавляли их вручную в ветку метаданных Общие -> Общие картинки. При повышении режима совместимости платформа подключает расширенную стандартную библиотеку картинок, чьи системные имена конфликтуют с пользовательскими общими картинками.

Для устранения конфликтов имен картинок можно применить следующие шаги:

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

Таким образом, для быстрого восстановления работоспособности обработки без риска сломать поведение конфигурации следует заменить обращения к ЭтотОбъект на ЭтаФорма либо получить прикладной объект через РеквизитФормыВЗначение.

← На главную