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