Опять "Поле объекта не обнаружено". Способы проверки

29.01.25

Разработка - Тестирование QA

Наверное, нет пользователя 1С, который не встречал такое сообщение, прерывающее работу системы. Такие ошибки - следствие недоработки программиста, который не смог предусмотреть возможное возникновение ошибочной ситуации при обращении к свойствам объекта. А как это сделать? Попытка ... Исключение - да, способ рабочий, но некрасивый и технически неэффективный. Рассмотрим, какие еще есть способы проверки существования свойства.

Справедливости  ради, возможны ситуации, когда без "Попытки" не обойтись. Но, как минимум, не следует без необходимости включать в "операторные скобки" страница текста. Выбрав минимальный отрезок кода, когда другие способы не подошли, обрабатываем проверку свойства. Очевидное достоинства: простота и универсальность  

Попытка
	ЗначениеСвойства = НашОбъект.Свойство
Исключение
	ЗначениеСвойства = Неопределено;
КонецПопытки;

 

1. Проверка свойств Структуры(Фиксированной структуры)
Достаточно известный способ. Но от этого ошибок по свойствам структуры меньше не становится.
Проверка существования свойства (ключа структуры) производится методом свойство Свойство(<Ключ>, <НайденноеЗначение>), возвращающим Истина при существовании свойства

ТестОбъект = Новый Структура;
ТестОбъект.Вставить("Эл1","Ок");
ТестОбъект.Вставить("Эл2","Ок");

//Приведет к ошибке
Сообщить(ТестОбъект.Эл3);
	
// Проверка 1й вариант
Если ТестОбъект.Свойство("Эл3") Тогда
	Сообщить(ТестОбъект.Эл3);
Иначе
	Сообщить("Поле Эл3 не существует!");
КонецЕсли           

При использовании метода Свойство() можно задать необязательный 2й параметр. Это позволяет повторно не обращаться к значению свойства, это значение сразу же вернется в переданную переменную.  Согласно документации, при отсутвии ключа в структуре, <НайденноеЗначение> возвращается Неопределено. Но нужно понимать, что элемент структуры вполне может иметь значение Неопределено и <НайденноеЗначение> = Неопределено еще не говорит, что ключ в структуре отсутствует.

//2й вариант
ЗначениеЭл3 = Неопределено;
Если ТестОбъект.Свойство("Эл3", ЗначениеЭл3) Тогда
	Сообщить(ЗначениеЭл3);
Иначе
	Сообщить("Поле Эл3 не существует!");
КонецЕсли;            

Метод Свойство() с аналогичными параметрами доступен для проверки свойств интерфейсных объектов управляемых форм: ДанныеФормыЭлементКоллекции, ДанныеФормыСтруктура, ДанныеФормыСтруктураСКоллекцией и ДанныеФормыЭлементДерева 

 

2. Существование документа/справочника и других объектов дерева метаданных верхнего уровня при обращении к менеджеру, типу и пр.
Удобно проводить с использованием свойства глобального контекста Метаданные

Если Метаданные.Документы.Найти("ПриходнаяНакладная") = Неопределено Тогда
	Сообщить("Документ не найден");
Иначе
	Док = Документы.ПриходнаяНакладная.СоздатьДокумент();
	Сообщить("Документ создан");
		
КонецЕсли;  

 

3. Проверка реквизитов объектов документов/справочников и пр.

Основные реквизиты (шапки)
 

Если Метаданные.Документы.Документ1.Реквизиты.Найти("Реквизит2") = Неопределено Тогда
	Сообщить("Реквизит не найден");
Иначе
	//Реквизит на месте	
КонецЕсли;

Полностью аналогичный способ - получение метаданных из ссылки/объекта справочника документа. Например:

ДокументОбъект = Документы.Документ1.СоздатьДокумент();
Если ДокументОбъект.Метаданные().Реквизиты.Найти("Реквизит2") = Неопределено Тогда
	Сообщить("Реквизит не найден");
Иначе
	//Реквизит на месте	
КонецЕсли; 

Аналогичным образом можно проверить как существование табличной части по имени, так и реквизита выбранной табличной части.

Для значения перечисления

Если Метаданные.Перечисления["Перечисление1"].ЗначенияПеречисления.Найти("ЗначениеПеречисления2") = Неопределено Тогда
	Сообщить("Значение перечисления не найдено");
Иначе
	//Есть значение
КонецЕсли;

 

4. Проверка колонок Таблицы значений/Дерева значений/Результата запроса

Здесь следует обращаться к коллекции колонок.

ТестТаблица = Новый ТаблицаЗначений;
ТестТаблица.Колонки.Добавить("Колонка1");
ТестТаблица.Колонки.Добавить("Колонка2");
ТестТаблица.Колонки.Добавить("Колонка3");
	
Если ТестТаблица.Колонки.Найти("Колонка4") = Неопределено Тогда
	Сообщить("Колонка4 отсутвует")
Иначе
	//Все на месте
КонецЕсли;

 

5. Элементы управляемых форм

ЕстьЭлемент = Не Элементы.Найти("КнопкаПроверка") = Неопределено;
Сообщить("Кнопка "+ЕстьЭлемент);

 

6. Труднодоступные для проверки свойства

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

 

7. Еще один универсальный способ

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

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

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

Например, оформим такую проверку в виде функции

Функция УниверсальнаяПроверка(Коллекция,Реквизит)
	
	ВременнаяСтруктура = Новый Структура(Реквизит,Неопределено);
	ЗаполнитьЗначенияСвойств(ВременнаяСтруктура,Коллекция);
	
	Возврат НЕ ВременнаяСтруктура[Реквизит] = Неопределено;
	
КонецФункции

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

Но, здесь опять возвращаемся к оговорке 1го раздела. Значение свойства объекта Неопределено не говорит о том, что свойство отсутствует.

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


Функция УниверсальнаяПроверкаGUID(Коллекция,Реквизит)
	
	УникальныйИдентификатор = Новый УникальныйИдентификатор;
	
	ВременнаяСтруктура = Новый Структура(Реквизит,УникальныйИдентификатор);
	ЗаполнитьЗначенияСвойств(ВременнаяСтруктура,Коллекция);
	
	Возврат НЕ ВременнаяСтруктура[Реквизит] = УникальныйИдентификатор;
	
КонецФункции

 

Конечно, это далеко не полный список всех способов и особенностей проверок свойств.

Кто готов поделиться своими секретами, буду ждать в комментариях для пополнения базы знаний по борьбе с ошибками.

 

Дополнение от 29.01.2025

8. Метод БСП

Как верно уточнил ixijixi, в БСП реализован метод универсальной проверки существования реквизита/свойства объекта:

ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Объект, Свойство)

Данная функция полностью реализует универсальный алгоритм раздела 7, в варианте с использованием уникального идентификатора.

9. Параметры запросов

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

При указании имени отсутствующего в запросе параметра, возникает ошибка.

По сути, УстановитьПараметр - лишь добавляет пару [<Имя>, <Значение>] в структуру запроса Параметры.

То есть

Запрос = Новый Запрос;
/// 
Запрос.УстановитьПараметр("Параметр",Значение);

// эквивалентно

Запрос.Параметры.Вставить("Параметр",Значение);

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

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

Однако существует вариант проверить наличие параметра в тексте запроса до его выполнения. Очевидно, что данный метод не "смотрит вперед" и такая проверка возможна только при исполнении после задания текста запроса. В общем случае, конечно, после окончательного варианта текста.

Итак, метод объекта типа запрос НайтиПараметры() доступен до выполнения запроса и возвращает объект типа ОписаниеПараметровЗапроса.

У данного типа предусмотрен метод Найти(<Имя>), который возвращает объект типа ОписаниеПараметраЗапроса. Данный объект обладает свойством ТипЗначения, которое позволяет определить заданный тип параметра (насколько точно, непонятно).

Но нам важно, что в случае отсутствия в тексте запроса параметра с заданным именем, метод Найти(<Имя>)  вернет Неопределено.

Таким образом, проверка будет выглядеть так:

Запрос = Новый Запрос;

Запрос.Текст = "........";

Несуществует = Запрос.НайтиПараметры.Найти(<Имя>) = Неопределено

 

Вступайте в нашу телеграмм-группу Инфостарт

См. также

DevOps и автоматизация разработки Тестирование QA Программист Пользователь 1С v8.3 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

Автотесты 1С - готовые тестовые сценарии, предназначенные для регресс-тестирования функционала конфигурации после обновления типовым релизом. Сценарии проверяют интерактивное заполнение форм документов, справочников и результат проведения документов. Сценарий – feature-файл, разработанный с помощью vanessa-automation. Запуск сценария выполняется интерактивно с помощью vanessa-automation или с помощью vanessa-runner в CI-системах. Доступно тестирование тонкого клиента. Поддерживаемые версии конфигураций 1С:Зарплата и Управление Персоналом 3 и версии КОРП: 3.1.35.48.

3600 руб.

05.08.2024    4252    22    1    

16

Тестирование QA DevOps и автоматизация разработки Программист 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Налоговый учет Платные (руб)

Готовые тестовые сценарии, предназначенные для регресс-тестирования функционала конфигурации после обновления типовым релизом. Сценарии проверяют интерактивное заполнение форм документов, справочников и результат проведения документов. Сценарии возможно использовать как для vanessa-automation, так и для СППР. Поддерживаемые версии конфигураций ERP2 и КА2: 2.5.17.168.

2400 руб.

04.07.2022    11374    44    1    

35

Тестирование QA Бесплатно (free)

Запуск дымового тестирования не требует выделенной инфраструктуры, обучения и лишних затрат. Найти ошибки и улучшить качество разработки можно малыми силами, просто запустив готовые наборы тест-кейсов на своей локальной машине. Расскажем о преимуществах методики дымового тестирования и возможностях доработанного фреймворка Vanessa ADD.

12.11.2025    2409    arcius_7012    14    

24

Тестирование QA Бесплатно (free)

Во время прошедшей в начале октября конференции INFOSTART TECH EVENT 2025 Инфостарт Лаборатория и Инфостарт Обучение проводили тестирование всех желающих на знание фреймворка Vanessa Automation. Хочу поделиться результатами этого мероприятия и подробно разобрать пятерку вопросов, которые оказались самыми сложными для участников сертификации.

05.11.2025    1482    kuntashov    7    

19

Тестирование QA Программист Бесплатно (free)

Ошибки неизбежны – вопрос только в том, как с ними работать. Рассказываем, почему тестирование стало неотъемлемой частью разработки, какие инструменты помогают автоматизировать рутину и как выстроить процесс, чтобы он приносил реальную пользу. Разберемся, с чего начать, как быстро получить первые результаты, и почему грамотное внедрение тестирования экономит время и ресурсы команды.

28.10.2025    736    Kirramone    0    

2

Тестирование QA Программист Бесплатно (free)

Тестирование – неотъемлемый этап разработки, и чтобы приносить ценность бизнесу быстрее, его имеет смысл оптимизировать. Расскажем о том, какие инструменты помогут в десятки раз ускорить прогон 7000 тестов и организовать многопоточность без потери качества.

30.09.2025    1295    kraynev-navi    0    

6

Тестирование QA 1С v8.3 Бесплатно (free)

Этот текст о том, без чего не обходится работа тестировщика. Статья будет полезна начинающим тестировщикам и всем, кто работает с 1С и хочет понять, как тестирование помогает ловить ошибки и делать систему удобнее.

01.09.2025    5071    Oksana_Makr    2    

16

Тестирование QA Программист Бесплатно (free)

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

29.08.2025    2292    Scorpion4eg    0    

11
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ixijixi 2069 21.01.25 08:41 Сейчас в теме
Всё уже придумано до нас
// Проверяет наличие реквизита или свойства у произвольного объекта без обращения к метаданным.
//
// Параметры:
//  Объект       - Произвольный - объект, у которого нужно проверить наличие реквизита или свойства;
//  ИмяРеквизита - Строка       - имя реквизита или свойства.
//
// Возвращаемое значение:
//  Булево - Истина, если есть.
//
ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Объект, Свойство)
Показать
shkipa91; so-lf; leosoft; Mshaydurov; DmitryKSL; asadroman; serg-lom89; SerVer1C; +8 Ответить
2. Sergey1CSpb 269 21.01.25 11:27 Сейчас в теме
(1) Все верно, по сути эта функция и описана в конце статьи.
Но, во-первых, в статье пояснен принцип работы в том числе и этой функции
Во-вторых, не всегда используется БСП
В-третьих, нет смысла использовать данный метод, например, для структур. Метод Свойство("Ключ") очевидно отработает быстрее

А в целом да, вместо создания функции по п.7 можно воспользоваться данным методом. Чуть позже допишу в тексте. Спасибо за уточнение!
3. Batman 166 22.01.25 11:58 Сейчас в теме
Пункт 6 - "....Но, например, существования параметра области таблицы невозможно проверить даже перебором"
Кажется, обсуждалось https://infostart.ru/1c/articles/1999853/
4. Sergey1CSpb 269 22.01.25 14:23 Сейчас в теме
(3) Какая жуть)).
Вообще, про ЗначениеВСтрокуВнутр в С-П написано
"Примечание:
Используется для сохранения функциональной совместимости с 1С:Предприятием 7.7. Использовать для других целей не рекомендуется
."
Попытка / Исключение как-то компактней выглядит и думаю, быстрее обрабатывается.

Но, похоже, в статье несколько о другом - задача получить список параметров, а не просто проверить существование кого-то конкретного
5. n_mezentsev 65 28.01.25 09:20 Сейчас в теме
(4) Я вам и никому не рекомендую использовать подход Попытка/Исключение без лишней надобности, поскольку это может привести к такой трудно уловимой ошибке как "В данной транзакции уже происходили ошибки", а там уже, например, не забываем, что Отказ в доступе - это не ошибка, например, но исключением ловится - в-общем, не нужны вам такие грабли)
6. Sergey1CSpb 269 28.01.25 10:36 Сейчас в теме
(5) Спасибо, по-моему, про нежелательность использования Попытки я написал в анонсе статьи. Собственно, ради этого статья и придумана.
А в комментарии выше ссылка на статью, где предлагали уж очень накрученный способ, с использованием метода, нежелательность применения которого документирована. Не думаю, что это лучше Попытки.
Но хорошо бы так строить систему, чтобы события "В данной транзакции уже происходили ошибки" не возникали)
7. user1856985 27.02.25 13:23 Сейчас в теме
Всё хорошо, только
Запрос.НайтиПараметры().Найти(<Имя>)
Для отправки сообщения требуется регистрация/авторизация