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

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

Массив объектов в 1С: что это и как с ним работать

Что такое массив объектов в 1С: создание массивов, добавление элементов, перебор в цикле, работа со структурами и типичные ошибки разработчиков.

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

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

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

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

Массив создаётся конструктором Новый Массив. Без параметров создаётся пустой массив; если передать число — создаётся массив заданной размерности с незаполненными элементами (значение Неопределено). Можно создать и многомерный массив, передав несколько измерений через запятую.

Ключевые свойства и методы массива:

  • Количество() — возвращает число элементов;
  • Добавить(Значение) — добавляет элемент в конец;
  • Вставить(Индекс, Значение) — вставляет элемент в указанную позицию;
  • Удалить(Индекс) — удаляет элемент по индексу;
  • Найти(Значение) — ищет элемент и возвращает индекс или Неопределено;
  • Очистить() — удаляет все элементы;
  • ВГраница() — возвращает индекс последнего элемента (Количество() - 1).

Доступ к элементу выполняется через квадратные скобки: МойМассив[0] — первый элемент. Попытка обратиться к индексу за пределами массива вызовет ошибку выполнения, поэтому перед обращением полезно проверять границы.

Как создать массив и заполнить его объектами

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

МассивДокументов = Новый Массив;

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Документ.РеализацияТоваровУслуг

|ГДЕ Дата МЕЖДУ &Начало И &Конец";

Запрос.УстановитьПараметр("Начало", НачалоМесяца(ТекущаяДата()));

Запрос.УстановитьПараметр("Конец", КонецМесяца(ТекущаяДата()));

Выборка = Запрос.Выполнить().Выбрать();

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

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

КонецЦикла;

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

Другой частый вариант — массив структур, когда нужно передать набор разнородных данных:

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

СтрокаДанных.Контрагент = КонтрагентСсылка;

СтрокаДанных.Сумма = 15000;

СтрокаДанных.Дата = ТекущаяДата();

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

Перебор элементов массива в цикле

Существует два основных способа перебора. Первый — цикл Для Каждого, когда индекс не нужен:

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

// обработка ссылки

КонецЦикла;

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

Для Индекс = 0 По МассивДокументов.ВГраница() Цикл

Сообщить("Элемент " + Индекс + ": " + МассивДокументов[Индекс]);

КонецЦикла;

Использование ВГраница() вместо Количество() - 1 делает код читабельнее и защищает от ошибки на пустом массиве: у пустого массива ВГраница() вернёт -1, и цикл просто не выполнится.

Когда массив не подходит: альтернативы

Массив — не универсальное решение. В ряде задач лучше работают другие коллекции:

КоллекцияКогда выбратьОграничение
МассивПростой упорядоченный список, передача параметровНет поиска по нескольким полям, нет колонок
Таблица значенийДанные с колонками, сортировка, свёртка, поискТяжелее, не сериализуется между клиентом и сервером напрямую
СоответствиеБыстрый поиск по ключу (аналог словаря)Порядок элементов не гарантирован
Список значенийИнтерактивный выбор, представления элементовУстаревающий механизм, медленный поиск
Фиксированный массивПередача данных между клиентом и сервером, защита от измененийНельзя изменять после создания

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

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

Массив ссылок

Подходит для пакетной обработки и передачи списков. Лёгкий, но без структуры данных элемента.

Массив структур

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

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

Лучший выбор для данных с колонками, сортировкой и поиском. Тяжелее массива по памяти.

Передача массивов между клиентом и сервером

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

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

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

Типичные ошибки при работе с массивами

Первая и самая распространённая ошибка — выход за границы массива. Обращение Массив[Массив.Количество()] всегда ошибочно, потому что индексация начинается с нуля. Перед доступом по вычисляемому индексу проверяйте, что массив не пуст.

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

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

Типичные ошибки
01
Обращение к Массив[Количество()] вместо ВГраница() — ошибка выполнения из-за индексации с нуля
02
Удаление элементов в цикле «Для Каждого» — пропуск элементов или падение кода
03
Хранение ПолучитьОбъект() в массиве — лишний расход памяти и блокировки
04
Поиск методом Найти() в цикле по большому массиву — квадратичная сложность, нужно соответствие
05
Передача несериализуемых типов (таблица значений) между клиентом и сервером — ошибка передачи данных

Проверка результата и отладка

Самый быстрый способ проверить содержимое массива в отладчике — добавить переменную в табло или использовать «Вычислить выражение». Для массива структур раскройте элемент и проверьте значения ключей.

В рабочем коде полезны простые проверки перед использованием результата:

Если МассивДокументов.Количество() = 0 Тогда

ВызватьИсключение "Не отобрано ни одного документа для обработки";

КонецЕсли;

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

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

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

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

Массив.Количество() соответствует числу отобранных записей

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

0 или значительно меньше ожидаемого — проверьте отбор запроса

Тип элементов
Норма

ТипЗнч(Элемент) даёт ожидаемый тип (ссылка, структура)

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

Неопределено или другой тип — ошибка заполнения

Доступ по индексу
Норма

Индекс в диапазоне от 0 до ВГраница()

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

Обращение к Количество() или отрицательному индексу

Итог

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

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

Частые вопросы о массивах в 1С

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

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

Можно ли хранить в одном массиве элементы разных типов?

Да, массив в 1С не типизирован: в нём могут одновременно находиться числа, строки, ссылки и структуры. Однако такая практика усложняет обработку — перед использованием элемента придётся проверять его тип через ТипЗнч().

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

Методом Найти(Значение): он вернёт индекс элемента или Неопределено, если значения нет. Для разовой проверки этого достаточно. Если проверок много, выгоднее один раз переложить значения в соответствие и искать по ключу.

Как удалить из массива дубликаты?

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

Передаётся ли массив в процедуру по ссылке или по значению?

Массив передаётся по ссылке: изменения элементов внутри вызванной процедуры будут видны в вызывающем коде, если параметр не объявлен с ключевым словом Знач. Учитывайте это, чтобы избежать неожиданной модификации исходных данных.

Что такое фиксированный массив и когда он нужен?

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