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