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