Коллекции: Массив, Структура, Соответствие, ТаблицаЗначений

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

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

Одиночных переменных хватает ненадолго: как только данных становится много, нужен контейнер. В 1С четыре рабочих коллекции, и у каждой своя ниша. Научившись выбирать между ними, вы будете писать код, который читается легко и работает быстро.

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

Массив хранит значения по порядку, доступ — по числовому индексу (нумерация с нуля). Берите его, когда важна последовательность, а имён у элементов нет.

Города = Новый Массив;
Города.Добавить("Москва");
Города.Добавить("Казань");
Города.Добавить("Уфа");

Сообщить("Всего городов: " + Города.Количество());
Сообщить("Первый: " + Города[0]); // индексация с нуля

Для Каждого Город Из Города Цикл
    Сообщить(" - " + Город);
КонецЦикла;

Результат:

Всего городов: 3
Первый: Москва
 - Москва
 - Казань
 - Уфа

Главные методы: Добавить() — в конец, Количество() — размер, обращение по индексу Массив[i], Найти() — вернуть индекс элемента или Неопределено.

Структура — набор именованных полей

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

Сотрудник = Новый Структура;
Сотрудник.Вставить("Фамилия", "Иванов");
Сотрудник.Вставить("Оклад", 80000);
Сотрудник.Вставить("Принят", '20240115');

// Обращение к полю по имени — через точку
Сообщить(Сотрудник.Фамилия + ": " + Сотрудник.Оклад);

// Можно задать поля сразу в конструкторе
Товар = Новый Структура("Наименование, Цена", "Мышь", 990);
Сообщить(Товар.Наименование + " — " + Товар.Цена);

Результат:

Иванов: 80000
Мышь — 990

Ключи структуры — всегда допустимые имена (нельзя пробел или начать с цифры). Если полю нужно произвольное имя-ключ (например, код с дефисом), берите Соответствие. Проверить наличие ключа помогает Свойство(): Если Сотрудник.Свойство("Оклад") Тогда ....

Соответствие — словарь с любыми ключами

Соответствие тоже хранит пары «ключ — значение», но ключом может быть любое значение: строка с чем угодно, число, дата, даже ссылка на справочник. Это главный инструмент для быстрого поиска «по ключу».

ЦеныПоАртикулу = Новый Соответствие;
ЦеныПоАртикулу.Вставить("ART-001", 1500);
ЦеныПоАртикулу.Вставить("ART-002", 3200);

// Мгновенный доступ по ключу
Сообщить("Цена ART-002: " + ЦеныПоАртикулу["ART-002"]);

// Перебор: элемент даёт .Ключ и .Значение
Для Каждого Пара Из ЦеныПоАртикулу Цикл
    Сообщить(Пара.Ключ + " -> " + Пара.Значение);
КонецЦикла;

Результат:

Цена ART-002: 3200
ART-001 -> 1500
ART-002 -> 3200

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

Массив, Структура или Соответствие — что выбрать

ЗадачаБерём
упорядоченный список, доступ по номеруМассив
несколько известных полей объектаСтруктура
быстрый поиск по произвольному ключуСоответствие

ТаблицаЗначений — рабочая лошадка обработки данных

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

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

Строка = Продажи.Добавить();
Строка.Товар = "Мышь";
Строка.Количество = 5;
Строка.Сумма = 4950;

Строка = Продажи.Добавить();
Строка.Товар = "Клавиатура";
Строка.Количество = 2;
Строка.Сумма = 3000;

// Обход строк и подсчёт итога
Итого = 0;
Для Каждого СтрокаТЗ Из Продажи Цикл
    Итого = Итого + СтрокаТЗ.Сумма;
КонецЦикла;
Сообщить("Итого продаж: " + Итого);

Результат:

Итого продаж: 7950

У ТЗ есть готовые методы, которые экономят массу кода: Итог("Сумма") — сумма по колонке; Сортировать("Сумма Убыв") — сортировка; НайтиСтроки(Отбор) — найти строки по условию; Свернуть("Товар", "Количество, Сумма") — группировка (свернуть одинаковые товары, сложив числовые колонки).

// Те же данные — считаем итог одной строкой вместо цикла
Сообщить("Итого через метод: " + Продажи.Итог("Сумма"));

// Найти строки, где количество больше 3
Отбор = Новый Структура("Количество", 5);
Найденные = Продажи.НайтиСтроки(Отбор);
Сообщить("Строк с количеством 5: " + Найденные.Количество());

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

Как это работает

Все коллекции 1С — объекты платформы, живущие в памяти сеанса. Массив внутри — динамический список ссылок на значения; добавление в конец быстрое, вставка в середину дороже. Структура и Соответствие построены как хеш-таблицы: ключ прогоняется через хеш-функцию, и по нему сразу вычисляется, где лежит значение — оттого доступ по ключу почти не зависит от размера. Структура дополнительно ограничивает ключи правилами имён и позволяет синтаксис через точку. ТаблицаЗначений хранит метаданные колонок и массив строк, где каждая строка — как мини-структура с полями по именам колонок; служебные методы (Итог, Свернуть, Сортировать) реализованы платформенным кодом и работают быстрее ручного цикла.

Частые ошибки

Индексация массива с единицы. В 1С массивы нумеруются с нуля: первый элемент — Массив[0], последний — Массив[Массив.Количество() - 1]. Обращение к Массив[Количество()] вылетит за границу.

Пробел или спецсимвол в ключе структуры. Стр.Вставить("Цена товара", 100) — ошибка: ключ структуры обязан быть корректным именем без пробелов. Нужен произвольный ключ — берите Соответствие.

Забыли описать колонки ТаблицыЗначений. Попытка Строка.Сумма = 100 без предварительного Колонки.Добавить("Сумма") завершится ошибкой — такой колонки нет. Сначала колонки, потом строки.

Ищут в массиве перебором там, где нужен словарь. Проверять «есть ли элемент» через Найти() в большом массиве в цикле — медленно (перебор внутри перебора). Если поиск по ключу частый, заранее сложите данные в Соответствие.

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

Итоги

  • Массив — упорядоченный список, доступ по индексу с нуля; Добавить(), Количество().
  • Структура — именованные поля-ключи (по правилам имён), доступ через точку; для «карточки» объекта.
  • Соответствие — словарь с любыми ключами, мгновенный поиск по ключу, .Ключ и .Значение при обходе.
  • ТаблицаЗначений — таблица в памяти (колонки + строки), основа обработок; методы Итог, Сортировать, НайтиСтроки, Свернуть.
  • Все они перебираются циклом Для Каждого ... Из ...; не изменяйте коллекцию прямо во время такого перебора.
Проверьте себя
1. С какого индекса начинается нумерация элементов Массива в 1С?
AС 1
BС 0
CС -1
DИндексов нет, только по имени
2. Какую коллекцию выбрать для быстрого поиска значения по произвольному ключу (например, по артикулу вида ART-001)?
AМассив
BСтруктура
CСоответствие
DТаблицаЗначений