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

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

Что такое массив данных в 1С и как с ним работать

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

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

Главная особенность массива в 1С — нумерация элементов начинается с нуля, а не с единицы, что часто становится источником ошибок у начинающих разработчиков. Элементы массива могут иметь разные типы: в одном массиве допустимо хранить числа, строки, ссылки на объекты и даже другие массивы. Размер массива не фиксируется жёстко — его можно расширять методом Добавить() или задать заранее через конструктор.

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

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

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

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

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

Как создать массив и заполнить его данными

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

bsl
// Пустой массив
СписокДокументов = Новый Массив();

// Добавление элементов
СписокДокументов.Добавить(ДокументСсылка);
СписокДокументов.Вставить(0, ПервыйДокумент); // в начало списка

// Массив заданного размера
Данные = Новый Массив(10); // 10 неопределённых элементов

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

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

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

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

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

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

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

Как обойти массив в цикле

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

bsl
// Вариант 1: обход значений
Для Каждого Документ Из СписокДокументов Цикл
    ОбработатьДокумент(Документ);
КонецЦикла;

// Вариант 2: обход по индексам
Для Индекс = 0 По СписокДокументов.ВГраница() Цикл
    Сообщить("Элемент " + Индекс + ": " + СписокДокументов[Индекс]);
КонецЦикла;

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

Перед обходом полезно проверять, что массив вообще содержит элементы: Если Массив.Количество() = 0 Тогда .... Это защищает от лишней работы и делает поведение кода предсказуемым, когда выборка оказалась пустой.

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

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

Сравнение коллекций 1С

Массив

Упорядоченный список с доступом по индексу. Подходит для передачи списков ссылок и параметров. Ограничение: медленный поиск значения методом Найти().

Структура

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

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

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

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

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

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

Многоколоночные данные с типизированными колонками. Подходит для записей вида «номенклатура + количество + сумма». Тяжелее массива по ресурсам.

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

Маршрут решения

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

Нужно передать в процедуру список ссылок на документыИспользуйте массив — это стандартный приём в типовых конфигурациях
Нужно в цикле проверять, встречалось ли значение раньшеИспользуйте соответствие с проверкой Соответствие[Значение] = Неопределено
Нужно хранить по каждой строке несколько полейИспользуйте таблицу значений с типизированными колонками
Пользователь должен отметить нужные позиции флажкамиИспользуйте список значений с пометками

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

Большинство ошибок с массивами связано с индексацией и изменением коллекции во время обхода. Они проявляются либо как явное исключение «Индекс находится за границами массива», либо как тихая порча логики обработки.

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

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

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

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

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

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

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

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

Обрабатываются Массив[0] и Массив[ВГраница()] без ошибок

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

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

Поведение на пустом массиве
Норма

Цикл не выполняется, код завершается без исключений

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

Обращение к элементу при Количество() = 0 вызывает ошибку

Удаление элементов
Норма

После удаления остальные элементы обработаны полностью

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

Часть элементов пропущена из-за сдвига индексов

Производительность поиска
Норма

Поиск по большому списку выполняется через соответствие

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

Метод Найти() вызывается в цикле по массиву из тысяч элементов

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

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

Итог

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

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

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

Сколько элементов может содержать массив в 1С?

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

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

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

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

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

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

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

Передаётся ли массив между клиентом и сервером?

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

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

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