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

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

Коллекция значений в 1С: что это такое и как с ней работать

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

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

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

Материал разбирает основные типы коллекций, способы их создания и обхода, критерии выбора под конкретную задачу и типичные ошибки начинающих разработчиков. Примеры приведены на встроенном языке 1С и работают в типовых конфигурациях на управляемых формах.

Какие типы коллекций существуют в 1С

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

  • Массив — упорядоченный набор значений произвольного типа, доступ по числовому индексу (нумерация с нуля).
  • Структура — набор пар «ключ — значение», где ключ — строка без пробелов, обращение через точку или в квадратных скобках.
  • Соответствие — пары «ключ — значение» с ключом любого типа, включая ссылки на объекты базы данных.
  • Список значений — список с возможностью хранить представление, картинку и пометку для каждого элемента; часто используется в интерфейсах.
  • Таблица значений — двумерная структура со строками и колонками, аналог нетипизированной таблицы в памяти.
  • Дерево значений — иерархическая таблица с вложенными строками.

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

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

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

Товары = Новый Массив;

Товары.Добавить("Номенклатура 1");

Товары.Добавить("Номенклатура 2");

Первый = Товары[0]; // обращение по индексу

Всего = Товары.Количество();

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

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

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

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

ПараметрыОтбора = Новый Структура;

ПараметрыОтбора.Вставить("Организация", ОрганизацияСсылка);

ПараметрыОтбора.Вставить("Склад", СкладСсылка);

// Обращение к значениям

ТекОрганизация = ПараметрыОтбора.Организация;

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

КэшЦен = Новый Соответствие;

КэшЦен.Вставить(НоменклатураСсылка, 1500);

Цена = КэшЦен[НоменклатураСсылка]; // быстрый поиск

Если Цена = Неопределено Тогда

// значения нет в кэше

КонецЕсли;

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

Структура

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

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

Ключ любого типа, включая ссылки. Подходит для кэшей, сопоставления объектов, быстрого поиска по ссылкам. Обращение только через квадратные скобки.

Массив

Порядок важнее поиска. Подходит для упорядоченных списков, очередей обработки, передачи однотипных значений.

Опасность обращения к несуществующему ключу

Обращение к несуществующему свойству структуры через точку вызывает ошибку выполнения. Безопасный способ — метод Свойство(), который возвращает Истина, если ключ найден, и помещает значение в переменную:

Значение = Неопределено;

Если ПараметрыОтбора.Свойство("Склад", Значение) Тогда

// ключ существует, Значение заполнено

КонецЕсли;

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

Типичные ошибки
01
Обращение к несуществующему свойству структуры через точку — приводит к аварийному завершению кода. Используйте метод Свойство().
02
Поиск в большом массиве внутри цикла — время работы растёт квадратично. Замените массив соответствием.
03
Попытка изменить фиксированную коллекцию — вызывает исключение. Создайте обычную копию через конструктор.
04
Передача таблицы значений с сервера на клиент в управляемой форме — тип недоступен на клиенте. Используйте реквизит формы или массив структур.

Таблица значений: работа с табличными данными

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

ТЗ = Новый ТаблицаЗначений;

ТЗ.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));

ТЗ.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));

НоваяСтрока = ТЗ.Добавить();

НоваяСтрока.Номенклатура = ТоварСсылка;

НоваяСтрока.Количество = 10;

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

Важное ограничение: таблица значений недоступна на тонком клиенте в управляемых формах. Для отображения данных пользователю таблицу размещают в реквизите формы с типом «ТаблицаЗначений» — платформа сама управляет передачей данных между сервером и клиентом.

Список значений и дерево значений

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

Список = Новый СписокЗначений;

Список.Добавить(Склад1, "Основной склад", Истина);

Список.Добавить(Склад2, "Резервный склад", Ложь);

// Пометки можно проверить после диалога

Для Каждого Элемент Из Список Цикл

Если Элемент.Пометка Тогда

// обработать выбранный склад

КонецЕсли;

КонецЦикла;

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

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

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

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

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

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

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

Обход коллекций и проверка результата

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

Для Каждого СтрокаТЗ Из ТаблицаТоваров Цикл

// обработка строки

КонецЦикла;

// Обход массива с индексом

Для Инд = 0 По Массив.ВГраница() Цикл

Элемент = Массив[Инд];

КонецЦикла;

Метод ВГраница() возвращает индекс последнего элемента (на единицу меньше количества) — его использование вместо Количество() - 1 делает код чище и защищает от ошибки при пустом массиве: цикл просто не выполнится.

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

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

Количество элементов после заполнения
Норма

Количество() возвращает ожидаемое число

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

Коллекция пуста или элементов больше, чем строк в источнике

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

Возвращается ожидаемое значение

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

Получено Неопределено при гарантированно заполненном ключе — проверьте тип ключа

Обращение к свойству структуры
Норма

Метод Свойство() вернул Истина

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

Ошибка выполнения при обращении через точку — ключа нет в структуре

Данные на форме
Норма

Таблица отображается в реквизите формы

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

Ошибка передачи данных — таблица значений создана вне реквизита на клиенте

Фиксированные коллекции и передача данных

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

Платформа возвращает фиксированные коллекции из ряда встроенных механизмов. Если нужно модифицировать такие данные, создайте изменяемую копию: например, Новый Массив(ФиксированныйМассив) — конструктор скопирует элементы в обычный массив.

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

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

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

Почему поиск в массиве медленный и что делать?

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

Можно ли использовать таблицу значений на тонком клиенте?

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

Как безопасно получить значение из структуры, если ключа может не быть?

Используйте метод Свойство("ИмяКлюча", Переменная): он возвращает Истина при наличии ключа и помещает значение во второй параметр. Прямое обращение через точку к отсутствующему свойству вызывает ошибку выполнения и прерывает код.

Что делать, если нужно изменить фиксированную коллекцию?

Фиксированные коллекции неизменяемы по замыслу. Создайте обычную копию через конструктор — например, Новый Массив(ФиксированныйМассив) — и работайте с копией. Исходная фиксированная коллекция останется нетронутой.

Какая коллекция лучше для выпадающего списка выбора?

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

Итог

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

Коллекция значений — базовый инструмент разработки в 1С: массив для упорядоченных списков, структура для именованных параметров, соответствие для быстрого поиска по ключу, таблица значений для табличных данных на сервере. Учитывайте ограничения клиента, не изменяйте коллекцию во время её обхода и проверяйте наличие ключей методом Свойство().