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