Работа с таблицами значений (ТЗ) — это повседневная задача разработчика 1С. Однако в версии платформы 1С:Предприятие 7.7 (известной как «клюшки») отсутствует встроенный метод Сдвинуть(), который появился только в восьмой версии. Это часто вводит в заблуждение начинающих программистов или тех, кто переходит с 1С 8.х на поддержку старых систем. В данной статье мы подробно разберем, какими способами можно изменить физический и визуальный порядок колонок в ТЗ, проанализируем производительность этих методов и выясним, почему популярные советы из интернета не всегда работают.
Прежде чем приступать к кодингу, проанализируем важный нюанс архитектуры 1С 7.7. В этой системе существует два принципиально разных «порядка» колонок:
НоваяКолонка() или структурой запроса. Именно этот порядок важен, когда мы обращаемся к данным по индексу, например, ТЗ.ПолучитьЗначение(НомерСтроки, 2).Рассмотрим классический алгоритм, который позволяет физически поменять местами две колонки в существующей таблице. Этот способ полезен, когда нам нужно сохранить структуру объекта, но изменить положение данных. Для этого мы используем объект СписокЗначений для временного хранения данных каждой колонки.
Разберем по шагам алгоритм для перемещения, например, 6-й и 9-й колонок:
// Создаем временные контейнеры
сп6 = СоздатьОбъект("СписокЗначений");
сп9 = СоздатьОбъект("СписокЗначений");
// Переменные для хранения параметров колонок (Идентификатор, Тип, Длина)
ИД6=""; Тип6=""; Дл6=""; Точ6="";
ИД9=""; Тип9=""; Дл9=""; Точ9="";
// Получаем текущие параметры колонок
Ид6 = ТЗ.ПолучитьПараметрыКолонки(6, Тип6, Дл6, Точ6);
Ид9 = ТЗ.ПолучитьПараметрыКолонки(9, Тип9, Дл9, Точ9);
// Выгружаем данные из колонок в списки значений
ТЗ.Выгрузить(сп6, , , 6);
ТЗ.Выгрузить(сп9, , , 9);
// Удаляем старые колонки (важно: удалять лучше с конца, чтобы не поплыли индексы)
ТЗ.УдалитьКолонку(9);
ТЗ.УдалитьКолонку(6);
// Вставляем новые колонки на нужные места
ТЗ.ВставитьКолонку(ИД9, 6, Тип9, Дл9, , , Точ9);
ТЗ.Заполнить(сп9, , , 6);
ТЗ.ВставитьКолонку(ИД6, 9, Тип6, Дл6, , , Точ6);
ТЗ.Заполнить(сп6, , , 9);
Важное замечание: При использовании метода Заполнить() данные копируются по ссылке. Если в колонках хранятся агрегатные объекты (справочники, документы), ссылки останутся корректными. Однако будьте осторожны при очистке исходных данных.
Если в таблице много строк (как в вопросе автора — более 3000) и нужно поменять местами несколько колонок сразу, метод удаления и вставки может работать медленно, так как 1С 7.7 при каждом удалении/вставке пересчитывает внутренние индексы таблицы. В этом случае эффективнее создать новую таблицу с нужной структурой.
Посмотрим на пример реализации через метод Выгрузить() в другую таблицу:
// Создаем новую пустую таблицу
ТЗ_Результат = СоздатьОбъект("ТаблицаЗначений");
// Формируем структуру в нужном нам порядке
ТЗ_Результат.НоваяКолонка("Колонка_2"); // Теперь она будет первой
ТЗ_Результат.НоваяКолонка("Колонка_1"); // Теперь она будет второй
// ... и так далее для всех колонок
// Копируем данные
// Метод Выгрузить в 1С 7.7 сопоставляет данные по Идентификаторам колонок
ТЗ.Выгрузить(ТЗ_Результат);
Этот способ является самым быстрым для обработки больших массивов данных, так как платформа выполняет сопоставление имен один раз и переносит данные блоком.
Выясним ситуацию, когда менять данные в памяти не требуется, а нужно лишь показать пользователю колонки в другом порядке. Для этого в 1С 7.7 используется метод ВидимостьКолонки(). У него есть третий параметр, который отвечает за позицию.
Синтаксис: ВидимостьКолонки(Идентификатор, Видимость, Позиция).
// Переместим колонку "Сумма" на первое место (позиция 1)
ТЗ.ВидимостьКолонки("Сумма", 1, 1);
// Переместим колонку "Товар" на второе место
ТЗ.ВидимостьКолонки("Товар", 1, 2);
Помните: Это изменит только то, что видит пользователь на экране. При программном переборе колонок через циклы порядок останется прежним (согласно индексам создания).
В процессе обсуждения часто возникает путаница с методом Сортировать(). Проанализируем, почему это не решение проблемы. Метод ТЗ.Сортировать("Колонка2, Колонка1") управляет порядком строк (записей) внутри таблицы, основываясь на значениях в указанных колонках. Он никак не перемещает сами колонки и не меняет их структуру. Если вам нужно изменить последовательность «столбцов», этот метод бесполезен.
Если ваша таблица значений получена методом Выгрузить(ТЗ) из объекта Запрос, то порядок колонок в ней жестко задан текстом запроса. Разберем самый элегантный способ управления порядком в этом случае:
Просто измените порядок следования переменных в секции запроса. Колонки в ТЗ всегда создаются в том порядке, в котором они описаны в тексте запроса (группировки и функции). Это избавляет от необходимости писать дополнительный код по перестановке колонок после выполнения запроса.
Подводя итоги, выделим основные правила работы с колонками в «клюшках»:
Сдвинуть() в 7.7 — этот код просто не скомпилируется.Выбор метода зависит от объема данных и цели: если таблица используется только для вывода отчета, лучше ограничиться визуальной настройкой, чтобы не тратить ресурсы процессора на перезапись памяти.