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

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

Что такое массив в программировании 1С и как с ним работать

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

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

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

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

Как создать массив и добавить в него элементы

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

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

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

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

Товары.Вставить(0, "Первый элемент");

Конструктор принимает необязательный параметр — размерность массива. Вызов Новый Массив(10) создаст массив из десяти элементов, каждый из которых равен Неопределено. Такой приём полезен, когда количество элементов известно заранее и нужно заполнять их по индексу, а не добавлять последовательно. Для многомерных массивов размерности перечисляются через запятую: Новый Массив(3, 5) создаёт массив из трёх массивов по пять элементов.

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

1c
МассивСсылок = Новый Массив;
Для Каждого СтрокаТЧ Из Документ.Товары Цикл
    МассивСсылок.Добавить(СтрокаТЧ.Номенклатура);
КонецЦикла;
Сообщить(МассивСсылок.Количество());

Обращение к элементам по индексу и границы массива

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

Обращение к несуществующему индексу вызывает ошибку «Индекс находится за границами массива» и прерывает выполнение кода. Это самая частая ошибка начинающих разработчиков: цикл от 1 до Количество() вместо диапазона от 0 до ВГраница(), или обращение к первому элементу без проверки, что массив не пуст.

Безопасный шаблон обращения выглядит так: сначала проверка Если Массив.Количество() > 0 Тогда, и только потом чтение Массив[0]. Если индекс вычисляется динамически, добавьте условие Индекс <= Массив.ВГраница().

Перебор массива: цикл Для Каждого и цикл по индексу

Существует два основных способа перебрать элементы. Цикл Для Каждого Элемент Из Массив Цикл подходит, когда нужно просто обработать каждое значение и позиция элемента не важна. Он читается проще и исключает ошибки с индексами.

Для Каждого Товар Из МассивСсылок Цикл

Сообщить(Товар);

КонецЦикла;

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

Для Инд = 0 По Массив.ВГраница() Цикл

Если Массив[Инд] = Неопределено Тогда

Массив.Удалить(Инд);

Инд = Инд - 1; // компенсация сдвига

КонецЕсли;

КонецЦикла;

Типичные ошибки
01
Цикл от 1 до Количество() вместо 0 до ВГраница() — пропуск первого элемента и выход за границы массива
02
Удаление элементов внутри цикла Для Каждого — часть элементов пропускается из-за сдвига индексов
03
Обращение к Массив[0] без проверки Количество() — исключение на пустом массиве
04
Использование Найти() для ссылок разных типов без приведения — метод возвращает Неопределено, хотя значение в массиве есть

Основные методы массива: поиск, удаление, очистка

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

МетодЧто делаетЧто возвращает
Добавить(Значение)Добавляет элемент в конецДобавленное значение
Вставить(Индекс, Значение)Вставляет элемент в позицию—
Найти(Значение)Ищет первое вхождениеИндекс или Неопределено
Удалить(Индекс)Удаляет элемент по индексу—
Количество()Число элементовЧисло
ВГраница()Индекс последнего элементаЧисло
Очистить()Удаляет все элементы—

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

Массив или другие коллекции: что выбрать под задачу

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

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

Массив

Однотипные значения, важен порядок, перебор целиком. Ограничение: поиск значения — линейный перебор, медленно на больших объёмах

Соответствие

Нужен быстрый поиск по ключу и проверка уникальности. Ограничение: порядок элементов не гарантирован

Структура

Фиксированный набор именованных полей, как мини-объект. Ограничение: ключи задаются при создании, не подходит для списков

Список значений

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

Практическое правило: если внутри цикла вы вызываете Массив.Найти(), чтобы проверить уникальность при добавлении, замените массив на соответствие — проверка Соответствие[Ключ] = Неопределено работает на порядки быстрее при тысячах элементов. А вот для передачи списка ссылок в запрос через параметр &СписокСсылок с условием В (&СписокСсылок) массив — стандартный и удобный вариант.

Маршрут решения

Как выбрать действие

Нужно передать список ссылок как параметр запросаИспользуйте массив — он напрямую принимается конструкцией В (&Параметр)
Нужно часто проверять наличие значения в набореИспользуйте соответствие вместо массива с Найти()
Нужно сохранить порядок и перебрать всё по очередиМассив — оптимальный вариант
Нужно показать список пользователю с флажкамиИспользуйте список значений с пометками

Типовые сценарии использования массивов в 1С

Передача списка в запрос

Самый частый сценарий — отбор данных по списку значений. Массив ссылок передаётся в запрос как параметр, а в тексте запроса используется оператор В. Это избавляет от цикла с отдельными запросами по каждому элементу и резко ускоряет обработку.

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Документ.Реализация

|ГДЕ Контрагент В (&СписокКонтрагентов)";

Запрос.УстановитьПараметр("СписокКонтрагентов", МассивКонтрагентов);

Накопление результатов обхода

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

Разбор строк и работа с файлами

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

Порядок действий при отладке массива
  1. 1
    Выведите Массив.Количество() сразу после заполнения — убедитесь, что массив не пуст
  2. 2
    Проверьте тип первого элемента через ТипЗнч(Массив[0]) — типы должны соответствовать ожиданиям
  3. 3
    Пройдите циклом с выводом индекса и значения каждого элемента
  4. 4
    Если массив передаётся в запрос, проверьте результат через консоль запросов с тем же параметром

Производительность и ограничения

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

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

Контрольные точки

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

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

Совпадает с ожидаемым числом записей источника

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

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

Обращение по индексу
Норма

Индекс в диапазоне от 0 до ВГраница()

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

Ошибка «Индекс за границами массива»

Поиск через Найти()
Норма

Возвращает числовой индекс

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

Возвращает Неопределено при заведомо существующем значении — проверьте типы

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

Чем массив отличается от таблицы значений в 1С?

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

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

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

Как удалить дубликаты из массива?

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

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

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

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

У массива нет собственного метода сортировки. Стандартный приём — перенести значения в список значений, вызвать его метод СортироватьПоЗначению(), а затем выгрузить обратно в массив. Альтернатива — загрузить значения в таблицу значений и отсортировать её, что удобно при сортировке по нескольким критериям.

Почему цикл Для Каждого пропускает элементы при удалении?

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

Итог

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

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