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

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

Что такое коллекции в 1С и как с ними работать

Разбираем, что такое коллекции в 1С: массивы, структуры, списки значений, таблицы значений и коллекции метаданных. Примеры кода, типичные ошибки и FAQ.

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

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

Что считается коллекцией в 1С

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

Общий признак всех коллекций — наличие методов доступа к элементам: количество элементов, обращение по индексу или ключу, перебор в цикле «Для Каждого», поиск. Однако реализация различается: массив хранит элементы подряд по индексам, соответствие — по хешу ключа, таблица значений — как набор строк с типизированными колонками. От этого зависят скорость операций и ограничения каждой коллекции.

Важно понимать, что коллекции метаданных (например, Метаданные.Справочники) доступны только для чтения: через них можно получать информацию о структуре конфигурации, но нельзя изменить саму конфигурацию из кода. Табличные части, напротив, являются частью данных объекта и сохраняются в базе вместе с ним.

Массив: упорядоченный список значений

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

bsl
Массив = Новый Массив;
Массив.Добавить("Товар А");
Массив.Добавить("Товар Б");
Для Каждого Элемент Из Массив Цикл
    Сообщить(Элемент);
КонецЦикла;
Количество = Массив.Количество();

Основные операции: Количество(), Найти() (возвращает индекс или Неопределено), Удалить(индекс), Очистить(), ВГраница() (индекс последнего элемента). Обращение по несуществующему индексу вызывает ошибку времени выполнения, поэтому перед обращением к элементу проверяйте границы.

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

Структура и соответствие: данные по ключу

Структура — коллекция пар «ключ-значение», где ключи задаются при создании и являются идентификаторами (должны быть допустимыми именами переменных). Структура удобна для передачи набора параметров в процедуру или функцию: вместо десятка аргументов передаётся одна структура. Значения доступны через точку (Структура.Цена) или через Свойство(), который позволяет проверить наличие ключа без ошибки.

Соответствие — тоже коллекция «ключ-значение», но ключом может быть значение любого типа, включая ссылки на объекты базы. Ключи можно добавлять и удалять динамически. Главное преимущество — быстрый поиск по ключу независимо от размера коллекции.

Структура или соответствие

Структура

Фиксированный набор именованных параметров, передача настроек в функции. Ключи — только допустимые идентификаторы, состав обычно не меняется.

Соответствие

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

Типовой приём — использование соответствия как «множества» для быстрой проверки дублей: значение помещается в ключ, а при проверке достаточно вызвать Соответствие[Значение] или метод Получить(). Это работает значительно быстрее перебора массива на больших объёмах данных.

Список значений и таблица значений

Список значений хранит элементы вместе с представлением и пометкой, поэтому его часто используют в интерфейсных задачах: выбор из списка, отметка нескольких значений, передача параметров в отчёты. Элементы можно сортировать по значению или представлению методом СортироватьПоЗначению().

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

bsl
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Номенклатура");
ТЗ.Колонки.Добавить("Количество");
Строка = ТЗ.Добавить();
Строка.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("0001");
Строка.Количество = 5;
Найденная = ТЗ.Найти(5, "Количество");

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

Табличные части и коллекции метаданных

Табличная часть — коллекция строк внутри объекта конфигурации (документа, справочника). Она хранится в базе данных вместе с объектом и доступна как свойство: ДокументОбъект.Товары. Строки добавляются методом Добавить(), перебираются циклом, удаляются по индексу или методом Очистить(). Изменения попадут в базу только после вызова Записать() у объекта-владельца.

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

Как выбрать коллекцию под задачу

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

Маршрут решения

Как выбрать коллекцию

Нужно быстро проверять вхождение значения в большой наборСоответствие: значение как ключ, проверка через Получить()
Нужно передать в функцию набор параметровСтруктура с именованными ключами
Нужно сгруппировать данные и посчитать суммыТаблица значений с методом Свернуть()
Нужны строки документа, сохраняемые в базеТабличная часть объекта
Нужен упорядоченный список с доступом по индексуМассив

При сомнениях ориентируйтесь на операцию, которая будет выполняться чаще всего. Если 90% работы кода — поиск, оптимизируйте под поиск (соответствие). Если основная работа — последовательный обход, разница между массивом и списком значений несущественна.

Типичные ошибки и проверка результата

Большинство проблем с коллекциями возникает из-за обращения к несуществующим элементам и неправильной работы со ссылками на коллекции. Коллекции в 1С передаются по ссылке: присвоив таблицу значений другой переменной, вы получаете не копию, а тот же объект. Для независимой копии таблицы значений используйте Скопировать(), для массива — создание нового массива с копированием элементов.

Типичные ошибки
01
Обращение к элементу массива по индексу без проверки границ — ошибка времени выполнения
02
Присвоение таблицы значений другой переменной вместо Скопировать() — изменения затрагивают обе переменные
03
Поиск в массиве перебором внутри цикла по тысячам элементов — резкое замедление кода
04
Обращение к полю структуры, которого нет, без проверки через Свойство() — ошибка «Поле не найдено»
05
Изменение коллекции во время перебора циклом «Для Каждого» — пропуск элементов или ошибка

Для удаления элементов во время обхода перебирайте коллекцию с конца по индексу либо собирайте элементы для удаления в отдельный массив и удаляйте после цикла. Для проверки наличия ключа в структуре используйте Структура.Свойство("ИмяКлюча", Значение) — метод вернёт Истина и заполнит переменную значением.

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

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

Перебор коллекции
Норма

Цикл обрабатывает ровно столько элементов, сколько вернуло Количество()

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

Элементы пропускаются или цикл завершается ошибкой обращения по индексу

Поиск по ключу
Норма

Метод Найти()/Получить() возвращает значение или Неопределено без исключений

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

Ошибка «Поле не найдено» или «Недопустимое значение ключа»

Копирование коллекции
Норма

Изменение копии не влияет на исходную коллекцию

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

Обе переменные показывают одинаковые изменения — это один объект

Часто задаваемые вопросы

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

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

Как проверить, есть ли ключ в структуре, без ошибки?

Используйте метод Свойство(): Если Структура.Свойство("Цена", ЗначениеЦены) Тогда ... КонецЕсли;. Метод вернёт Истина, если ключ существует, и поместит значение во второй параметр. Прямое обращение к несуществующему полю вызовет ошибку.

Почему изменение таблицы значений в одной переменной меняет её и в другой?

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

Как удалить элементы из коллекции во время перебора?

Безопасные способы: перебирать массив по индексу с конца к началу и удалять текущий элемент, либо в цикле собирать кандидатов на удаление в отдельный массив, а удалять уже после завершения обхода. Удаление элементов прямо внутри цикла «Для Каждого» приводит к пропускам или ошибкам.

Что быстрее для поиска: массив или соответствие?

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

Можно ли изменить конфигурацию через коллекции метаданных?

Нет. Коллекции метаданных доступны только для чтения: через них можно получать имена объектов, состав реквизитов и другие свойства конфигурации, но изменить структуру базы программно из встроенного языка нельзя.

Итог

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

Коллекция в 1С — объект-контейнер для набора значений. Массив — порядок и индексы, структура — именованные параметры, соответствие — быстрый поиск по ключу, таблица значений — табличная обработка, табличная часть — данные объекта в базе. Выбирайте коллекцию под основную операцию и помните: коллекции передаются по ссылке.