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

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

Как заполнить массив в 1С: практические способы и примеры

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

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

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

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

Создание массива и первые элементы

Пустой массив объявляется конструктором Новый Массив. Сразу после создания он не содержит ни одного элемента, и обращение по индексу вызовет ошибку «Индекс находится за границами массива».

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

Товары.Добавить("Номенклатура 1");

Товары.Добавить("Номенклатура 2");

Товары.Добавить("Номенклатура 3");

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

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

Заполнение массива в цикле

Самый распространённый сценарий — наполнение массива в цикле Для или Для Каждого. Так формируют списки номеров, диапазоны дат, наборы ссылок.

СписокМесяцев = Новый Массив;

Для НомерМесяца = 1 По 12 Цикл

СписокМесяцев.Добавить(НомерМесяца);

КонецЦикла;

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

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

Для Каждого СтрокаТЧ Из Документ.Товары Цикл

МассивСсылок.Добавить(СтрокаТЧ.Номенклатура);

КонецЦикла;

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

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

Заполнение массива из запроса и таблицы значений

На практике массив чаще всего заполняется результатом запроса — например, чтобы передать список ссылок в параметр другого запроса через оператор В (&СписокСсылок). Есть два рабочих подхода.

Первый — обход выборки с добавлением в массив:

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

Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Документ.РеализацияТоваровУслуг

|ГДЕ Дата МЕЖДУ &Начало И &Конец";

Выборка = Запрос.Выполнить().Выбрать();

МассивДокументов = Новый Массив;

Пока Выборка.Следующий() Цикл

МассивДокументов.Добавить(Выборка.Ссылка);

КонецЦикла;

Второй, более короткий — выгрузка колонки таблицы значений методом ВыгрузитьКолонку(). Он сразу возвращает массив:

Результат = Запрос.Выполнить().Выгрузить();

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

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

Заполнение массива фиксированного размера

Иногда массив нужен заранее заданной длины — например, для хранения показателей по фиксированному числу периодов. Конструктор Новый Массив(10) создаёт массив из десяти элементов, каждый из которых равен Неопределено.

Показатели = Новый Массив(12);

Для Индекс = 0 По 11 Цикл

Показатели[Индекс] = 0;

КонецЦикла;

Обращение по индексу через квадратные скобки работает только в пределах существующего размера. Присвоить значение элементу Показатели[12] в массиве из 12 элементов нельзя — это вызовет ошибку. Для расширения используйте Добавить().

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

Массив — не единственная коллекция в 1С, и выбор неправильной структуры усложняет код. Ориентируйтесь на задачу.

КоллекцияКогда подходитОграничение
МассивПередача списков между клиентом и сервером, параметры запросов, обход по индексуНет поиска по представлению, нет пометок
Список значенийИнтерактивный выбор пользователем, пометки, сортировкаТяжелее массива, не всегда сериализуется
СтруктураИменованные параметры, наборы свойствКлючи — только строки, нет порядка обхода по индексу
Таблица значенийМногоколоночные данные, группировки, итогиИзбыточна для простого списка значений

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

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

Метод Добавить() в цикле

Универсальный способ, подходит для любого источника; код длиннее, но читаем

ВыгрузитьКолонку() из запроса

Одна строка вместо цикла; работает только с результатом запроса или таблицей значений

Новый Массив(N) с присваиванием по индексу

Подходит для фиксированного размера; требует строгого контроля индексов

Проверка результата и типичные ошибки

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

Если МассивДокументов.Количество() = 0 Тогда

Сообщить("По заданным условиям документы не найдены");

КонецЕсли;

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

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

Полезные операции после заполнения

Заполненный массив редко используется «как есть». Часто требуется удалить дубли, очистить или объединить два массива. Встроенного метода «свернуть массив» нет, поэтому дубли убирают вручную через промежуточный массив или соответствие:

Уникальные = Новый Массив;

Для Каждого Элемент Из ИсходныйМассив Цикл

Если Уникальные.Найти(Элемент) = Неопределено Тогда

Уникальные.Добавить(Элемент);

КонецЕсли;

КонецЦикла;

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

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

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

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

Количество() соответствует числу строк источника

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

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

Наличие значения
Норма

Найти(Значение) возвращает индекс

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

Возвращает Неопределено — значение не добавлено или отличается тип

Содержимое элементов
Норма

Типы значений соответствуют ожиданию (ссылки, строки)

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

Элементы равны Неопределено — массив создан с размером, но не заполнен

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

Как заполнить массив случайными числами в 1С?

Используйте объект ГенераторСлучайныхЧисел: создайте его через Новый ГенераторСлучайныхЧисел(), затем в цикле вызывайте СлучайноеЧисло(НижняяГраница, ВерхняяГраница) и добавляйте результат в массив методом Добавить().

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

Да. Установите параметр через Запрос.УстановитьПараметр("Список", Массив) и используйте в тексте запроса условие вида «ГДЕ Ссылка В (&Список)». Пустой массив в таком условии не даст ни одной строки — это нужно учитывать.

Как узнать, пустой ли массив?

Проверьте Массив.Количество() = 0. Отдельной функции «ПустойМассив» во встроенном языке нет. Переменная, которой массив не присвоен, равна Неопределено, и вызов Количество() у неё вызовет ошибку — сначала проверяйте, что переменная инициализирована.

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

Количество() возвращает число элементов, ВГраница() — индекс последнего элемента, то есть Количество() минус один. Для цикла «Для Инд = 0 По Массив.ВГраница()» используйте именно ВГраница(), иначе получите выход за границы массива.

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

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

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

Встроенной сортировки у массива нет. Простой способ — скопировать значения в список значений, вызвать СортироватьПоЗначению() и выгрузить обратно, либо загрузить массив в колонку таблицы значений и отсортировать её методом Сортировать().

Итог

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

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