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