Коллекции: Массив, Структура, Соответствие, ТаблицаЗначений
Коллекция — это контейнер, который хранит много значений сразу; в 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 без предварительного Колонки.Добавить("Сумма") завершится ошибкой — такой колонки нет. Сначала колонки, потом строки.
Ищут в массиве перебором там, где нужен словарь. Проверять «есть ли элемент» через Найти() в большом массиве в цикле — медленно (перебор внутри перебора). Если поиск по ключу частый, заранее сложите данные в Соответствие.
Меняют коллекцию во время Для Каждого. Удаление или добавление элементов прямо внутри цикла Для Каждого ломает внутренний итератор. Собирайте изменения отдельно (например, индексы на удаление) и применяйте после цикла — или идите обратным счётным циклом.
Итоги
- Массив — упорядоченный список, доступ по индексу с нуля;
Добавить(),Количество(). - Структура — именованные поля-ключи (по правилам имён), доступ через точку; для «карточки» объекта.
- Соответствие — словарь с любыми ключами, мгновенный поиск по ключу,
.Ключи.Значениепри обходе. - ТаблицаЗначений — таблица в памяти (колонки + строки), основа обработок; методы
Итог,Сортировать,НайтиСтроки,Свернуть. - Все они перебираются циклом
Для Каждого ... Из ...; не изменяйте коллекцию прямо во время такого перебора.