В прошлый раз я описывал возможности массива в статье: Как готовить и есть массивы.
Сегодня хочется пройтись по двум похожим друг на друга коллекциям: Структура и Соответствие.
Все примеры воспроизводились на платформе 8.3.25.
Начнем с соответствия. Тут все просто:
// Можно создать соответствие без скобок
Соответствие1 = Новый Соответствие;
// А можно и со скобками
Соответствие2 = Новый Соответствие();
Со структурой всё становится немного интереснее. Можно сразу создать структуру, основываясь на ключах и значениях.
// Можно создать структуру без скобок
Структура1 = Новый Структура;
// Можно со скобками
Структура2 = Новый Структура();
// А можно и с начальными данными
Структура3 = Новый Структура("Один, Два, Три", 1, , 3);
Вы не обязаны присваивать значения каждому ключу. Например, в случае с ключом "Два" значение будет "Неопределено".
Ключом у соответствия может быть все, что угодно:
Соответствие = Новый Соответствие;
// Можем указать число
Соответствие.Вставить(1, "Один");
// Можем указать строку
Соответствие.Вставить("1", "Один");
// Можем указать какую-нибудь дичь
Соответствие.Вставить(Справочники.ТипВсеСсылки(), "Два");
// Можем не указывать ключ, в данном случае ключом станет "Неопределено"
Соответствие.Вставить(, "Три");
// Можем указать дату
Соответствие.Вставить(ТекущаяДата(), "Четыре");
Задавать новые элементы соответствия можно и без метода "Вставить". Для этого нам нужно указать ключ в квадратных скобках и через знак "=" задать значение:
// Можем ключом соответствия указать другое соответствие
Соответствие[Новый Соответствие] = "Пять";
// Можем указать ссылку на объект
Соответствие[Справочники.Сотрудники.НайтиПоКоду("123456789")] = "Шесть";
У структуры в свою очередь есть четкие правила создания ключей. Ключи должны содержать только буквы и нижнее подчеркивание (_):
Структура = Новый Структура;
Структура.Вставить("_Один", 1);
Структура.Вставить("_Два_", 2);
Структура.Вставить("Три_", 3);
Структура.Вставить("Чет_ыре", 4);
Как правило, значения из соответствия получают указанием ключа в квадратных скобках, но еще есть и метод соответствия "Получить":
Сообщить(Соответствие[1]); // "Один"
Сообщить(Соответствие.Получить(Неопределено)); // Три
Если передать параметром несуществующий ключ, исключения не будет. Соответствие просто вернет "Неопределено":
Сообщить(Соответствие[7]); // Неопределено
Сообщить(Соответствие.Получить(8)); // Неопределено
Значения структуры тоже можно получать через квадратные скобки, но наиболее часто используемым вариантом является указание ключа через точку:
Сообщить(Структура._Один); // 1
Сообщить(Структура["_Два_"]); // 2
// Регистр букв при указании ключа в скобках не важен
Сообщить(Структура["трИ_"]); // 3
// Да и при указании через точку, регистр тоже не важен
Сообщить(Структура.чет_ырЕ); // 4
Если указать в скобках или через точку ключ, которого в структуре нет, платформой будет сформировано исключение. Для того, чтобы проверить, если ли в структуре определенный ключ, надо использовать метод структуры "Свойство":
Если Структура.Свойство("_Один") Тогда // Истина
Значение = Структура["_Один"]; // 1
Иначе
Значение = Неопределено;
КонецЕсли;
Этот кусок кода можно немного сократить, если использовать второй параметр метода "Свойство", который является выходным:
Значение = Значение;
// Несуществующий ключ
Структура.Свойство("Четыре", Значение);
Сообщить(Значение); // Неопределено
// Существующий ключ
Структура.Свойство("_Два_", Значение);
Сообщить(Значение); // 2
Для соответствия:
Соответствие[1] = "Другой один";
Соответствие.Вставить(1, "Совсем другой один");
Оба этих вызова будут работать, и оба просто поменяют значение у существующего ключа. Если же такого ключа еще нет, оба этих вызова просто добавят новый ключ и его значение.
Для структуры:
Если Структура.Свойство("_Один") Тогда
Структура["_Один"] = "Другой 1";
Структура._Один = "Совсем другой 1";
КонецЕсли;
При попытке изменения значения по несуществующему ключу, будет выкинуто исключение. Тут надо или проверять, что такой ключ существует, или точно быть уверенным, что такой ключ существует. Но можно поменять значение без проверки через:
Структура.Вставить("_Один", "Вообще другой 1");
И даже если такой ключ уже заявлен, значение по ключу просто обновится.
Количество элементов в коллекции можно узнать вызвав метод "Количество":
Сообщить(Структура.Количество());
Сообщить(Соответствие.Количество());
Удаление данных в структуре и в соответствии делается одинаково:
Структура.Удалить("_Один");
Соответствие.Удалить(1);
Если передать несуществующие ключи в метод "Удалить", исключения не будет.
Ну и конечно, можно зачистить всю коллекцию:
Структура.Очистить();
Соответствие.Очистить();
Этот метод удалит все ключи, и коллекция станет пустой.
Фиксированные структуры и соответствия отличаются от обычных тем, что в них нельзя менять ключи и значения, нельзя удалять элементы коллекции и очищать коллекции. Создаются следующим способом:
Соответствие = Новый Соответствие;
Соответствие["Ответ"] = 42;
ФиксСоответствие = Новый ФиксированноеСоответствие(Соответствие);
Структура = Новый Структура("Ответ", 42);
ФиксСтруктура = Новый ФиксированнаяСтруктура(Структура);
// Можно и без обычной структуры
ФискСтруктура = Новый ФиксированнаяСтруктура("Ответ", 42);
Структуру и соответствие можно обойти в цикле, например:
Копия = Новый Структура;
Для Каждого КиЗ Из Структура Цикл
Копия.Вставить(КиЗ.Ключ, КиЗ.Значение);
КонецЦикла;
Копия = Новый Соответствие;
Для Каждого КиЗ Из Соответствие Цикл
Копия[КиЗ.Ключ] = КиЗ.Значение;
КонецЦикла;
В этом случае в КиЗ будет ключ и значение элемента коллекции.
Главное помнить, что это не упорядоченная коллекция, и никто не гарантирует, что при обходе в цикле вы получите элементы коллекции в том же порядке, в котором вы их добавляли.
Если вам нужно, чтобы структура или соответствие было упорядоченным, храните ключи в другом месте:
Ключи = Новый Массив;
Структура = Новый Структура;
Для Каждого Строка Из Источник Цикл
Ключи.Добавить(Строка.Ключ);
Структура.Вставить(Строка.Ключ, Строка.Значение);
КонецЦикла;
ПятыйЭлемент = Структура[Ключи[4]];