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