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

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

Как добавить значения в массив 1С

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

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

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

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

Создание массива и базовое добавление через Добавить()

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

Товары = Новый Массив;

Товары.Добавить("Номенклатура1");

Товары.Добавить("Номенклатура2");

Товары.Добавить(123); // массив может хранить разные типы

Метод Добавить() помещает элемент в конец массива и возвращает добавленное значение, что удобно для цепочек вызовов. После каждого вызова размер массива увеличивается на единицу — проверить текущее количество элементов можно через Товары.Количество().

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

Вставка значения в середину массива

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

Очередь = Новый Массив;

Очередь.Добавить("Первый");

Очередь.Добавить("Третий");

Очередь.Вставить(1, "Второй"); // вставка между элементами

// Результат: Первый, Второй, Третий

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

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

Заполнение массива в цикле и из выборки

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

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

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

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

КонецЦикла;

Если нужно собрать только уникальные значения, перед добавлением проверяйте наличие элемента методом Найти(): он возвращает индекс найденного элемента или Неопределено, если значения в массиве нет. Это простая замена отсутствующему в языке типу «множество».

Если МассивСсылок.Найти(Выборка.Ссылка) = Неопределено Тогда

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

КонецЕсли;

Порядок действий
  1. 1
    Создайте массив: Массив = Новый Массив
  2. 2
    Добавляйте значения методом Массив.Добавить(Значение) в нужных местах кода
  3. 3
    Для уникальности проверяйте Массив.Найти(Значение) перед добавлением
  4. 4
    Проверьте результат: Массив.Количество() и обход циклом Для Каждого

Присваивание по индексу и изменение существующих элементов

Метод Добавить() расширяет массив, а прямое обращение по индексу — только изменяет уже существующий элемент. Конструкция Массив[0] = НовоеЗначение заменяет значение в позиции 0, но не добавляет новую позицию.

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

Обращение по индексу за границами массива — одна из самых частых причин ошибок. Перед присваиванием убедитесь, что индекс меньше Массив.Количество(), либо используйте Добавить()/Вставить(), которые сами управляют размером коллекции.

Сравнение вариантов

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

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

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

Вставка в середину или начало со сдвигом элементов. Требует контроля допустимого диапазона индекса.

Массив[Индекс] = Значение

Замена существующего элемента при известном размере. Не расширяет массив, при неверном индексе — ошибка.

Массив как параметр запроса и смежные сценарии

Частая задача — передать набор значений в запрос для условия В (&Список). Здесь массив наполняется обычным способом, а затем назначается параметру через Запрос.УстановитьПараметр("Список", МассивСсылок). Платформа автоматически разворачивает массив в список значений условия.

Пустой массив в параметре запроса — источник неочевидного поведения: условие В с пустым списком не вернёт ни одной строки. Если пустой набор допустим по логике, проверяйте Массив.Количество() = 0 до выполнения запроса и выбирайте альтернативную ветку кода.

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

Типичные ошибки и проверка результата

Первая распространённая ошибка — присваивание результата Добавить() самому массиву: Массив = Массив.Добавить(Х). После этого переменная перестаёт быть массивом, и следующий вызов метода падает с ошибкой. Метод возвращает добавленное значение, а не коллекцию.

Вторая ошибка — путаница с индексацией. Цикл Для И = 1 По Массив.Количество() корректен для обхода, но Массив[И] на последней итерации выйдет за границу, потому что последний допустимый индекс — Количество() - 1. Для обхода безопаснее использовать Для Каждого Элемент Из Массив Цикл.

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

Типичные ошибки
01
Массив = Массив.Добавить(Х) — переменная перестаёт быть массивом, следующий вызов падает с ошибкой
02
Обращение к Массив[Количество()] — индексация с нуля, последний индекс равен Количество()-1
03
Вставка по индексу больше Количество() — ошибка времени выполнения
04
Добавление дублей без проверки Найти() — лишние строки в отчётах и повторные проведения документов
05
Передача пустого массива в условие В запроса — запрос возвращает пустой результат
Контрольные точки

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

Размер массива
Норма

Массив.Количество() равно ожидаемому числу элементов

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

Количество меньше или больше ожидаемого — проверяйте условия добавления в цикле

Содержимое
Норма

Обход Для Каждого выводит все значения без ошибок типов

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

Неопределено в позициях или значения неожиданного типа

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

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

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

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

Часто задаваемые вопросы

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

Да, массив не типизирован: в одну коллекцию допустимо складывать строки, числа, даты, ссылки, структуры и другие массивы. Однако при последующей обработке проверяйте тип каждого элемента функцией ТипЗнч(), иначе операция с несовместимым типом вызовет ошибку.

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

Используйте метод Вставить с нулевым индексом: Массив.Вставить(0, Значение). Все существующие элементы сдвинутся на одну позицию вправо, а новое значение окажется первым.

Чем Добавить() отличается от Установить()?

Добавить() увеличивает размер массива и помещает значение в конец. Установить(Индекс, Значение) заменяет значение в уже существующей позиции и не меняет размер коллекции — по сути это то же, что присваивание Массив[Индекс] = Значение.

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

Вызовите Массив.Найти(Значение): метод вернёт индекс первого совпадения или Неопределено, если элемента нет. Условие «равно Неопределено» означает, что значение можно безопасно добавить без создания дубля.

Что будет, если обратиться к несуществующему индексу?

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

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

Да, массивы передаются между клиентом и сервером, если содержат сериализуемые типы: примитивы, ссылки, структуры, вложенные массивы. Таблицу значений напрямую на тонкий клиент передать нельзя — её заменяют массивом структур.

Итог

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

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