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

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

Как проверить наличие элемента в структуре 1С

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

Проверка наличия элемента в структуре — одна из самых частых операций при разработке на встроенном языке 1С. Структура применяется для передачи параметров между процедурами, хранения настроек, результатов запросов и временных данных, поэтому обращение к несуществующему ключу без предварительной проверки приводит к ошибке «Поле объекта не обнаружено» и аварийному завершению кода.

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

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

Как устроена структура и почему обращение к несуществующему ключу опасно

Структура — это коллекция пар «ключ — значение», где ключом выступает строка, удовлетворяющая правилам именования переменных встроенного языка: без пробелов, начинается с буквы или подчёркивания. Создаётся конструктором Новый Структура("Ключ1, Ключ2", Значение1, Значение2) или пустой с последующим добавлением элементов методом Вставить().

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

Проверка через метод Свойство() — основной способ

Метод Свойство(ИмяСвойства) возвращает значение типа Булево: Истина, если ключ присутствует в структуре, и Ложь в противном случае. Это штатный и самый быстрый способ проверки, рекомендуемый как базовый вариант.

СтруктураПараметров = Новый Структура("Организация, Период");

Если СтруктураПараметров.Свойство("Организация") Тогда

// Ключ существует — можно безопасно читать значение

ТекущаяОрганизация = СтруктураПараметров.Организация;

КонецЕсли;

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

ЗначениеОрганизации = Неопределено;

Если СтруктураПараметров.Свойство("Организация", ЗначениеОрганизации) Тогда

// Значение уже в переменной ЗначениеОрганизации

КонецЕсли;

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

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

Частая логическая ошибка — путать отсутствие ключа и наличие ключа со значением Неопределено или пустой ссылкой. Метод Свойство() вернёт Истина в обоих случаях, если ключ физически добавлен в структуру, даже когда его значение пустое.

Если для логики программы важно именно заполненное значение, проверку нужно делать в два этапа: сначала существование ключа, затем содержимое через функцию ЗначениеЗаполнено(). Сокращать это до одной проверки ЗначениеЗаполнено(Структура.Ключ) нельзя — при отсутствии ключа обращение вызовет исключение до того, как сработает функция.

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

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

Свойство() вернуло Истина
Норма

Ключ существует, значение можно читать

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

Значение может быть Неопределено — проверьте ЗначениеЗаполнено()

Свойство() вернуло Ложь
Норма

Ключа нет — используйте значение по умолчанию

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

Чтение Структура.Ключ в этой ветке вызовет ошибку

Значение получено через второй параметр
Норма

Переменная содержит данные из структуры

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

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

Проверка через перебор элементов коллекции

Альтернативный способ — обойти структуру циклом Для Каждого КлючИЗначение Из Структура Цикл и сравнить КлючИЗначение.Ключ с искомой строкой. Такой подход оправдан, когда нужно проверить сразу несколько ключей, найти ключи по шаблону (например, все, начинающиеся с определённого префикса) или построить список отсутствующих полей для диагностического сообщения.

ИскомыйКлюч = "Склад";

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

Для Каждого Элемент Из СтруктураПараметров Цикл

Если Элемент.Ключ = ИскомыйКлюч Тогда

КлючНайден = Истина;

Прервать;

КонецЕсли;

КонецЦикла;

Для одиночной проверки перебор избыточен и медленнее метода Свойство(), особенно в циклах с большим числом итераций. Используйте его только там, где требуется анализ состава коллекции целиком.

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

Свойство() с одним параметром

Быстрая проверка существования ключа. Подходит, когда значение не нужно или читается отдельно.

Свойство() с двумя параметрами

Проверка и получение значения за один вызов. Оптимальный вариант для большинства сценариев.

Перебор коллекции

Поиск по шаблону, проверка нескольких ключей, сбор диагностики. Медленнее, не подходит для частых вызовов.

Особенности соответствия и вложенных структур

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

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

Если Не Параметры.Свойство("Настройки", Настройки)

Или ТипЗнч(Настройки) <> Тип("Структура") Тогда

Возврат;

КонецЕсли;

Если Настройки.Свойство("Склад", Склад) Тогда

// Работаем со складом

КонецЕсли;

Типичные ошибки и ограничения

Самая распространённая ошибка — использование значения по умолчанию через конструкцию «Если структура заполнена, то читаем ключ» без проверки самого ключа. Непустая структура не гарантирует наличие конкретного элемента. Вторая типичная проблема — регистр и опечатки в имени ключа: платформа сравнивает ключи без учёта регистра, но лишний пробел или переставленная буква делают ключ другим, и проверка молча вернёт Ложь.

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

Типичные ошибки
01
Обращение Структура.Ключ без проверки — исключение при отсутствии ключа и остановка кода
02
Проверка только ЗначениеЗаполнено(Структура.Ключ) — ошибка возникает раньше, чем сработает функция
03
Неочищенная переменная-приёмник второго параметра в цикле — использование значения с прошлой итерации
04
Опечатка в строковом имени ключа — проверка всегда возвращает Ложь, причину видно только в отладчике
05
Перенос кода для соответствия на структуру — разное поведение при отсутствии ключа

Порядок безопасной реализации проверки

Для типовой задачи «прочитать параметр, а если его нет — применить значение по умолчанию» удобно оформить отдельную функцию. Она убирает дублирование проверок по всему коду и централизует логику обработки отсутствующих ключей.

Порядок действий
  1. 1
    Определите тип коллекции: структура или соответствие — от этого зависит способ проверки
  2. 2
    Объявите переменную-приёмник и инициализируйте её значением по умолчанию
  3. 3
    Вызовите Свойство() с двумя параметрами и проверьте возвращённое булево
  4. 4
    При необходимости дополнительно проверьте значение через ЗначениеЗаполнено()
  5. 5
    Протестируйте код в отладчике на структуре без искомого ключа — исключений быть не должно
Функция ПолучитьПараметр(СтруктураПараметров, ИмяКлюча, ЗначениеПоУмолчанию)

Результат = ЗначениеПоУмолчанию;

Если ТипЗнч(СтруктураПараметров) = Тип("Структура")

И СтруктураПараметров.Свойство(ИмяКлюча, Результат) Тогда

// Значение получено из структуры

КонецЕсли;

Возврат Результат;

КонецФункции

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

Частые вопросы

Есть ли в 1С метод вроде «НайтиКлюч» для структуры?

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

Что вернёт Свойство(), если ключ есть, но значение равно Неопределено?

Метод вернёт Истина, потому что проверяет существование ключа, а не содержимое. Через второй параметр вы получите Неопределено, и для оценки заполненности нужна дополнительная проверка функцией ЗначениеЗаполнено().

Учитывается ли регистр букв в имени ключа?

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

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

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

Как проверить сразу несколько обязательных ключей?

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

Можно ли проверить наличие вложенного ключа одним выражением?

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

Итог

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

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