Разработка и Конфигурация · 11 мин
Как добавить строки в массив 1С
Как добавить строки в массив 1С: методы Добавить, Вставить, работа с индексами, типовые ошибки и примеры кода для разработчика 1С:Предприятие 8.
Массив во встроенном языке 1С — это упорядоченная коллекция значений произвольного типа, к которым обращаются по числовому индексу. Добавление строк (точнее, элементов-строк) в массив — одна из базовых операций при обработке данных: сборе списков контрагентов, формировании параметров запроса, подготовке данных для печатных форм и обменов.
В отличие от некоторых других языков, в 1С массив динамический: его не нужно заранее объявлять с фиксированным размером. Элементы добавляются по мере необходимости, а размер массива автоматически увеличивается. Основных способа добавления два — метод Добавить() (в конец массива) и метод Вставить() (в произвольную позицию).
Ниже разобраны синтаксис обоих методов, работа с индексами, типовые ошибки и практические сценарии, которые встречаются в реальных доработках конфигураций.
Создание массива и первое добавление элемента
Перед добавлением элементов массив нужно создать. Для этого используется конструктор Новый Массив. Без параметров создаётся пустой массив, в который далее добавляют значения методом Добавить().
МассивСтрок = Новый Массив;
МассивСтрок.Добавить("Первая строка");
МассивСтрок.Добавить("Вторая строка");
МассивСтрок.Добавить("Третья строка");
Метод Добавить() принимает один параметр — значение любого типа: строку, число, дату, ссылку на объект, структуру и даже другой массив. Метод возвращает ссылку на сам массив, что позволяет при необходимости строить цепочки вызовов, хотя на практике такой стиль используется редко.
Конструктору Новый Массив можно передать число — тогда создаётся массив заданного размера, заполненный значениями Неопределено. Это удобно, когда количество элементов известно заранее и они будут заполняться по индексу через присваивание: МассивСтрок[0] = "Значение";.
Метод Добавить: синтаксис и нюансы
Синтаксис метода предельно прост: Массив.Добавить(Значение). Элемент всегда попадает в конец массива, а его индекс будет равен Массив.Количество() - 1 после добавления. Это важно учитывать, когда далее нужно обратиться к только что добавленному элементу.
Строки в массив часто добавляют в цикле — например, при обходе результата запроса или табличной части документа:
МассивНаименований = Новый Массив;
Для Каждого СтрокаТовара Из Документ.Товары Цикл
МассивНаименований.Добавить(СтрокаТовара.Номенклатура.Наименование);
КонецЦикла;
Обратите внимание: если требуется, чтобы в массиве не было повторов, метод Добавить() сам уникальность не контролирует. Перед добавлением нужно проверять наличие значения через Массив.Найти(Значение) — метод вернёт индекс элемента или Неопределено, если значения нет. Либо используйте соответствие или список значений, где контроль дублей организовать проще.
Если МассивСтрок.Найти(НоваяСтрока) = Неопределено Тогда
МассивСтрок.Добавить(НоваяСтрока);
КонецЕсли;Метод Вставить: добавление в середину массива
Когда порядок элементов важен и новую строку нужно поместить не в конец, а в конкретную позицию, применяется метод Вставить(Индекс, Значение). Все элементы, начиная с указанного индекса, сдвигаются вправо, а новое значение занимает освободившееся место.
МассивСтрок = Новый Массив;
МассивСтрок.Добавить("А");
МассивСтрок.Добавить("В");
МассивСтрок.Вставить(1, "Б");
// Результат: "А", "Б", "В"
Индекс вставки должен находиться в допустимом диапазоне — от 0 до текущего количества элементов включительно. Вставка по индексу, равному Количество(), эквивалентна обычному добавлению в конец. Попытка вставить по индексу за пределами диапазона приведёт к ошибке исполнения.
Метод Вставить() работает медленнее Добавить() при больших объёмах, поскольку требует сдвига части элементов. Если порядок не критичен, добавляйте в конец, а при необходимости сортируйте готовую коллекцию другими средствами — например, перенеся данные в таблицу значений.
Сравнение способов добавления
Добавляет элемент в конец массива. Самый быстрый и безопасный способ, подходит для большинства задач сбора данных.
Вставляет элемент в заданную позицию со сдвигом остальных. Нужен, когда важен порядок, но требует контроля диапазона индекса.
Массив[Индекс] = Значение заменяет существующий элемент, но не добавляет новый. Работает только в пределах уже созданного размера.
Индексация и обращение к добавленным строкам
Индексы массива в 1С начинаются с нуля: первый элемент — Массив[0], последний — Массив[Массив.Количество() - 1]. Это принципиально отличается от табличных частей и таблиц значений, где тоже нулевая индексация, но отличается от нумерации строк в пользовательском интерфейсе, которая начинается с единицы.
Типовой перебор добавленных строк выглядит так:
Для Индекс = 0 По МассивСтрок.Количество() - 1 Цикл
Сообщить(МассивСтрок[Индекс]);
КонецЦикла;
Если обходить массив циклом Для Каждого, индекс не нужен вовсе — переменная цикла сразу получает значение элемента. Этот вариант предпочтителен, когда позиция элемента не имеет значения, и снижает риск выхода за границы массива.
Добавление массива в массив и вложенные структуры
Отдельный частый вопрос — как добавить в массив сразу несколько строк из другого массива. Специального метода слияния в языке нет, поэтому элементы переносятся циклом:
Для Каждого Элемент Из МассивИсточник Цикл
МассивПриемник.Добавить(Элемент);
КонецЦикла;
Если выполнить МассивПриемник.Добавить(МассивИсточник) без цикла, в приёмник попадёт не набор строк, а один элемент — сам массив. Так формируются вложенные структуры, и обращаться к строке придётся через два индекса: МассивПриемник[0][1]. Иногда это именно то, что нужно, — например, при передаче пакетов строк в процедуру печати, — но случайное вложение массива вместо его элементов является распространённой ошибкой.
Для сложных наборов данных, где у каждой строки несколько полей, массив строк быстро перестаёт быть удобным. В таких случаях используют массив структур (Новый Структура("Номенклатура, Количество", ...)) или таблицу значений — она даёт именованные колонки, сортировку, свёртку и поиск без ручных циклов.
- 1Создайте пустой массив: Новый Массив
- 2Определите источник строк: запрос, табличная часть, файл
- 3В цикле добавляйте значения методом Добавить()
- 4При необходимости исключения дублей проверяйте Найти() перед добавлением
- 5Проверьте результат через Количество() и пробный обход циклом
Типовые ошибки и способы их избежать
Первая группа ошибок связана с индексами: перепутанная нумерация с единицы вместо нуля, обращение к последнему элементу как Массив[Количество()] вместо Массив[Количество() - 1]. Обе ситуации завершаются исключением, поэтому вычисляемые индексы стоит явно проверять.
Вторая группа — логические ошибки: добавление в массив самого массива вместо его элементов, пропуск проверки на дубли там, где дубли недопустимы (например, в параметрах запроса с оператором В дубли безвредны, а вот при выгрузке в файл — нет), использование массива там, где нужна таблица значений.
Третья группа касается производительности. Массивы на сотни тысяч элементов с частым поиском через Найти() работают медленно, потому что поиск линейный. Если проверка вхождения выполняется в цикле многократно, замените массив на соответствие — поиск по ключу в нём существенно быстрее.
Как проверить результат
Количество() совпадает с числом добавленных строк
Число меньше ожидаемого — часть добавлений не выполнилась или ветка кода не отработала
Обход циклом выводит именно строки ожидаемого вида
Среди элементов встречается объект типа Массив — случайное вложение
Каждое значение встречается один раз
Повторы — перед Добавить() не выполнялась проверка Найти()
Когда массив не лучший выбор
Массив оптимален для простого упорядоченного списка значений, который заполняется последовательно и читается целиком. Но у него есть ограничения: нет именованного доступа к полям, медленный поиск, неудобная сортировка.
Если данные нужно сортировать, группировать или искать по нескольким критериям — берите таблицу значений. Если важен быстрый поиск по ключу и уникальность — соответствие. Если требуется представление в интерфейсе с возможностью пометок — список значений. Правильный выбор коллекции на этапе проектирования избавляет от переделок, когда обработка начнёт работать с реальными объёмами данных.
Что важно запомнить
Строки добавляют методом Добавить() в конец массива или Вставить(Индекс, Значение) в нужную позицию. Индексы начинаются с нуля, границы контролируются через Количество(). Для уникальности проверяйте Найти(), для больших объёмов с поиском рассмотрите соответствие или таблицу значений.
Частые вопросы о добавлении строк в массив
Как добавить строку в начало массива?
Используйте Массив.Вставить(0, "Значение") — элемент займёт нулевую позицию, а остальные сдвинутся вправо. Учтите, что при частых вставках в начало большого массива это медленнее, чем добавление в конец с последующим разворотом логики обхода.
Можно ли добавить в массив значения разных типов?
Да, массив в 1С не типизирован: в одном массиве могут соседствовать строки, числа, даты и ссылки. Однако смешение типов усложняет последующую обработку, поэтому на практике массив обычно заполняют значениями одного типа.
Как удалить строку из массива?
Методом Массив.Удалить(Индекс) — элемент с указанным индексом удаляется, остальные сдвигаются. Удалять элементы внутри прямого цикла по индексу следует с осторожностью: после удаления индексы смещаются, и без корректировки счётчика часть элементов будет пропущена.
Как узнать, есть ли строка в массиве?
Метод Массив.Найти(Значение) вернёт индекс первого вхождения или Неопределено, если значение не найдено. Поиск выполняется по равенству значений и работает линейно — для миллионов проверок лучше подходит соответствие.
Чем массив отличается от фиксированного массива?
Фиксированный массив (Новый ФиксированныйМассив) создаётся на основе обычного, но не позволяет добавлять, вставлять и удалять элементы. Он используется там, где коллекция должна быть неизменяемой, — например, в параметрах некоторых методов платформы.
Как передать массив строк между клиентом и сервером?
Массив сериализуется платформой и свободно передаётся в серверные вызовы, если все его элементы — сериализуемые типы (строки, числа, ссылки, структуры). Вложенные объекты вроде таблиц значений в параметрах клиент-серверного взаимодействия имеют ограничения, поэтому состав массива стоит держать простым.