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

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

Как записать данные в массив в 1С

Как записать данные в массив в 1С: методы Добавить, Вставить, Установить, работа с индексами, типовые ошибки и проверка результата с примерами кода.

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

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

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

Создание массива и базовые принципы записи

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

// Пустой массив

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

// Массив из 10 элементов, заполненных значением Неопределено

Массив = Новый Массив(10);

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

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

Метод Добавить() — запись в конец массива

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

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

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

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

// Типичный сценарий — заполнение из выборки запроса

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

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

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

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

КонецЦикла;

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

Для добавления одного и того же значения несколько раз не нужен цикл с ручным счётчиком — достаточно вызвать Добавить() в теле цикла Для. Сам массив позаботится о расширении.

Метод Установить() — запись по индексу

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

Остатки = Новый Массив(12); // 12 месяцев

Остатки.Установить(0, 1500); // январь

Остатки.Установить(11, 2300); // декабрь

// Альтернатива — прямое присваивание по индексу

Остатки[0] = 1500;

Обращение по индексу в квадратных скобках и метод Установить() делают одно и то же. Скобочный синтаксис короче и чаще встречается в типовом коде, метод — нагляднее для новичков.

Главное ограничение: индекс должен существовать. Вызов Массив.Установить(5, Значение) для массива из трёх элементов завершится ошибкой «Индекс находится за границами массива». Перед записью по индексу проверяйте условие Индекс <= Массив.ВГраница().

Метод Вставить() — запись в произвольную позицию

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

Очередь = Новый Массив;

Очередь.Добавить("Задача 1");

Очередь.Добавить("Задача 3");

// Вставка приоритетной задачи между существующими

Очередь.Вставить(1, "Срочная задача");

// Результат: Задача 1, Срочная задача, Задача 3

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

Допустимый диапазон индекса для Вставить() — от 0 до Массив.Количество() включительно. Вставка по индексу, равному количеству элементов, эквивалентна Добавить().

Запись сложных данных: структуры, таблицы и вложенные массивы

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

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

НоваяСтрока = Новый Структура;

НоваяСтрока.Вставить("Номенклатура", СсылкаНоменклатура);

НоваяСтрока.Вставить("Количество", 5);

НоваяСтрока.Вставить("Цена", 1200);

СтрокиДокумента.Добавить(НоваяСтрока);

Учтите, что в массив записывается ссылка на объект, а не его копия. Если после добавления структуры изменить её поля, изменения отразятся и в элементе массива. Это удобно для накопления данных, но становится источником трудноуловимых ошибок, если одна и та же структура добавляется в массив несколько раз в цикле — все элементы будут указывать на один объект с последними значениями.

Решение простое: создавайте новую структуру внутри каждой итерации цикла, а не переиспользуйте одну переменную.

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

Заполнение массива из запроса и других источников

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

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

Запрос.Текст =

"ВЫБРАТЬ

| РеализацияТоваровУслуг.Ссылка КАК Ссылка

|ИЗ

| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

|ГДЕ

| РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода";

Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДатаСеанса()));

Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(ТекущаяДатаСеанса()));

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

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

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

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

КонецЦикла;

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

ТаблицаТоваров = Запрос.Выполнить().Выгрузить();

МассивНоменклатуры = ТаблицаТоваров.ВыгрузитьКолонку("Номенклатура");

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

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

Добавить()

Запись в конец массива. Подходит для последовательного накопления данных, не требует контроля индексов

Установить() или [Индекс]

Замена существующего элемента. Требует, чтобы индекс уже существовал, иначе — ошибка выполнения

Вставить()

Запись в произвольную позицию со сдвигом элементов. Нужна, когда важен порядок; на больших массивах медленнее добавления

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

Готовый массив из колонки таблицы значений или результата запроса без ручного цикла

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

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

// Быстрая диагностика в отладчике или через Сообщить

Сообщить("Элементов: " + МассивДокументов.Количество());

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

Сообщить(Элемент);

КонецЦикла;

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

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

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

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

Массив.Количество() равно ожидаемому числу записей

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

Количество больше ожидаемого — вероятно, массив был создан с фиксированным размером и дополнен через Добавить()

Значения элементов
Норма

Каждый элемент содержит данные нужного типа

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

Встречаются Неопределено — элементы созданы конструктором, но не заполнены

Поиск значения
Норма

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

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

Возвращает Неопределено — значение не записано или записано с другим типом

FAQ

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

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

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

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

Как записать значение в массив, если индекс может выходить за границы?

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

Почему все элементы массива содержат одинаковую структуру с последними данными?

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

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

Вызовите метод ВыгрузитьКолонку("ИмяКолонки") у таблицы значений — он вернёт новый массив со значениями указанной колонки. Это короче и надёжнее ручного цикла обхода строк с вызовом Добавить().

Есть ли ограничение на размер массива в 1С?

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

Итог

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

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