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