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