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