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

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

Как из структуры сделать массив в 1С

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

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

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

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

Как устроены структура и массив и когда нужно преобразование

Структура создаётся конструктором Новый Структура("Имя, Возраст", "Иван", 30) и хранит данные по именованным ключам. Обращение идёт через точку (Структура.Имя) или через квадратные скобки (Структура["Имя"]). Ключи должны быть допустимыми идентификаторами, если заданы в конструкторе строкой.

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

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

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

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

СтруктураДанных = Новый Структура("Контрагент, Договор, Сумма",

"ООО Ромашка", "Д-15", 15000);

МассивЗначений = Новый Массив;

Для Каждого КлючИЗначение Из СтруктураДанных Цикл

МассивЗначений.Добавить(КлючИЗначение.Значение);

КонецЦикла;

В переменной КлючИЗначение доступны два свойства: Ключ (строка с именем) и Значение (содержимое). Если нужны и те и другие, их можно комбинировать — например, формировать строки вида «Ключ = Значение» для протоколирования.

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

Как получить массив ключей структуры

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

МассивКлючей = Новый Массив;

Для Каждого КлючИЗначение Из СтруктураДанных Цикл

МассивКлючей.Добавить(КлючИЗначение.Ключ);

КонецЦикла;

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

Если требуется отсортированный список имён, после заполнения массива вызовите сортировку через СписокЗначений или собственный алгоритм. Сам массив встроенного метода сортировки строк не имеет.

Как сделать массив структур

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

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

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

СтрокаДанных = Новый Структура;

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

СтрокаДанных.Вставить("Количество", Выборка.Количество);

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

КонецЦикла;

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

Такой массив структур напрямую сериализуется в JSON через ЗаписьJSON: каждая структура станет объектом, а массив — JSON-массивом. Это основной путь обмена данными с внешними API.

Порядок действий при преобразовании
  1. 1
    Создайте пустой массив: Новый Массив
  2. 2
    Переберите структуру циклом «Для Каждого КлючИЗначение Из Структура Цикл»
  3. 3
    Добавьте в массив значение, ключ или новую структуру через Добавить()
  4. 4
    Сравните Массив.Количество() со Структура.Количество() для проверки
  5. 5
    При необходимости отсортируйте или сериализуйте результат

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

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

Частая ошибка — попытка обратиться к элементу структуры по индексу, как к массиву: Структура[0] вызовет ошибку, потому что в квадратных скобках ожидается строковый ключ. Обратная ошибка — обращение к массиву по имени свойства.

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

Типичные ошибки
01
Обращение к структуре по индексу Структура[0] — в скобках ожидается строковый ключ, возникнет ошибка
02
Изменение структуры внутри цикла её перебора — обход становится непредсказуемым
03
Расчёт на порядок элементов структуры — порядок не гарантирован платформой
04
Потеря вложенных структур: в массив попадает ссылка на вложенную структуру, а не её копия — изменения затронут оба объекта

Альтернативы: соответствие, таблица значений, фиксированные коллекции

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

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

Куда преобразовывать структуру

Массив

Когда нужен последовательный обход по индексу, сериализация в JSON или передача списка значений

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

Когда данные однотипные и нужны сортировка, поиск, итоги и вывод в отчёт

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

Когда ключи — не строки-идентификаторы, а произвольные значения, и нужен быстрый поиск

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

Когда результат нужен для интерактивного выбора пользователем или отбора с флажками

FAQ

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

Нет, встроенного метода для этого нет. Преобразование выполняется циклом перебора с добавлением элементов в массив. Код занимает три-четыре строки и легко оформляется в универсальную функцию, которую можно переиспользовать.

Сохранится ли порядок элементов после перебора структуры?

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

Что попадёт в массив, если значение структуры — другая структура?

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

Как проверить, что все элементы структуры попали в массив?

Сравните Массив.Количество() со Структура.Количество() — значения должны совпадать. Дополнительно можно пройти по массиву циклом и проверить типы и значения элементов через ТипЗнч().

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

Перебор обеих коллекций выглядит одинаково — через пары «ключ-значение». Разница в исходных данных: у структуры ключи — строки-идентификаторы, у соответствия — значения любого типа. Код преобразования в массив от этого не меняется.

Итог

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

Структура преобразуется в массив циклом «Для Каждого» с добавлением значений, ключей или новых структур. Готового метода нет. Порядок элементов структуры не гарантирован, а вложенные структуры попадают в массив по ссылке. Проверяйте результат сравнением количества элементов.