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

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

В процессе разработки на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с неочевидным поведением метода ВыделенныеСтроки. Обычная задача — обработать строки, которые пользователь выделил в таблице на форме — может превратиться в поиск «платформенных ошибок», если не понимать внутренние механизмы работы с идентификаторами строк. В этой статье мы подробно разберем, почему значения в массиве выделенных строк постоянно растут, чем идентификатор отличается от индекса и как правильно передать эти данные на сервер для обработки.

Разбираем природу идентификаторов строк

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

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

Различия в типах данных: Табличные части vs Динамические списки

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

  1. Табличные части и коллекции: Метод всегда возвращает массив числовых идентификаторов (типа Число).
  2. Динамические списки: Метод возвращает массив значений ключевых полей. Обычно это ссылки (СправочникСсылка, ДокументСсылка) или уникальные идентификаторы GUID, если ключ составной.

Если вы пишете универсальный механизм для обработки выделенных строк, всегда проверяйте тип данных коллекции, иначе код, написанный для табличной части, «упадет» при попытке обработать динамический список.

Переход с клиента на сервер: типичные ошибки

Выясним причину популярной ошибки «Метод не обнаружен». Разработчики часто пытаются вызвать ВыделенныеСтроки непосредственно на сервере, обращаясь к объекту данных. Посмотрим на неправильный пример кода:


&НаСервере
Процедура ОбработатьНаСервере()
    // ОШИБКА! У объекта (данных) нет свойства ВыделенныеСтроки
    Массив = Объект.Товары.ВыделенныеСтроки; 
КонецПроцедуры

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

Реализация корректной обработки строк

Разберем по шагам, как правильно изменить реквизиты в выделенных строках. Для этого нам понадобится метод НайтиПоИдентификатору(). Рассмотрим пример кода, который решает задачу автора темы:


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

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

Важные особенности, о которых стоит помнить

Проанализируем еще несколько критических моментов, которые помогут избежать багов в будущем:

  1. Порядок строк в массиве: Не стоит ожидать, что строки в массиве будут идти в том же порядке, что и на экране. Платформа помещает их туда в порядке интерактивного выделения пользователем. Если вам важен порядок «сверху вниз», вам придется дополнительно сопоставлять полученные ID с индексами в коллекции.
  2. «Протухание» идентификаторов: Если в процессе выполнения серверного кода вы вызываете методы, которые полностью обновляют коллекцию (например, заново заполняете таблицу из запроса), старые идентификаторы в массиве станут невалидными. Метод НайтиПоИдентификатору() просто вернет Неопределено.
  3. Режим выделения: Проверьте свойство таблицы формы РежимВыделения. Если установлено значение Одиночный, массив всегда будет содержать не более одного элемента, даже если пользователь пытался выделить несколько строк с зажатой клавишей Ctrl.
  4. Внешние обработки (.epf): При тестировании во внешних обработках иногда наблюдаются странности с кэшированием идентификаторов. Если вы изменили логику работы с таблицей, лучше закройте и откройте форму заново, чтобы сбросить внутренние счетчики платформы.

Подведем итог: Метод ВыделенныеСтроки — это мощный инструмент для связи визуального представления данных с их программной обработкой. Главное — помнить, что он оперирует временными идентификаторами элементов формы, которые нужно использовать совместно с методом НайтиПоИдентификатору() в контексте данных формы.

← На главную