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