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

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

Как задать массив в 1С: практическое руководство с примерами кода

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

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

Задать массив в 1С можно несколькими способами: создать пустой массив и заполнить его программно, сразу указать размерность, получить массив из результата запроса или из строки через разложение по разделителю. Каждый вариант имеет свои ограничения и типичные сценарии применения, которые разобраны ниже.

Материал ориентирован на встроенный язык 1С (версии платформы 8.3 и выше). Все примеры кода можно выполнять как на сервере, так и на клиенте, если иное не указано отдельно.

Создание пустого массива и массива заданного размера

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

Если заранее известно нужное количество элементов, размерность передают параметром. При этом все ячейки инициализируются значением Неопределено:

// Пустой массив

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

// Массив из 10 элементов, каждый равен Неопределено

МассивФиксированный = Новый Массив(10);

// Многомерный массив 3 на 5

Матрица = Новый Массив(3, 5);

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

Заполнение массива значениями

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

МассивСкладов = Новый Массив;

МассивСкладов.Добавить("Основной склад");

МассивСкладов.Добавить("Резервный склад");

МассивСкладов.Вставить(0, "Транзитный склад");

// Изменение значения по индексу

МассивСкладов[1] = "Центральный склад";

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

Обход массива: два рабочих способа

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

// Вариант 1: обход без индекса

Для Каждого Склад Из МассивСкладов Цикл

Сообщить(Склад);

КонецЦикла;

// Вариант 2: обход по индексам

Для Индекс = 0 По МассивСкладов.ВГраница() Цикл

Сообщить("Позиция " + Индекс + ": " + МассивСкладов[Индекс]);

КонецЦикла;

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

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

Получение массива из запроса и из строки

Частый сценарий — задать массив на основе данных информационной базы. Результат запроса выгружается в таблицу значений, а нужная колонка превращается в массив методом ВыгрузитьКолонку(). Это стандартный приём, например, для передачи списка ссылок в параметр запроса или в отбор динамического списка.

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура

|ГДЕ НЕ ПометкаУдаления";

МассивСсылок = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");

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

Для разбора строки с разделителями удобна функция СтрРазделить(), которая возвращает массив подстрок. Обратное действие выполняет СтрСоединить():

МассивКодов = СтрРазделить("АРТ-001;АРТ-002;АРТ-003", ";");

СтрокаОбратно = СтрСоединить(МассивКодов, ", ");

Поиск, проверка и удаление элементов

Метод Найти(Значение) возвращает индекс первого найденного элемента либо Неопределено, если значения в массиве нет. Перед обращением по индексу всегда проверяйте результат поиска — обращение по несуществующему индексу вызывает ошибку выполнения.

Индекс = МассивСкладов.Найти("Резервный склад");

Если Индекс <> Неопределено Тогда

МассивСкладов.Удалить(Индекс);

КонецЕсли;

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

Массив, фиксированный массив и список значений: что выбрать

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

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

Массив

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

ФиксированныйМассив

Неизменяемая версия массива. Используется, когда состав должен быть защищён от изменений, например в параметрах клиентских процедур.

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

Хранит значение, представление и пометку. Удобен для отборов, диалогов выбора и передачи списков в запросы.

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

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

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

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

Проверка результата и отладка

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

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

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

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

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

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

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

Типы элементов
Норма

Все элементы имеют ожидаемый тип, проверяется через ТипЗнч()

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

Встречаются Неопределено или значения другого типа

Обход в цикле
Норма

Цикл Для Каждого обрабатывает все элементы без ошибок

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

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

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

Итог

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

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

Частые вопросы

Как задать массив в 1С одной строкой с готовыми значениями?

Конструктор Новый Массив не принимает значения элементов напрямую, поэтому обычно пишут несколько вызовов Добавить(). Альтернатива — разбить строку: Массив = СтрРазделить("1,2,3", ",") вернёт массив из трёх строковых элементов. Для чисел значения потребуется дополнительно преобразовать.

Чем отличается Количество() от ВГраница()?

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

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

Да. Массив передаётся как параметр запроса и используется с оператором В: ГДЕ Номенклатура В (&СписокНоменклатуры). Это стандартный способ отбора по списку значений без построения длинных условий через ИЛИ.

Как скопировать массив, чтобы изменения не затронули оригинал?

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

Как отсортировать массив в 1С?

Встроенного метода сортировки у массива нет. Практичные варианты: перенести значения в список значений и вызвать СортироватьПоЗначению(), либо выгрузить в таблицу значений и отсортировать её. Для массива ссылок удобно выполнить сортировку запросом с УПОРЯДОЧИТЬ ПО и получить упорядоченный результат обратно.

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

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