Как получить значение из соответствия в 1С: метод Получить, скобки и проверка ключа
Чтобы получить значение из соответствия в 1С, используйте метод Получить(Ключ)
или обращение по ключу через квадратные скобки Соответствие[Ключ]. Разница
принципиальна: Получить() при отсутствии ключа вернёт Неопределено
и не прервёт выполнение, а [Ключ] при отсутствии ключа вызовет исключение.
Поэтому для безопасного чтения и проверки наличия ключа применяют
Значение = Соответствие.Получить(Ключ) со сравнением результата с
Неопределено. Ключом в соответствии может быть значение любого типа —
это главное отличие от Структуры, где ключ только строка-идентификатор.
Получить значение методом Получить()
Основной и самый безопасный способ получить значение из соответствия в 1С — метод
Получить(Ключ). Он возвращает значение, связанное с ключом, а если такого ключа
в соответствии нет — Неопределено (без ошибки выполнения):
Соответствие = Новый Соответствие;
Соответствие.Вставить("Москва", "Столица России");
Соответствие.Вставить(1980, "Олимпиада");
Значение = Соответствие.Получить("Москва");
Сообщить(Значение); // Столица России
// Ключа нет — вернётся Неопределено, исключения НЕ будет
Пусто = Соответствие.Получить("Тверь");
Сообщить(Пусто = Неопределено); // Истина
Именно потому, что Получить() не падает на отсутствующем ключе, его удобно
использовать и для чтения значения, и для проверки наличия ключа одним вызовом (см. ниже).
Обращение к значению через квадратные скобки []
Второй способ получить значение из соответствия — обращение по ключу через квадратные скобки
Соответствие[Ключ]. Он короче, но имеет важное ограничение:
Соответствие = Новый Соответствие;
Соответствие.Вставить("Москва", "Столица России");
Значение = Соответствие["Москва"];
Сообщить(Значение); // Столица России
// ОПАСНО: ключа нет → будет вызвано исключение, выполнение прервётся
Значение = Соответствие["Тверь"]; // Ошибка!
В отличие от метода Получить(), обращение [Ключ] при отсутствии ключа
вызывает исключение. Поэтому квадратные скобки безопасно применять только когда
вы уверены, что ключ существует. Если такой уверенности нет — используйте Получить().
Как проверить наличие ключа в соответствии
У типа Соответствие нет отдельного метода вроде Свойство() у
Структуры. Проверка наличия ключа в соответствии выполняется через тот же
Получить() со сравнением результата с Неопределено:
Значение = Соответствие.Получить("Москва");
Если Значение <> Неопределено Тогда
Сообщить("Ключ есть, значение: " + Значение);
Иначе
Сообщить("Такого ключа в соответствии нет");
КонецЕсли;
Есть тонкость: если по ключу намеренно хранится значение Неопределено,
то отличить «ключа нет» от «ключ есть, но значение Неопределено» через Получить()
напрямую нельзя. На практике это встречается редко; если такой сценарий возможен, храните
в качестве значения специальный маркер (например, пустую строку или Истина)
вместо Неопределено.
Заполнение соответствия: Вставить, Удалить, Количество
Прежде чем получить значение, соответствие нужно заполнить. Добавление и замена элементов —
метод Вставить(Ключ, Значение):
Соответствие = Новый Соответствие;
Соответствие.Вставить("Ключ1", 100);
Соответствие.Вставить("Ключ1", 200); // ключ уже есть → значение заменяется
Сообщить(Соответствие.Количество()); // 1
Сообщить(Соответствие.Получить("Ключ1")); // 200
Соответствие.Удалить("Ключ1");
Сообщить(Соответствие.Количество()); // 0
Ключи в соответствии уникальны: повторная вставка того же ключа не создаёт
дубль, а перезаписывает значение. Удаление элемента — Удалить(Ключ),
количество элементов — Количество(), полная очистка — Очистить().
Обход соответствия циклом Для Каждого
Когда нужно получить все значения из соответствия сразу, применяют обход циклом
Для Каждого … Из … Цикл. Каждый элемент выборки — пара «ключ-значение»
со свойствами Ключ и Значение:
Для Каждого КлючИЗначение Из Соответствие Цикл
Сообщить("Ключ: " + КлючИЗначение.Ключ
+ ", значение: " + КлючИЗначение.Значение);
КонецЦикла;
Такой обход удобен, чтобы выгрузить содержимое соответствия, посчитать или отфильтровать элементы. Порядок обхода соответствует порядку добавления ключей.
Соответствие или Структура: что выбрать
Соответствие и Структура — обе коллекции пар «ключ-значение», но
различаются требованиями к ключу и способом доступа:
-
Тип ключа. В
Соответствииключ — значение любого типа (строка, число, ссылка, дата). ВСтруктуреключ — только строка-идентификатор (буквы, цифры и подчёркивание, без пробелов). -
Доступ к значению. В
Соответствии— черезПолучить()или[Ключ]. ВСтруктуре— ещё и через точкуСтруктура.Ключ, а проверка наличия ключа делается методомСвойство(). -
Когда что. Нужен произвольный ключ (число, ссылка на элемент, дата) —
берите
Соответствие. Ключи — фиксированный набор понятных строк-идентификаторов (как имена параметров) — удобнееСтруктура.
Частые ошибки при получении значения из соответствия
-
Обращение
[Ключ]к отсутствующему ключу. Это самая частая ошибка:Соответствие[Ключ]при отсутствии ключа вызывает исключение и обрывает выполнение. Если ключ может отсутствовать — используйтеПолучить(). -
Путают Соответствие и Структуру. У
Соответствиянет доступа через точкуСоответствие.Ключи нет методаСвойство(). Обращение по точке работает уСтруктуры, а не у соответствия. -
Проверка наличия ключа при значении Неопределено. Если по ключу хранится
Неопределено, отличить «ключа нет» от «значение Неопределено» черезПолучить()не выйдет. Не хранитеНеопределенокак осмысленное значение — используйте маркер. -
Строковый и числовой ключ — разные ключи.
Получить("1")иПолучить(1)обращаются к разным элементам: тип ключа учитывается. Следите за типом ключа при вставке и чтении.
Частые вопросы о получении значения из соответствия в 1С
Чем отличается Получить() от обращения через квадратные скобки?
Получить(Ключ) при отсутствии ключа возвращает Неопределено и не
прерывает выполнение. Обращение Соответствие[Ключ] при отсутствии ключа
вызывает исключение. Для безопасного чтения используйте Получить().
Как проверить, есть ли ключ в соответствии?
Вызовите Значение = Соответствие.Получить(Ключ) и сравните результат с
Неопределено. Отдельного метода СодержитКлюч() у типа
Соответствие нет — в отличие от Структуры с её Свойство().
Может ли ключом соответствия быть не строка?
Да. В соответствии ключом может быть значение любого типа: число, дата, ссылка на элемент
справочника. Это ключевое отличие от Структуры, где ключ — только
строка-идентификатор.