В конфигурациях на платформе 1С:Предприятие разработчику нередко требуется создавать и заполнять двумерные массивы для хранения структурированных данных. Типичным примером может быть таблица значений, формируемая вручную без использования объекта «ТаблицаЗначений». В таких случаях удобно использовать массив массивов – структура, в которой каждая строка представлена отдельным вложенным массивом.
Для создания двумерного массива в 1С применяется следующий подход: сначала инициализируется внешний массив, затем в него поочерёдно добавляются внутренние массивы, каждый из которых соответствует строке. Никакой отдельной конструкции для двумерных массивов в платформе не предусмотрено, что делает важным чёткое понимание структуры вложенности и правил доступа к элементам.
Пример базовой инициализации:
Массив = Новый Массив;
Для Счетчик = 1 По 5 Цикл
Строка = Новый Массив;
Для Колонка = 1 По 3 Цикл
Строка.Добавить(0);
КонецЦикла;
Массив.Добавить(Строка);
КонецЦикла;
При заполнении массива данными следует учитывать, что индексация элементов начинается с 0. Обращение к элементу осуществляется через двойной индекс, например: Массив[2][1]
. Для изменения конкретного значения используется такой же синтаксис с присваиванием.
Рекомендуется использовать вложенные циклы для работы с каждым элементом. При этом важно избегать попыток обращения к неинициализированным подмассивам. Перед добавлением элементов всегда следует проверять существование вложенной структуры или инициализировать её в момент создания.
Инициализация пустого двумерного массива в 1С:Предприятие
В 1С:Предприятие отсутствует тип «двумерный массив» в привычном понимании. Для создания аналогичной структуры используют массив массивов. Чтобы задать пустой двумерный массив, достаточно создать внешний массив и заполнить его вложенными пустыми массивами.
- Создание пустого массива:
Массив = Новый Массив;
- Добавление пустых строк (вложенных массивов):
Для Сч = 1 По КоличествоСтрок Цикл Массив.Добавить(Новый Массив); КонецЦикла;
После выполнения цикла переменная Массив
содержит необходимое количество строк, каждая из которых может использоваться как строка таблицы с заданным числом элементов (столбцов). Для последующего добавления данных:
Массив[0].Добавить(0); Массив[0].Добавить("Текст");
Чтобы инициализировать фиксированное число столбцов в каждой строке сразу:
Для Сч = 1 По КоличествоСтрок Цикл Строка = Новый Массив; Для Кол = 1 По КоличествоСтолбцов Цикл Строка.Добавить(Неопределено); КонецЦикла; Массив.Добавить(Строка); КонецЦикла;
Такой подход позволяет избежать ошибок при доступе к несуществующим элементам и упрощает последующую обработку данных.
Заполнение массива значениями из таблицы значений
Для переноса данных из ТаблицыЗначений в двумерный массив в 1С следует учитывать структуру таблицы и точный порядок колонок. Ниже приведён способ, позволяющий выполнить это с минимальными затратами по времени.
Сначала нужно определить размеры массива. Количество строк соответствует ЧислоСтрок(), а количество столбцов – КоличествоКолонок(). Например:
Массив = Новый Массив(ТаблицаЗначений.ЧислоСтрок());
Для Каждого Строка Из ТаблицаЗначений Цикл
ВнутреннийМассив = Новый Массив(ТаблицаЗначений.Колонки.Количество());
Для Ном = 0 По ТаблицаЗначений.Колонки.Количество() — 1 Цикл
ВнутреннийМассив[Ном] = Строка[ТаблицаЗначений.Колонки[Ном].Имя];
КонецЦикла;
Массив.Добавить(ВнутреннийМассив);
КонецЦикла;
Если известно, какие поля требуются, можно сократить количество колонок вручную, задав имена явно:
ИменаКолонок = Новый Массив;
ИменаКолонок.Добавить(«Код»);
ИменаКолонок.Добавить(«Наименование»);
…
Для Каждого Строка Из ТаблицаЗначений Цикл
ВнутреннийМассив = Новый Массив(ИменаКолонок.Количество());
Для Ном = 0 По ИменаКолонок.Количество() — 1 Цикл
ВнутреннийМассив[Ном] = Строка[ИменаКолонок[Ном]];
КонецЦикла;
Массив.Добавить(ВнутреннийМассив);
КонецЦикла;
Такой способ удобен при передаче данных в внешние компоненты или при последующей сериализации. Исключение лишних колонок уменьшает объём памяти и ускоряет обработку.
Чтение данных из регистра и перенос в двумерный массив
Для чтения данных из регистра сведений и переноса их в двумерный массив используется запрос и цикл по результату. Пример на платформе 1С:Предприятие 8.3:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ Ресурс1, Ресурс2, Измерение1, Измерение2 ИЗ РегистрСведений.ПримерРегистр.СрезПоследних()"; Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Массив = Новый Массив;
Цикл по выборке добавляет каждую строку как вложенный массив:
Пока Выборка.Следующий() Цикл Строка = Новый Массив; Строка.Добавить(Выборка.Ресурс1); Строка.Добавить(Выборка.Ресурс2); Строка.Добавить(Выборка.Измерение1); Строка.Добавить(Выборка.Измерение2); Массив.Добавить(Строка); КонецЦикла;
В результате Массив
представляет собой двумерную структуру, где каждая строка соответствует одной записи регистра. Порядок столбцов должен соответствовать порядку добавления в массив. Избегайте пропуска реквизитов, чтобы сохранить целостность структуры.
Заполнение массива через цикл по строкам и столбцам
Для создания двумерного массива в 1С используется объект типа Массив
, содержащий вложенные массивы. Такой способ позволяет точно задать структуру «строки-столбцы».
Инициализация начинается с внешнего массива, представляющего строки. Затем в каждой итерации по строкам создаются вложенные массивы для столбцов. Пример:
МассивДанных = Новый Массив;
КоличествоСтрок = 5;
КоличествоСтолбцов = 3;
Для НомерСтроки = 0 По КоличествоСтрок - 1 Цикл
Строка = Новый Массив;
Для НомерСтолбца = 0 По КоличествоСтолбцов - 1 Цикл
Строка.Добавить("Ячейка_" + Строка(НомерСтроки) + "_" + Строка(НомерСтолбца));
КонецЦикла;
МассивДанных.Добавить(Строка);
КонецЦикла;
В результате МассивДанных[2][1]
вернёт строку "Ячейка_2_1"
. Количество строк и столбцов может задаваться переменными или вычисляться динамически. Тип данных внутри массива может быть любым.
Изменение значений осуществляется напрямую: МассивДанных[1][2] = "Новое значение";
Такая структура удобна для обработки табличных данных, импорта из внешних источников и последующего преобразования в ТаблицуЗначений или другие объекты 1С.
Использование методов объекта Массив для работы с двумерными структурами
В 1С объект Массив
не имеет встроенной поддержки двумерных структур, однако можно организовать работу с такими данными через массив массивов. Каждый элемент основного массива должен быть отдельным массивом, представляющим строку.
Для создания двумерной структуры используется цикл добавления вложенных массивов. Пример:
ДвумерныйМассив = Новый Массив; Для Строка = 0 По 4 Цикл НоваяСтрока = Новый Массив; Для Колонка = 0 По 2 Цикл НоваяСтрока.Добавить(Строка * 10 + Колонка); КонецЦикла; ДвумерныйМассив.Добавить(НоваяСтрока); КонецЦикла;
Для обращения к элементам используется двойной индекс:
Значение = ДвумерныйМассив[2][1]; // Получение элемента из третьей строки, второй колонки
Метод Количество()
позволяет определить число строк, а для количества колонок – метод Количество()
применяется к вложенному массиву:
ЧислоСтрок = ДвумерныйМассив.Количество(); ЧислоКолонок = ДвумерныйМассив[0].Количество();
Для перебора всех значений удобно использовать вложенные циклы:
Для Строка = 0 По ДвумерныйМассив.Количество() - 1 Цикл Для Колонка = 0 По ДвумерныйМассив[Строка].Количество() - 1 Цикл Значение = ДвумерныйМассив[Строка][Колонка]; // Обработка значения КонецЦикла; КонецЦикла;
Изменение значения происходит напрямую через индексацию:
ДвумерныйМассив[1][2] = 99; // Присваивание значения элементу
Для удаления строки используется метод Удалить()
основного массива. Для удаления элемента из строки – метод Удалить()
вложенного массива:
ДвумерныйМассив[3].Удалить(1); // Удаление второго элемента в четвёртой строке ДвумерныйМассив.Удалить(3); // Удаление четвёртой строки
Метод Очистить()
очищает как основную структуру, так и вложенные при необходимости:
Для Каждого Строка Из ДвумерныйМассив Цикл Строка.Очистить(); КонецЦикла; ДвумерныйМассив.Очистить();
Для копирования строк или всего массива следует использовать Копировать()
, иначе копия будет ссылкой на исходные данные:
КопияСтроки = ДвумерныйМассив[0].Копировать();
Преобразование однострочного массива в двумерный формат
Для преобразования одномерного массива в двумерный в 1С необходимо определить количество столбцов в будущей структуре. Если элементов в исходном массиве, например, 12, а количество столбцов – 4, итоговая матрица будет содержать 3 строки.
Пример алгоритма:
1. Создаётся исходный массив:
ОдномерныйМассив = Новый Массив;
Для И = 1 По 12 Цикл
ОдномерныйМассив.Добавить(И);
КонецЦикла;
2. Указывается количество столбцов:
ЧислоСтолбцов = 4;
3. Вычисляется количество строк:
ЧислоСтрок = Цел(ОдномерныйМассив.Количество() / ЧислоСтолбцов);
4. Создаётся двумерный массив:
ДвумерныйМассив = Новый Массив;
5. Заполнение:
Сч = 0;
Для Стр = 0 По ЧислоСтрок — 1 Цикл
Строка = Новый Массив;
Для Стлб = 0 По ЧислоСтолбцов — 1 Цикл
Если Сч < ОдномерныйМассив.Количество() Тогда
Строка.Добавить(ОдномерныйМассив[Сч]);
Иначе
Строка.Добавить(Неопределено);
КонецЕсли;
Сч = Сч + 1;
КонецЦикла;
ДвумерныйМассив.Добавить(Строка);
КонецЦикла;
При необходимости можно заменить Неопределено на любое значение-заполнитель. Структура остаётся стабильной даже при нехватке элементов для последней строки.
Рекомендация: использовать фиксированное количество столбцов и проверку границ массива для предотвращения ошибок доступа к несуществующим индексам.
Обработка пустых и неинициализированных элементов в двумерном массиве
В 1С:Предприятие при работе с двумерными массивами необходимо учитывать возможность наличия пустых или неинициализированных элементов. Это особенно важно при переборе, заполнении и анализе данных.
- При создании массива с фиксированными размерами, но без явного заполнения, элементы будут содержать значение
Неопределено
. - Если массив создается вложенными циклами без предварительной инициализации внутренних массивов, попытка обращения по индексу вызовет исключение.
- Для проверки значения используйте конструкцию:
Если ЗначениеЗаполнено(Массив[Индекс1][Индекс2]) Тогда
. - Для безопасного обращения к элементам рекомендуется предварительно проверять наличие подмассива:
Если ТипЗнч(Массив[Индекс1]) = Тип("Массив") Тогда
.
- Перед добавлением элемента по индексу убедитесь, что подмассив существует. При необходимости создайте его:
Если Массив[Индекс1] = Неопределено Тогда Массив[Индекс1] = Новый Массив;
- Для заполнения пустых ячеек используйте цикл с проверкой:
Если Массив[И][J] = Неопределено Тогда Массив[И][J] = ЗначениеПоУмолчанию;
- Для удаления неинициализированных строк используйте
Удалить(Массив, Индекс)
только после проверки:Если НЕ ЗначениеЗаполнено(Массив[Индекс])
.
Явное управление заполнением и проверкой значений снижает вероятность ошибок при последующей обработке данных и повышает читаемость кода.