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

25.11.24

Разработка - Механизмы платформы 1С

Возможности структуры и соответствия для самых маленьких.

В прошлый раз я описывал возможности массива в статье: Как готовить и есть массивы.

Сегодня хочется пройтись по двум похожим друг на друга коллекциям: Структура и Соответствие.

Все примеры воспроизводились на платформе 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]];

 

Структура Соответствие Массив ФиксированнаяСтруктура ФиксированноеСоответствие

См. также

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    8330    bayselonarrend    20    

156

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    6400    dsdred    18    

80

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    19654    YA_418728146    26    

72

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    24320    SeiOkami    48    

135

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    15385    YA_418728146    7    

169
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. hame1e00n 524 25.11.24 15:51 Сейчас в теме
Коротко и понятно! Спасибо!)
YA_418728146; +1 Ответить
2. kovin 26.11.24 10:28 Сейчас в теме
У структуры ключ "может быть только строковым и должен удовлетворять требованиям, предъявляемым к именованию переменных встроенного языка" и соответственно "Именем переменной, объявленной процедуры или функции может быть любая последовательность букв, цифр и знаков подчеркивания, начинающаяся с буквы или знака подчеркивания".
3. kuzyara 2095 29.11.24 10:51 Сейчас в теме
Это всё понятно, это всё есть в справке.

Так как правильно ответить на вопрос "Чем отличаются структура и соответствие?"
4. le_ 243 29.11.24 11:09 Сейчас в теме
Уже была статья с таким заголовком:
https://infostart.ru/1c/tools/142517/
5. Cyberhawk 135 03.12.24 17:01 Сейчас в теме
Ключи должны содержать только буквы и нижнее подчеркивание
А как же цифры?
6. kMidas 15 05.12.24 11:53 Сейчас в теме
Также у `Соответствие` индексный поиск по ключу
Оставьте свое сообщение