Как пронумеровать строки в ТаблицеЗначений в 1С

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

При работе с программными таблицами значений на обычных формах часто возникает необходимость вывести порядковые номера строк. В отличие от табличных частей объектов метаданных, у объекта ТаблицаЗначений нет встроенной системной колонки НомерСтроки, которая нумеруется платформой автоматически. Разберем подробнее, почему возникает ошибка, когда все строки получают номер «1», и рассмотрим правильные варианты реализации нумерации.

Причина ошибки при нумерации в событии ПриПолученииДанных

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


Процедура ТПРеализацияПриПолученииДанных(Элемент, ОформленияСтрок)
    сч = 0;
    Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        Сч = Сч + 1;
        ОформлениеСтроки.Ячейки.НомерСтроки.УстановитьТекст("" + Сч);
    КонецЦикла; 
КонецПроцедуры

При таком подходе в интерфейсе у всех строк отображается единица. Выясним причину этого поведения:

  1. Событие ПриПолученииДанных вызывается порционно — платформа запрашивает оформление только для той части строк, которая отображается на экране в текущий момент.
  2. Переменная сч объявляется внутри процедуры и каждый раз при вызове события инициализируется нулем.
  3. В результате при каждой порции вывода обработка начинается заново с первой строки полученного массива ОформленияСтрок.

Способ 1. Добавление колонки НомерСтроки в источника данных

Самое надежное решение — добавить физическую колонку для номера строки непосредственно в саму таблицу значений и заполнить ее в момент формирования или загрузки данных.

Рассмотрим по шагам реализацию этого способа:

  1. Добавление колонки в ТЗ: Добавим колонку с типом Число при программном создании таблицы.
  2. Заполнение нумерации: При обходе строк таблицы запишем номер с помощью метода Индекс() или обычного счетчика.

Посмотрим на пример кода создания колонки и заполнения таблицы значений:


// 1. Создаем колонку с типом Число
ТЗУ.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число",, Новый КвалификаторыЧисла(10)));

// 2. Заполняем нумерацию при обходе коллекции
Для Каждого СтрокаТЗ Из ТЗУ Цикл
    СтрокаТЗ.НомерСтроки = ТЗУ.Индекс(СтрокаТЗ) + 1;
КонецЦикла;

Метод Индекс() возвращает индекс текущей строки в коллекции (индексация начинается с 0). Прибавляя единицу, получаем корректный порядковый номер строки. Этот способ гарантирует, что данные нумерации сохранятся в источнике и будут корректно отображаться в табличном поле на форме.

Способ 2. Динамический вывод нумерации без изменения таблицы данных

Если визуальная колонка НомерСтроки добавлена только в элементы формы, а в самой таблице значений создавать отдельное поле не требуется, пронумеровать строки можно динамически в событиях оформления элемента формы.

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


Процедура ТПРеализацияПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    
    ИндексСтроки = Элемент.Значение.Индекс(ДанныеСтроки);
    ОформлениеСтроки.Ячейки.НомерСтроки.УстановитьТекст(Формат(ИндексСтроки + 1, "ЧГ=0"));
    
КонецПроцедуры

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


Процедура ТПРеализацияПриПолученииДанных(Элемент, ОформленияСтрок)
    
    Для Каждого ОформлениеИзСписка Из ОформленияСтрок Цикл
        НомерСтроки = Элемент.Значение.Индекс(ОформлениеИзСписка.ДанныеПервоисточника) + 1;
        ОформлениеИзСписка.Ячейки.НомерСтроки.УстановитьТекст(Формат(НомерСтроки, "ЧГ=0"));
    КонецЦикла;
    
КонецПроцедуры

Выделим основные рекомендации при выборе подхода:

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

← На главную