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

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

Как добавить строки в массив 1С

Как добавить строки в массив 1С: методы Добавить, Вставить, работа с индексами, типовые ошибки и примеры кода для разработчика 1С:Предприятие 8.

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

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

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

Создание массива и первое добавление элемента

Перед добавлением элементов массив нужно создать. Для этого используется конструктор Новый Массив. Без параметров создаётся пустой массив, в который далее добавляют значения методом Добавить().

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

МассивСтрок.Добавить("Первая строка");

МассивСтрок.Добавить("Вторая строка");

МассивСтрок.Добавить("Третья строка");

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

Конструктору Новый Массив можно передать число — тогда создаётся массив заданного размера, заполненный значениями Неопределено. Это удобно, когда количество элементов известно заранее и они будут заполняться по индексу через присваивание: МассивСтрок[0] = "Значение";.

Метод Добавить: синтаксис и нюансы

Синтаксис метода предельно прост: Массив.Добавить(Значение). Элемент всегда попадает в конец массива, а его индекс будет равен Массив.Количество() - 1 после добавления. Это важно учитывать, когда далее нужно обратиться к только что добавленному элементу.

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

МассивНаименований = Новый Массив;

Для Каждого СтрокаТовара Из Документ.Товары Цикл

МассивНаименований.Добавить(СтрокаТовара.Номенклатура.Наименование);

КонецЦикла;

Обратите внимание: если требуется, чтобы в массиве не было повторов, метод Добавить() сам уникальность не контролирует. Перед добавлением нужно проверять наличие значения через Массив.Найти(Значение) — метод вернёт индекс элемента или Неопределено, если значения нет. Либо используйте соответствие или список значений, где контроль дублей организовать проще.

bsl
Если МассивСтрок.Найти(НоваяСтрока) = Неопределено Тогда
    МассивСтрок.Добавить(НоваяСтрока);
КонецЕсли;

Метод Вставить: добавление в середину массива

Когда порядок элементов важен и новую строку нужно поместить не в конец, а в конкретную позицию, применяется метод Вставить(Индекс, Значение). Все элементы, начиная с указанного индекса, сдвигаются вправо, а новое значение занимает освободившееся место.

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

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

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

МассивСтрок.Вставить(1, "Б");

// Результат: "А", "Б", "В"

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

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

Сравнение способов добавления

Добавить(Значение)

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

Вставить(Индекс, Значение)

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

Присваивание по индексу

Массив[Индекс] = Значение заменяет существующий элемент, но не добавляет новый. Работает только в пределах уже созданного размера.

Индексация и обращение к добавленным строкам

Индексы массива в 1С начинаются с нуля: первый элемент — Массив[0], последний — Массив[Массив.Количество() - 1]. Это принципиально отличается от табличных частей и таблиц значений, где тоже нулевая индексация, но отличается от нумерации строк в пользовательском интерфейсе, которая начинается с единицы.

Типовой перебор добавленных строк выглядит так:

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

Сообщить(МассивСтрок[Индекс]);

КонецЦикла;

Если обходить массив циклом Для Каждого, индекс не нужен вовсе — переменная цикла сразу получает значение элемента. Этот вариант предпочтителен, когда позиция элемента не имеет значения, и снижает риск выхода за границы массива.

Добавление массива в массив и вложенные структуры

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

Для Каждого Элемент Из МассивИсточник Цикл

МассивПриемник.Добавить(Элемент);

КонецЦикла;

Если выполнить МассивПриемник.Добавить(МассивИсточник) без цикла, в приёмник попадёт не набор строк, а один элемент — сам массив. Так формируются вложенные структуры, и обращаться к строке придётся через два индекса: МассивПриемник[0][1]. Иногда это именно то, что нужно, — например, при передаче пакетов строк в процедуру печати, — но случайное вложение массива вместо его элементов является распространённой ошибкой.

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

Порядок действий при сборе строк в массив
  1. 1
    Создайте пустой массив: Новый Массив
  2. 2
    Определите источник строк: запрос, табличная часть, файл
  3. 3
    В цикле добавляйте значения методом Добавить()
  4. 4
    При необходимости исключения дублей проверяйте Найти() перед добавлением
  5. 5
    Проверьте результат через Количество() и пробный обход циклом

Типовые ошибки и способы их избежать

Первая группа ошибок связана с индексами: перепутанная нумерация с единицы вместо нуля, обращение к последнему элементу как Массив[Количество()] вместо Массив[Количество() - 1]. Обе ситуации завершаются исключением, поэтому вычисляемые индексы стоит явно проверять.

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

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

Типичные ошибки
01
Добавление массива в массив без цикла — в приёмнике оказывается один вложенный элемент вместо набора строк
02
Обращение Массив[Количество()] — индекс за границей, выполнение прерывается ошибкой
03
Ожидание автоматической уникальности — Добавить() не проверяет дубли, контроль ложится на разработчика
04
Модификация массива внутри цикла Для Каждого по нему же — сдвиг индексов приводит к пропуску или повторной обработке элементов
Контрольные точки

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

Количество элементов
Норма

Количество() совпадает с числом добавленных строк

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

Число меньше ожидаемого — часть добавлений не выполнилась или ветка кода не отработала

Содержимое элементов
Норма

Обход циклом выводит именно строки ожидаемого вида

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

Среди элементов встречается объект типа Массив — случайное вложение

Отсутствие дублей
Норма

Каждое значение встречается один раз

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

Повторы — перед Добавить() не выполнялась проверка Найти()

Когда массив не лучший выбор

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

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

Итог

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

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

Частые вопросы о добавлении строк в массив

Как добавить строку в начало массива?

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

Можно ли добавить в массив значения разных типов?

Да, массив в 1С не типизирован: в одном массиве могут соседствовать строки, числа, даты и ссылки. Однако смешение типов усложняет последующую обработку, поэтому на практике массив обычно заполняют значениями одного типа.

Как удалить строку из массива?

Методом Массив.Удалить(Индекс) — элемент с указанным индексом удаляется, остальные сдвигаются. Удалять элементы внутри прямого цикла по индексу следует с осторожностью: после удаления индексы смещаются, и без корректировки счётчика часть элементов будет пропущена.

Как узнать, есть ли строка в массиве?

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

Чем массив отличается от фиксированного массива?

Фиксированный массив (Новый ФиксированныйМассив) создаётся на основе обычного, но не позволяет добавлять, вставлять и удалять элементы. Он используется там, где коллекция должна быть неизменяемой, — например, в параметрах некоторых методов платформы.

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

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