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