Разработка и Конфигурация · 10 мин
ЭтотОбъект и Объект в 1С: в чём разница
Разбираем разницу между ЭтотОбъект и Объект в 1С: контексты формы и модуля объекта, типичные ошибки, примеры кода и правила выбора для разработчика.
В модулях 1С:Предприятия постоянно встречаются два похожих обращения к данным — ЭтотОбъект и Объект. Новички часто считают их взаимозаменяемыми, но это разные сущности, живущие в разных контекстах: ЭтотОбъект доступен в модуле объекта (справочника, документа, обработки), а Объект — в модуле формы как реквизит формы, содержащий данные редактируемого объекта.
Путаница между ними приводит к характерным ошибкам: «Переменная не определена (Объект)» при переносе кода из формы в модуль объекта, потеря изменений при записи, обращения к несуществующим свойствам. Понимание того, где какой идентификатор доступен и что он возвращает, — базовый навык разработчика 1С.
Ниже разберём, что представляет собой каждый идентификатор, в каких модулях он доступен, какие типы возвращает, и покажем на практических сценариях, как правильно переносить код между контекстами.
Что такое ЭтотОбъект и где он доступен
ЭтотОбъект — ключевое слово, доступное в модуле объекта (например, в модуле справочника «Номенклатура» или документа «РеализацияТоваровУслуг»), а также в модулях обработок и отчётов. Оно возвращает сам объект встроенного языка, для которого выполняется модуль: СправочникОбъект, ДокументОбъект и так далее.
Через ЭтотОбъект можно явно обратиться к реквизитам и табличным частям: ЭтотОбъект.Наименование, ЭтотОбъект.Товары.Добавить(). На практике внутри модуля объекта префикс обычно опускают — реквизиты доступны напрямую по имени. Явное использование ЭтотОбъект нужно в основном тогда, когда требуется передать ссылку на сам объект в другую процедуру или когда имя реквизита совпадает с именем локальной переменной.
Важно понимать: ЭтотОбъект — это именно объект данных в памяти, а не ссылка. Для получения ссылки используют свойство Ссылка: ЭтотОбъект.Ссылка. Если объект ещё не записан, ссылка может быть пустой или временной.
Что такое Объект в модуле формы
В модуле формы идентификатор Объект — это не ключевое слово языка, а реквизит формы, который платформа автоматически создаёт для основного реквизита формы. У формы элемента справочника или документа основной реквизит называется «Объект» и имеет тип ДанныеФормыСтруктура (на сервере при обращении через РеквизитФормыВЗначение — полноценный объект).
Ключевое следствие: Объект в форме — это не СправочникОбъект напрямую, а его представление в виде данных формы. Поэтому в форме недоступны многие методы объекта — например, нельзя вызвать Объект.Записать() с параметрами проведения или обратиться к методам, определённым в модуле объекта, напрямую.
Запись из формы выполняется штатно — командой «Записать» или методом формы Записать(), а платформа сама преобразует данные формы в объект и вызывает обработчики модуля объекта. Если нужно получить настоящий объект в форме, используют РеквизитФормыВЗначение("Объект"), но это серверный вызов с сериализацией данных.
Сравнение контекстов и типов
| Критерий | ЭтотОбъект | Объект (в форме) |
|---|---|---|
| Где доступен | Модуль объекта, модуль обработки/отчёта | Модуль формы объекта |
| Что возвращает | СправочникОбъект, ДокументОбъект и т.п. | ДанныеФормыСтруктура (реквизит формы) |
| Методы объекта (Записать, Заполнить) | Доступны | Недоступны напрямую |
| Обработчики событий объекта | Вызываются при Записать() | Вызываются при штатной записи формы |
| Клиентский контекст | Не применимо | Доступен и на клиенте (чтение/изменение данных) |
Главное практическое различие — тип значения. Код, написанный для модуля объекта и опирающийся на методы ДокументОбъект, в форме работать не будет без адаптации, потому что Объект в форме имеет другой тип и другой набор возможностей.
Сравнение вариантов
Подходит для бизнес-логики: проведение, проверки заполнения, движения. Не доступен в форме.
Подходит для работы с данными на форме: отображение, интерактивное редактирование. Не имеет методов прикладного объекта.
Даёт полноценный объект в форме, но только на сервере и с затратами на сериализацию.
Типичные ошибки при переносе кода между контекстами
Самая частая ошибка — копирование кода из формы в модуль объекта без замены идентификатора. Строка Объект.Товары.Очистить(), работавшая в форме, в модуле объекта даст ошибку «Переменная не определена (Объект)». Правильный вариант: Товары.Очистить() или ЭтотОбъект.Товары.Очистить().
Обратная ситуация: перенос кода из модуля объекта в форму. Строка ЭтотОбъект.Записать() в форме не скомпилируется — ЭтотОбъект там не определён. В форме запись выполняется через метод формы Записать() или, при необходимости нестандартной записи, через серверную процедуру с РеквизитФормыВЗначение, вызовом методов объекта и обратным преобразованием ЗначениеВРеквизитФормы.
Ещё одна ловушка — попытка вызвать экспортную процедуру модуля объекта из формы как Объект.МояПроцедура(). Так не сработает: у данных формы нет пользовательских методов. Нужно либо получить объект через РеквизитФормыВЗначение, либо вынести логику в общий модуль и вызывать её оттуда.
Как правильно перенести код из формы в модуль объекта
Типовая задача: логика, написанная в форме, должна срабатывать при любом способе записи — из формы, из обмена данными, из фонового задания. Для этого её переносят в модуль объекта, например в обработчики ПередЗаписью или ПриЗаписи.
Порядок переноса: заменить все обращения Объект.Х на Х или ЭтотОбъект.Х; убрать обращения к элементам формы и реквизитам формы — их в модуле объекта нет; проверить, что процедура не зависит от интерактивных действий пользователя (предупреждения, вопросы в модуле объекта недопустимы — используйте вызов исключений через ВызватьИсключение или Отказ = Истина с сообщением).
- 1Найдите в коде формы все обращения к реквизиту Объект
- 2Замените Объект.Реквизит на Реквизит или ЭтотОбъект.Реквизит
- 3Удалите обращения к элементам формы и реквизитам формы
- 4Замените интерактивные вызовы (Предупреждение, Вопрос) на сообщения и Отказ = Истина
- 5Поместите код в подходящий обработчик: ПередЗаписью, ПриЗаписи, ОбработкаПроверкиЗаполнения
- 6Проверьте запись объекта из формы и программно через СоздатьОбъект/Записать
Когда использовать РеквизитФормыВЗначение и какие есть ограничения
Если в форме действительно нужен полноценный объект — например, чтобы вызвать его метод заполнения или нестандартную запись — применяют связку РеквизитФормыВЗначение("Объект") и ЗначениеВРеквизитФормы(ОбъектДанных, "Объект"). Это единственный штатный способ получить ДокументОбъект из данных формы.
Ограничения существенные: методы доступны только на сервере (в клиент-серверном режиме — серверный вызов), каждая пара преобразований сериализует все данные объекта, что заметно при больших табличных частях. Поэтому такой приём применяют точечно — на момент записи или заполнения, а не при каждом изменении поля.
Проверка результата и контрольные точки
После переноса или изменения кода проверьте три сценария: запись объекта через форму (кнопка «Записать» и «Провести»), программную запись через ОбъектДанных.Записать() из внешнего кода и, если применимо, загрузку через обмен данными. Логика в модуле объекта должна отрабатывать во всех трёх случаях одинаково.
Признаки корректной работы: отсутствие ошибок компиляции модуля, срабатывание проверок заполнения при программной записи, отсутствие обращений к элементам формы в журнале ошибок. Если ошибка возникает только при обмене или фоновой записи — почти наверняка код остался завязан на контекст формы.
Как проверить результат
Модуль объекта и формы сохраняются без ошибок конфигуратора
Ошибки «Переменная не определена» для Объект или ЭтотОбъект
Документ записывается и проводится штатно
Ошибки при нажатии «Записать» или «Провести»
Записать() из внешнего кода выполняет ту же логику
Логика срабатывает только при записи из формы
Форма реагирует на ввод без задержек
Подтормаживания при изменении полей — лишние серверные вызовы
Частые вопросы
Можно ли в модуле объекта писать просто имя реквизита без ЭтотОбъект?
Да, внутри модуля объекта реквизиты и табличные части доступны напрямую по имени — это стандартная практика. ЭтотОбъект добавляют явно, когда нужно передать сам объект параметром или избежать конфликта имён с локальной переменной.
Почему в форме Объект.Записать() работает не так, как ожидается?
У реквизита формы «Объект» с типом ДанныеФормыСтруктура нет методов прикладного объекта. Штатная запись выполняется методом формы Записать() — платформа сама преобразует данные и вызовет обработчики модуля объекта. Для нестандартной записи используют РеквизитФормыВЗначение на сервере.
Чем ЭтотОбъект отличается от ЭтотОбъект.Ссылка?
ЭтотОбъект — это сам объект данных в памяти со всеми реквизитами и табличными частями. Ссылка — уникальный идентификатор записи в базе данных, лёгковесное значение для хранения в реквизитах других объектов. У нового незаписанного объекта ссылка может отличаться от той, что будет после записи.
Доступен ли ЭтотОбъект в модуле менеджера?
Нет. Модуль менеджера работает на уровне всего менеджера объекта (справочника, документа), а не конкретного экземпляра, поэтому ЭтотОбъект там не определён. Конкретный объект в такие процедуры передают параметром.
Как из формы вызвать процедуру, описанную в модуле объекта?
Напрямую через реквизит Объект — никак. Варианты: получить объект через РеквизитФормыВЗначение("Объект") в серверной процедуре и вызвать метод у него, либо вынести логику в общий модуль и вызывать её и из формы, и из модуля объекта.
Что важно запомнить
ЭтотОбъект живёт в модуле объекта и возвращает сам объект данных; Объект — реквизит формы с данными в виде ДанныеФормыСтруктура. При переносе кода между контекстами меняйте идентификаторы, убирайте зависимость от формы и проверяйте запись всеми способами: из формы, программно и через обмен.