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

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

Двумерный массив в 1С: что это и как с ним работать

Что такое двумерный массив в 1С, почему его нет как отдельного типа, и как реализовать через массив массивов, таблицу значений и соответствие. Примеры кода.

Двумерный массив — это структура данных, которую удобно представить как таблицу: у каждого элемента есть два индекса — номер строки и номер колонки. К этой теме обращаются разработчики, которые перешли на 1С из других языков (C++, Pascal, Python) и привыкли к записи вида Массив[i][j]. В языке 1С такого встроенного типа нет, но задача решается несколькими штатными способами.

Встроенный язык 1С поддерживает только одномерный массив — тип Массив с методами Добавить(), Вставить(), Удалить(), Количество(). Однако элементом массива может быть любое значение, включая другой массив. На этом и строится основной приём имитации двумерности.

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

Что такое двумерный массив и есть ли он в 1С

Двумерный массив — это набор однотипных элементов, адресуемых парой индексов. Классический пример — матрица в математике, шахматная доска, прайс-лист, где строки соответствуют товарам, а колонки — ценам по типам контрагентов.

В языке 1С нет конструкции вида Новый Массив(10, 20), создающей прямоугольную матрицу. Конструктор Новый Массив(10) создаёт одномерный массив из десяти элементов со значением Неопределено в каждом. Попытка передать два размера в конструктор не даст двумерной структуры — лишние параметры будут проигнорированы или приведут к ошибке в зависимости от контекста.

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

Способ 1: массив массивов

Самый близкий к классическому двумерному массиву вариант — создать массив, в который вложены другие массивы. Сначала создаётся «внешний» массив строк, затем для каждой строки — внутренний массив ячеек.

Матрица = Новый Массив;

Для ИндексСтроки = 0 По 9 Цикл

Строка = Новый Массив;

Для ИндексКолонки = 0 По 4 Цикл

Строка.Добавить(0); // начальное значение ячейки

КонецЦикла;

Матрица.Добавить(Строка);

КонецЦикла;

// Обращение к элементу

Матрица[2][3] = 150;

Значение = Матрица[2][3];

Обращение Матрица[2][3] работает потому, что Матрица[2] возвращает вложенный массив, а следующий оператор индексации [3] обращается уже к его элементу. Синтаксически это выглядит как привычный двумерный массив.

Когда массив массивов уместен

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

Ограничения приёма

У массива массивов нет проверки прямоугольности: строки могут оказаться разной длины, и обращение к несуществующему индексу вызовет ошибку «Индекс находится за границами массива». Нет и именованных колонок — смысл каждого индекса приходится держать в голове или описывать в комментариях.

Типичные ошибки
01
Обращение Матрица[Строка][Колонка] до заполнения вложенного массива — элементы равны Неопределено, и попытка индексирования даёт ошибку
02
Путаница порядка индексов: сначала строка, потом колонка — при перестановке данные записываются не туда без видимой ошибки
03
Ожидание, что Новый Массив(10, 5) создаст матрицу 10 на 5 — конструктор так не работает

Способ 2: таблица значений — основная замена в прикладных задачах

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

ТЗ = Новый ТаблицаЗначений;

ТЗ.Колонки.Добавить("Номенклатура");

ТЗ.Колонки.Добавить("Количество");

ТЗ.Колонки.Добавить("Цена");

НоваяСтрока = ТЗ.Добавить();

НоваяСтрока.Номенклатура = "Товар А";

НоваяСтрока.Количество = 10;

НоваяСтрока.Цена = 500;

Доступ по индексам тоже возможен: ТЗ[0] вернёт первую строку, а ТЗ[0].Цена — значение конкретной ячейки. То есть таблица значений закрывает и сценарий «адресации по двум координатам», но делает это безопаснее и читаемее.

Дополнительное преимущество — методы Найти(), НайтиСтроки(), Сортировать(), Итог(), Свернуть(). Задача «найти сумму по колонке» в массиве массивов потребует цикла, а в таблице значений решается одним вызовом.

Сравнение вариантов

Массив массивов

Подходит для алгоритмических задач с числовой адресацией. Минус: нет типизации колонок, поиска и итогов, легко выйти за границы

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

Основной выбор для табличных бизнес-данных: именованные колонки, поиск, сортировка, итоги. Минус: тяжелее по памяти, чем массив

Соответствие

Подходит, когда доступ нужен по уникальному ключу, а не по номеру строки. Минус: нет порядка следования и индексации

Способ 3: соответствие и структура для доступа по ключу

Иногда под «двумерным массивом» на самом деле понимается быстрый доступ к значению по паре признаков — например, цена по комбинации «номенклатура + склад». Здесь удобно Соответствие, где ключом может быть строка-идентификатор или вложенная структура.

ЦеныПоСкладам = Новый Соответствие;

Вложенное = Новый Соответствие;

Вложенное.Вставить("ОсновнойСклад", 500);

Вложенное.Вставить("РезервныйСклад", 480);

ЦеныПоСкладам.Вставить("ТоварА", Вложенное);

Цена = ЦеныПоСкладам["ТоварА"]["ОсновнойСклад"];

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

Как обойти и обработать двумерную структуру

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

Для ИндексСтроки = 0 По Матрица.Количество() - 1 Цикл

Строка = Матрица[ИндексСтроки];

Для ИндексКолонки = 0 По Строка.Количество() - 1 Цикл

Значение = Строка[ИндексКолонка];

// обработка значения

КонецЦикла;

КонецЦикла;

Альтернатива — цикл Для Каждого ... Из ... Цикл, который исключает ошибки с индексами полностью, но не даёт номера текущей позиции. Если позиция нужна, оставайтесь на индексном варианте.

Для таблицы значений обход ещё проще: Для Каждого СтрокаТЗ Из ТЗ Цикл с доступом к полям по именам. Это самый читаемый и безопасный вариант, поэтому в прикладном коде конфигураций он встречается чаще всего.

Порядок выбора структуры
  1. 1
    Определите, что представляют данные: математическую матрицу, бизнес-таблицу или справочник «ключ → значение»
  2. 2
    Для матрицы с числовой адресацией создайте массив массивов и заполните все вложенные строки до первого обращения
  3. 3
    Для бизнес-таблицы создайте ТаблицуЗначений с типизированными колонками и используйте её методы поиска и итогов
  4. 4
    Для доступа по ключу используйте Соответствие, при необходимости вложенное
  5. 5
    Проверьте обход: убедитесь, что циклы используют фактические размеры структуры, а не жёстко заданные числа

Частые ошибки и как их проверить

Первая группа ошибок связана с незаполненностью структуры. Если обратиться к Матрица[5][2], а пятая строка ещё не создана или короче трёх элементов, выполнение прервётся ошибкой. Признак проблемы — сообщение «Индекс находится за границами массива» в журнале или в окне ошибок конфигуратора.

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

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

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

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

Заполненность матрицы
Норма

Каждая строка — массив ожидаемой длины, обращение по любому допустимому индексу не вызывает ошибки

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

Ошибка «Индекс находится за границами массива» или Неопределено вместо значения

Порядок индексов
Норма

Контрольная запись в ячейку [1][0] читается из той же ячейки и не влияет на [0][1]

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

Значение появляется в зеркальной позиции — индексы перепутаны

Выбор типа данных
Норма

Поиск и итоги выполняются штатными методами ТаблицыЗначений или Соответствия

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

В коде вручную реализованы поиск, сортировка и суммирование по массиву массивов

Когда нужна помощь и как углубиться в тему

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

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

Итог

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

Двумерного массива как типа в 1С нет. Для матриц используют массив массивов с обращением Матрица[Строка][Колонка], для бизнес-таблиц — ТаблицуЗначений, для доступа по ключу — Соответствие. Перед обращением по индексу убедитесь, что структура заполнена, а порядок индексов проверен на контрольном примере.

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

Почему в 1С не сделали настоящий двумерный массив?

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

Можно ли передать массив массивов между клиентом и сервером?

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

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

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

Как сделать «трёхмерный массив» в 1С?

Тем же приёмом вложенности: массив, элементы которого — массивы массивов, с обращением вида Данные[i][j][k]. Однако при такой глубине код становится трудно читаемым, и обычно разумнее перейти на таблицу значений с дополнительными колонками или на структуру со вложенными соответствиями.

Как найти значение в массиве массивов?

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

Можно ли отсортировать массив массивов по колонке?

Штатного метода сортировки по вложенной колонке у массива нет — придётся писать собственный алгоритм сравнения строк. Проще перенести данные в ТаблицуЗначений и вызвать метод Сортировать() с указанием имени колонки и направления.