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

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

В процессе разработки конфигураций на платформе 1С:Предприятие 8.3 в режиме управляемого приложения начинающие разработчики часто сталкиваются с ошибкой синтаксического контроля при обращении к данным документа или справочника из модуля формы:

Переменная не определена (Объект)

Посмотрим на типовой пример кода, в котором может возникнуть данная ситуация при заполнении цены в строке табличной части:


&НаКлиенте
Процедура ПереченьНоменклатурыНоменклатураПриИзменении(Элемент)
    СтрокаТабличнойЧасти = Элементы.ПереченьНоменклатуры.ТекущиеДанные;
    СтрокаТабличнойЧасти.Цена = РаботаСоСправочниками.РозничнаяЦена(Объект.Дата, СтрокаТабличнойЧасти.Номенклатура);
КонецПроцедуры

Разберем детально, почему платформа не видит переменную Объект и какими способами можно устранить эту ошибку.

Причина 1. Отсутствие или удаление основного реквизита управляемой формы

В управляемых формах 1С ключевым связующим звеном между базой данных и интерфейсом является основной реквизит. По умолчанию платформа автоматически создает реквизит с именем Объект и типом данных ДокументОбъект.<ИмяДокумента> или СправочникОбъект.<ИмяСправочника>. Если этот реквизит был случайно удален, переименован или форма создавалась как произвольная, обращение к Объект в модуле формы приводит к ошибке.

Разберем по шагам, как вручную восстановить основной реквизит:

  1. Откроем нужную форму в конфигураторе.
  2. Перейдем в правое верхнее окно редактора формы на вкладку Реквизиты.
  3. Нажмем кнопку Добавить реквизит и укажем имя Объект.
  4. В поле Тип выберем соответствующий объектный тип (например, ДокументОбъект.ОказаниеУслуги).
  5. Нажмем правой кнопкой мыши по созданному реквизиту и выберем пункт Установить как основной реквизит (имя реквизита в списке выделится полужирным шрифтом).
  6. Проверим элементы интерфейса: если поля ввода или таблицы потеряли привязку, заново укажем для них свойство ПутьКДанным (например, Объект.Дата, Объект.Контрагент).

Причина 2. Пересоздание управляемой формы с помощью конструктора

Если форма создавалась недавно и еще не содержит сложного уникального интерфейса, самым быстрым и надежным способом будет полное пересоздание формы. Разберем этот вариант:

  1. Удалим поврежденную форму из ветки объекта конфигурации.
  2. В окне редактирования объекта перейдем на вкладку Формы и нажмем кнопку добавления (значок с плюсом).
  3. В мастере создания выберем тип Форма документа или Форма элемента.
  4. Платформа автоматически создаст корректную структуру элементов, назначит основной реквизит Объект и свяжет табличные части.
  5. После этого перенесем программный код обработчиков в новый модуль формы.

Причина 3. Вызов процедуры с директивой &НаСервереБезКонтекста

Проанализируем контекст исполнения процедур. Реквизит формы Объект доступен только в процедурах с директивами &НаКлиенте и &НаСервере. Если процедура объявлена с директивой &НаСервереБезКонтекста, контекст формы на сервер не передается ради оптимизации клиент-серверного взаимодействия.

Посмотрим на пример ошибочного кода:


&НаСервереБезКонтекста
Функция ПолучитьЦенуНаСервере(Номенклатура)
    // Ошибка: Объект недоступен без контекста!
    Возврат РаботаСоСправочниками.РозничнаяЦена(Объект.Дата, Номенклатура);
КонецФункции

Чтобы исправить эту ошибку, передадим дату документа в качестве явного входного параметра:


&НаСервереБезКонтекста
Функция ПолучитьЦенуНаСервере(ДатаДокумента, Номенклатура)
    Возврат РаботаСоСправочниками.РозничнаяЦена(ДатаДокумента, Номенклатура);
КонецФункции

&НаКлиенте
Процедура НоменклатураПриИзменении(Элемент)
    СтрокаТЧ = Элементы.ПереченьНоменклатуры.ТекущиеДанные;
    СтрокаТЧ.Цена = ПолучитьЦенуНаСервере(Объект.Дата, СтрокаТЧ.Номенклатура);
КонецПроцедуры

Причина 4. Неправильное расположение кода (Модуль объекта вместо Модуля формы)

Иногда начинающие разработчики путают модуль формы и модуль объекта. Если код помещен в Модуль объекта (например, в процедуру ОбработкаПроведения или ПередЗаписью), переменной Объект там не существует.

В модуле объекта обращение к собственным реквизитам выполняется напрямую по их имени либо через предопределенное свойство ЭтотОбъект:


// В модуле объекта:
Процедура ОбработкаПроведения(Отказ, Режим)
    // Правильное обращение к реквизитам шапки:
    ТекущаяДатаДокумента = ЭтотОбъект.Дата; // либо просто Дата
КонецПроцедуры

Причина 5. Ошибки раскладки клавиатуры и опечатки

Выясним еще один скрытый источник проблемы: смешение букв русской и английской раскладок клавиатуры. Визуально слова Объект (на русском) и Oбъeкт (с латинскими буквами O или e) выглядят абсолютно одинаково, однако компилятор 1С воспринимает их как разные идентификаторы. Если имя основного реквизита или имя переменной в модуле было введено на другой раскладке, синтаксический контроль выдаст ошибку отсутствия переменной. Для исправления достаточно полностью стереть и набрать слово заново на одной раскладке.

← На главную