Что быстрее работает в 1С: ТаблицаЗначений или Массив Массивов?

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

При разработке высоконагруженных алгоритмов в среде 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. Поиск данных: Если нам нужно найти строку по значению, в массиве нам придется запустить еще один цикл (линейный поиск), что крайне медленно ($O(n)$). В ТаблицаЗначений мы можем построить Индексы. Метод НайтиСтроки() по индексированной колонке работает практически мгновенно, используя алгоритмы хеш-таблиц.
  2. Сортировка: Метод Сортировать() у таблицы выполняется крайне эффективно. Чтобы отсортировать массив массивов, нам придется писать собственный алгоритм на языке 1С (например, «пузырек» или «быстрая сортировка»), что будет работать в десятки и сотни раз медленнее встроенного метода.
  3. Агрегатные функции: Метод Итог("Сумма") позволяет мгновенно получить сумму по колонке без явного обхода в цикле на стороне интерпретатора 1С.

Использование Структур и ЗаполнитьЗначенияСвойств()

Рассмотрим еще один вариант оптимизации, предложенный опытными разработчиками. Иногда удобно выгружать строку таблицы в Структура. Однако стоит помнить, что метод ЗаполнитьЗначенияСвойств() работает несколько медленнее, чем явное присвоение. Его использование оправдано только в целях улучшения читаемости кода и при работе с большим количеством полей, где ручное присвоение может привести к ошибкам.

Выводы и рекомендации

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

Выбирайте Массив Массивов, если:

Выбирайте Таблицу Значений, если:

Таким образом, хотя Массив и выигрывает 15% скорости на простом цикле, ТаблицаЗначений остается гораздо более гибким и мощным инструментом для решения большинства бизнес-задач в 1С.

← На главную