Разработка и Конфигурация · 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, и цикл просто не выполнится.
- 1Объявите переменную и создайте массив: МассивДанных = Новый Массив;
- 2Добавьте элементы методом Добавить() или заполните массив в цикле из источника данных.
- 3Проверьте количество элементов через МассивДанных.Количество().
- 4Обойдите массив циклом Для Каждого и убедитесь, что значения обрабатываются корректно.
Получение массива из запроса и из строки
Частый сценарий — задать массив на основе данных информационной базы. Результат запроса выгружается в таблицу значений, а нужная колонка превращается в массив методом ВыгрузитьКолонку(). Это стандартный приём, например, для передачи списка ссылок в параметр запроса или в отбор динамического списка.
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура
|ГДЕ НЕ ПометкаУдаления";
МассивСсылок = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
Обратная задача — передать массив в запрос для отбора по списку значений. Запросы в 1С умеют работать с массивами напрямую через оператор В (&МассивЗначений), что избавляет от построения длинных условий через ИЛИ.
Для разбора строки с разделителями удобна функция СтрРазделить(), которая возвращает массив подстрок. Обратное действие выполняет СтрСоединить():
МассивКодов = СтрРазделить("АРТ-001;АРТ-002;АРТ-003", ";");
СтрокаОбратно = СтрСоединить(МассивКодов, ", ");
Поиск, проверка и удаление элементов
Метод Найти(Значение) возвращает индекс первого найденного элемента либо Неопределено, если значения в массиве нет. Перед обращением по индексу всегда проверяйте результат поиска — обращение по несуществующему индексу вызывает ошибку выполнения.
Индекс = МассивСкладов.Найти("Резервный склад");
Если Индекс <> Неопределено Тогда
МассивСкладов.Удалить(Индекс);
КонецЕсли;
Удаление выполняется методом Удалить(Индекс), полная очистка — методом Очистить(). Для проверки наличия значения без получения индекса удобно сравнить результат Найти() с Неопределено. Если нужно просто узнать, пуст ли массив, достаточно проверить Массив.Количество() = 0.
Массив, фиксированный массив и список значений: что выбрать
В 1С есть несколько похожих коллекций, и выбор между ними влияет на поведение кода. Обычный массив изменяем и гибок. Фиксированный массив (Новый ФиксированныйМассив(Массив)) нельзя изменить после создания — он используется там, где данные не должны меняться, например в параметрах обработчиков ожидания. Список значений дополнительно хранит представление и пометку каждого элемента, поэтому подходит для интерактивных отборов и передачи в запросы.
Сравнение коллекций
Универсальный изменяемый набор значений с доступом по индексу. Подходит для большинства задач обработки данных в коде.
Неизменяемая версия массива. Используется, когда состав должен быть защищён от изменений, например в параметрах клиентских процедур.
Хранит значение, представление и пометку. Удобен для отборов, диалогов выбора и передачи списков в запросы.
Именованные колонки и строки. Выбирайте, когда у элемента несколько связанных полей, а не одно значение.
Если по ходу работы нужно часто проверять наличие значения, массив с линейным поиском через Найти() может стать узким местом на больших объёмах. В таких случаях значения выгоднее хранить в соответствии, где проверка наличия ключа выполняется быстрее.
Проверка результата и отладка
Быстрый способ убедиться, что массив задан правильно, — вывести его состав в цикле через Сообщить() или посмотреть переменную в отладчике конфигуратора (табло, Alt+F9). В табло массив раскрывается как список элементов с индексами и типами значений, что позволяет сразу увидеть лишние Неопределено или неверный порядок.
Как проверить результат
Массив.Количество() соответствует ожидаемому числу значений
Количество 0 или больше ожидаемого — проверьте логику заполнения
Все элементы имеют ожидаемый тип, проверяется через ТипЗнч()
Встречаются Неопределено или значения другого типа
Цикл Для Каждого обрабатывает все элементы без ошибок
Ошибка «Индекс за границами» или пропуск элементов при удалении в цикле
При передаче массива между клиентом и сервером помните об ограничении: на тонком клиенте доступны не все типы значений, и массив, содержащий, например, объекты типа Запрос или ТабличныйДокумент в неподходящем контексте, вызовет ошибку сериализации. Передавайте между контекстами только простые типы, ссылки и сериализуемые коллекции.
Что важно запомнить
Массив задаётся через Новый Массив, заполняется методом Добавить(), обходится циклом Для Каждого или по индексам до ВГраница(). Поиск — через Найти() с проверкой на Неопределено, удаление в цикле — только с конца. Для неизменяемых наборов берите ФиксированныйМассив, для отборов с представлениями — СписокЗначений.
Частые вопросы
Как задать массив в 1С одной строкой с готовыми значениями?
Конструктор Новый Массив не принимает значения элементов напрямую, поэтому обычно пишут несколько вызовов Добавить(). Альтернатива — разбить строку: Массив = СтрРазделить("1,2,3", ",") вернёт массив из трёх строковых элементов. Для чисел значения потребуется дополнительно преобразовать.
Чем отличается Количество() от ВГраница()?
Количество() возвращает число элементов, а ВГраница() — индекс последнего элемента, то есть на единицу меньше. В циклах по индексам корректно использовать ВГраница(): для пустого массива он вернёт -1, и цикл безопасно не выполнится.
Можно ли передать массив в запрос 1С?
Да. Массив передаётся как параметр запроса и используется с оператором В: ГДЕ Номенклатура В (&СписокНоменклатуры). Это стандартный способ отбора по списку значений без построения длинных условий через ИЛИ.
Как скопировать массив, чтобы изменения не затронули оригинал?
Прямого метода копирования у обычного массива нет. Создайте новый массив и перенесите элементы в цикле, либо используйте промежуточное преобразование через фиксированный массив. Помните: присваивание Массив2 = Массив1 копирует ссылку, а не содержимое — оба имени будут указывать на один объект.
Как отсортировать массив в 1С?
Встроенного метода сортировки у массива нет. Практичные варианты: перенести значения в список значений и вызвать СортироватьПоЗначению(), либо выгрузить в таблицу значений и отсортировать её. Для массива ссылок удобно выполнить сортировку запросом с УПОРЯДОЧИТЬ ПО и получить упорядоченный результат обратно.
Почему возникает ошибка «Индекс находится за границами массива»?
Ошибка возникает при обращении к элементу, которого нет: пустой массив, индекс равен Количество() вместо ВГраница(), либо элементы были удалены в процессе обхода. Проверяйте размер массива перед обращением и результат Найти() на Неопределено перед использованием индекса.