При переходе на платформу 1С:Предприятие 8.3 из других программ или табличных процессоров (например, Excel), у разработчиков часто возникает желание обращаться к ячейкам табличной части (ТЧ) по координатам, используя аналогию R1C1. Давайте разберем, почему в 1С это делается иначе и как правильно организовать работу с данными.
Важно различать два понятия: Данные объекта и Элементы формы. Когда мы работаем с Объект.ТабЧасть1, мы имеем дело с коллекцией данных, находящейся в памяти. Когда мы обращаемся к Элементы.ТабЧасть1, мы управляем визуальным отображением этой таблицы на экране. Прямое обращение по индексам [строка, колонка] к элементам управления не является стандартным паттерном разработки, так как визуальное представление может меняться, а структура данных объекта — нет.
Если ваша задача — изменить значение в ячейке, основываясь на уникальном коде (например, в колонке Код), самый эффективный путь — использование метода Найти. Рассмотрим, как это реализовать на практике.
Допустим, нам нужно найти строку, где Код равен определенному числу, и изменить в этой строке Значение:
// Ищем строку, в которой реквизит \"Код\" равен искомому значению
НайденнаяСтрока = Объект.ТабЧасть1.Найти(ИскомыйКод, \"Код\");
// Проверяем, была ли найдена строка
Если НайденнаяСтрока <> Неопределено Тогда
НайденнаяСтрока.Значение = 100;
КонецЕсли;
Этот подход является наиболее безопасным, так как он не зависит от порядка расположения строк в таблице.
Бывают ситуации, когда по вашему условию может быть найдено несколько строк. В таком случае метод Найти не подойдет, так как он возвращает только первое вхождение. Используем метод НайтиСтроки:
// Создаем структуру с условием поиска
СтруктураПоиска = Новый Структура(\"Код\", ИскомыйКод);
// Получаем массив строк, подходящих под условие
НайденныеСтроки = Объект.ТабЧасть1.НайтиСтроки(СтруктураПоиска);
// Перебираем найденные строки в цикле
Для Каждого СтрокаТЧ Из НайденныеСтроки Цикл
СтрокаТЧ.Значение = 200;
КонецЦикла;
Если вы точно знаете номер строки, к которой хотите обратиться (например, в процессе перебора коллекции), используйте индексацию коллекции Объект.ТабЧасть1. Однако помните, что в 1С индексация начинается с нуля.
// Доступ к 0-й (первой) строке табличной части
СтрокаТЧ = Объект.ТабЧасть1[0];
СтрокаТЧ.Значение = 300;
Хотя платформу можно заставить работать с индексами колонок, это крайне не рекомендуется по следующим причинам:
Значение) делают код самодокументированным. Обращение по индексу [0][1] заставляет других разработчиков гадать, что это за данные.1 или 2 опасна, так как пользователь может отсортировать таблицу или удалить строки, и логика программы нарушится.Если вы хотите реализовать логику «формул» (например, как в Excel), используйте события табличной части. При изменении реквизитов в колонках Код или Значение, вызывайте процедуру пересчета. В обработчике события ПриИзменении используйте Элементы.ТабЧасть1.ТекущиеДанные, чтобы получить доступ именно к той строке, которую сейчас редактирует пользователь. Это обеспечит корректную работу формул в любой строке таблицы, независимо от ее позиции.
Таким образом, ключ к успешной работе с табличными данными в 1С — это отказ от «матричного» мышления в пользу работы с коллекциями объектов и использованием имен колонок.