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