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

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

Массив в 1С: как он выглядит и как с ним работать

Как выглядит массив в 1С: объявление, обращение по индексу, методы Добавить, Вставить, Удалить, Количество. Примеры кода, ошибки и перебор в цикле.

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

Визуально массив «выглядит» как упорядоченный список: каждый элемент занимает позицию с индексом от нуля до Количество − 1. В коде массив создаётся конструктором Новый Массив(), а в отладчике конфигуратора отображается в табло как раскрывающийся список элементов с индексами и значениями. Именно в отладчике проще всего увидеть, «как выглядит» массив на практике.

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

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

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

Типичный фрагмент кода с массивом выглядит так:

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

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

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

Товары.Добавить(150); // допустимо, но требует осторожности

Сообщить(Товары[0]); // выведет "Номенклатура 1"

Сообщить(Товары.Количество()); // выведет 3

Здесь видно главное: индексация начинается с нуля, обращение к элементу выполняется через квадратные скобки, а размер массива меняется динамически по мере добавления элементов. Заранее объявлять тип или длину не требуется.

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

Как увидеть массив в отладчике

Самый наглядный способ понять, как выглядит массив, — остановиться точкой останова и посмотреть его в табло выражений. Для этого запустите конфигурацию в режиме отладки, поставьте точку останова на строке после заполнения массива и добавьте переменную в табло (клавиша Shift+F9 или пункт контекстного меню).

В табло массив отображается как строка с типом «Массив» и количеством элементов. По двойному щелчку открывается окно, где каждый элемент показан отдельной строкой: индекс, значение и тип значения. Так можно проверить порядок элементов, наличие Неопределено и фактическое содержимое после обработки.

Как посмотреть массив в отладчике
  1. 1
    Поставьте точку останова на строке после заполнения массива
  2. 2
    Запустите отладку и дождитесь остановки
  3. 3
    Выделите переменную и нажмите Shift+F9, чтобы добавить её в табло
  4. 4
    Дважды щёлкните по значению — откроется список элементов с индексами
  5. 5
    Проверьте количество, порядок и типы значений элементов

Если массив большой, просматривать его глазами утомительно. В таких случаях полезно вычислить в табло выражение Массив.Количество() или обратиться к конкретному индексу, например Массив[5], чтобы проверить отдельный элемент без прокрутки всего списка.

Основные методы массива

Встроенный язык предоставляет компактный набор методов для работы с массивом. Знать их нужно наизусть, потому что они встречаются практически в каждом модуле.

МетодЧто делаетПример
Добавить(Значение)Добавляет элемент в конецМ.Добавить("А")
Вставить(Индекс, Значение)Вставляет элемент в позицию, сдвигая остальныеМ.Вставить(0, "А")
Удалить(Индекс)Удаляет элемент по индексуМ.Удалить(2)
Количество()Возвращает число элементовН = М.Количество()
Найти(Значение)Возвращает индекс или НеопределеноИ = М.Найти("А")
Очистить()Удаляет все элементыМ.Очистить()
ВГраница()Индекс последнего элемента (Количество − 1)М[М.ВГраница()]
Получить(Индекс)Чтение элемента, аналог скобокМ.Получить(0)

Особое внимание обратите на метод Найти(): если значение не найдено, он возвращает Неопределено, а не −1, как в некоторых языках. Поэтому проверку результата нужно писать именно через сравнение с Неопределено.

Перебор элементов массива

Существует два основных способа обойти массив, и у каждого своё назначение. Первый — цикл Для Каждого, когда индекс не важен:

Для Каждого Элемент Из Товары Цикл

Сообщить(Элемент);

КонецЦикла;

Второй — цикл со счётчиком, когда нужен индекс, например для изменения элемента или вывода номера позиции:

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

Товары[Инд] = СокрЛП(Товары[Инд]);

КонецЦикла;

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

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

РеальныйИндекс = -Инд;

Если Не ЗначениеЗаполнено(Товары[РеальныйИндекс]) Тогда

Товары.Удалить(РеальныйИндекс);

КонецЕсли;

КонецЦикла;

Массив по сравнению с другими коллекциями 1С

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

Какую коллекцию выбрать

Массив

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

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

Когда нужен список с представлениями, пометками и сортировкой; удобен для интерактивного выбора и передачи в элементы формы.

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

Когда нужен быстрый поиск по ключу (аналог словаря). Порядок элементов не гарантирован.

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

Когда данные имеют структуру строк и колонок, нужны сортировка, поиск по нескольким полям, свёртка и итоги.

Структура

Когда набор полей фиксирован и известен заранее, а обращение идёт по имени свойства.

Частая ситуация: массив используют для поиска дублей или проверки вхождения значения в цикле. На тысячах элементов это заметно тормозит, потому что Найти() каждый раз перебирает массив заново. В таких случаях правильнее перевести данные в Соответствие, где проверка ключа выполняется быстро.

Типичные ошибки при работе с массивом

Большинство проблем с массивами связано с индексами и нулевой базой нумерации. Вторая группа ошибок — непонимание передачи по ссылке и смешение типов элементов.

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

Отдельно стоит упомянуть пустой массив. Вызов Массив[0] для пустого массива — это ошибка выполнения, которая прервёт обработку. Перед обращением по индексу всегда проверяйте Количество(), особенно если массив заполняется результатом запроса или данными извне.

Практические приёмы и ограничения

Массив можно передать в параметр запроса и использовать в условии В (&СписокСсылок) — это стандартный способ отфильтровать выборку по списку документов или номенклатуры. Запрос примет массив напрямую, дополнительных преобразований не требуется.

Массивы бывают вложенными: элементом массива может быть другой массив. Обращение выглядит как Матрица[0][1]. Так моделируют таблицы, но для табличных данных почти всегда удобнее ТаблицаЗначений — она даёт именованные колонки и встроенные методы поиска.

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

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

Как проверить корректность работы с массивом

Первый и последний элемент
Норма

Массив[0] и Массив[Массив.ВГраница()] возвращают ожидаемые значения

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

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

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

Возвращён индекс, либо Неопределено обработано отдельной веткой

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

Код сравнивает результат с -1 или 0 без проверки на Неопределено

Массив после вызова процедуры
Норма

Содержимое соответствует ожиданиям вызывающего кода

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

Массив неожиданно очищен или дополнен — побочный эффект передачи по ссылке

Итог

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

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

Частые вопросы о массивах в 1С

С чего начинается индексация массива в 1С?

С нуля. Первый элемент — Массив[0], последний — Массив[Массив.ВГраница()]. Это отличается от нумерации строк в некоторых коллекциях СКД и запросов, поэтому при переносе логики проверяйте базу индексации.

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

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

Как узнать, есть ли значение в массиве?

Методом Найти(): он возвращает индекс первого вхождения или Неопределено, если значения нет. Типовая проверка: Если Массив.Найти(Значение) <> Неопределено Тогда ... КонецЕсли. Для частых проверок на больших объёмах лучше использовать Соответствие.

Чем массив отличается от фиксированного массива?

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

Как быстро очистить массив?

Методом Очистить() — он удаляет все элементы, сохраняя сам объект. Альтернатива — присвоить переменной Новый Массив(), но тогда старая ссылка останется у других переменных, которые держали тот же массив, а Очистить() изменит общий объект для всех ссылок.

Можно ли отсортировать массив штатными средствами?

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