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

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

Что представляет собой массив в 1С и как с ним работать

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

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

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

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

Как устроен массив и как он хранит данные

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

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

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

Создание массива и наполнение элементами

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

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

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

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

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

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

// Теперь в массиве три элемента, "ПервыйЭлемент" — с индексом 0

Удаление элементов выполняется методом Удалить(Индекс), а полная очистка — Очистить(). После очистки массив остаётся доступным для использования, просто его количество становится равным нулю.

Обход массива: циклы и чтение значений

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

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

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

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

КонецЦикла;

// Обратный обход для безопасного удаления

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

ОбратныйИнд = МассивТоваров.ВГраница() - Инд;

Если УсловиеУдаления(МассивТоваров[ОбратныйИнд]) Тогда

МассивТоваров.Удалить(ОбратныйИнд);

КонецЕсли;

КонецЦикла;

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

Полезные методы: поиск, границы, строки

Метод Найти(Значение) возвращает индекс первого найденного элемента или Неопределено, если элемента нет. Это стандартный способ проверки наличия значения в массиве.

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

Полезный приём — преобразование массива строк в одну строку и обратно. Функция СтрСоединить(Массив, Разделитель) склеивает элементы, а СтрРазделить(Строка, Разделитель) возвращает массив подстрок. Это удобно для формирования списков в сообщениях, условий запросов и логирования.

Передача массива в процедуры и функции

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

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

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

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

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

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

КоллекцияДоступ к элементамКогда подходит
МассивПо индексуУпорядоченный список, передача параметров, обход по порядку
СоответствиеПо ключуБыстрый поиск, подсчёт уникальных значений, кэширование
Список значенийПо индексу и значениюИнтерактивный выбор пользователем, значение + представление
Таблица значенийСтроки с колонкамиСтруктурированные данные, сортировка, свёртка, итоги

Эвристика простая: нужен порядок и простой перебор — массив; нужен поиск по ключу — соответствие; нужны колонки и агрегация — таблица значений. Комбинации тоже законны: массив структур часто заменяет «лёгкую» таблицу значений, когда не нужны методы свёртки и сортировки.

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

Массив

Простой упорядоченный список с доступом по индексу; поиск значения — линейный перебор

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

Быстрый поиск по ключу; порядок элементов не гарантирует смысловой последовательности задачи

Таблица значений

Колонки, сортировка, свёртка, итоги; избыточна для простых списков

Массивы в запросах и типовых сценариях

Одно из главных практических применений массива — передача списка значений в параметр запроса для условия В (&Список). Запрос автоматически разворачивает массив в перечисление значений. Это стандартный способ отбора по списку контрагентов, складов или видов документов.

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

Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура

|ГДЕ Ссылка В (&СписокТоваров)";

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

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

Массивы также используются в параметрах типовых методов платформы: например, при формировании печатных форм, настройке отборов динамических списков, работе с файлами (массив найденных файлов от НайтиФайлы). Знание типа возвращаемого значения помогает сразу писать корректный обход без лишних преобразований.

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

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

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

Массив.Количество() соответствует ожидаемому числу записей

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

Количество равно 0 — проверьте условия отбора или выборку-источник

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

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

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

Ошибка «Индекс за границами массива» — проверьте логику цикла

Результат Найти()
Норма

Возвращён индекс (число) или Неопределено при отсутствии

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

Код сравнивает результат с -1 или 0 — неверная трактовка возврата

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

Массив эффективен для последовательного обхода и добавления в конец. Операции вставки и удаления в середине требуют сдвига элементов и на больших объёмах работают медленнее. Если логика требует частых вставок в середину, стоит пересмотреть алгоритм или структуру данных.

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

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

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

Чем массив отличается от списка значений в 1С?

Список значений хранит пары «значение + представление», умеет сортироваться, показываться пользователю для выбора и поддерживает пометки. Массив — просто упорядоченный набор значений без представлений и интерактивных возможностей. Для внутренней логики обычно используют массив, для диалогов с пользователем — список значений.

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

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

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

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

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

Простое присваивание копирует только ссылку. Для независимой копии создайте новый массив и перенесите элементы циклом: Для Каждого Элемент Из ИсходныйМассив Цикл НовыйМассив.Добавить(Элемент) КонецЦикла. Учтите, что сами элементы-ссылки (например, вложенные массивы) по-прежнему будут общими.

Почему Найти() возвращает Неопределено, хотя значение в массиве есть?

Чаще всего причина в несовпадении типов или в сравнении ссылок: число 5 не равно строке "5", а две ссылки на разные объекты не равны даже при одинаковых реквизитах. Проверьте типы значений в массиве и тип искомого значения, при необходимости приведите их к одному виду.

Как передать массив в запрос для условия «В»?

Передайте массив как параметр запроса методом УстановитьПараметр("Имя", Массив) и используйте в тексте условие ГДЕ Поле В (&Имя). Запрос сам развернёт коллекцию. Аналогично можно передавать список значений и таблицу значений, но массив — самый лёгкий вариант.

Итог

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

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