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