Как получить данные выделенной строки в табличной части на управляемой форме 1С?

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

Часто перед разработчиком встает задача организовать обработку данных табличной части по нажатию на кнопку, расположенную на форме. Например, нужно изменить статус у выбранных товаров или распечатать этикетку для конкретной позиции. Основной вопрос в такой ситуации: как из кода кнопки получить доступ к той строке (или строкам), которую выделил пользователь? Разберем эту задачу по шагам и рассмотрим основные методы, которые предоставляет платформа 1С для работы в управляемых формах.

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

Способ 1: Работа с одной текущей (активной) строкой

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

Элементы.ИмяВашейТаблицы.ТекущиеДанные

Это свойство доступно только на клиенте и возвращает не идентификатор, а сразу структуру с данными текущей строки. Это очень удобно, так как можно сразу обращаться к колонкам по их именам. Это предпочтительный метод для обработки одиночных строк.

Посмотрим на пример. Допустим, у нас есть табличная часть "Товары" с колонкой "Номенклатура".


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

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

Способ 2: Работа с несколькими выделенными строками

Если пользователю нужно дать возможность выделить несколько строк (например, с помощью клавиш Ctrl или Shift) и обработать их все разом, на помощь приходит свойство ВыделенныеСтроки.

Элементы.ИмяВашейТаблицы.ВыделенныеСтроки

Это свойство возвращает массив, но не с данными строк, а с их уникальными идентификаторами. Это ключевое отличие, которое часто вызывает вопросы.

Если при вызове этого метода вы получаете пустой массив, проверьте два момента:

  1. В свойствах элемента формы "Таблица" на закладке "Использование" должен быть установлен флаг МножественныйВыбор.
  2. Пользователь должен выделить строки целиком (обычно кликом по области слева от строки), а не просто активировать ячейку.

Идентификатор строки: что это и чем отличается от индекса?

Прежде чем двигаться дальше, разберем важнейшее понятие. В обсуждении на форуме возникла путаница между идентификатором и индексом строки. Это не одно и то же.

Свойство ВыделенныеСтроки возвращает массив именно таких надежных идентификаторов.

Как получить данные строки по ее идентификатору

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

Получение данных на клиенте

На клиенте можно использовать метод таблицы формы ДанныеСтроки().


&НаКлиенте
Процедура ОбработатьВыделенные(Команда)
    
    МассивИдентификаторов = Элементы.Товары.ВыделенныеСтроки;
    
    Если МассивИдентификаторов.Количество() = 0 Тогда
        Сообщить("Ни одной строки не выделено!");
        Возврат;
    КонецЕсли;
    
    Сообщить("Начинаем обработку " + МассивИдентификаторов.Количество() + " строк.");
    
    Для Каждого ИдентификаторСтроки Из МассивИдентификаторов Цикл
        
        // Получаем структуру с данными по идентификатору
        ДанныеВыделеннойСтроки = Элементы.Товары.ДанныеСтроки(ИдентификаторСтроки);
        
        // Работаем с данными
        Сообщить("Обрабатывается: " + ДанныеВыделеннойСтроки.Номенклатура);
        
    КонецЦикла;
    
КонецПроцедуры

Получение данных на сервере

Часто основная логика обработки находится на сервере. Передавать всю структуру данных на сервер неэффективно. Правильный подход — передать только массив идентификаторов, а на сервере по ним найти нужные строки в объекте.

Для этого используется метод коллекции табличной части объекта НайтиПоИдентификатору().


&НаКлиенте
Процедура ОбработатьВыделенныеНаСервере(Команда)
    МассивИдентификаторов = Элементы.Товары.ВыделенныеСтроки;
    Если МассивИдентификаторов.Количество() = 0 Тогда
        Сообщить("Ни одной строки не выделено!");
        Возврат;
    КонецЕсли;
    
    // Вызываем серверную процедуру и передаем массив ID
    ОбработатьНаСервере(МассивИдентификаторов);
КонецПроцедуры

&НаСервере
Процедура ОбработатьНаСервере(МассивИдентификаторов)
    
    // Объект - это основной реквизит формы, например, "ДокументОбъект.РеализацияТоваровУслуг"
    Для Каждого ИдентификаторСтроки Из МассивИдентификаторов Цикл
        
        // Находим строку в табличной части объекта по ее ID
        НайденнаяСтрока = Объект.Товары.НайтиПоИдентификатору(ИдентификаторСтроки);
        
        Если НайденнаяСтрока <> Неопределено Тогда
            // Выполняем серверную логику, например, меняем реквизит
            НайденнаяСтрока.Статус = Перечисления.СтатусыТоваров.Обработан;
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

Подведем итог

Давайте кратко суммируем, что мы выяснили:

  1. Для обработки одной активной строки на клиенте используйте Элементы.ТЧ.<strong>ТекущиеДанные</strong>. Это самый прямой и удобный способ.
  2. Для обработки нескольких выделенных строк используйте Элементы.ТЧ.<strong>ВыделенныеСтроки</strong>. Этот метод вернет массив идентификаторов.
  3. Не путайте идентификатор (постоянный уникальный ключ) и индекс (порядковый номер). Работать всегда надежнее через идентификатор.
  4. Чтобы по идентификатору получить данные на клиенте, используйте метод Элементы.ТЧ.<strong>ДанныеСтроки(Идентификатор)</strong>.
  5. Чтобы по идентификатору получить строку табличной части на сервере, передайте ID и используйте метод Объект.ТЧ.<strong>НайтиПоИдентификатору(Идентификатор)</strong>.

Применяя эти простые правила, вы сможете легко и надежно организовать любую интерактивную обработку данных в табличных частях ваших документов и справочников.

← На главную