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