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