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