К статье
Практический материал

Разработка и Конфигурация · 14 мин

Чем отличается массив от таблицы значений в 1С

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

Массив и таблица значений — два базовых универсальных типа коллекций во встроенном языке 1С, и выбор между ними напрямую влияет на скорость, читаемость и устойчивость кода. Массив — это упорядоченный список произвольных значений, доступ к которым идёт по числовому индексу. Таблица значений — структурированный набор строк с именованными колонками, по сути аналог небольшой реляционной таблицы в памяти.

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

Ошибка выбора типа коллекции обычно проявляется не сразу, а при росте объёмов данных: поиск по массиву в цикле, переприсваивание массива внутри запроса, попытка «поискать по колонке» в массиве структур. Ниже разберём устройство обеих коллекций, сравним возможности и разберём сценарии, в которых каждый вариант оправдан.

Что такое массив в 1С и как он устроен

Массив создаётся конструктором Новый Массив() или литералом и хранит элементы любых типов — числа, строки, ссылки, структуры, даже другие массивы. Каждый элемент доступен по индексу, начиная с нуля: Массив[0] — первый элемент. Размер массива можно задать при создании и менять динамически методом Добавить() или Вставить().

Набор методов массива минимален: Добавить(), Вставить(), Удалить(), Найти(), Количество(), Очистить(), а также ВГраница() для получения верхнего индекса. Метод Найти() ищет точное совпадение значения и возвращает индекс или Неопределено. Никаких именованных полей, группировок и сортировки «из коробки» у массива нет.

Важная особенность: массив передаётся в запрос как параметр и автоматически преобразуется платформой в список значений для оператора В (&Список). Это самый частый способ фильтрации запроса по набору ссылок, и здесь массив — оптимальный инструмент.

Что такое таблица значений и как она устроена

Таблица значений создаётся конструктором Новый ТаблицаЗначений, после чего в неё добавляют колонки через Колонки.Добавить("Имя", Тип). Каждая строка таблицы — объект типа «СтрокаТаблицыЗначений», к полям которого обращаются по имени колонки: Строка.Номенклатура. Типы колонок можно ограничить через ОписаниеТипов, что защищает от случайной записи данных неверного типа.

Богатство таблицы значений — в её методах обработки данных. Поиск: Найти(Значение, "Колонка") и НайтиСтроки(Отбор) с отбором по нескольким колонкам через структуру. Агрегация: Свернуть("Номенклатура", "Количество,Сумма") группирует строки и суммирует числовые колонки, Итог("Сумма") считает итог по колонке. Сортировка: Сортировать("Дата Возр, Сумма Убыв"). Есть также Скопировать() с отбором, ВыгрузитьКолонку(), ЗагрузитьКолонку(), индексы через Индексы.Добавить() для ускорения поиска.

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

Сравнение возможностей массива и таблицы значений

Нагляднее всего различия видны при сопоставлении ключевых характеристик обеих коллекций.

КритерийМассивТаблица значений
Структура элементаОдно значение любого типаСтрока с именованными колонками
Доступ к даннымПо числовому индексуПо индексу строки и имени колонки
ПоискНайти() по точному значениюНайти(), НайтиСтроки() с отбором по нескольким колонкам
СортировкаНет встроеннойСортировать() по любым колонкам
Группировка и итогиНетСвернуть(), Итог()
Индексы для ускорения поискаНетИндексы.Добавить()
Передача в запросНапрямую как список для оператора ВКак временная таблица через МенеджерВременныхТаблиц
Накладные расходы памятиМинимальныеВыше из-за метаданных колонок и строк

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

Что выбрать

Массив

Однородный список значений: ссылки для отбора в запросе, список имён файлов, набор строк для сообщения. Не подходит, если у каждой записи несколько полей.

Таблица значений

Структурированные данные с несколькими полями, нужен поиск по отбору, сортировка, свёртка или выгрузка на форму. Избыточна для простого списка из одного значения на элемент.

Когда использовать массив: типовые сценарии

Первый и самый частый сценарий — передача списка ссылок в запрос. Если нужно выбрать документы по списку контрагентов, массив заполняется в цикле и передаётся параметром: Запрос.УстановитьПараметр("Контрагенты", МассивКонтрагентов), а в тексте запроса используется условие ГДЕ Контрагент В (&Контрагенты). Здесь таблица значений ничего не добавит, кроме лишнего кода.

Второй сценарий — накопление результатов при обходе данных, когда каждый результат самодостаточен: список найденных файлов, перечень ошибок проверки, набор номеров строк с расхождениями. Третий сценарий — возврат нескольких значений из функции, когда структура не нужна или неудобна: функция возвращает массив, вызывающий код перебирает его циклом Для Каждого Элемент Из Массив Цикл.

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

Когда использовать таблицу значений: типовые сценарии

Главный сценарий — обработка результата запроса. Выгрузка запроса даёт таблицу значений, и дальнейшая работа идёт её штатными средствами: свёртка для агрегации по контрагентам, сортировка перед выводом в отчёт, поиск строк по отбору при сопоставлении с другими данными. Перекладывать такие данные в массивы структур — типичная ошибка, увеличивающая код без выигрыша.

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

Отдельно стоит сценарий с временными таблицами в запросе: таблица значений помещается в менеджер временных таблиц и соединяется с данными базы на стороне СУБД. Это самый быстрый способ сопоставить «внешние» данные с учётными без построчных запросов в цикле.

Типичные ошибки при выборе и использовании коллекций

Самая распространённая ошибка — хранение многополевых записей в нескольких параллельных массивах: отдельно массив номенклатуры, отдельно количества, отдельно цен. При вставке или удалении элемента индексы легко рассинхронизировать, и данные «поплывут» молча, без ошибки исполнения. Любая запись с двумя и более связанными полями — кандидат на таблицу значений или хотя бы массив структур.

Вторая ошибка — ожидание от массива поведения таблицы: попытка найти элемент по части значения, отсортировать его или получить итог. Третья — использование НайтиСтроки() на большой таблице без индекса внутри цикла: код работает, но на реальных объёмах выполняется неприемлемо долго. Четвёртая — изменение таблицы значений (добавление или удаление строк) во время её перебора циклом Для Каждого, что приводит к пропуску строк или ошибкам; удалять строки нужно либо с конца по индексу, либо собирая строки к удалению в отдельный массив.

Типичные ошибки
01
Параллельные массивы для многополевых данных — рассинхронизация индексов и порча данных без сообщения об ошибке
02
Поиск по большой таблице значений в цикле без индекса — резкое падение производительности
03
Передача в запрос массива из сотен тысяч элементов через оператор В — длинный текст запроса и медленное выполнение; лучше временная таблица
04
Удаление строк таблицы значений внутри цикла Для Каждого — пропуск строк; удаляйте с конца по индексу
05
Конвертация результата запроса в массив структур «для удобства» — лишний код и потеря методов таблицы

Проверка результата и отладка

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

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

Контрольные точки

Как проверить результат

Заполненность коллекции после загрузки
Норма

Количество() больше нуля и совпадает с ожидаемым объёмом

Тревожный признак

Пустая коллекция или меньше строк, чем в источнике

Типы колонок таблицы значений
Норма

Колонки созданы с ОписаниеТипов, значения однородны

Тревожный признак

В колонках смешанные типы, есть Неопределено

Скорость поиска
Норма

НайтиСтроки() с индексом отрабатывает мгновенно на рабочих объёмах

Тревожный признак

Заметные паузы при поиске в цикле

Целостность после удаления строк
Норма

Удалены именно целевые строки, остальные на месте

Тревожный признак

Пропущены или удалены лишние строки

Частые вопросы

Можно ли отсортировать массив в 1С?

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

Что быстрее — массив или таблица значений?

При простом добавлении и переборе массив легче и быстрее, так как не хранит метаданные колонок. Но при поиске, фильтрации и группировке таблица значений с индексами обычно выигрывает, потому что эти операции реализованы на уровне платформы, а не циклами в коде. Выбирать нужно по типу операций, а не по абстрактной «скорости».

Как преобразовать таблицу значений в массив?

Если нужен массив значений одной колонки, используйте Массив = ТЗ.ВыгрузитьКолонку("ИмяКолонки"). Если нужен массив строк — переберите таблицу циклом и добавляйте строки или структуры в массив вручную. Обратное преобразование делается через цикл с ТЗ.Добавить() и заполнением полей строки.

Можно ли передать таблицу значений между клиентом и сервером?

Да, таблица значений сериализуется платформой и передаётся между клиентскими и серверными вызовами, однако на тонком клиенте у неё ограничен набор методов. На форме её обычно преобразуют в реквизит типа «ТаблицаЗначений» или «ДинамическийСписок». Массив тоже передаётся, но на клиенте доступен только в ограниченном виде.

Когда вместо массива лучше взять соответствие?

Когда основной операцией является поиск по ключу: соответствие возвращает значение по ключу практически мгновенно, тогда как Массив.Найти() перебирает элементы. Типичный пример — кэш «ссылка → представление» или «код → строка таблицы». Если же нужен только упорядоченный перебор, массив остаётся правильным выбором.

Итог

Что важно запомнить

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