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

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

В практике разработчика 1С часто возникает задача трансформации данных, когда информацию, хранящуюся в строках (например, дополнительные реквизиты или настройки), необходимо представить в виде широкой таблицы, где каждое наименование становится отдельным заголовком колонки. Рассмотрим подробно, как правильно выполнить такое преобразование ТаблицыЗначений, разберем типичные ошибки и изучим эффективные алгоритмы решения.

Постановка задачи и логика преобразования

Представим, что у нас есть исходная таблица с двумя колонками: Наименование и Значение. В ней может быть три строки: "Свойство 1" со значением 10, "Свойство 2" со значением 15 и так далее. Наша цель — получить новую таблицу, в которой будет всего одна строка, но колонки будут называться "Свойство1", "Свойство2" и содержать соответствующие числа. Проанализируем основные способы реализации этой задачи.

Способ 1: Прямое заполнение в цикле (оптимально для простых структур)

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

Рассмотрим правильный алгоритм действий:

  1. Создаем новый объект ТаблицаЗначений.
  2. Выполняем запрос к данным или получаем исходную таблицу.
  3. Добавляем одну пустую строку в целевую таблицу.
  4. В цикле динамически добавляем колонки и записываем значения в ту самую созданную строку.

Посмотрим на пример кода, реализующий этот подход:


// Предположим, РезультатЗапроса содержит колонки СвойствоИмя и Значение
ТЗ_Результат = Новый ТаблицаЗначений;
Если РезультатЗапроса.Количество() > 0 Тогда
    // Создаем единственную строку заранее
    НоваяСтрока = ТЗ_Результат.Добавить();
    
    Для Каждого СтрокаДанных Из РезультатЗапроса Цикл
        // Динамически добавляем колонку, имя берем из данных
        ИмяКолонки = СтрЗаменить(СтрокаДанных.СвойствоИмя, " ", "");
        ТЗ_Результат.Колонки.Добавить(ИмяКолонки);
        
        // Заполняем значение в созданную ранее строку
        НоваяСтрока[ИмяКолонки] = СтрокаДанных.Значение;
    КонецЦикла;
КонецЕсли;

Способ 2: Надежное преобразование с валидацией имен колонок

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

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


&НаСервере
Функция ПреобразоватьТаблицуДанных(ТаблицаВход)
    ТаблицаРезультат = Новый ТаблицаЗначений;
    
    // 1. Подготавливаем уникальный список имен для колонок
    КопияКолонки = ТаблицаВход.Скопировать(, "Наименование");
    КопияКолонки.Свернуть("Наименование");
    КопияКолонки.Сортировать("Наименование");
    
    // 2. Создаем структуру колонок
    Для Каждого СтрокаКопии Из КопияКолонки Цикл
        СинонимКолонки = СтрокаКопии.Наименование;
        // Очищаем имя от пробелов для соответствия правилам 1С
        ИмяКолонки = СтрЗаменить(СинонимКолонки, " ", "");
        
        // Добавляем колонку с указанием типа и заголовка
        ТаблицаРезультат.Колонки.Добавить(ИмяКолонки, Новый ОписаниеТипов("Число"), СинонимКолонки);
    КонецЦикла;
    
    // 3. Заполняем данные в одну строку
    Если ТаблицаВход.Количество() > 0 Тогда
        НоваяСтрока = ТаблицаРезультат.Добавить();
        Для Каждого СтрокаВход Из ТаблицаВход Цикл
            ИмяКолонки = СтрЗаменить(СтрокаВход.Наименование, " ", "");
            НоваяСтрока[ИмяКолонки] = СтрокаВход.Значение;
        КонецЦикла;
    КонецЕсли;
    
    Возврат ТаблицаРезультат;
КонецФункции

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

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

Ограничения на именование идентификаторов: Метод Колонки.Добавить() вызовет исключение, если имя колонки начинается с цифры или содержит знаки препинания. Рекомендуется использовать вспомогательную функцию для очистки строки или добавлять префикс (например, "Колонка_") к техническому имени, сохраняя исходный текст в параметре Заголовок.

Типизация данных: Если в методе Добавить() не указать параметр ОписаниеТипов, колонка получит тип Произвольный. Для повышения производительности и корректной работы сортировки лучше явно определять тип, основываясь на данных исходной таблицы.

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

Альтернативные подходы

Выясним, всегда ли нужно программно перестраивать таблицу. В зависимости от цели, можно использовать другие инструменты:

Подводя итог, отметим: для успешного преобразования ТаблицыЗначений важно четко разделять этап формирования структуры (колонок) и этап заполнения данных. Вынос метода Добавить() для строки за пределы цикла — это ключевой момент, позволяющий получить горизонтальную структуру данных вместо вертикальной.

← На главную