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

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

Как преобразовать массив в структуру в 1С

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

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

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

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

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

Массив — это упорядоченная коллекция, где доступ к элементу идёт по индексу от нуля: Массив[0], Массив[1] и так далее. Структура — коллекция пар «ключ-значение», где ключом выступает строка, допустимая как имя переменной: Структура.Наименование или Структура["Наименование"].

Преобразование чаще всего требуется в трёх ситуациях. Первая — передача данных в процедуру, принимающую структуру параметров: многие типовые механизмы БСП и прикладных конфигураций ждут именно структуру. Вторая — подготовка данных к выгрузке в JSON: методы записи JSON удобно наполнять из структур и соответствий. Третья — объединение нескольких массивов в единый объект с осмысленными именами полей вместо безликих индексов.

Базовый способ: обход массива циклом

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

Функция МассивВСтруктуру(Массив, ПрефиксКлюча = "Элемент")

Результат = Новый Структура;

Для Индекс = 0 По Массив.Количество() - 1 Цикл

ИмяКлюча = ПрефиксКлюча + Формат(Индекс, "ЧГ=");

Результат.Вставить(ИмяКлюча, Массив[Индекс]);

КонецЦикла;

Возврат Результат;

КонецФункции

После вызова МассивВСтруктуру(МассивТоваров, "Товар") значения будут доступны как Результат.Товар0, Результат.Товар1 и так далее. Обратите внимание на форматную строку "ЧГ=": она убирает разделители групп, иначе при больших индексах в ключ попадёт неразрывный пробел, и ключ станет недопустимым.

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

Массив пар «ключ-значение»: осмысленные имена ключей

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

Функция ПарыВСтруктуру(МассивПар)

Результат = Новый Структура;

Для Каждого Пара Из МассивПар Цикл

Результат.Вставить(Пара.Ключ, Пара.Значение);

КонецЦикла;

Возврат Результат;

КонецФункции

Если данные приходят в виде плоского массива, где чётные элементы — ключи, а нечётные — значения, обход делается с шагом два:

Для Индекс = 0 По Массив.Количество() - 2 Цикл

Если Индекс % 2 = 0 Тогда

Результат.Вставить(Массив[Индекс], Массив[Индекс + 1]);

КонецЕсли;

КонецЦикла;

Перед вставкой проверяйте, что массив содержит чётное число элементов и что ключи не пустые. Иначе последняя пара окажется неполной, а пустой ключ вызовет ошибку выполнения.

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

Массив структур: свёртка в одну структуру или ключ по полю

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

Для слияния структур достаточно перебрать ключи каждой из них:

Функция СлитьСтруктуры(МассивСтруктур)

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

Для Каждого ТекСтруктура Из МассивСтруктур Цикл

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

Итог.Вставить(КлючЗначение.Ключ, КлючЗначение.Значение);

КонецЦикла;

КонецЦикла;

Возврат Итог;

КонецФункции

Для варианта с ключом по полю код похож на предыдущий раздел, только ключ вычисляется из элемента:

Для Каждого СтрокаДанных Из МассивСтруктур Цикл

Итог.Вставить("Код_" + СтрокаДанных.Код, СтрокаДанных);

КонецЦикла;

При слиянии помните: если у двух структур встречается одинаковый ключ, более позднее значение перезапишет раннее без предупреждения. Если потеря данных недопустима, перед вставкой проверяйте наличие ключа через Итог.Свойство(Ключ) и обрабатывайте конфликт явно — например, складывайте значения в массив.

Вложенные массивы и рекурсивное преобразование

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

Функция ПреобразоватьРекурсивно(Значение)

Если ТипЗнч(Значение) = Тип("Массив") Тогда

Результат = Новый Структура;

Для Индекс = 0 По Значение.Количество() - 1 Цикл

Результат.Вставить("Элемент" + Формат(Индекс, "ЧГ="),

ПреобразоватьРекурсивно(Значение[Индекс]));

КонецЦикла;

Возврат Результат;

Иначе

Возврат Значение;

КонецЕсли;

КонецФункции

Здесь важно понимать ограничение: если конечная цель — запись в JSON, переводить массивы в структуры обычно не нужно. Запись JSON корректно обрабатывает массивы напрямую, а искусственные ключи «Элемент0», «Элемент1» только испортят структуру документа. Рекурсивное преобразование оправдано, когда потребитель данных умеет работать только со структурами.

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

Как выбрать подход

Массив однотипных значений, порядок важенКлючи из индексов: Элемент0, Элемент1 — базовый цикл
Массив содержит пары ключ-значениеКлюч из элемента: Вставить(Пара.Ключ, Пара.Значение)
Массив структур нужно объединитьСлияние через перебор КлючЗначение каждой структуры
Массив структур с уникальным полемКлюч из этого поля с префиксом, значение — вся структура
Цель — выгрузка в JSONНе преобразовывайте: ЗаписатьJSON работает с массивами напрямую

Альтернатива: соответствие вместо структуры

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

Результат = Новый Соответствие;

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

Результат.Вставить(Элемент.Артикул, Элемент);

КонецЦикла;

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

Структура или соответствие

Структура

Ключи — допустимые идентификаторы, доступ через точку, принимается типовыми механизмами параметров. Не подходит для произвольных строк-ключей.

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

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

Фиксированная структура

Состав ключей фиксируется при создании, защищает от случайных вставок. Подходит для строго типизированных параметров.

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

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

Дополнительно выборочно обратитесь к нескольким ключам и проверьте значения. Для безопасного обращения используйте Структура.Свойство("ИмяКлюча", НайденноеЗначение) — метод вернёт Ложь, если ключа нет, вместо того чтобы выбросить исключение.

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

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

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

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

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

Меньше — были дубликаты ключей, данные перезаписаны

Обращение к ключу
Норма

Свойство() возвращает Истина, значение корректно

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

Свойство() возвращает Ложь — ключ не сформировался

Типы значений
Норма

ТипЗнч() показывает ожидаемые типы

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

Вместо значения — вложенный массив там, где ждали простое значение

Теперь об ошибках, которые встречаются чаще всего. Первая — формирование ключа без Формат(..., "ЧГ="): число превращается в строку с разделителями групп, и вставка падает. Вторая — игнорирование дубликатов: метод Вставить() молча перезаписывает существующий ключ, и разработчик теряет данные, не замечая этого. Третья — попытка использовать как ключ строку с пробелами или спецсимволами без очистки.

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

Типичные ошибки
01
Ключ из числа без Формат(Индекс, "ЧГ=") — в ключ попадает неразрывный пробел, Вставить() вызывает исключение
02
Дубликаты ключей без проверки — Вставить() молча перезаписывает значения, часть данных теряется
03
Произвольные строки как ключи структуры — пробелы и спецсимволы недопустимы, нужен переход на соответствие
04
Изменение массива во время обхода — сдвиг индексов, пропуск элементов или обращение за границу
05
Лишнее преобразование перед записью JSON — массивы сериализуются напрямую, обёртка только вредит

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

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

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

Что делать, если ключи содержат пробелы или начинаются с цифр?

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

Как не потерять данные при одинаковых ключах?

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

Нужно ли преобразовывать массив в структуру перед записью в JSON?

Обычно нет. Методы ЗаписатьJSON корректно сериализуют массивы как JSON-массивы. Преобразование в структуру с ключами «Элемент0», «Элемент1» превратит массив в объект и исказит формат, что может сломать интеграцию с внешней системой.

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

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

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

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

Итог

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

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