Разработка и Конфигурация · 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] обращается уже к его элементу. Синтаксически это выглядит как привычный двумерный массив.
Когда массив массивов уместен
Этот способ подходит для алгоритмических задач: матричных вычислений, игровых полей, промежуточных расчётов, где важна именно числовая адресация по двум индексам. Для прикладных учётных задач он обычно проигрывает таблице значений.
Ограничения приёма
У массива массивов нет проверки прямоугольности: строки могут оказаться разной длины, и обращение к несуществующему индексу вызовет ошибку «Индекс находится за границами массива». Нет и именованных колонок — смысл каждого индекса приходится держать в голове или описывать в комментариях.
Способ 2: таблица значений — основная замена в прикладных задачах
Если данные по смыслу являются таблицей — товары с ценами, сотрудники с показателями, периоды с суммами — правильный инструмент в 1С это ТаблицаЗначений. Она даёт именованные колонки с типами, встроенные поиск, сортировку, свёртку и итоги, чего массив массивов не умеет в принципе.
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Номенклатура");
ТЗ.Колонки.Добавить("Количество");
ТЗ.Колонки.Добавить("Цена");
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Номенклатура = "Товар А";
НоваяСтрока.Количество = 10;
НоваяСтрока.Цена = 500;
Доступ по индексам тоже возможен: ТЗ[0] вернёт первую строку, а ТЗ[0].Цена — значение конкретной ячейки. То есть таблица значений закрывает и сценарий «адресации по двум координатам», но делает это безопаснее и читаемее.
Дополнительное преимущество — методы Найти(), НайтиСтроки(), Сортировать(), Итог(), Свернуть(). Задача «найти сумму по колонке» в массиве массивов потребует цикла, а в таблице значений решается одним вызовом.
Сравнение вариантов
Подходит для алгоритмических задач с числовой адресацией. Минус: нет типизации колонок, поиска и итогов, легко выйти за границы
Основной выбор для табличных бизнес-данных: именованные колонки, поиск, сортировка, итоги. Минус: тяжелее по памяти, чем массив
Подходит, когда доступ нужен по уникальному ключу, а не по номеру строки. Минус: нет порядка следования и индексации
Способ 3: соответствие и структура для доступа по ключу
Иногда под «двумерным массивом» на самом деле понимается быстрый доступ к значению по паре признаков — например, цена по комбинации «номенклатура + склад». Здесь удобно Соответствие, где ключом может быть строка-идентификатор или вложенная структура.
ЦеныПоСкладам = Новый Соответствие;
Вложенное = Новый Соответствие;
Вложенное.Вставить("ОсновнойСклад", 500);
Вложенное.Вставить("РезервныйСклад", 480);
ЦеныПоСкладам.Вставить("ТоварА", Вложенное);
Цена = ЦеныПоСкладам["ТоварА"]["ОсновнойСклад"];
Такой подход работает быстрее перебора при большом объёме данных, потому что поиск в соответствии не требует последовательного сканирования. Но соответствие не хранит порядок элементов — если важна последовательность обхода, нужен массив или таблица.
Как обойти и обработать двумерную структуру
Для массива массивов обход выполняется вложенными циклами. Важно брать границы из фактического размера каждой строки, а не из заранее заданной константы — это защищает от выхода за границы при «рваных» массивах.
Для ИндексСтроки = 0 По Матрица.Количество() - 1 Цикл
Строка = Матрица[ИндексСтроки];
Для ИндексКолонки = 0 По Строка.Количество() - 1 Цикл
Значение = Строка[ИндексКолонка];
// обработка значения
КонецЦикла;
КонецЦикла;
Альтернатива — цикл Для Каждого ... Из ... Цикл, который исключает ошибки с индексами полностью, но не даёт номера текущей позиции. Если позиция нужна, оставайтесь на индексном варианте.
Для таблицы значений обход ещё проще: Для Каждого СтрокаТЗ Из ТЗ Цикл с доступом к полям по именам. Это самый читаемый и безопасный вариант, поэтому в прикладном коде конфигураций он встречается чаще всего.
- 1Определите, что представляют данные: математическую матрицу, бизнес-таблицу или справочник «ключ → значение»
- 2Для матрицы с числовой адресацией создайте массив массивов и заполните все вложенные строки до первого обращения
- 3Для бизнес-таблицы создайте ТаблицуЗначений с типизированными колонками и используйте её методы поиска и итогов
- 4Для доступа по ключу используйте Соответствие, при необходимости вложенное
- 5Проверьте обход: убедитесь, что циклы используют фактические размеры структуры, а не жёстко заданные числа
Частые ошибки и как их проверить
Первая группа ошибок связана с незаполненностью структуры. Если обратиться к Матрица[5][2], а пятая строка ещё не создана или короче трёх элементов, выполнение прервётся ошибкой. Признак проблемы — сообщение «Индекс находится за границами массива» в журнале или в окне ошибок конфигуратора.
Вторая группа — логические ошибки без сообщений: перепутан порядок индексов, данные записались «транспонированно», итоги сходятся, но по неверным строкам. Такие ошибки находятся только проверкой на контрольном примере с известным результатом.
Третья группа — выбор неподходящего типа: разработчик хранит табличные данные в массиве массивов, а потом вручную пишет поиск, сортировку и подсчёт итогов, которые таблица значений дала бы бесплатно. Если в коде появляются циклы поиска по массиву массивов — это сигнал пересмотреть структуру.
Как проверить результат
Каждая строка — массив ожидаемой длины, обращение по любому допустимому индексу не вызывает ошибки
Ошибка «Индекс находится за границами массива» или Неопределено вместо значения
Контрольная запись в ячейку [1][0] читается из той же ячейки и не влияет на [0][1]
Значение появляется в зеркальной позиции — индексы перепутаны
Поиск и итоги выполняются штатными методами ТаблицыЗначений или Соответствия
В коде вручную реализованы поиск, сортировка и суммирование по массиву массивов
Когда нужна помощь и как углубиться в тему
Самостоятельная работа с этими структурами безопасна: ошибки проявляются на этапе отладки и не затрагивают учётные данные, если код выполняется в тестовой базе. Перед внедрением любой обработки в рабочую базу делайте резервную копию и проверяйте алгоритм на копии данных.
Для системного изучения стоит освоить смежные типы: СписокЗначений, Структура, ДеревоЗначений для иерархических данных, а также выгрузку результатов запросов в таблицу значений — именно этот приём чаще всего заменяет «двумерные массивы» в реальных доработках.
Что важно запомнить
Двумерного массива как типа в 1С нет. Для матриц используют массив массивов с обращением Матрица[Строка][Колонка], для бизнес-таблиц — ТаблицуЗначений, для доступа по ключу — Соответствие. Перед обращением по индексу убедитесь, что структура заполнена, а порядок индексов проверен на контрольном примере.
Частые вопросы
Почему в 1С не сделали настоящий двумерный массив?
Платформа 1С ориентирована на учётные задачи, где табличные данные почти всегда имеют именованные поля и типы. Для этого созданы ТаблицаЗначений и результаты запросов, которые покрывают потребности в двумерных структурах более удобным способом, чем «голые» индексы.
Можно ли передать массив массивов между клиентом и сервером?
Да, массивы сериализуются и передаются между клиентскими и серверными процедурами, если все вложенные значения относятся к допустимым для передачи типам. ТаблицуЗначений напрямую с сервера на клиент в управляемых формах передать нельзя — её преобразуют, например, в массив структур или используют реквизит формы соответствующего типа.
Что быстрее: массив массивов или таблица значений?
Для простого обхода по индексам массив массивов обычно легче и быстрее, так как это более простая структура. Но как только требуется поиск, отбор или итоги, таблица значений выигрывает за счёт встроенных оптимизированных механизмов, а поиск по ключу быстрее всего выполняет Соответствие.
Как сделать «трёхмерный массив» в 1С?
Тем же приёмом вложенности: массив, элементы которого — массивы массивов, с обращением вида Данные[i][j][k]. Однако при такой глубине код становится трудно читаемым, и обычно разумнее перейти на таблицу значений с дополнительными колонками или на структуру со вложенными соответствиями.
Как найти значение в массиве массивов?
Только перебором: вложенными циклами по строкам и колонкам со сравнением каждого элемента. Если такой поиск выполняется часто, это признак того, что структура выбрана неверно — замените её на ТаблицуЗначений с методом Найти() или на Соответствие с доступом по ключу.
Можно ли отсортировать массив массивов по колонке?
Штатного метода сортировки по вложенной колонке у массива нет — придётся писать собственный алгоритм сравнения строк. Проще перенести данные в ТаблицуЗначений и вызвать метод Сортировать() с указанием имени колонки и направления.