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