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

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

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

Разбор проблемы: Индекс против Идентификатора

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

Когда мы удаляем или добавляем строки в табличную часть без записи объекта в базу, нумерация строк (индексы) постоянно меняется. Если вы попытаетесь обратиться к строке через ТЧ[Индекс], вы рискуете получить ошибку или данные совсем не той строки, на которую рассчитывали.

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

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

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

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

  1. Получим массив идентификаторов из свойства Элементы.ИмяТаблицы.ВыделенныеСтроки.
  2. Используем метод НайтиПоИдентификатору() для доступа к данным объекта.

Пример правильной реализации кода

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


// Предположим, таблица на форме называется ТабличнаяЧасть1
// Мы хотим получить доступ к строкам, которые выделил пользователь

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

Почему это решение работает всегда?

Анализируя ситуацию, мы видим, что использование идентификатора делает наш код устойчивым к любым изменениям состава табличной части:

Таким образом, мы видим, что проблема «смещения» индекса — это не ошибка платформы, а вопрос использования правильного инструмента. Мы настоятельно рекомендуем полностью отказаться от использования порядковых индексов при работе с выделением в управляемых формах и перейти на использование метода НайтиПоИдентификатору(). Это сделает ваш код профессиональным, надежным и легким в поддержке.

← На главную