Как программно создать таблицу с произвольным количеством колонок и строк и заполнить её данными?

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

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

Различие между данными и их отображением

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

Многие начинающие разработчики пытаются добавлять колонки напрямую в элемент формы. Однако важно понимать: Табличная часть (как объект в дереве метаданных конфигурации) имеет жестко заданную структуру, которую нельзя изменить программно в режиме 1С:Предприятие. Чтобы реализовать динамическую структуру, мы должны использовать ТаблицаЗначений. Она позволяет добавлять любое количество колонок и строк «на лету».

Рассмотрим ситуацию, когда нам нужно создать таблицу, где количество строк задается в одном поле ввода, количество колонок — в другом, а каждая ячейка должна содержать сумму своих координат (индекс строки + индекс колонки).

Шаг 1: Подготовка источника данных

Прежде всего, выясним причину, по которой код из обсуждения работал некорректно. Основная ошибка заключалась в том, что колонки добавлялись внутри цикла по строкам. Это приводило к дублированию структуры при каждой итерации. Правильный подход — сначала создать структуру (каркас) таблицы, а затем наполнять её данными.

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

  1. Очищаем или создаем заново объект ТаблицаЗначений.
  2. В цикле добавляем нужное количество колонок, задавая им уникальные имена.
  3. Назначаем эту таблицу в качестве значения для элемента формы ТабличноеПоле.
  4. Вызываем метод СоздатьКолонки(), чтобы визуальная сетка обновилась.

Шаг 2: Реализация программного кода

Посмотрим на пример кода, который реализует правильную последовательность действий. Предположим, что на форме у нас есть ПолеВводаКолонок, ПолеВводаСтрок и табличное поле с именем ТабличноеПоле1.


// 1. Создаем новую таблицу значений
ТЗ = Новый ТаблицаЗначений;

// 2. Сначала создаем структуру колонок
Для НомерКол = 1 По ПолеВводаКолонок Цикл
    // Добавляем колонку с именем "Колонка1", "Колонка2" и т.д.
    // Указываем тип Число, чтобы можно было записывать сумму координат
    ТЗ.Колонки.Добавить("Колонка" + НомерКол, Новый ОписаниеТипов("Число"));
КонецЦикла;

// 3. Теперь заполняем таблицу строками и данными
Для НомерСтр = 1 По ПолеВводаСтрок Цикл
    НоваяСтрока = ТЗ.Добавить();
    
    // Внутренним циклом обходим колонки в созданной строке
    Для НомерКол = 1 По ПолеВводаКолонок Цикл
        // Записываем сумму координат ячейки
        // Для удобства пользователя используем человеческую нумерацию (с 1)
        НоваяСтрока["Колонка" + НомерКол] = НомерСтр + НомерКол;
    КонецЦикла;
КонецЦикла;

// 4. Связываем данные с экранной формой
ЭлементыФормы.ТабличноеПоле1.Значение = ТЗ;

// 5. Отрисовываем колонки на форме
ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();

Шаг 3: Как полностью очистить таблицу

Иногда требуется не просто удалить строки, но и полностью «сбросить» структуру таблицы, чтобы при следующем нажатии кнопки количество колонок могло измениться. Для этого недостаточно метода Очистить(), так как он затрагивает только данные (строки), но оставляет колонки нетронутыми.

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


// Получаем доступ к текущей таблице значений из формы
ТЗ = ЭлементыФормы.ТабличноеПоле1.Значение;

// Удаляем все строки
ТЗ.Очистить();

// Удаляем все колонки
ТЗ.Колонки.Очистить();

// Обновляем визуальное отображение (сетка станет пустой)
ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();

Важные технические нюансы

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

  1. Имена колонок: Имя колонки в ТаблицаЗначений.Колонки.Добавить() должно соответствовать правилам именования переменных (не начинаться с цифры, не содержать пробелов). Поэтому мы используем префикс: "Колонка" + Номер.
  2. Типизация: Если не указать ОписаниеТипов при добавлении колонки, она будет иметь произвольный тип. Это может привести к тому, что при редактировании пользователем значения будут восприниматься как строки, а не как числа.
  3. Индексация: Помните, что встроенные индексы строк и колонок в 1С начинаются с 0. Если ваша задача требует вычислений на основе физического положения (координат), не забывайте прибавлять или отнимать единицу там, где это необходимо для логики интерфейса.
  4. Метод СоздатьКолонки(): Этот метод является ключевым для ТабличногоПоля. Без него данные в памяти изменятся, но пользователь увидит пустую таблицу или старую структуру столбцов.

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

← На главную