Как исправить ошибку "Поле объекта не обнаружено" при обращении к реквизитам текущей строки таблицы в 1С

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

Разберем распространенную проблему, с которой сталкиваются разработчики управляемого интерфейса 1С:Предприятие 8.3 при попытке считать данные выделенной строки таблицы формы. Ошибка "Поле объекта не обнаружено" обычно возникает при обращении к свойствам объекта через точку в клиентском контексте (&НаКлиенте).

Анализ причины ошибки

Проанализируем ситуацию на примере следующего фрагмента кода:


&НаКлиенте
Процедура СохранитьЛист(Команда)
    ТекущаяСтрока = Элементы.Листы.ТекущаяСтрока;
    Если ТекущаяСтрока <> Неопределено Тогда
        Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
        Диалог.Заголовок = "Укажите имя файла";
        Диалог.МножественныйВыбор = Ложь;
        Диалог.ПолноеИмяФайла = ТекущаяСтрока.ИмяФайла; // Здесь возникает ошибка
        Если Диалог.Выбрать() Тогда
            // Сохранение файла
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

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

  1. Назначение свойства ТекущаяСтрока: Данное свойство элемента таблицы формы возвращает только идентификатор выделенной строки (число для таблицы значений) или ключевое значение (ссылку, например СправочникСсылка или ДокументСсылка). У этого объекта нет direct-доступа к реквизитам отображаемого элемента.
  2. Ограничения клиентского контекста: На клиенте объекты типа "Ссылка" являются лишь адресами записей в базе данных и не содержат внутри себя реквизитов объекта. Попытка обратиться к реквизиту ссылки напрямую через точку (ТекущаяСтрока.ИмяФайла) вызывает ошибку "Поле объекта не обнаружено".
  3. Влияние платформы и операционной системы: Старые релизы платформы (например, 8.3.6) имеют проблемы совместимости с Windows 10, из-за чего отладчик на клиенте может некорректно отображать типы данных и реквизиты объектов.

Способ 1. Использование свойства ТекущиеДанные

Выясним, как правильно считывать значения колонок выделенной строки на клиенте без обращения к серверу. Для этого у элементов таблиц управляемой формы предусмотрено специальное свойство ТекущиеДанные.

Свойство ТекущиеДанные возвращает объект типа ДанныеФормыЭлементКоллекции, который содержит готовые к использованию значения всех колонок, присутствующих в таблице на форме.

Исправленный клиентский код выглядит следующим образом:


&НаКлиенте
Процедура СохранитьЛист(Команда)
    ТекущиеДанные = Элементы.Листы.ТекущиеДанные;
    Если ТекущиеДанные <> Неопределено Тогда
        Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
        Диалог.Заголовок = "Укажите имя файла";
        Диалог.МножественныйВыбор = Ложь;
        Диалог.ПолноеИмяФайла = ТекущиеДанные.ИмяФайла;
        Если Диалог.Выбрать() Тогда
            // Сохранение файла
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Важное примечание: Если используется динамический список, для обращения к полю через ТекущиеДанные необходимо убедиться, что реквизит выведен в колонки таблицы формы или у него в настройках списка установлено свойство "Использовать всегда".

Способ 2. Чтение реквизитов через серверный контекст

Рассмотрим случай, когда реквизит (например, ИмяФайла) отсутствует в колонках таблицы формы, а на клиенте доступна только ссылка на элемент справочника из свойства ТекущаяСтрока. В этом случае чтение данных необходимо вынести в отдельную серверную функцию.

Реализуем получение данных по ссылке через контекст &НаСервереБезКонтекста:


&НаКлиенте
Процедура СохранитьЛист(Команда)
    СсылкаНаЛист = Элементы.Листы.ТекущаяСтрока;
    Если ЗначениеЗаполнено(СсылкаНаЛист) Тогда
        ИмяФайла = ПолучитьИмяФайлаПоСсылке(СсылкаНаЛист);
        
        Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
        Диалог.Заголовок = "Укажите имя файла";
        Диалог.МножественныйВыбор = Ложь;
        Диалог.ПолноеИмяФайла = ИмяФайла;
        Если Диалог.Выбрать() Тогда
            // Сохранение файла
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьИмяФайлаПоСсылке(Ссылка)
    Возврат Ссылка.ИмяФайла;
КонецФункция

Способ 3. Обновление платформы 1С:Предприятие

Посмотрим на особенности поведения тонкого клиента под управлением Windows 10. Если код работает некорректно или в режиме отладки реквизиты объектов не отображаются, причиной может быть устаревшая версия платформы.

  1. Для стабильной работы тонкого клиента под Windows 10 рекомендуется использовать версию платформы 1С:Предприятие не ниже 8.3.10.
  2. При смене операционной системы или переносе информационной базы очистите кеш тонкого клиента (каталоги 1Cv883 в папках AppData\Local и AppData\Roaming профиля пользователя).
← На главную