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

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

Как ввести массив в 1С: пошаговое руководство для разработчика

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

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

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

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

Объявление массива: пустой и с заданной размерностью

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

Если размер известен, его можно передать параметром: Новый Массив(10) создаст массив из десяти элементов, каждый из которых равен Неопределено. Такой подход удобен, когда позиции элементов значимы — например, данные распределяются по фиксированным колонкам. Заполняются элементы присваиванием по индексу: Массив[0] = Значение;.

Можно создать массив и сразу с начальными значениями, перечислив их через запятую в конструкторе: Новый Массив("Январь", "Февраль", "Март"). Важно помнить: размер массива в 1С не фиксируется жёстко — даже массив, созданный с размерностью 10, можно расширить методом Добавить(), и его длина станет 11.

bsl
Массив = Новый Массив(); // пустой массив
Массив.Добавить("Первый элемент");
Массив.Добавить(42);

Месяцы = Новый Массив("Январь", "Февраль", "Март");

Резерв = Новый Массив(5); // 5 элементов со значением Неопределено
Резерв[0] = Справочники.Номенклатура.НайтиПоКоду("0001");

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

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

Удаление выполняется методом Удалить(Индекс). Частая задача — очистить массив от части элементов в цикле. Здесь кроется классическая ошибка: если удалять элементы при прямом обходе от начала к концу, индексы смещаются и часть элементов пропускается. Правильный приём — обход в обратном порядке, от последнего индекса к нулю.

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

Порядок безопасного удаления элементов
  1. 1
    Определите условие удаления и проверьте его на одном элементе
  2. 2
    Организуйте цикл от Массив.Количество() - 1 до 0 с шагом -1
  3. 3
    Внутри цикла проверяйте условие и вызывайте Массив.Удалить(Индекс)
  4. 4
    После цикла проверьте Массив.Количество() — оно должно уменьшиться на число удалённых

Обход массива: два рабочих варианта цикла

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

Второй вариант — индексный цикл: Для Индекс = 0 По Массив.Количество() - 1 Цикл. Он обязателен, когда нужно изменять элементы по месту (Массив[Индекс] = НовоеЗначение), удалять элементы или когда логика зависит от позиции — например, обработка только чётных позиций или связанных пар соседних элементов.

Граница цикла Количество() - 1 — критичное место. Индексация в 1С начинается с нуля, поэтому последний допустимый индекс всегда на единицу меньше размера. Обращение к Массив[Массив.Количество()] вызовет ошибку «Индекс находится за границами массива».

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

Фиксированный массив: когда изменять состав нельзя

Отдельный вид — фиксированный массив, который создаётся конструктором Новый ФиксированныйМассив(ОбычныйМассив) из существующего массива. После создания его состав менять нельзя: методы Добавить, Вставить, Удалить недоступны, а присваивание по индексу вызовет ошибку.

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

Проверить тип значения можно через ТипЗнч(Значение) = Тип("ФиксированныйМассив"). Это полезно в универсальных процедурах, которые принимают коллекции из разных источников и должны корректно реагировать на неизменяемые данные.

Массив как результат методов платформы и преобразование коллекций

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

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

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

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

Как выбрать способ ввода массива

Количество элементов заранее неизвестноСоздайте Новый Массив() и заполняйте методом Добавить()
Нужны фиксированные позиции с заполнением по индексуИспользуйте Новый Массив(Размер) и присваивание по индексу
Данные приходят строкой с разделителемПримените СтрРазделить() и при необходимости обработайте элементы в цикле
Состав не должен меняться после созданияОберните массив в Новый ФиксированныйМассив()
Данные уже в таблице значений или списке значенийИспользуйте ВыгрузитьКолонку() или перенос элементов циклом

Проверка содержимого массива при отладке

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

В конфигураторе удобнее табло: остановитесь на точке останова после заполнения массива, выделите переменную и нажмите «Вычислить выражение» (Shift+F9) — массив раскроется списком элементов с индексами и значениями. Там же видно реальную длину и тип каждого элемента, что помогает поймать неожиданные Неопределено.

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

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

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

Размер массива
Норма

Количество() возвращает ожидаемое число элементов

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

Количество() = 0 или меньше ожидаемого — данные не добавились

Граница индексов
Норма

ВГраница() = Количество() - 1

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

Обращение по индексу вызывает ошибку выхода за границы

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

Каждый элемент имеет ожидаемый тип (строка, ссылка, число)

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

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

Поиск контрольного значения
Норма

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

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

Найти() возвращает Неопределено при заведомо существующем значении

FAQ: частые вопросы о вводе массивов в 1С

С какого индекса начинается массив в 1С?

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

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

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

Как создать двумерный массив?

Отдельного типа «двумерный массив» в 1С нет. Используется массив массивов: каждый элемент внешнего массива сам является массивом, обращение идёт как Массив[Строка][Колонка]. Если данные табличные по смыслу, часто удобнее заменить такую конструкцию таблицей значений.

Чем массив отличается от списка значений?

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

Почему Добавить() выдаёт ошибку «Метод объекта не обнаружен»?

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

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

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

Итог

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

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