В процессе разработки на платформе 1С:Предприятие 8 (особенно при работе с управляемыми формами) начинающие специалисты часто сталкиваются с ошибкой «Поле объекта не обнаружено» при попытке обратиться к реквизиту формы через конструкцию Объект.ИмяРеквизита. В этой статье мы подробно разберем, почему возникает эта ошибка, в чем разница между реквизитами формы и реквизитами объекта, как правильно настроить свойства элементов в Конфигураторе и как победить кэширование внешних обработок.
Для понимания сути проблемы проанализируем, как устроена управляемая форма. В правом верхнем углу редактора формы находятся ее реквизиты. Главный реквизит формы, который создается автоматически и выделяется жирным шрифтом, обычно называется Объект. Он имеет специальный тип данных, например, ДанныеФормыСтруктура (для документов, справочников или обработок).
Существует два принципиально разных способа создания реквизитов, и обращение к ним в коде происходит по-разному:
ИмяРеквизита или ЭтаФорма.ИмяРеквизита. Если написать Объект.ИмяРеквизита, система выдаст ошибку, так как внутри структуры Объект этого поля нет.Объект. К ним обращаются исключительно через точку: Объект.ИмяРеквизита. Именно такие данные могут быть записаны в базу данных или переданы в модуль объекта для серверных расчетов.Рассмотрим ситуацию, когда нам необходимо добавить реквизит ФайлЛога во внешнюю обработку и обратиться к нему через Объект.ФайлЛога. Пройдем по шагам весь процесс настройки:
ФайлЛога. Зададим ему необходимый тип данных (например, Строка).Объект. Мы увидим, что наш новый реквизит ФайлЛога автоматически появился внутри этой структуры.ФайлЛога из правого окна реквизитов в левое окно элементов формы. Платформа сама создаст элемент управления (поле ввода).После этого мы сможем корректно использовать реквизит в коде модуля формы. Посмотрим на практический пример реализации диалога выбора каталога:
&НаКлиенте
Процедура КаталогПереносаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Отменяем стандартное поведение системы
Режим = РежимДиалогаВыбораФайла.ВыборКаталога;
ДиалогСохранения = Новый ДиалогВыбораФайла(Режим);
ДиалогСохранения.МножественныйВыбор = Ложь;
ДиалогСохранения.Заголовок = "Выберите каталог для сохранения логирования";
Если ДиалогСохранения.Выбрать() Тогда
// Теперь обращение работает корректно, так как реквизит добавлен в объект
Объект.ФайлЛога = ДиалогСохранения.Каталог;
КонецЕсли;
КонецПроцедуры
Часто разработчики замечают странное поведение интерфейса Конфигуратора: двойной клик по одним реквизитам открывает палитру свойств, а по другим — нет. Выясним причину этого поведения.
Интерфейс Конфигуратора контекстно-зависим:
Объект, Конфигуратор может проигнорировать это действие или открыть только выбор типа данных. Это связано с тем, что данный реквизит принадлежит метаданным самого объекта, а не формы, и его базовые свойства настраиваются в главном окне объекта.Решение: Чтобы гарантированно открыть свойства любого элемента или реквизита в 1С, используйте универсальные способы: нажмите клавишу F4, комбинацию клавиш Alt + Enter или нажмите правую кнопку мыши и выберите пункт «Свойства» в контекстном меню.
Иногда возникает ситуация: разработчик добавил реквизит в объект метаданных, сохранил обработку, но при запуске в режиме «1С:Предприятие» система продолжает выдавать ошибку «Поле объекта не обнаружено», а в табло отладчика этот реквизит отсутствует внутри структуры Объект.
Причина кроется в механизме кэширования внешних файлов (форматов .epf и .erf). Платформа 1С оптимизирует работу и при первом открытии файла кэширует его структуру в оперативной памяти сеанса. При повторном открытии системы или простом переоткрытии формы изменения могут не примениться, так как программа обращается к старой версии из кэша.
Чтобы избежать этой проблемы и гарантированно применить изменения метаданных, выполним следующие шаги:
Файл -> Открыть.Соблюдение этих простых правил убережет вас от ложных ошибок компиляции и сэкономит время при отладке программного кода управляемых форм 1С.