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

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

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

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

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

Типичная задача выглядит так: нужно собрать список ссылок на номенклатуру, передать его в запрос как параметр и получить остатки сразу по всем позициям. Без массива пришлось бы перебирать элементы по одному и выполнять десятки запросов. С массивом достаточно одного обращения к базе с условием В (&СписокТоваров).

Материал рассчитан на тех, кто работает в конфигураторе 1С:Предприятие 8.3 и пишет или дорабатывает код в модуле формы, общем модуле или модуле объекта. Все примеры выполнимы в типовых конфигурациях и в пустой базе для экспериментов.

Что такое массив в 1С и когда его применять

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

Массив уместен, когда важен порядок элементов и нужен быстрый доступ по индексу. Если требуется проверять уникальность значений или искать соответствие «ключ — значение», лучше подходят соответствие и структура. Если нужен список, который пользователь увидит и отредактирует в интерфейсе, — список значений.

Типовые сценарии применения: передача списка ссылок в запрос или виртуальную таблицу, сбор строк для последующего соединения через СтрСоединить, хранение параметров обработки, возврат нескольких значений из функции в виде структурированного набора.

Создание массива конструктором Новый Массив

Базовый синтаксис: МойМассив = Новый Массив; — создаёт пустой массив без элементов. Если заранее известно количество элементов, можно указать размерность: Новый Массив(10) создаст массив из десяти элементов, каждый из которых равен Неопределено. Для двумерного массива указывают два измерения: Новый Массив(3, 5).

1c
МассивТоваров = Новый Массив;
МассивТоваров.Добавить(СсылкаНаТовар1);
МассивТоваров.Добавить(СсылкаНаТовар2);

Фиксированный = Новый Массив(5); // 5 элементов, каждый Неопределено
Фиксированный[0] = "Первый";

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

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

Добавление, вставка и удаление элементов

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

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

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

Обход массива: цикл Для Каждого и обход по индексу

Самый читаемый способ — цикл Для Каждого Элемент Из Массив Цикл ... КонецЦикла;. Он подходит, когда индекс не нужен, а требуется только значение элемента. Внутри цикла переменная получает копию простого значения или ссылку на объект, поэтому присваивание нового значения переменной цикла не изменит сам элемент массива.

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

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

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

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

Передача массива в запрос и типовые сценарии

Одно из главных применений массива — параметр запроса с оператором В. Массив присваивается параметру напрямую: Запрос.УстановитьПараметр(\"СписокТоваров\", МассивТоваров);, а в тексте запроса пишется условие ГДЕ Номенклатура В (&СписокТоваров). Платформа сама разворачивает массив в список значений.

Второй частый сценарий — сбор массива из выборки запроса для дальнейшей обработки без повторных обращений к базе. Выгрузка результата в таблицу значений с последующим ВыгрузитьКолонку(\"Ссылка\") сразу даёт массив ссылок нужной колонки.

Третий сценарий — передача данных между процедурами и между клиентом и сервером. Массив сериализуется платформой, поэтому его можно возвращать из серверной функции на клиент, если все элементы сериализуемы (ссылки, примитивы, структуры). Объекты типа «ДокументОбъект» передавать нельзя — только ссылки.

Порядок действий: массив как параметр запроса
  1. 1
    Создайте пустой массив конструктором Новый Массив
  2. 2
    Заполните его ссылками в цикле выборки или из таблицы значений методом ВыгрузитьКолонку
  3. 3
    В тексте запроса напишите условие с оператором В (&ИмяПараметра)
  4. 4
    Вызовите Запрос.УстановитьПараметр и передайте массив
  5. 5
    Выполните запрос и проверьте, что результат не пустой

Типичные ошибки и ограничения

Самая частая ошибка — обращение к несуществующему индексу. Выражение Массив[Массив.Количество()] всегда вызывает ошибку, потому что последний допустимый индекс — Количество() минус один. Перед обращением по индексу проверяйте границы через ВГраница().

Вторая группа ошибок связана с ожиданием уникальности: массив не контролирует дубли. Если добавить одну и ту же ссылку дважды, в массиве будет два одинаковых элемента, что исказит результаты запросов с соединениями. Для исключения дублей перед добавлением проверяйте Если Массив.Найти(Значение) = Неопределено Тогда либо используйте соответствие как промежуточный фильтр.

Типичные ошибки
01
Обращение Массив[Количество()] вместо ВГраница() — ошибка индекса за границами массива
02
Удаление элементов в прямом цикле — пропуск соседних элементов
03
Ожидание уникальности — массив хранит дубли, результаты запросов задваиваются
04
Попытка изменить элемент через переменную цикла Для Каждого — исходный массив не меняется
05
Передача массива с объектами (не ссылками) с сервера на клиент — ошибка сериализации

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

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

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

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

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

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

Меньше ожидаемого — фильтр в цикле отсек часть данных, больше — дубли

Запрос с параметром-массивом
Норма

Результат не пустой, записей столько, сколько ожидалось по списку

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

Пустой результат при непустом массиве — проверьте тип элементов и имя параметра

Обход без ошибок
Норма

Цикл завершился без исключений, все элементы обработаны

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

Ошибка индекса — где-то выход за ВГраница()

Массив или другая коллекция: как выбрать

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

Сравнение вариантов

Массив

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

Соответствие

Быстрый поиск по ключу и контроль уникальности ключей. Не сохраняет гарантированный порядок обхода

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

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

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

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

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

Если массив собирается из выборки запроса и потом снова передаётся в другой запрос, часто выгоднее вообще отказаться от массива: объедините оба условия в одном запросе через соединение или вложенный запрос. Меньше обращений к базе — быстрее код и проще отладка.
ПЗ
Практическое замечание
Итог

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

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

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

Как создать пустой массив в 1С?

Достаточно написать МойМассив = Новый Массив; без параметров. Получится массив с нулём элементов, готовый к наполнению методом Добавить(). Проверить пустоту можно условием Если МойМассив.Количество() = 0 Тогда.

Как узнать, есть ли значение в массиве?

Используйте метод Найти: Если Массив.Найти(ИскомоеЗначение) <> Неопределено Тогда — значение присутствует. Метод возвращает индекс первого вхождения или Неопределено. Помните, что поиск линейный и на больших массивах внутри цикла работает медленно.

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

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

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

Простого встроенного метода нет. Рабочий приём: создать соответствие, пройти по массиву и записать каждое значение как ключ, затем собрать новый массив из ключей соответствия. Альтернатива — проверять Найти() перед каждым Добавить(), но это медленнее на больших объёмах.

Как передать массив с клиента на сервер?

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

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

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