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