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