Программирование в 1С

Как получить значение из соответствия в 1С: метод Получить, скобки и проверка ключа

Коротко

Чтобы получить значение из соответствия в 1С, используйте метод Получить(Ключ) или обращение по ключу через квадратные скобки Соответствие[Ключ]. Разница принципиальна: Получить() при отсутствии ключа вернёт Неопределено и не прервёт выполнение, а [Ключ] при отсутствии ключа вызовет исключение.

Поэтому для безопасного чтения и проверки наличия ключа применяют Значение = Соответствие.Получить(Ключ) со сравнением результата с Неопределено. Ключом в соответствии может быть значение любого типа — это главное отличие от Структуры, где ключ только строка-идентификатор.

Получить значение методом Получить()

Основной и самый безопасный способ получить значение из соответствия в 1С — метод Получить(Ключ). Он возвращает значение, связанное с ключом, а если такого ключа в соответствии нет — Неопределено (без ошибки выполнения):

Соответствие = Новый Соответствие;
Соответствие.Вставить("Москва", "Столица России");
Соответствие.Вставить(1980, "Олимпиада");

Значение = Соответствие.Получить("Москва");
Сообщить(Значение); // Столица России

// Ключа нет — вернётся Неопределено, исключения НЕ будет
Пусто = Соответствие.Получить("Тверь");
Сообщить(Пусто = Неопределено); // Истина
Получить
Ключключ искомого элемента (значение любого типа)
Значение элемента, либо Неопределено, если ключа нет

Именно потому, что Получить() не падает на отсутствующем ключе, его удобно использовать и для чтения значения, и для проверки наличия ключа одним вызовом (см. ниже).

Обращение к значению через квадратные скобки []

Второй способ получить значение из соответствия — обращение по ключу через квадратные скобки Соответствие[Ключ]. Он короче, но имеет важное ограничение:

Соответствие = Новый Соответствие;
Соответствие.Вставить("Москва", "Столица России");

Значение = Соответствие["Москва"];
Сообщить(Значение); // Столица России

// ОПАСНО: ключа нет → будет вызвано исключение, выполнение прервётся
Значение = Соответствие["Тверь"]; // Ошибка!

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

Как проверить наличие ключа в соответствии

У типа Соответствие нет отдельного метода вроде Свойство() у Структуры. Проверка наличия ключа в соответствии выполняется через тот же Получить() со сравнением результата с Неопределено:

Значение = Соответствие.Получить("Москва");
Если Значение <> Неопределено Тогда
    Сообщить("Ключ есть, значение: " + Значение);
Иначе
    Сообщить("Такого ключа в соответствии нет");
КонецЕсли;

Есть тонкость: если по ключу намеренно хранится значение Неопределено, то отличить «ключа нет» от «ключ есть, но значение Неопределено» через Получить() напрямую нельзя. На практике это встречается редко; если такой сценарий возможен, храните в качестве значения специальный маркер (например, пустую строку или Истина) вместо Неопределено.

Заполнение соответствия: Вставить, Удалить, Количество

Прежде чем получить значение, соответствие нужно заполнить. Добавление и замена элементов — метод Вставить(Ключ, Значение):

Соответствие = Новый Соответствие;
Соответствие.Вставить("Ключ1", 100);
Соответствие.Вставить("Ключ1", 200); // ключ уже есть → значение заменяется

Сообщить(Соответствие.Количество()); // 1
Сообщить(Соответствие.Получить("Ключ1")); // 200

Соответствие.Удалить("Ключ1");
Сообщить(Соответствие.Количество()); // 0
Вставить
Ключключ элемента, значение любого типа
Значениесохраняемое значение
→ добавляет новый или заменяет значение существующего ключа

Ключи в соответствии уникальны: повторная вставка того же ключа не создаёт дубль, а перезаписывает значение. Удаление элемента — Удалить(Ключ), количество элементов — Количество(), полная очистка — Очистить().

Обход соответствия циклом Для Каждого

Когда нужно получить все значения из соответствия сразу, применяют обход циклом Для Каждого … Из … Цикл. Каждый элемент выборки — пара «ключ-значение» со свойствами Ключ и Значение:

Для Каждого КлючИЗначение Из Соответствие Цикл
    Сообщить("Ключ: " + КлючИЗначение.Ключ
        + ", значение: " + КлючИЗначение.Значение);
КонецЦикла;

Такой обход удобен, чтобы выгрузить содержимое соответствия, посчитать или отфильтровать элементы. Порядок обхода соответствует порядку добавления ключей.

Соответствие или Структура: что выбрать

Соответствие и Структура — обе коллекции пар «ключ-значение», но различаются требованиями к ключу и способом доступа:

  • Тип ключа. В Соответствии ключ — значение любого типа (строка, число, ссылка, дата). В Структуре ключ — только строка-идентификатор (буквы, цифры и подчёркивание, без пробелов).
  • Доступ к значению. В Соответствии — через Получить() или [Ключ]. В Структуре — ещё и через точку Структура.Ключ, а проверка наличия ключа делается методом Свойство().
  • Когда что. Нужен произвольный ключ (число, ссылка на элемент, дата) — берите Соответствие. Ключи — фиксированный набор понятных строк-идентификаторов (как имена параметров) — удобнее Структура.

Частые ошибки при получении значения из соответствия

  • Обращение [Ключ] к отсутствующему ключу. Это самая частая ошибка: Соответствие[Ключ] при отсутствии ключа вызывает исключение и обрывает выполнение. Если ключ может отсутствовать — используйте Получить().
  • Путают Соответствие и Структуру. У Соответствия нет доступа через точку Соответствие.Ключ и нет метода Свойство(). Обращение по точке работает у Структуры, а не у соответствия.
  • Проверка наличия ключа при значении Неопределено. Если по ключу хранится Неопределено, отличить «ключа нет» от «значение Неопределено» через Получить() не выйдет. Не храните Неопределено как осмысленное значение — используйте маркер.
  • Строковый и числовой ключ — разные ключи. Получить("1") и Получить(1) обращаются к разным элементам: тип ключа учитывается. Следите за типом ключа при вставке и чтении.

Частые вопросы о получении значения из соответствия в 1С

Чем отличается Получить() от обращения через квадратные скобки?

Получить(Ключ) при отсутствии ключа возвращает Неопределено и не прерывает выполнение. Обращение Соответствие[Ключ] при отсутствии ключа вызывает исключение. Для безопасного чтения используйте Получить().

Как проверить, есть ли ключ в соответствии?

Вызовите Значение = Соответствие.Получить(Ключ) и сравните результат с Неопределено. Отдельного метода СодержитКлюч() у типа Соответствие нет — в отличие от Структуры с её Свойство().

Может ли ключом соответствия быть не строка?

Да. В соответствии ключом может быть значение любого типа: число, дата, ссылка на элемент справочника. Это ключевое отличие от Структуры, где ключ — только строка-идентификатор.