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