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

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

Чем структура отличается от массива в 1С

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

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

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

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

Как устроен массив в 1С

Массив создаётся конструктором Новый Массив() или литералом и хранит элементы в строгом порядке. Каждый элемент доступен по индексу — целому числу от нуля до значения Количество() - 1. Элементы могут быть любого типа и не обязаны совпадать между собой, хотя на практике массивы обычно заполняют однотипными данными.

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

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

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

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

Сообщить(Товары[0]); // "Номенклатура А"

Сообщить(Товары.Количество()); // 2

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

Как устроена структура в 1С

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

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

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

Отбор.Вставить("Организация", ОрганизацияСсылка);

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

Сообщить(Отбор.Организация);

ЕстьСклад = Отбор.Свойство("Склад"); // Ложь — ключа нет

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

Ключевые отличия: сравнение по параметрам

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

КритерийМассивСтруктура
Способ доступа к элементуПо числовому индексу от 0По строковому ключу
Порядок элементовГарантирован, управляется разработчикомНе гарантирован
Вставка в серединуМетод Вставить(Индекс, Значение)Невозможна
Удаление элементаПо индексуПо имени ключа (Удалить(Ключ))
Проверка наличияНайти(Значение) — поиск по значениюСвойство(Ключ) — поиск по ключу
Дублирование данныхОдинаковые значения допустимыКлючи уникальны, повторный Вставить перезаписывает
Типичное назначениеСписки однотипных объектов, выборки, очередиПараметры, отборы, наборы разнородных полей

Из таблицы следует практическое правило: если данные естественно описываются словами «список из…» — это массив, если «набор полей с именами…» — это структура. Попытка использовать массив как «анонимный объект» с позиционными полями быстро приводит к нечитаемому коду, где смысл Данные[3] понятен только автору.

Когда выбирать массив, а когда структуру

Сценарии для массива

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

Сценарии для структуры

Структура — стандартный носитель параметров в типовых конфигурациях: отборы для НайтиПоРеквизиту() и динамических списков, параметры открытия форм, дополнительные параметры процедур оповещений, настройки отчётов. Именованный доступ делает код самодокументируемым: Параметры.Контрагент читается мгновенно, тогда как позиционный массив требует комментариев.

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

Как выбрать коллекцию

Данные однотипные и важен порядок обходаИспользуйте массив
Нужно передать в процедуру набор разнородных именованных параметровИспользуйте структуру
Требуется быстрый поиск по значению и уникальностьРассмотрите соответствие вместо массива
Нужен список пар «ключ–значение» с ключами произвольного вида (не идентификаторы)Используйте соответствие, а не структуру

Работа с коллекциями на практике: примеры кода

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

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

Для Каждого СтрокаТЗ Из ТаблицаДанных Цикл

Элемент = Новый Структура("Ссылка, Сумма, Дата");

ЗаполнитьЗначенияСвойств(Элемент, СтрокаТЗ);

Результат.Добавить(Элемент);

КонецЦикла;

Обратная задача — преобразовать структуру в список ключей. Здесь помогает обход циклом Для Каждого КлючИЗначение Из Структура Цикл: переменная цикла содержит свойства Ключ и Значение. Прямого метода «получить массив ключей» у структуры нет, его формируют вручную.

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

Типичные ошибки и ограничения

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

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

Типичные ошибки
01
Обращение Массив[Массив.Количество()] — выход за границу, последний индекс равен Количество()-1
02
Чтение Структура.Ключ без проверки Свойство() — исключение при отсутствии ключа
03
Логика, зависящая от порядка ключей структуры, — порядок не гарантирован платформой
04
Использование массива с позиционным смыслом полей вместо структуры — нечитаемый и хрупкий код
05
Удаление элементов массива в прямом цикле — сдвиг индексов и пропуск элементов

При удалении элементов массива в цикле обход выполняют в обратном порядке — от последнего индекса к нулю. Тогда удаление текущего элемента не влияет на индексы ещё не обработанных. Это стандартный приём, который стоит применять всегда, когда фильтрация идёт «на месте».

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

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

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

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

Массив

Однотипные упорядоченные данные, обход по индексу; не подходит для именованных полей

Структура

Именованные параметры и отборы; ключи только строки-идентификаторы, порядок не гарантирован

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

Поиск по ключу любого типа, кэши и словари; менее наглядно для параметров процедур

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

Интерактивный выбор и представления в формах; избыточен для внутренних алгоритмов

Как проверить корректность кода с коллекциями

После написания процедуры, работающей с массивом или структурой, полезно прогнать её на граничных случаях: пустая коллекция, один элемент, отсутствующий ключ, дубли значений. Большинство ошибок проявляется именно на этих наборах, а не на «средних» данных.

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

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

Обход массива
Норма

Все элементы обработаны, индексы в диапазоне 0..Количество()-1

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

Исключение «Индекс находится за границами массива»

Чтение структуры
Норма

Перед доступом вызвано Свойство() или ключ гарантирован

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

Ошибка «Поле объекта не обнаружено»

Передача на сервер
Норма

Коллекция содержит только сериализуемые типы

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

Ошибка передачи данных между клиентом и сервером

Удаление из массива в цикле
Норма

Цикл идёт от последнего индекса к первому

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

Часть элементов пропущена при обходе

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

Можно ли обратиться к элементу структуры по индексу?

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

Что быстрее: поиск в массиве или обращение по ключу структуры?

Обращение к структуре по ключу обычно быстрее, чем поиск значения в массиве методом Найти(), который перебирает элементы последовательно. Однако на небольших объёмах данных разница незаметна, и выбирать коллекцию стоит по смыслу задачи, а не по производительности.

Можно ли вложить структуру в структуру или массив в массив?

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

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

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

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

Используйте условие «Если Массив.Количество() = 0 Тогда». Метод Количество() безопасен для пустого массива, а вот обращение к элементу Массив[0] без этой проверки вызовет исключение о выходе индекса за границы.

Сохраняет ли структура порядок добавления ключей при обходе?

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

Итог

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

Массив — упорядоченная коллекция с доступом по числовому индексу, структура — набор пар «ключ–значение» с доступом по строковому имени. Массив применяют для однотипных списков и алгоритмов с порядком, структуру — для именованных параметров и отборов. Перед чтением ключа структуры проверяйте его через Свойство(), а перед доступом к элементу массива — границы индекса.