К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как получить значение соответствия в 1С

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

Соответствие в 1С — это универсальная коллекция пар «ключ–значение», аналог словаря или ассоциативного массива в других языках. Получить значение по ключу можно двумя способами: через метод Получить() и через оператор квадратных скобок []. Оба варианта работают быстро, но ведут себя по-разному, если ключ не найден.

Ошибки при чтении соответствий — одна из частых причин падения кода: обращение по несуществующему ключу возвращает Неопределено, и последующая работа с этим значением без проверки приводит к исключению. В статье разобраны оба способа получения значения, безопасные шаблоны проверки, обход соответствия и типичные ошибки.

Что такое соответствие и когда его применяют

Соответствие (Соответствие, англ. Map) хранит пары «ключ–значение», где ключ может быть любого типа: строка, число, ссылка на справочник или документ, дата. Значение — тоже произвольного типа, включая структуры, массивы и другие соответствия.

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

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

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

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

Курсы = Новый Соответствие;

Курсы.Вставить("USD", 90);

Курсы.Вставить("EUR", 98);

КурсДоллара = Курсы.Получить("USD"); // 90

КурсЙены = Курсы.Получить("JPY"); // Неопределено

Метод не вызывает исключения при отсутствии ключа — это делает его безопасным для ситуаций, когда наличие ключа не гарантировано. Однако вернувшееся Неопределено нужно обработать, иначе дальнейшие операции (арифметика, обращение к свойствам) завершатся ошибкой.

bsl
Значение = Соответствие.Получить(Ключ);
Если Значение = Неопределено Тогда
    // ключа нет — обработать ситуацию
КонецЕсли;

Получение значения через квадратные скобки

Альтернативный синтаксис — обращение по ключу в квадратных скобках, как к элементу массива:

КурсДоллара = Курсы["USD"]; // 90

По поведению при чтении этот вариант аналогичен Получить(): при отсутствующем ключе возвращается Неопределено. Различие проявляется при записи: оператор Соответствие[Ключ] = Значение работает как Вставить() — добавляет пару или перезаписывает существующую.

Выбор между двумя формами — вопрос стиля команды. Метод Получить() явнее показывает намерение чтения и легче ищется по коду, поэтому в типовых конфигурациях встречается чаще. Важно не смешивать синтаксис чтения с синтаксисом других коллекций: у структуры обращение идёт по имени свойства через точку, а не по произвольному ключу.

Сравнение способов

Получить(Ключ)

Явное чтение, привычно в типовом коде; при отсутствии ключа возвращает Неопределено

Соответствие[Ключ]

Короче, читается как доступ к массиву; поведение при чтении идентично, но та же запись используется и для вставки

Безопасная проверка наличия ключа

Раз соответствие не сообщает об отсутствии ключа исключением, ответственность за проверку лежит на разработчике. Стандартный шаблон — сравнение результата с Неопределено:

Курс = Курсы.Получить(Валюта);

Если Курс = Неопределено Тогда

ВызватьИсключение "Не найден курс валюты " + Валюта;

КонецЕсли;

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

Курс = Курсы.Получить(Валюта);

Если Курс = Неопределено Тогда

Курс = 1; // валюта учёта

КонецЕсли;

Тонкий момент: Неопределено может быть не только признаком отсутствия ключа, но и легально сохранённым значением. Если для логики важно различать эти случаи, единственный надёжный способ — пробная вставка-замена не подойдёт; используйте соглашение «не хранить Неопределено в соответствии» или дополнительный признак рядом со значением.

Обход соответствия и получение всех значений

Когда нужны все пары, используйте цикл Для Каждого. Каждая итерация возвращает объект КлючИЗначение со свойствами Ключ и Значение:

Для Каждого Пара Из Курсы Цикл

Сообщить(Пара.Ключ + " = " + Пара.Значение);

КонецЦикла;

Количество элементов возвращает метод Количество(). Очистить всё соответствие можно методом Очистить(), удалить один элемент — Удалить(Ключ).

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

Порядок безопасного чтения значения
  1. 1
    Убедитесь, что переменная содержит соответствие, а не Неопределено или структуру
  2. 2
    Вызовите Соответствие.Получить(Ключ) с ключом ожидаемого типа
  3. 3
    Сравните результат с Неопределено
  4. 4
    При отсутствии ключа выполните ветку по умолчанию или вызовите исключение с понятным текстом
  5. 5
    Используйте полученное значение только после проверки

Особенности ключей: типы и ссылки

Сравнение ключей выполняется с учётом типа: строка "123" и число 123 — разные ключи. Числовые ключи 10 и 10.0 считаются одинаковыми. При смешении типов в одной коллекции легко получить «промах»: значение вставлено по строковому ключу, а ищется по числовому.

Ссылки на объекты базы (справочники, документы) сравниваются по внутреннему идентификатору, поэтому одна и та же ссылка, полученная из разных запросов, корректно находится как ключ. Это делает соответствие удобным кэшем вида «ссылка → вычисленные данные».

Пустая строка, Неопределено и NULL тоже могут быть ключами, но использовать их так не рекомендуется: это затрудняет чтение кода и провоцирует ошибки при проверках.

Типичные ошибки
01
Поиск по ключу другого типа: вставили число, ищут строкой — результат всегда Неопределено
02
Использование результата без проверки на Неопределено — падение при первом отсутствующем ключе
03
Ожидание порядка добавления при обходе — порядок элементов соответствия не гарантирован
04
Путаница со структурой: попытка обратиться Соответствие.ИмяСвойства вместо Соответствие[ИмяСвойства]
05
Хранение Неопределено как значения — невозможно отличить от отсутствующего ключа

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

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

У структуры есть метод Свойство(Имя, НайденноеЗначение), который возвращает признак наличия ключа — это решает проблему различения «нет ключа» и «значение Неопределено». У соответствия такого метода нет, поэтому для критичных сценариев иногда используют структуру с вычисляемыми именами либо пару соответствий.

Маршрут решения

Как выбрать подход

Ключи — ссылки, даты или строки произвольного видаИспользуйте соответствие и метод Получить()
Набор полей фиксирован и известен на этапе разработкиИспользуйте структуру с проверкой через Свойство()
Нужно отличать отсутствие ключа от значения НеопределеноСтруктура со Свойство() или запрет на хранение Неопределено в соответствии
Нужен быстрый поиск по реквизиту среди тысяч записейПостройте соответствие «реквизит → данные» один раз и читайте из него

Проверка результата и отладка

Быстрый способ убедиться, что соответствие заполнено как ожидается, — вывести его содержимое в цикле или посмотреть переменную в отладчике: конфигуратор показывает количество элементов и пары «ключ–значение». Для ссылочных ключей в отладчике видно представление объекта.

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

Контрольные точки

Как проверить результат

Результат Получить()
Норма

Возвращено ожидаемое значение нужного типа

Тревожный признак

Неопределено при гарантированно добавленном ключе — проверьте тип и значение ключа

Количество() после заполнения
Норма

Совпадает с числом добавленных уникальных ключей

Тревожный признак

Меньше ожидаемого — часть ключей совпала и перезаписала друг друга

Обход в цикле
Норма

Все пары выводятся с корректными ключами и значениями

Тревожный признак

Лишние или неожиданные ключи — проверьте источник данных для вставки

Часто задаваемые вопросы

Что вернёт Получить(), если ключа нет в соответствии?

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

Как узнать, есть ли ключ в соответствии?

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

Можно ли использовать ссылку на документ как ключ?

Да, ссылки любых типов допустимы в качестве ключей и сравниваются по внутреннему идентификатору. Это стандартный приём для кэширования данных по объектам: соответствие вида «ссылка → структура с реквизитами» избавляет от повторных запросов к базе.

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

В структуре обращение идёт по имени свойства через точку, а ключи должны быть допустимыми идентификаторами. В соответствии ключ произвольного типа и читается через Получить() или скобки. У структуры есть метод Свойство() с признаком наличия ключа, у соответствия — нет.

Сохраняется ли порядок элементов при обходе соответствия?

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

Как удалить значение из соответствия?

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

Итог

Что важно запомнить

Значение соответствия читается методом Получить(Ключ) или через квадратные скобки; при отсутствии ключа оба способа возвращают Неопределено. Всегда проверяйте результат, следите за типом ключа и не рассчитывайте на порядок обхода коллекции.