При разработке высоконагруженных алгоритмов в среде 1С перед программистом часто встает вопрос выбора оптимальной структуры для хранения и обработки данных в оперативной памяти. Традиционно для этих целей используется ТаблицаЗначений, однако в некоторых сценариях разработчики рассматривают использование вложенных массивов (массива массивов). Давайте подробно разберем, какая из этих структур работает быстрее, в чем заключаются их принципиальные архитектурные различия и как сделать правильный выбор, исходя из конкретной задачи.
Для начала проанализируем классическую ситуацию: у нас есть набор данных (условно 10 колонок и 100 000 строк), и нам необходимо просто перебрать все значения. Рассмотрим программный код, который позволяет замерить производительность обоих подходов.
В первом случае мы используем массив, элементами которого являются другие массивы. Во втором — стандартный объект ТаблицаЗначений. Обратите внимание на синтаксис доступа к данным в циклах:
// Тест для Массива Массивов
Для каждого СтрокаМассива из ДвумерныйМассив Цикл
Значение0 = СтрокаМассива[0];
Значение1 = СтрокаМассива[1];
Значение2 = СтрокаМассива[2];
Значение3 = СтрокаМассива[3];
Значение4 = СтрокаМассива[4];
Значение5 = СтрокаМассива[5];
Значение6 = СтрокаМассива[6];
Значение7 = СтрокаМассива[7];
Значение8 = СтрокаМассива[8];
Значение9 = СтрокаМассива[9];
КонецЦикла;
// Тест для Таблицы Значений
Для каждого СтрокаТЗ из ТаблицаЗначений Цикл
Ячейка1 = СтрокаТЗ.Колонка1;
Ячейка2 = СтрокаТЗ.Колонка2;
Ячейка3 = СтрокаТЗ.Колонка3;
Ячейка4 = СтрокаТЗ.Колонка4;
Ячейка5 = СтрокаТЗ.Колонка5;
Ячейка6 = СтрокаТЗ.Колонка6;
Ячейка7 = СтрокаТЗ.Колонка7;
Ячейка8 = СтрокаТЗ.Колонка8;
Ячейка9 = СтрокаТЗ.Колонка9;
Ячейка10 = СтрокаТЗ.Колонка10;
КонецЦикла;
Проанализируем результаты замеров. При небольшом количестве итераций (до 10 000) разница практически незаметна и составляет доли процента. Однако при увеличении объема данных до 100 000 строк и выше выясняется, что Массив Массивов работает быстрее Таблицы Значений примерно на 15%. Почему это происходит? Разберем технические причины.
Выясним причину отставания ТаблицаЗначений. Когда мы пишем СтрокаТЗ.Колонка1, платформа 1С выполняет обращение по имени свойства. Это означает, что системе нужно сначала найти в метаданных таблицы индекс колонки, соответствующий строке «Колонка1», и только потом получить значение из памяти. Несмотря на внутреннее кэширование, этот процесс всегда будет медленнее, чем прямое обращение по числовому индексу Массив[0].
Лайфхак для оптимизации Таблицы Значений: Если вам критически важна скорость обхода таблицы, мы можем заранее получить индексы колонок и обращаться к ним не через точку, а через квадратные скобки. Например:
ИндексКолонки1 = ТаблицаЗначений.Колонки.Колонка1.Индекс();
// В цикле:
Значение = СтрокаТЗ[ИндексКолонки1];
Такой подход значительно сокращает разрыв в производительности между массивом и таблицей, так как исключается поиск имени колонки в словаре на каждой итерации.
Рассмотрим аспект потребления ресурсов. ТаблицаЗначений — это сложный объект, который хранит не только данные, но и структуру (типы данных, заголовки, ограничения). Если ваша задача подразумевает хранение миллионов простых строк (например, кэш простых чисел или промежуточные идентификаторы), массив массивов будет потреблять значительно меньше оперативной памяти. В ситуациях с дефицитом памяти на сервере 1С использование тяжелых таблиц может привести к аварийному завершению рабочих процессов, в то время как массивы позволят обработать тот же объем данных успешно.
Проанализируем ситуацию передачи коллекций в контексте клиент-серверного взаимодействия. ТаблицаЗначений не может быть передана с сервера на клиент напрямую (если она не является реквизитом формы). Нам приходится либо помещать её во ВременноеХранилище, либо конвертировать в массив структур. Массив же является универсальным сериализуемым типом. При интенсивном обмене данными передача массивов происходит быстрее и требует меньше процессорного времени на упаковку/распаковку (сериализацию) данных.
Несмотря на то что «тупой» перебор в массиве быстрее, ТаблицаЗначений обладает мощным встроенным функционалом, реализованным на уровне ядра платформы (язык C++), что делает её незаменимой в сложных задачах.
ТаблицаЗначений мы можем построить Индексы. Метод НайтиСтроки() по индексированной колонке работает практически мгновенно, используя алгоритмы хеш-таблиц.Сортировать() у таблицы выполняется крайне эффективно. Чтобы отсортировать массив массивов, нам придется писать собственный алгоритм на языке 1С (например, «пузырек» или «быстрая сортировка»), что будет работать в десятки и сотни раз медленнее встроенного метода.Итог("Сумма") позволяет мгновенно получить сумму по колонке без явного обхода в цикле на стороне интерпретатора 1С.Рассмотрим еще один вариант оптимизации, предложенный опытными разработчиками. Иногда удобно выгружать строку таблицы в Структура. Однако стоит помнить, что метод ЗаполнитьЗначенияСвойств() работает несколько медленнее, чем явное присвоение. Его использование оправдано только в целях улучшения читаемости кода и при работе с большим количеством полей, где ручное присвоение может привести к ошибкам.
Выясним итоговую позицию: что же выбрать? Выбор должен зависеть от характера операций, которые вы планируете выполнять с данными.
Выбирайте Массив Массивов, если:
Выбирайте Таблицу Значений, если:
ВыгрузитьКолонку() для передачи в запросы (условие В (&Массив)).Таким образом, хотя Массив и выигрывает 15% скорости на простом цикле, ТаблицаЗначений остается гораздо более гибким и мощным инструментом для решения большинства бизнес-задач в 1С.