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

17.04.26

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

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

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

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

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

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

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

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

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

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

 

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

10. Выборка из результата запроса

В разделе 4 наряду с поиском колонок Таблицы значений и Дерева значений описан аналогичный по синтаксису метод проверки существования колонки Результата запроса, другими словами наличия в исходном запросе поля с соответствующим псевдонимом.

Если Не РезультатЗапроса.Колонки.Найти("Поле1") = Неопределено Тогда
Сообщить("Колонка Поле1 существует!");
КонецЕсли

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

........
Процедура1(РезультатЗапроса.Выбрать())
........

Процедура Процедура1(ВыборкаИзРезультатаЗапроса)
........
КонецПроцедуры

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

Если Не ВыборкаИзРезультатаЗапроса.Владелец().Колонки.Найти("Поле1") = Неопределено Тогда
Сообщить("Колонка Поле1 существует!");
КонецЕсли

 

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

11. О параметрах области Табличного документа/Макета

В разделе 6 обнаружилась не совсем точная формулировка относительно невозможности проверки существования параметра табличного документа. Некоторые способы выкрутиться возможны.

Обычно для исключения возможности ошибки при попытке заполнения отсутствующего параметра, параметры заполняются не напрямую, а через переменную типа Структура. Ключом является имя предполагаемого параметра, значением - значение этого параметра. Тогда при заполнении:

Область.Параметры.Заполнить(СтруктураПараметров)

Или, что тоже самое:

ЗаполнитьЗначениеСвойств(Область.Параметры,СтруктураПараметров)

отсутствующие в ключах структуры параметры будут проигнорированы, это не вызовет ошибку.

 

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

С помощью метода Количество() можно определить количество параметров в области. Далее, перебором по индексу получить все имена параметров области, используя обращение в скобках [Индекс] Или через Получить(Индекс).

Таким образом:


ПараметрНайден = Ложь;

Для ИндексПараметра = 0 По Область.Параметры.Количество() -1 Цикл
    Если ОбластьПодвалаНакладной.Параметры[ИндексПараметра] = ИмяИсходногоПараметра Тогда
        ПараметрНайден = Истина;
        Прервать;
    КонецЕсли;
КонецЦикла;

Если Не ПараметрНайден Тогда
    Сообщить("Параметр не найден");
КонецЕсли;            

 

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

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

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

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

5000 руб.

04.07.2022    14538    65    5    

41

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

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

5000 руб.

05.08.2024    6333    42    1    

20

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

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

5368 руб.

20.01.2022    11993    49    1    

23

Поиск данных Тестирование QA Программист 1С 8.3 1С 8.5 Бесплатно (free)

Как мы пришли к Юнит-тестированию и почему стоит его использовать. Использование универсальных тестов для проверки работы IS MagicInput в вашей конфигурации.

16.07.2026    276    Evg-Lylyk    0    

5

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

Tantor Postgres 18 - масштабный релиз СУБД, за которым стоят месяцы тестирования, сотни часов нагрузочных прогонов и десятки исправлений, о которых пользователь никогда не узнает просто потому, что они были найдены и устранены до выхода версии. Александр Симонов, руководитель направления развития 1С в "Тантор Лабс", рассказывает, как устроен процесс тестирования изнутри - почему одного эталонного прогона недостаточно, что делать, когда ванильный PostgreSQL 18 ломает собственные оптимизации, и как Tantor Postgres приближается к той планке, которую MS SQL Server держал годами.

07.07.2026    492    Tantor    2    

6

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

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

29.06.2026    1871    alexandr_yang    5    

10

Тестирование QA Программист 1С:Предприятие 8 Бесплатно (free)

Как мы пришли к использованию Ванессы для автоматизации действий пользователей? Сначала я увидел в интернете лекцию Олега Филиппова про RPA. И когда встал вопрос про автоматизацию небольших процессов, то эта лекция у меня прекрасно соединилась с опытом тестирования программ с помощью Vanessa Automation. Минимум усилий, минимум ручного кода и высокая скорость внедрения. И самое главное, не надо менять программу. А если программа изменится, то алгоритм быстро поправить и дополнить.

19.06.2026    1127    swimdog    3    

7

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

Разбираемся, какие виды тестирования нужно проводить при внедрении заказных бизнес-приложений. Что такое воронка «бесконечного тестирования». Чем синдром «сапера» отличается от синдрома «лудомана». А также можно ли полюбить тестирование.

18.06.2026    722    DmitryShostak    0    

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

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

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