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