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

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

Массив в 1С: что это такое и как с ним работать

Что такое массив в 1С, как объявить, заполнить и перебрать элементы. Примеры кода на встроенном языке, типичные ошибки и отличия от списка значений.

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

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

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

Что такое массив и чем он отличается от других коллекций

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

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

Массив и другие коллекции 1С

Массив

Доступ по числовому индексу с нуля. Быстрый, минимум служебных данных. Нет поиска по значению из коробки, кроме метода Найти().

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

Элементы имеют представление и пометку, удобен для интерактивного выбора. Тяжелее массива, индексация тоже с нуля.

Структура

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

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

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

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

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

1c
// Пустой массив
Сотрудники = Новый Массив;
Сотрудники.Добавить("Иванов");
Сотрудники.Добавить("Петров");

// Массив с заданным размером (элементы = Неопределено)
Оценки = Новый Массив(5);

// Двумерный массив 3x4
Матрица = Новый Массив(3, 4);

Метод Установить(Индекс, Значение) заменяет значение существующего элемента, а Очистить() удаляет все элементы. Для удаления одного элемента используется Удалить(Индекс) — при этом все последующие элементы сдвигаются, и их индексы уменьшаются на единицу.

Обратите внимание: если массив создан с указанием размера, например Новый Массив(10), его элементы заполнены значением Неопределено, а метод Добавить() добавит новые элементы после десятого, увеличив размер до одиннадцати. Это неочевидное поведение часто приводит к лишним пустым элементам в начале коллекции.

Как обратиться к элементам и перебрать массив

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

1c
// Перебор без индекса
Для Каждого Элемент Из Массив Цикл
	Сообщить(Элемент);
КонецЦикла;

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

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

Поиск, сортировка и преобразование массива

Для поиска элемента по значению используется метод Найти(Значение) — он возвращает индекс первого найденного элемента или Неопределено, если значения нет. Сравнение выполняется строго, с учётом типа: строка «10» и число 10 — разные значения.

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

1c
// Сортировка массива через список значений
Список = Новый СписокЗначений;
Список.ЗагрузитьЗначения(Массив);
Список.СортироватьПоЗначению(НаправлениеСортировки.Возр);
Массив = Список.ВыгрузитьЗначения();

// Соединение элементов в строку
СтрокаРезультат = СтрСоединить(Массив, "; ");

Метод СтрСоединить() объединяет элементы массива в строку через разделитель — удобно для формирования сообщений и условий запросов. Обратная операция — СтрРазделить(Строка, Разделитель) — возвращает массив подстрок. Эта пара методов покрывает большинство задач разбора и сборки строк.

Передача массива в запрос и между процедурами

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

1c
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	Номенклатура.Ссылка КАК Ссылка
|ИЗ
|	Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|	Номенклатура.Ссылка В (&СписокСсылок)";
Запрос.УстановитьПараметр("СписокСсылок", МассивСсылок);
Результат = Запрос.Выполнить();

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

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

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

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

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

Как проверить результат и выбрать подходящую коллекцию

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

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

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

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

Массив.Количество() равно ожидаемому числу

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

Лишние элементы со значением Неопределено — вероятно, массив создан с указанием размера

Перебор в цикле
Норма

Цикл обрабатывает все элементы ровно один раз

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

Элементы пропускаются или обрабатываются дважды — проверьте удаление внутри цикла

Поиск значения
Норма

Найти() возвращает корректный индекс или Неопределено

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

Значение есть в массиве, но не находится — несовпадение типов, например строка вместо числа

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Чаще всего причина в несовпадении типов: число 10 и строка «10» для метода Найти() — разные значения. Проверьте типы элементов и искомого значения. Также учтите, что для ссылок сравнение идёт по уникальному идентификатору, а для строк — с учётом регистра.

Можно ли использовать массив в качестве параметра функции и вернуть его обратно?

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