Как получить значение из табличной части справочника при активации ячейки в 1С

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

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

Понятие контекста: Элемент формы vs Объект данных

Прежде чем переходить к написанию кода, проанализируем, где именно находятся наши данные. В управляемом приложении 1С существует четкое разделение между Объектом (данными, которые будут записаны в базу) и Элементами формы (визуальным представлением этих данных на экране).

Когда пользователь кликает по таблице, он взаимодействует с Элементом формы. Именно у элемента формы есть информация о том, какая строка сейчас выделена синим цветом или в какой ячейке стоит курсор. Поэтому для получения "текущего" значения мы всегда будем обращаться к коллекции ЭтаФорма.Элементы.

Основной способ получения значения через ТекущиеДанные

Рассмотрим наиболее распространенный и правильный способ получения значения в управляемых формах. Для этого используется свойство ТекущиеДанные. Разберем по шагам логику обращения к реквизиту:

  1. Обращаемся к элементу формы, который отображает табличную часть.
  2. Используем свойство ТекущиеДанные, которое возвращает структуру со всеми колонками текущей строки.
  3. Указываем имя нужной колонки (реквизита табличной части).

Пример кода, если наша табличная часть называется ТрубыГладкиеИМуфтыКНим, а реквизит — ТолщинаСтенки:


// Получаем данные текущей строки
ДанныеСтроки = Элементы.ТрубыГладкиеИМуфтыКНим.ТекущиеДанные;

// Извлекаем значение конкретной колонки
Если ДанныеСтроки <> Неопределено Тогда
    ЗначениеРеквизита = ДанныеСтроки.ТолщинаСтенки;
    // Дальнейшая логика использования значения
КонецЕсли;

Важный нюанс: Обратите внимание на проверку Если ДанныеСтроки <> Неопределено. Если табличная часть пуста, то свойство ТекущиеДанные не содержит строки, и попытка обратиться к .ТолщинаСтенки приведет к ошибке. Всегда добавляйте эту проверку в свой код.

Различие между ТекущаяСтрока и ТекущиеДанные

Частая ошибка новичков — использование свойства ТекущаяСтрока. Выясним причину, почему это работает не так, как ожидается. В управляемых формах 1С свойство Элементы.ИмяТаблицы.ТекущаяСтрока возвращает не саму строку с данными, а ее идентификатор (внутренний номер строки в памяти, обычно типа Число).

Посмотрим на сравнение:

Если вам все же необходимо работать через идентификатор (например, на сервере), то получить данные можно так:


ИдентификаторСтроки = Элементы.ТрубыГладкиеИМуфтыКНим.ТекущаяСтрока;
Если ИдентификаторСтроки <> Неопределено Тогда
    СтрокаТЧ = Объект.ТрубыГладкиеИМуфтыКНим.НайтиПоИдентификатору(ИдентификаторСтроки);
    Значение = СтрокаТЧ.ТолщинаСтенки;
КонецЕсли;

Выбор события для обработки нажатия

Чтобы программа поняла, в какой момент нужно считывать значение, необходимо назначить обработчик события для таблицы. Рассмотрим основные варианты:

  1. ПриАктивизацииЯчейки — срабатывает каждый раз, когда пользователь перемещает курсор по таблице (даже стрелками на клавиатуре). Подходит, если нужно мгновенно обновлять информацию в другом поле формы.
  2. ПередНачаломИзменения — удобно использовать, если вы хотите превратить ячейку в своего рода "кнопку". Если установить параметр Отказ = Истина, то ячейка не перейдет в режим редактирования текста, но ваш код выполнится.
  3. Выбор — срабатывает при двойном клике или нажатии Enter. Это самый надежный способ, гарантирующий осознанное действие пользователя.

Проанализируем реализацию через событие ПриАктивизацииЯчейки:


&НаКлиенте
Процедура ТрубыГладкиеИМуфтыКНимПриАктивизацииЯчейки(Элемент)
    
    // Элемент — это само табличное поле, к которому привязано событие
    Данные = Элемент.ТекущиеДанные;
    
    Если Данные <> Неопределено Тогда
        // Переносим значение в реквизит основного объекта
        Объект.ВыбранныйПараметр = Данные.ТолщинаСтенки;
    КонецЕсли;
    
КонецПроцедуры

Динамическое получение значения из любой колонки

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

Рассмотрим пример реализации универсального получения значения:


&НаКлиенте
Процедура УниверсальноеПолучениеЗначения(Элемент)
    
    Данные = Элемент.ТекущиеДанные;
    
    Если Данные <> Неопределено Тогда
        // Получаем имя текущей колонки
        ИмяКолонки = Элемент.ТекущийЭлемент.Имя;
        
        // Извлекаем значение по имени колонки (имена реквизитов ТЧ должны совпадать с именами колонок)
        Попытка
            Значение = Данные[ИмяКолонки];
            Сообщить("Вы выбрали значение: " + Значение);
        Исключение
            // Обработка случая, если имя колонки не совпадает с реквизитом ТЧ
        КонецПопытки;
    КонецЕсли;
    
КонецПроцедуры

Особенности работы при множественном выделении

Если в свойствах таблицы на форме включен режим Выделение - Множественный, то свойство ТекущиеДанные всегда будет возвращать данные только последней выделенной строки (той, где стоит фокус ввода). Если вам нужно обработать все строки, которые выделил пользователь (например, зажав Shift), следует использовать коллекцию ВыделенныеСтроки.

Посмотрим, как это реализовать:


&НаКлиенте
Процедура ОбработатьВсеВыделенные()
    
    МассивИдентификаторов = Элементы.ТрубыГладкиеИМуфтыКНим.ВыделенныеСтроки;
    
    Для Каждого Ид Из МассивИдентификаторов Цикл
        СтрокаДанных = Объект.ТрубыГладкиеИМуфтыКНим.НайтиПоИдентификатору(Ид);
        // Обработка данных каждой строки
        Сообщить(СтрокаДанных.ТолщинаСтенки);
    КонецЦикла;
    
КонецПроцедуры

Подводя итог, можно сказать, что наиболее стабильный и простой путь получения значения в 1С 8.3 — это использование Элементы.ИмяТЧ.ТекущиеДанные.ИмяРеквизита с обязательной проверкой на Неопределено. Это гарантирует корректную работу интерфейса и отсутствие ошибок при пустых таблицах.

← На главную