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