Разработка и Конфигурация · 10 мин
1С: как проверить, есть ли ключ в структуре
Как в 1С проверить наличие ключа в структуре: метод Свойство, получение значения, работа с соответствиями, типичные ошибки и примеры кода на встроенном языке.
Встроенный язык 1С не имеет отдельного метода вида «ЕстьКлюч», поэтому проверка наличия ключа в структуре выполняется через метод Свойство(). Он возвращает Истина, если ключ найден, и Ложь — если такого свойства в структуре нет. Дополнительно метод может вернуть значение ключа через второй параметр, что позволяет совместить проверку и чтение в одном вызове.
Задача возникает постоянно: при разборе параметров, переданных в процедуру, при чтении настроек, при обработке результата запроса или данных из другой подсистемы. Неправильная проверка — частая причина ошибок «Поле объекта не обнаружено» и обращений к неопределённым значениям.
Ниже разобраны синтаксис метода, приёмы безопасного чтения значений, отличия при работе с соответствиями, типичные ошибки и готовые шаблоны кода, которые можно переносить в свои процедуры без доработки.
Как работает метод Свойство
Метод Свойство() имеет два параметра. Первый — строка с именем ключа, второй — необязательная переменная, в которую будет помещено значение. Если ключ найден, метод возвращает Истина и заполняет переменную; если нет — возвращает Ложь, а переменная получает значение Неопределено.
СтруктураПараметров = Новый Структура("Организация, Период", Организация, ДатаНачала);
Если СтруктураПараметров.Свойство("Организация") Тогда
// Ключ существует
КонецЕсли;
Имя ключа передаётся строкой и не чувствительно к регистру: Свойство("организация") и Свойство("Организация") вернут одинаковый результат. Это удобно, но требует аккуратности — нельзя создать в структуре два ключа, отличающихся только регистром.
Проверка с одновременным получением значения
Самый распространённый приём — совместить проверку и чтение. Второй параметр объявляется заранее или прямо в месте вызова, и после успешной проверки значение уже доступно для использования.
Перем ЗначениеСклад;
Если ПараметрыОтбора.Свойство("Склад", ЗначениеСклад) Тогда
// ЗначениеСклад уже заполнено, работаем с ним
Запрос.УстановитьПараметр("Склад", ЗначениеСклад);
Иначе
// Ключа нет — применяем поведение по умолчанию
КонецЕсли;
Такой подход избавляет от двойного обращения к структуре и делает код короче. Важно помнить: если ключ найден, но его значение равно Неопределено, метод всё равно вернёт Истина. Проверка наличия ключа и проверка заполненности значения — разные операции.
Безопасное чтение с значением по умолчанию
Когда ключ необязателен, удобно заранее присвоить переменной значение по умолчанию, а затем вызвать Свойство(). Если ключ есть — переменная перезапишется, если нет — останется значение по умолчанию. Ветка Иначе при этом не нужна вовсе.
КоличествоСтрок = 100; // значение по умолчанию
Настройки.Свойство("КоличествоСтрок", КоличествоСтрок);
Этот приём широко используется в типовых конфигурациях при разборе параметров форм и настроек отчётов. Он сокращает код и снижает риск забыть обработать случай отсутствующего ключа.
Для обязательных ключей, наоборот, стоит явно проверять результат и вызывать исключение с понятным текстом, если ключ отсутствует. Молчаливая подмена значения по умолчанию там, где параметр обязателен, приводит к трудноуловимым ошибкам в расчётах.
- 1Объявите переменную и присвойте ей значение по умолчанию
- 2Вызовите Структура.Свойство("ИмяКлюча", Переменная)
- 3Если параметр обязателен — проверьте результат и при Ложь вызовите исключение
- 4Проверьте тип полученного значения, если оно приходит извне
- 5Используйте значение в дальнейшей логике
Проверка ключа в соответствии
Для коллекции типа Соответствие метод Свойство() не применяется. Здесь используется метод Получить(Ключ): если ключ отсутствует, возвращается Неопределено. Ключом соответствия может быть значение любого типа, а не только строка.
Значение = СоответствиеКурсов.Получить(Валюта);
Если Значение = Неопределено Тогда
// Ключа нет (или значение равно Неопределено)
КонецЕсли;
Ограничение этого подхода очевидно: невозможно отличить отсутствующий ключ от ключа со значением Неопределено. Если такое различие критично, придётся либо хранить признак отдельно, либо перебирать соответствие циклом и сравнивать ключи. На практике чаще всего достаточно простой проверки на Неопределено.
Структура или соответствие
Ключи — строки-идентификаторы, фиксированный набор свойств, доступ через точку. Не подходит, если ключи содержат пробелы или произвольные символы.
Ключи любого типа, включая ссылки и даты. Нет доступа через точку, нельзя отличить отсутствие ключа от значения Неопределено.
Проверка вложенных структур
Когда данные многоуровневые (например, структура внутри структуры), проверку нужно выполнять последовательно на каждом уровне. Попытка сразу обратиться к Данные.Адрес.Город при отсутствии ключа «Адрес» вызовет ошибку исполнения.
Перем ВложенныеДанные, Город;
Если Данные.Свойство("Адрес", ВложенныеДанные)
И ТипЗнч(ВложенныеДанные) = Тип("Структура")
И ВложенныеДанные.Свойство("Город", Город) Тогда
// Все уровни существуют, Город получен
КонецЕсли;
Дополнительная проверка типа через ТипЗнч() защищает от ситуации, когда ключ есть, но содержит не структуру, а, например, строку. Это особенно актуально при разборе данных, полученных из JSON или из внешних систем.
Типичные ошибки при проверке ключей
Первая ошибка — проверка значения вместо ключа: конструкция Если Структура.Ключ <> Неопределено падает с ошибкой, когда ключа нет вообще. Сначала всегда проверяется наличие ключа методом Свойство(), и только потом анализируется значение.
Вторая ошибка — использование в структуре ключей, нарушающих правила идентификаторов. Ключ с пробелом или дефисом нельзя задать через конструктор Новый Структура("..."), и обращение через точку к нему невозможно. Для произвольных строк в роли ключей предназначено соответствие.
Третья ошибка — забыть, что Свойство() без второго параметра только проверяет, но не возвращает значение. После такой проверки значение всё равно нужно читать отдельно через точку или повторным вызовом с переменной.
Как убедиться, что проверка работает правильно
Отладка таких проверок проста: поставьте точку останова на строке вызова Свойство() и посмотрите в табло содержимое структуры. Там видны все ключи и их значения — можно сразу сверить, совпадает ли искомое имя с фактическим, включая написание.
Полезно проверить три сценария: ключ есть и заполнен, ключ есть, но значение пустое, ключа нет совсем. Код должен корректно отрабатывать все три случая. Если структура формируется в другой подсистеме, убедитесь, что имя ключа не изменилось после обновления конфигурации — такие расхождения частая причина «внезапно переставшего работать» кода.
Как проверить результат
Возвращает Истина, переменная заполнена ожидаемым значением
Возвращает Ложь при видимо существующем ключе — проверьте написание имени
Строка в Свойство() совпадает с ключом, видимым в табло структуры
Опечатка или устаревшее имя после обновления конфигурации
Код различает 'ключа нет' и 'значение пустое'
Пустое значение обрабатывается как отсутствие ключа или наоборот
Что важно запомнить
Для структуры наличие ключа проверяется методом Свойство() с необязательным вторым параметром для значения; для соответствия — методом Получить() с проверкой на Неопределено. Проверка наличия ключа и проверка заполненности значения — разные операции, их нужно выполнять осознанно.
Частые вопросы
Можно ли проверить ключ без учёта регистра?
Отдельной настройки не требуется: ключи структуры и так нечувствительны к регистру. Вызов Свойство("склад") найдёт ключ "Склад". Но при переборе структуры циклом ключи возвращаются в том написании, в котором были созданы.
Что вернёт Свойство(), если ключ есть, но значение равно Неопределено?
Метод вернёт Истина, а во второй параметр запишет Неопределено. Метод проверяет именно существование ключа, а не содержимое. Если нужно отсеять пустые значения, добавьте отдельную проверку ЗначениеЗаполнено() или сравнение с Неопределено.
Как проверить сразу несколько ключей?
Компактного встроенного способа нет. Обычно вызывают Свойство() для каждого ключа в связке через И, либо перебирают список обязательных имён в цикле и при первом отсутствующем вызывают исключение с указанием имени ключа.
Чем отличается проверка в фиксированной структуре?
Для ФиксированнаяСтруктура метод Свойство() работает точно так же. Отличие только в том, что состав ключей нельзя изменить после создания, поэтому проверка чаще нужна на стороне кода, который формирует исходную структуру.
Можно ли использовать ВРег для надёжности сравнения имён?
Это излишне: Свойство() сам игнорирует регистр. ВРег имеет смысл только при ручном переборе структуры циклом и сравнении имён ключей строковым сравнением, которое регистрозависимо.
Есть ли аналог HasKey или ContainsKey в 1С?
Отдельного метода с таким именем нет. Роль HasKey выполняет Свойство() для структуры и связка Получить() плюс сравнение с Неопределено для соответствия. Это стандартная практика во всех конфигурациях.