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

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й способ (через вставку элемента структуры) при указании несуществующего параметра не вызовет ошибку и при выполнении запроса будет проигнорирован. Что может являться своего рода проверкой.

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

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

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

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

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

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

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

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

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

 

См. также

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

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

2160 руб.

20.01.2022    8288    29    0    

14

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

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

3000 руб.

05.08.2024    1796    17    1    

11

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

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

2400 руб.

04.07.2022    8818    39    1    

30

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

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

16.01.2025    723    1C_Community    9    

4

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

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

28.11.2024    2857    user1999010    3    

18

Облачные сервисы, хостинг Linux Тестирование QA Сервера Системный администратор Программист Платформа 1С v8.3 Бесплатно (free)

Завершающая публикация цикла "В облако на работу:.. Рецепты от Капитана", в ходе которых был собран полнофункциональный рабочий контур 1С в сети на отечественной Ред ОС. С веб-серверами, доменной авторизацией, архивированием, отказоустойчивостью и прочая, прочая... В этой статье мы определяемся с быстродействием системы, проводим нагрузочное тестирование и отпускаем ее в свободное плавание (зачеркнуто) выпускаем ее в продуктовый контур, где, конечно же, придется отлавливать ошибки, мониторить состояние и т.п.

31.10.2024    1726    capitan    0    

0

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

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

21.10.2024    3590    leemuar    8    

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

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

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