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