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