1с соответствие
В продолжении рубрики ‘Джуниор 1с’ сегодня рассмотрим уникальную коллекцию значений (контейнер данных) 1с ‘Cоответствие’. Сразу, для удобства, просмотра материала опубликую основные действия с соответствием:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) //Создать Соответствие //1-параметр: Ключ - Произвольный //2-параметр: Значений - Произвольный КонтейнерСоответствий = Новый Соответствие; КонтейнерСоответствий.Вставить(Справочники._ДемоКонтрагенты.ПустаяСсылка(), "ПустойКонтрагент"); КонтейнерСоответствий.Вставить(2020 , "ТекущийГод"); КонтейнерСоответствий.Вставить("сайт" , "craft1c"); КонтейнерСоответствий.Вставить("МОСКВА Г" , Истина); КонтейнерСоответствий.Вставить(Ложь , Новый Массив("1", "2", "3")); КонтейнерСоответствий.Вставить(Новый Массив("4", "5", "6"), Истина); //заменяет значения ключа, если ранее оно было установлено КонтейнерСоответствий.Вставить("МОСКВА Г" , Ложь); //Узнать количество элементов Сообщить(КонтейнерСоответствий.Количество()); //Получаем значения //1. по ключу //Ищет не по всем значениям Сообщить(КонтейнерСоответствий.Получить(2020)); // "ТекущийГод" Сообщить(КонтейнерСоответствий.Получить("МОСКВА Г")); // Истина Сообщить(КонтейнерСоответствий.Получить(Справочники._ДемоКонтрагенты.ПустаяСсылка())); // ПустойКонтрагент Сообщить(КонтейнерСоответствий.Получить(Новый Массив("4", "5", "6"))); //Неопределено Сообщить(КонтейнерСоответствий.Получить(Новый Массив("4", "5", "8"))); //Неопределено //Получаем значения //2. перебором Для Каждого Элемент Из КонтейнерСоответствий Цикл Сообщить(Строка(Элемент.Ключ) + " " + Элемент.Значение); КонецЦикла; //Получаем значения //3. по ключу ЗначениеКлюча = КонтейнерСоответствий[2020]; ЗначениеКлюча = КонтейнерСоответствий["craft1c"]; //Проверка на наличие ключа в соответствии Если НЕ ЗначениеКлюча = Неопределено Тогда КонецЕсли; Если НЕ КонтейнерСоответствий["craft1c"] = Неопределено Тогда КонецЕсли; Если НЕ КонтейнерСоответствий.Получить(2020) = Неопределено Тогда КонецЕсли; //Удалить элемент соответствия по ключу КонтейнерСоответствий.Удалить(2020); //Очистить соответствие КонтейнерСоответствий.Очистить(); КонецПроцедуры |
Основные отличием соответствия от структуры является то, что ключ в соответствии может быть произвольного типа, а в структуре только строкой. Также соответствие не упорядочивает элементы при добавлении.
Если рассматривать общий случай, то из всех коллекций значений, поиск в соответствии является самым быстрым. Но все зависит от реализуемой задачи – например можно потерять в скорости, только заполняю эту коллекцию, а выиграть в результате поиска в ней. И вся оптимизация сойдет на нет.
Так же стоит обратить внимание на поиск в соответствии: не по всем типам ключей будут искаться значения. К примеру если брать вышеуказанные примеры, то поиск по ключу типа ‘Массив‘ выдаст ‘Неопределено‘:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
&НаКлиенте Процедура ПриОткрытии(Отказ) КонтейнерСоответствий = Новый Соответствие; КонтейнерСоответствий.Вставить(Новый Массив("4", "5", "6"), Истина); Если КонтейнерСоответствий.Получить(Новый Массив("4", "5", "6")) = Неопределено Тогда КонецЕсли; КонецПроцедуры |
Основное назначения соответствия – это получение коллекции связанных попарно элементов (пар). К примеру:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
//Примеры соответствий ЗначенияДляОтправки = Новый Соответствие; ЗначенияДляОтправки.Вставить(Перечисления._ДемоПолФизическогоЛица.Женский, "Женский"); ЗначенияДляОтправки.Вставить(Перечисления._ДемоПолФизическогоЛица.Мужской, "Мужской"); ЗначенияДляОтправки = Новый Соответствие; ЗначенияДляОтправки.Вставить(Перечисления._ДемоЮридическоеФизическоеЛицо.ФизическоеЛицо, "ФизическоеЛицо"); ЗначенияДляОтправки.Вставить(Перечисления._ДемоЮридическоеФизическоеЛицо.ЮридическоеЛицо, "ЮридическоеЛицо"); Результат = Новый Соответствие; ТекстЗапроса = "ВЫБРАТЬ | УчетныеЗаписиЭлектроннойПочты.Ссылка КАК Ссылка, | НастройкиУчетныхЗаписейЭлектроннойПочты.ОтветственныйЗаОбработкуПисем КАК ВладелецУчетнойЗаписи |ИЗ | РегистрСведений.НастройкиУчетныхЗаписейЭлектроннойПочты КАК НастройкиУчетныхЗаписейЭлектроннойПочты | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.УчетныеЗаписиЭлектроннойПочты КАК УчетныеЗаписиЭлектроннойПочты | ПО НастройкиУчетныхЗаписейЭлектроннойПочты.УчетнаяЗаписьЭлектроннойПочты = УчетныеЗаписиЭлектроннойПочты.Ссылка"; Запрос = Новый Запрос(ТекстЗапроса); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Результат.Вставить(Выборка.Ссылка, Выборка.ВладелецУчетнойЗаписи); КонецЦикла; |
Так же существует такое понятие как фиксированное соответствие: неизменяемая коллекций пар. Для того что бы изменить фиксированное соответствие необходимо его переопределить заново:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
&НаСервере Процедура ФиксированноеСоответствиеНаСервере() Типы = Новый Соответствие; Типы.Вставить("name", Тип("Строка")); Типы.Вставить("descr", Тип("Строка")); Типы.Вставить("protocol", Тип("Строка")); Типы.Вставить("url", Тип("Строка")); Типы.Вставить("port", Тип("Число")); ТипыФиксированноеСоответствие = Новый ФиксированноеСоответствие(Типы); //изменить фиксированное соответствие ВставитьВФиксированноеСоответствие(ТипыФиксированноеСоответствие, "ip", Тип("Строка")) КонецПроцедуры &НаСервере Процедура ВставитьВФиксированноеСоответствие(ФиксированноеСоответствие, Ключ, Значение) Экспорт Соответствие = Новый Соответствие(ФиксированноеСоответствие); Соответствие.Вставить(Ключ, Значение); ФиксированноеСоответствие = Новый ФиксированноеСоответствие(Соответствие); КонецПроцедуры &НаКлиенте Процедура ФиксированноеСоответствие(Команда) ФиксированноеСоответствиеНаСервере(); КонецПроцедуры |
Параметр сеанса к примеру может быть определен как фиксированное соответствие:
Соответствие отлично подходит для кэширования значений в форме документа и дальнейшей работы с ними:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
//Кэширование значений: ДниНедели = Новый Соответствие; ДниНедели.Вставить(Элементы.Понедельник.Имя, 1); ДниНедели.Вставить(Элементы.Вторник.Имя, 2); ДниНедели.Вставить(Элементы.Среда.Имя, 3); ДниНедели.Вставить(Элементы.Четверг.Имя, 4); ДниНедели.Вставить(Элементы.Пятница.Имя, 5); ДниНедели.Вставить(Элементы.Суббота.Имя, 6); ДниНедели.Вставить(Элементы.Воскресенье.Имя, 7); ДниНедели = Новый ФиксированноеСоответствие(ДниНедели); Месяцы = Новый Соответствие; Месяцы.Вставить(Элементы.Январь.Имя, 1); Месяцы.Вставить(Элементы.Февраль.Имя, 2); Месяцы.Вставить(Элементы.Март.Имя, 3); Месяцы.Вставить(Элементы.Апрель.Имя, 4); Месяцы.Вставить(Элементы.Май.Имя, 5); Месяцы.Вставить(Элементы.Июнь.Имя, 6); Месяцы.Вставить(Элементы.Июль.Имя, 7); Месяцы.Вставить(Элементы.Август.Имя, 8); Месяцы.Вставить(Элементы.Сентябрь.Имя, 9); Месяцы.Вставить(Элементы.Октябрь.Имя, 10); Месяцы.Вставить(Элементы.Ноябрь.Имя, 11); Месяцы.Вставить(Элементы.Декабрь.Имя, 12); Месяцы = Новый ФиксированноеСоответствие(Месяцы); |
Для того что бы быстро скопировать соответствие или фиксированное соответствие достаточно воспользоваться функцией из БСП ‘СкопироватьРекурсивно’.
В общем учитесь правильно использовать эту коллекцию значений и к вашему коду трудно будет придраться.