Есть ли ключ в соответствии

1. json 3350 19.01.18 14:50 Сейчас в теме
Есть коллекция с типом Соответствие. Нужно программно узнать, есть ли в ней некоторый ключ. В структуре, например, есть специальный метод "Свойство()", а как это лучше сделать?

Я вижу следующие способы:
1. Перебрать все ключи в цикле - мне не нравится, т.к. в коллекции может быть много элементов
2. Получить количество элементов в коллекции, добавить нужный ключ, после добавления проверить, изменилось ли количество элементов - такой способ кривой, да и требует внесения изменений
3. Обычный способ "Если Коллекция[Ключ] = Неопределено Тогда ..." - также не проходит, т.к. в коллекции может быть элемент, с таким ключом, и значением равным Неопределено
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
67. user654641_yaga_m 13 27.06.23 14:57 Сейчас в теме
69. user654641_yaga_m 13 27.06.23 15:34 Сейчас в теме
(1)В документации написано:

Если при обращении к элементу коллекции с помощью оператора [], указан несуществующий ключ, будет вызвано исключение.
В то же время метод Получить, в параметре которого указан несуществующий ключ, возвращает значение Неопределено.

В первом случае сделает исключение, а не вернет Неопределено - может это решение Вашей проблемы?
70. PLAstic 296 30.06.23 10:54 Сейчас в теме
(1) Навскидку: получить значение по ключу. Если оно = Неопределено, запомнить количество ключей методом Количество() и вставить этот же ключ со значением Неопределено в соответствие. Сравнить кол-во с запомненным. Если не совпадает, ключа не было в оригинале. Удалить этот ключ.
2. SlavaKron 19.01.18 15:01 Сейчас в теме
Насколько знаю, соответствие не позволяет создать ключ, значение которого Неопределено.

Извиняюсь, неправильно понял вопрос.
4. json 3350 19.01.18 15:07 Сейчас в теме
(2)
	Коллекция = Новый Соответствие();
	Коллекция.Вставить("тест", Неопределено);
	Сообщить(Коллекция.Количество());
	// Сообщает : 1


(3)
ЗаполнитьЗначенияСвойств() не работает для соответствия
10. SlavaKron 19.01.18 15:14 Сейчас в теме
(4) Вы правы. Единственный выход - это попытаться избегать значений Неопределено, либо предварительно обработать соответствие, заменив значения Неопределено на NULL, например.
12. json 3350 19.01.18 15:19 Сейчас в теме
(10) избегать значения Неопределено - не всегда возможно. У меня например коллекция приходит в виде JSON, который может быть многоуровневым. Если в JSONе значение равно NULL, то 1С его преобразует к Неопределено
3. plevakin 19.01.18 15:04 Сейчас в теме
ПроверочнаяСтруктура = Новый Структура("Ключ", "ЗНАЧЕНИЕ_КОТОРОЕ_НИКОГДА_НЕ_ВСТРЕТИТСЯ");
ЗаполнитьЗначенияСвойств(ПроверочнаяСтруктура, Коллекция);
Если ПроверочнаяСтруктура.Ключ = "ЗНАЧЕНИЕ_КОТОРОЕ_НИКОГДА_НЕ_ВСТРЕТИТСЯ" Тогда
// не было такого ключа
КонецЕсли;
5. Sanya2049 40 19.01.18 15:10 Сейчас в теме
6. json 3350 19.01.18 15:11 Сейчас в теме
7. Goleff74 217 19.01.18 15:11 Сейчас в теме
1. Получить значение по ключу.
2. Получить количество элементов.
3. Вставить данный ключ.
4. Сравнить количество элементов с п.2.
8. json 3350 19.01.18 15:12 Сейчас в теме
(7) В вопросе этот метод описан. Мне он не нравится
9. Goleff74 217 19.01.18 15:13 Сейчас в теме
(8)
Хранить структуру с одним полем вместо значения.
11. json 3350 19.01.18 15:18 Сейчас в теме
Придумал еще один способ:
1. Получить значение по ключу
2. Если значение = Неопределено, то
- запомнить количество,
- удалить значение
- проверить сколько элементов осталось
- если уменьшилось, то добавить его на место и вернуть истина
13. Sanya2049 40 19.01.18 15:22 Сейчас в теме
А тип коллекции какой?
14. json 3350 19.01.18 15:23 Сейчас в теме
15. Sanya2049 40 19.01.18 15:25 Сейчас в теме
Там есть метод получить если он не получит по ключу вернет неопределенно?
(14)
Соответствие
16. json 3350 19.01.18 15:30 Сейчас в теме
(15)
Коллекция = Новый Соответствие();
Ключ = "тест";
Коллекция.Вставить(Ключ, Неопределено);
Сообщить(Коллекция.Получить(Ключ) = Неопределено); //  сообщит: Истина
Сообщить(Коллекция.Количество()); //  сообщит: 1


такой способ не подходит, он описан в вопросе п. 3
18. Sanya2049 40 19.01.18 15:34 Сейчас в теме
(16)
Коллекция =Новый Соответствие();
Коллекция.Вставить("МойКлюч",Значение);

Если Коллекция.Получить("МойКлюч")=Неопределено тогда
// мой код
КонецЕсли;
19. json 3350 19.01.18 15:37 Сейчас в теме
(18)
Коллекция =Новый Соответствие(); 
Коллекция.Вставить("МойКлюч",НЕОПРЕДЕЛЕНО); 

Если Коллекция.Получить("МойКлюч")=Неопределено тогда 
// мой код 
КонецЕсли;


в этом случае мой код не выполнится, а ключ в коллекции есть
17. json 3350 19.01.18 15:32 Сейчас в теме
Пока получилось так:


Функция СоответствиеСодержитКлюч(Соответствие, Ключ)
	
	Если НЕ Соответствие[Ключ] = Неопределено Тогда
		Возврат Истина;
	КонецЕсли;
	
	КоличествоЭлементов = Соответствие.Количество();
	Соответствие.Удалить(Ключ);
	
	Если КоличествоЭлементов = Соответствие.Количество() Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Соответствие.Вставить(Ключ);
	Возврат Истина;
	
КонецФункции
Показать


Можно ли сделать оптимальнее?
axsebur; daho; bad_wag; kuzev; +4 Ответить
50. truba 16.06.23 18:04 Сейчас в теме
(17) А с чего общество решило что Соотвествие[Ключ] это не цикл перебора коллекции ? И если вдруг это так, то для того, что бы избежать цикла перебора в коде 1С. запускают его в предприятии а потом еще и вставляют и удаляют значения. Это вот точно быстрее и оптимальнее?
81. kalyaka 1105 02.03.24 14:10 Сейчас в теме
(50) нет :) Это классика из теории программирования. Соответствия строятся на использовании хэш таблиц.
20. user623969_dusa 19.01.18 15:44 Сейчас в теме
попытка
соответствие.получить(ключ)
исключение
//ключа нет
конецпопытки
21. Fox-trot 163 19.01.18 15:45 Сейчас в теме
лучше циклом
+запомнить для повторного использования
23. json 3350 19.01.18 15:53 Сейчас в теме
(21)
(22)

в коллекции потенциально может быть и 100 и 1000 элементов, мне не подходит такой вариант
повторное использование тоже не прокатит:
мне сначала нужно найти один ключ - я перебираю всю коллекцию, запоминаю,
потом мне нужно найти второй ключ - я снова перебираю всю коллекцию, запоминаю,
и таких проверок может быть много. Нет выигрыша от повторного использования
22. Sanya2049 40 19.01.18 15:51 Сейчас в теме
Да только циклам даже в синтаксисе написан
24. BackinSoda 19.01.18 15:55 Сейчас в теме
А можно не использовать соответствие, а другую какую-нибудь коллекцию ?)
25. Sanya2049 40 19.01.18 15:56 Сейчас в теме
Тогда заполни еще одну коллекцию где есть методы найти() или свойство() и там проверяй
26. json 3350 19.01.18 15:58 Сейчас в теме
(25)
(24)
нет, другую коллекцию использовать нельзя
27. Sanya2049 40 19.01.18 16:00 Сейчас в теме
(26) Значит твоя задача не решаемая....
28. json 3350 19.01.18 16:02 Сейчас в теме
(27) Задача - решаемая. Решений много.
Хочу найти самое оптимальное.
Пока мне кажется самым оптимальным решение из поста 17

Есть ли более быстрое решение?
29. Fox-trot 163 19.01.18 16:33 Сейчас в теме
(28) решение в (17) некорректно потому как меняет исходные данные
хотя может пофиг
30. json 3350 19.01.18 16:45 Сейчас в теме
(29) да, это кривое решение, согласен

Но мне кажется, что оно быстрее, чем использование цикла (в общем случае, если предположить, что коллекция может быть большой)

Поэтому я и обращаюсь за помощью, может кто-нибудь сможет предложить что-нибудь покрасивее, но без потери скорости
31. SPID 19.01.18 16:48 Сейчас в теме
(30) Сделайте замеры) мне кажется что перебор все же довольно быстрая операция для соответствия.
А ключи какого типа - Строка? А то может преобразовать, например в строку json или еще что и искать наименование в строке...
juliia1992; +1 Ответить
32. spacecraft 19.01.18 18:53 Сейчас в теме
(30) решение в (17) очень красивое. Эту красоту нужно просто увидеть.
Запись в соответствие по определению быстрее поиска. Исходные данные при выходе из обработки остаются прежними.
Что еще нужно?
51. truba 16.06.23 18:07 Сейчас в теме
(32) Исходя из чего вы решили что запись в соотвествие быстрее поиска? На чем основана уверенность что запись не ищет элемент по ключу что бы заполнить ему значение? Или если не ищет, а просто вставляет новый элемент, то это не потенциальная утечка памяти?
53. spacecraft 16.06.23 18:42 Сейчас в теме
(51) просто помимо 1С необходимо знать и другие ЯП и понимать механику их работы.
Соответствие это аналог map в других языках. И обращение по ключи использует функцию вычисления хэш. Из-за этого и скорость записи мало отличается по скорости записи в массив по индексу (добавляется вычисление хэш), а не использует поиск по самому ключу.

PS. кстати, именно из-за использования хэш и дает возможность использовать в качестве ключа любой тип данных, так как все равно по нему будет вычисляться хэш, который и будет использоваться.
55. spacecraft 16.06.23 19:54 Сейчас в теме
(51) и еще. Что подразумевать под поиском в соответствии.
Гарантированный поиск в соответствии возможен только полным перебором, пока не найдется ключ или до конца коллекции.
Так как прямого получение значение Неопределено, не гарантирует, что такого ключа нет. Это может быть значение по существующему ключу. Вот и получается, что поиск по коллекции(с перебором самой коллекции) значительно медленнее самой записи.
56. truba 16.06.23 20:03 Сейчас в теме
(55) Если залезть под капот, то по ключу мы вычисляем хэш и дальше так же перебором уже по хэшам, не так ли?
//я понимаю что дело в количестве условных перекладываний объектов из сущности в сущность и оптимизации функций сравнения разных и что переложить в хэш и сравнить последовательность до первого разного байта это статистически быстрее чем подбирать функции сравнения сложных объектов или массива очень длинных строк, различающихся в последнем символе.
57. spacecraft 16.06.23 20:07 Сейчас в теме
(56) а это уже не важно. Если будем делать перебор коллекции вплоть до конца. Это явно медленнее прямой записи по индексу(хэшу)
58. truba 16.06.23 20:11 Сейчас в теме
(57) Тогда лезем под капот капота. пусть хэш это у нас индекс. Мы получили ключ входным параметром. преобразовали в хэш и дальше у нас задача понять есть ли такой хэш в нашей коллекции, условно. Задача упростилась т.к. привели ключи одному типу.

ПС. в итоге мы имеем задачу оптимизации количества процессорных команд, и постулат такой что преобразование хранения данных с ключем-хэшем статитситчески быстрее. С этим я спорить не буду.
59. spacecraft 16.06.23 20:19 Сейчас в теме
(58) и?
Условно:
А = Данные[Ключ]

В А получили Неопределено.
Ключ существует?
Получение данных из соответствия и поиск в соответствии это два принципиально разных действия.
Получение данных из соответствия так же довольно быстрый, так как так же получение по хэш. Это почти тоже самое, что и получение данных из массива по индексу. Но есть принципиальное отличие. Если обратиться к массиву с несуществующим индексом, то получим исключение. Если обратиться к соответствию с несуществующим ключом получим Неопределено. Но где гарантия, что полученное Неопределено это отсутствие ключа, а не такое значение по существующему ключу? Вот тут и кроится дилемма, так как соответствие не может дать такую гарантию и единственно гарантированный поиск в соответствии - полный перебор самой коллекции.
33. vadim1011985 101 19.01.18 19:41 Сейчас в теме
ИскомыйКлюч = "Мой Ключ";

КлючьНайден = Ложь;

Для каждого Зн из Соответствия цикл 

Если Зн.Ключ = ИскомыйКлюч Тогда
    КлючьНайден = Истина;
    Прервать; 
КонецЕсли;

КонецЦикла; 
Показать


Блин, что то не увидел что Вам цикл не нравиться
34. vadim1011985 101 19.01.18 19:48 Сейчас в теме
а если соответствие в структуру перегнать ?
35. Fox-trot 163 19.01.18 20:19 Сейчас в теме
(34) так оно еще медленнее буит потому как запись+чтение супротив толькочтение
36. json 3350 22.01.18 09:03 Сейчас в теме
(33), (35)
видимо, вы путаете с запись в оперативную память с записью в базу данных))
что такое запись в коллекцию - это почти то же самое, что и присвоение переменной. В случае обхода в цикле будет присвоений столько же, сколько элементов в коллекции (в худшем случае) - я имею в виду конструкцию "для каждого КлючИЗначение из Коллекция цикл". Плюс будет проверка на равенство.
В случае же поиска через Получить(), он будет выполняться более эффективными алгоритмами

Поэтому, если рассуждать логически, то способ 17 должен быть быстрее. Но как было справедливо замечено, нужно провести тест. Может позже я его сделаю
37. Fox-trot 163 22.01.18 13:56 Сейчас в теме
(36) ты или не в теме или лукавишь. чел в (34) предложил ПЕРЕГНАТЬ. а говорилось о тысячах элементах, так что времени понадобится. и не мало
38. VmvLer 22.01.18 14:01 Сейчас в теме
а чем метод соответствия Получить() не устроил-то?

или если тут ветка для мазохистов, то мой вопрос снят
39. spacecraft 22.01.18 14:32 Сейчас в теме
(38)
а чем метод соответствия Получить() не устроил-то?

Как минимум пониманием механизма работы соответствия.
Пример.
Соответствие1 = Новый Соответствие;
Соответствие1["Ключ"] = Неопределено;
Сообщить(Соответствие1.Получить("Ключ"));

Соответствие2 = Новый Соответствие;
Сообщить(Соответствие2.Получить("Ключ"));

Ключа в обоих соответствиях нет?
Fox-trot; +1 Ответить
40. VmvLer 22.01.18 15:09 Сейчас в теме
(39) если ключ установлен как Неопределено, то логично считать, что и значение соответствия по этому ключу Неопределено - все остальное от лукавого.
41. Fox-trot 163 22.01.18 15:11 Сейчас в теме
(40) у ТС другое понимание вопроса ;-)
42. spacecraft 22.01.18 15:17 Сейчас в теме
(40) теперь читаем первоначальный вопрос: "Есть ли ключ в соответствии"?
Продолжая пример из (39):
Для каждого ключ Из Соответствие1 Цикл
    Сообщить(ключ.Ключ);
КонецЦикла;

Есть ключ. И не надо ничего домысливать.
Для Соответствие2 нет ключа.
Но для обоих вернет Неопределено.
43. VmvLer 22.01.18 15:30 Сейчас в теме
Есть ключ, нет ключа

сродни вопросу "Есть ли жизнь на Марсе"

я хочу сказать, что если исключить ключ Неопределено, то метода Получить() вполне достаточно.

технологии все больше уходят в сферу вероятностей или как говорят математики необходимых и достаточных условий когда просто глупо тратить ресурсы на то, что пренебрежительно мало и по логике точно ничего не содержит, а если содержит, то его создал идиот и ценность этого творения ничтожна.
44. spacecraft 22.01.18 15:39 Сейчас в теме
(43) напрасно. Нужно просто уметь готовить (с).
Иногда само значение элемента коллекции не важно. Важно само наличие этого элемента, как триггера.
Иногда приходится отказываться от соответствия в пользу структуры, только из-за поиска ключа.
daho; Fox-trot; +2 Ответить
52. truba 16.06.23 18:09 Сейчас в теме
(44) старый добрый СписокЗначений? Ключи только текстовые?
54. spacecraft 16.06.23 18:57 Сейчас в теме
(51) (52)
ну и для кучи, статья от признанного гуру:
https://infostart.ru/1c/articles/79285/
60. truba 27.06.23 11:33 Сейчас в теме
(54)
Помогите разобраться вот с этим:

СО = Новый Соответствие;
СО[1] = СО[1];

Это недокументированное поведение компилятора что СО[1] без "=" справа возвращает объект "неопределено", а с "=" справа возвращает объект КиЗ принадлежащий Со?

Переписывать компилятор под объект соответствие ради этого отдельного финта очень спорное дело, но других идей так то и нет нет.
61. spacecraft 27.06.23 11:43 Сейчас в теме
(60)
Это недокументированное поведение компилятора что СО[1] без "=" справа возвращает объект "неопределено", а с "=" справа возвращает объект КиЗ принадлежащий Со?

А что тут не понятно?
Это равнозначно:
СО = Новый Соответствие;
А = СО[1];
СО[1] = А;

А получит значение Неопределено, так как Ключа нет и по умолчанию вернется Неопределено.
Далее присваиваем в соответствие по ключу значение Неопределено. Теперь в соответствии есть ключ и значение.
Если еще раз получить:
А = СО[1];
то вернется все то же Неопределено, только это уже будет не значение по умолчанию, а реальное значение по ключу.
И отличить это можно только полным перебором всего соответствия, до нахождения ключа, или до конца.
62. truba 27.06.23 11:59 Сейчас в теме
(61)
Т.е. компилятор переписан под соответствие, выходит что так.
Т.е. действие оператора получения элемента коллекции "[]" на объект Соответствие отличается от действия суммы операторов "[] =" на этот же объект Соответсвие.

В первом случае возврат Неопределено, во воторм случае преобразуем "[] =" в "Новый КиЗ.Значение = "

Не уверен что это хорошая практика перепиливать компилятор под объекты, но придется просто запомнить.
Однако и та околонулевая частота применения этого финта говорит о том что пилить в компилятор какие то такие исключения под конкретный объект очень спорная практика.
63. spacecraft 27.06.23 12:37 Сейчас в теме
(62) что-то не туда вас занесло.
Все просто.
Есть lvalue и есть rvalue.
Что скажите про такой код:
СО = Новый Соответствие;
СО[1] = СО(1);

Для уточнения, СО(1) это вызов функции, а не получение значения соответствия по ключу.
Но так наглядно.
Чтобы присвоить значение lvalue, сначала вычисляется rvalue. А это результат функции. Т.е. сначала вызывается функция, получается результат этой функции, и только после этого присваивается полученное значение левой переменной.
Так и при таком коде:
СО = Новый Соответствие;
СО[1] = СО[1];

Сначала получается значение rvalue. Потом это значение присваивается lvalue.
Никаких специальных ухищрений компилятора не делается. Все отрабатывает штатно.
64. truba 27.06.23 13:18 Сейчас в теме
(63) Коллега, давайте станем на место компилятора.

Видим оператор "[]" который действует на операнд "СО" со вторым операндом [ВторойОперанд]
Действие оператора [] на коллекцию это обычно получение элемента коллекции.
Соотвествие это тоже коллекция, по крайней мере оператор "Для Каждого" на нее действует.
Т.е. по общей логике действие оператора [] на эту коллекцию ожидается как получение элемента коллекции по некоему ключу.
Но если с Метаданные[НеизвестнаяФигня] вызовет скорее исключение, то в случае с
Соответствие[НеизвестнаяФигня] - явно оператор для соответствия переопределен, т.е. соответствие уже не совсем коллекция.

Это половина истории.
Потому что связка операторов "[] = "-уже совсем заводит в тупик, т.к. к какой еще коллекции применима такая последовательность операторов? Потому что левый операнд от "[] =" - КлючИЗначение.Значение.
Компилятор для соотвествия заменяет " СО[Ключ] = значение " на Соответствие.Вставить(Ключ,Значение), что не является ожидаемым действием связки операторов [] = для никакой больше коллекции, насколько я помню. По крайней мере для массива мы получим исключение и т.д.

ПС. Это я к тому, что компилятор выглядит переписанным под объект Соответствие, что на мой взгляд - плохой стиль. А переписание еще и пары операторов так на мой опять же субъективный взгляд уже крайне плохой стиль, как бы изящно это не выглядело в коде. Потому что эта изящность - это исключение которое надо будет помнить и которое в отсутствии жесткой типизации 1С выглядит вдвойне спорно, т.е. СО мы можем и переопределить в концепции 1С, а с ним и переопределится действие всех операторов на этот объект.
65. spacecraft 27.06.23 13:39 Сейчас в теме
(64)
Видим оператор "[]" который действует на операнд "СО" со вторым операндом [ВторойОперанд]

Где нашли "ВторойОперанд"? Это вообще не операнды.
Т.е. по общей логике действие оператора [] на эту коллекцию ожидается как получение элемента коллекции по некоему ключу.

Считаете, что все получения по ключу из разных типов коллекций отрабатываются одним алгоритмом? Серьезно?
Читайте СП. Для соответствия, если указанный ключ отсутствует.возвращается Неопределено.
Тут нет никаких сложностей.
Все уже озвучено выше.
66. truba 27.06.23 14:28 Сейчас в теме
(65) Да для меня не вопрос если действие операторов на разные объекты разное, в конечном итоге действие оператора "+" в выражении 3+4 действует совсем иначе чем "три" + "четыре".

Но это изначально стремный путь зависимости операторов от операндов. Хотя бы в том плане что мы не можем:

Процедура ДобавитьЭлементВЛюбуюКоллекциюПоКлючу(Коллекция, Ключ,Значение) 
     Коллекция[Ключ] = Значение;
КонецПроцедуры


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

На мой взгляд это не сложность, это хуже, это ошибка.

Потому что встретив в коде Коллекция[Ключ] = Значение - при отсутствии жесткой типизации вы не знаете как эта конструкция себя поведет. Прог ДОЛЖЕН помнить что где то глубоко в его коде корректно его код (о котором он забыл три года назад) работает только с соответствием, или с массивом.

А этот код может со временем опуститься в глубокое закрытое пятью верхними обертками легаси.
68. spacecraft 27.06.23 15:24 Сейчас в теме
(66) с добрым утром. Соответствие это не уникальная коллекция присущая 1С.
Аналогичные коллекции есть и в других ЯП. С аналогичным поведением, возвращающим null, если нет ключа.
И снова путаете понятие операндов.
45. drundel 06.12.19 12:17 Сейчас в теме
ЗначениеЗаполнено(Соответствие["ключ"]) жи
;b
46. PlatonStepan 38 13.01.22 05:38 Сейчас в теме
(17)
Понимаю, что тема мягко говоря не актуальная )
Но тоже заморочился с подобной проверкой и вот что получилось:
ЕстьКлюч = соотв[Ключ] <> неопределено;

Если НЕ ЕстьКлюч Тогда
	//на этом этапе ещё не ясно, имеется ли ключ, или только его значение "неопределено"
	//поэтому запомним количество ключей в коллекции
	КоличествоКлючейКоллекции = соотв.Количество();
	//явно вставим, тут ничего страшного в перезаписи нет, так как исходное значение и так "неопределено"
	соотв[Ключ] = неопределено;
	//если количество ключей изменилось, значит ключа не было
	ЕстьКлюч = КоличествоКлючейКоллекции = соотв.Количество();
	
	Если НЕ ЕстьКлюч Тогда
		//подчистим
		соотв.Удалить(Ключ);
	КонецЕсли;
КонецЕсли;
Показать


Для фиксированных соответствий достаточно следующего кода:
Попытка
	ЕстьКлюч = фсоотв[Ключ] = истина или истина;
Исключение
	ЕстьКлюч = ложь;
КонецПопытки;


так как - цитата из СП:
Если при обращении к элементу коллекции с помощью оператора [], указан несуществующий ключ, будет вызвано исключение.
В то же время метод Получить, в параметре которого указан несуществующий ключ, возвращает значение Неопределено.
axsebur; hcooh; +2 Ответить
47. PiotrLoginov 16.06.23 16:20 Сейчас в теме
(46) У Вас какой-то свой СП. Или Вы видите между строк. Не вижу такой инфы, что "Если при обращении к элементу коллекции с помощью оператора [], указан несуществующий ключ, будет вызвано исключение."
49. spacecraft 16.06.23 17:58 Сейчас в теме
(47) это похоже у вас персональный СП, отличный от оригинала.

ФиксированноеСоответствие (FixedMap)
Элементы коллекции:
КлючИЗначение
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются элементы соответствия.
Возможно обращение к значению элемента посредством оператора [...]. В качестве аргумента передается значение ключа элемента.
Методы:
Количество (Count)
Получить (Get)
Конструкторы:
Из соответствия
Описание:
Представляет собой неизменяемую коллекцию пар КлючИЗначение. В качестве ключа может выступать любое значение. Рекомендуется, чтобы в качестве ключа выступало значение примитивного типа или другого типа, значение которого может только присваиваться, но не может менять свое содержимое.
Если при обращении к элементу коллекции с помощью оператора [], указан несуществующий ключ, будет вызвано исключение.
В то же время метод Получить, в параметре которого указан несуществующий ключ, возвращает значение Неопределено.
Показать

Чтобы не было недопонимания откуда указываю про ФиксированноеСоответствие, перечитайте (46):
Для фиксированных соответствий достаточно следующего кода:
native-api; PlatonStepan; +2 Ответить
48. PiotrLoginov 16.06.23 16:21 Сейчас в теме
Не особый я любитель заниматься некропостингом, но в данном случае уж очень не хочется, чтобы форумчане дезинформировались.
71. kpdozer 24.08.23 17:42 Сейчас в теме
Тема старая, но актуальная.
А всего то нужно изменить подход к использованию Соответствия.
Если в Соответствии в качестве Значения всегда использовать Структуру тогда:
Параметр=Параметры["Путь"];
Если НЕ ТипЗнч(Параметр) = Тип("Структура") Тогда 
      Сообщить ("Нет ключа Путь"); 
КонецЕсли;

Было вот тут уже: http://forum.infostart.ru/forum9/topic185074/message1915439/#message1915439
72. пользователь 24.08.23 17:56
Сообщение было скрыто модератором.
...
73. user1880116 24.08.23 18:58 Сейчас в теме
(71)
всегда использовать Структуру
Лучше настройки компоновки. Значение можно хранить в правом поле первого элемента отбора.
axsebur; Oldsad; +2 Ответить
74. пользователь 24.08.23 19:33
Сообщение было скрыто модератором.
...
75. kpdozer 24.08.23 23:55 Сейчас в теме
(72)
А чего "не"?
Если не ты логику использования Соответствия задумывал, то конечно "не". В этом случае бояться циклов не стоит. Или костылей с количеством(). В конце концов скопировать в фиксированную структуру, только для того, чтобы через "попытку исключение" проверить существование ключа. А если ты сам задумал логику использования Соответствия, то все ок.
76. пользователь 25.08.23 00:14
Сообщение было скрыто модератором.
...
77. user1880116 25.08.23 09:39 Сейчас в теме
(75)
А если ты сам задумал логику использования Соответствия
То ты полностью контролируешь вставку значений. Это делает исходный вопрос о наличии ключа бессмысленым - ты же его туда и вставил.
78. kpdozer 25.08.23 09:40 Сейчас в теме
(77) иногда вставил, а иногда не вставил.
79. user1880116 25.08.23 10:01 Сейчас в теме
80. kpdozer 25.08.23 10:19 Сейчас в теме
(79)
Ну типа того)) Состав ключей может быть разным в зависимости от ситуации.
82. kalyaka 1105 02.03.24 14:23 Сейчас в теме
Предлагаю такой вариант решения: завернуть значение ключа в структуру. Т.е. для сохранения значения использовать не само значение, а структуру вида: Новый Структура("Значение", МоеЗначение). Тогда, при извлечении значения, если ключ существует, то значение можно получить из структуры, а если нет - то будет Неопределено. Пример:
Словарь = Новый Соответствие; 
Словарь.Вставить("МойКлюч", Новый Структура("Значение", МоеЗначение)); 

Если Словарь.Получить("МойКлюч") = Неопределено Тогда 
    Сообщить("Ключа нет");
Иначе
    Сообщить("Значение ключа: " + Словарь["МойКлюч"].Значение);
КонецЕсли;
Sashares; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот