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