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

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

Зачем нужен массив в 1С и как с ним работать

Зачем нужен массив в 1С: хранение списков данных, перебор элементов, методы Добавить, Найти, Удалить. Примеры кода, типичные ошибки и выбор между массивом и другими коллекциями.

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

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

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

Как устроен массив во встроенном языке 1С

Массив создаётся конструктором Новый Массив или литералом в квадратных скобках. Индексация начинается с нуля: первый элемент имеет индекс 0, последний — Массив.Количество() - 1. Это частый источник ошибок у тех, кто пришёл из учётных задач, где привычна нумерация с единицы.

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

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

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

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

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

Метод ВГраница() возвращает индекс последнего элемента и удобен в циклах Для. Для пустого массива он вернёт -1, что корректно отработает в условии цикла — проходов просто не будет.

bsl
СписокДокументов = Новый Массив;
СписокДокументов.Добавить(ДокументСсылка);

Если СписокДокументов.Найти(ДокументСсылка) = Неопределено Тогда
    СписокДокументов.Добавить(ДокументСсылка);
КонецЕсли;

Для Каждого Док Из СписокДокументов Цикл
    // обработка элемента
КонецЦикла;

Где массив применяется на практике

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

Самый частый сценарий — отбор по списку в запросе. Собираете массив ссылок, передаёте его как параметр и используете оператор В (&СписокСсылок). Платформа сама разворачивает массив в условие выборки. Это корректнее и быстрее, чем построение запроса в цикле по каждому элементу.

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

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

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

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

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

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

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

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

Массив

Упорядоченный список с доступом по индексу. Подходит для перебора, передачи в запросы, разбора строк. Поиск по значению — линейный.

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

Пары ключ-значение с быстрым поиском по ключу. Подходит для проверки уникальности и кэширования. Порядок обхода не гарантирован в логике задачи.

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

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

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

Структура с колонками для многомерных данных. Подходит, когда у элемента несколько полей, а не одно значение.

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

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

Выход за границы массива — ошибка времени выполнения, которая прерывает код. Возникает при обращении к индексу, равному Количество() (нумерация с нуля!), или при обращении к пустому массиву без проверки. Перед доступом по вычисленному индексу всегда проверяйте его диапазон.

Удаление элементов внутри прямого цикла Для Каждого — классическая ошибка с неочевидными последствиями: элементы пропускаются или обход ломается. Если нужно удалять по условию, идите циклом Для от конца к началу (Пока Индекс >= 0 ... Индекс = Индекс - 1) или собирайте элементы для удаления в отдельный массив и удаляйте после основного цикла.

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

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

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

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

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

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

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

Размер массива после заполнения
Норма

Массив.Количество() совпадает с ожидаемым числом элементов

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

Количество меньше ожидаемого — часть веток заполнения не отработала

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

Индекс от 0 до Массив.Количество() - 1

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

Индекс равен Количество() или отрицательный — будет исключение

Содержимое перед передачей в запрос
Норма

Все элементы одного типа, нет Неопределено

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

Смешанные типы или пустые значения — риск неверного отбора

Ограничения и когда массив не подходит

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

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

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

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

Используйте условие Если Массив.Количество() = 0 Тогда. Отдельного метода проверки на пустоту у массива нет. Не сравнивайте массив с Неопределено — созданный конструктором массив всегда является объектом, даже если пуст.

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

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

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

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

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

Да, это штатный сценарий: Запрос.УстановитьПараметр("Список", Массив) и условие ГДЕ Ссылка В (&Список). Платформа разворачивает массив в список значений условия. Следите, чтобы массив не был пустым, если логика не предполагает выборку по пустому списку.

Почему Найти не находит элемент, который точно есть в массиве?

Чаще всего причина в сравнении: для ссылок сравниваются сами ссылки, а не реквизиты; для строк учитываются регистр и пробелы; для чисел — точное совпадение типа и значения. Проверьте типы элементов и искомого значения через ТипЗнч и приведите их к одному виду перед поиском.

Что быстрее: перебор массива или запрос к базе?

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

Итог

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

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