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

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

См. также

Инструментарий разработчика Нейросети DevOps и автоматизация разработки Тестирование QA Разработчик 1С 8.3 Бесплатно (free)

Открытый набор правил и скриптов на GitHub для ИИ-агента (агента искусственного интеллекта: Claude Code, Codex и других). Агент сам снимает опись машины, предлагает путь проверки кода: плагин Unica или BSL Language Server со справкой платформы. С вашего «да» ставит недостающее, затем выгружает внешнюю обработку, заводит git и доводит её до зелёного теста YAxUnit. Оба пути проверены с нуля свежим агентом на копии демобазы «Управление торговлей» 11.5, платформа 8.3.27. Новая часть: для задач по данным базы агент выгружает конфигурацию в XML, строит карту объектов и пишет запросы только по именам, найденным в выгрузке. Внутри гайд «Unica на Windows» с известными ошибками и проверенными обходами.

10.11.2026    536    Iliaelagin    0    

1

Тестирование QA Разработчик 1С:Предприятие 8 Бесплатно (free)

Когда полная сборка автотестов занимает полчаса, даже небольшая автоматизация может изменить рабочий процесс. Рассказываю, как Python-утилита Phase Switcher постепенно превратилась в KOT for 1C — open-source расширение для VS Code. KOT 3.0 объединяет в одной рабочей среде библиотеку шагов и сценариев, IntelliSense, поддержку СППР и самостоятельных feature Vanessa Automation, исследователь форм, запись действий и управление выполнением через MCP. В статье — история разработки проекта от небольшой Python-утилиты до расширения для VS Code, практические примеры, неудачные эксперименты и решения, которые помогли инструменту прижиться в нашей команде.

02.11.2026    497    alexiosus    0    

2

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

Резкий рост числа пользователей, консолидация систем или миграция в облако требуют заранее понять, выдержит ли инфраструктура новую нагрузку. Рассказываем, как с помощью LLM команда за 16 недель подготовила и провела нагрузочные тесты для шести баз: автоматизировала анализ технологических журналов и журналов регистрации, формирование реалистичных сценариев и создание обработок для «1С:Тест-центра» и JMeter. Показываем, как оркестратор, AI-агенты и MCP-серверы помогают сократить объем ручной работы, а также объясняем, почему контроль со стороны 1С-эксперта по-прежнему остается обязательным. Разбираем архитектуру решения, уже работающие инструменты и направления дальнейшей автоматизации нагрузочного тестирования.

31.10.2026    537    gabrielyants    0    

5

Инструментарий разработчика Тестирование QA Разработчик Стажер 1С 8.3 Абонемент ($m)

Проверила пять пакетных команд платформы 8.3.27 на контрольном расширении Нано-УТ: они обнаружили 4 из 28 заложенных пунктов. В набор входят ошибки применимости, предупреждения и сведения для ручного разбора. Проверка XML-выгрузки отметила все 28 пунктов и 15 из 15 на похожем слепом наборе. Показываю журналы, ограничения и сценарий обновления основной конфигурации. Прилагаются инструмент с 69 тестами и материалы опыта.

7 стартмани

28.10.2026    409    Ninel_S    2    

2

Инструментарий разработчика Мобильная разработка Тестирование QA Разработчик 1С 8.3 Абонемент ($m)

Скрипт form_diff_mobile.py сравнивает две выгрузки конфигурации 1С и показывает, что в формах удалено и переименовано, где на это ещё ссылаются и какой код попадает в мобильные контексты. На «Нано-УТ 2.0» сделано 13 изменений форм: платформа 8.3.27.2130 отметила 7, в остальных шести промолчала, и в четырёх из них скрипт нашёл обращение к удалённому элементу, строку с прежним именем формы, смену директивы или выход формы из мобильной области. На чистой УТ 11.5 сравнение с копией дало 0 находок, а с копией с пятью правками ровно семь. В архивах скрипт, 74 теста, стенд, чек-лист выпуска, журнал выпуска и скрипты опытов на платформе.

7 стартмани

27.10.2026    364    Ninel_S    0    

1

Тестирование QA Разработчик 1С 8.3 Абонемент ($m)

Прогнала через 1С 8.3.27 и валидатор .NET 21 файл XML по одной схеме: базовый пример и типичные отклонения. Вердикты совпали в 20 случаях (у .NET включены предупреждения), дата без времени дала расхождение. В архиве - схема, тесты, закреплённая версия учебной базы и исправленный сценарий проверки, включая выгрузку и обратное чтение 30 продаж.

1 стартмани

26.10.2026    352    Ninel_S    0    

1

Рефакторинг и качество кода Тестирование QA Системный администратор Разработчик 1С 8.3 Абонемент ($m)

В базе 1С на PostgreSQL копятся индексы, которыми никто не пользуется: их создаёт флажок «Индексировать» у реквизитов или их добавляют вручную. Каждый такой индекс замедляет запись: в опыте на тестовой таблице восемь лишних индексов сделали вставку 300 000 строк в четыре-шесть раз дольше. Скрипт на Python смотрит статистику PostgreSQL и показывает, какие индексы ни разу не использовались и какой реквизит 1С их создал. На нашей конфигурации «Нано-УТ» он нашёл четыре ненужных индекса документа и один дубль, добавленный вручную. После того как я сняла флажки и обновила конфигурацию, индексов стало 227 вместо 234, данные не пострадали. В архиве скрипт, запросы и примеры.

5 стартмани

23.10.2026    521    Ninel_S    4    

1

Рефакторинг и качество кода Тестирование QA Разработчик 1С 8.3 Абонемент ($m)

Скрипт, который должен был проверять код 1С в Docker, на деле проверял только, что файл не пустой: из 11 модулей с ошибками он пропустил все. Я переписала проверку и сравнила её с самой 1С на тех же 11 модулях из нашей конфигурации «Нано-УТ». Новый скрипт нашёл незакрытые «Если», процедуры и скобки в 10 случаях из 11. Вызов несуществующей процедуры находит только сама 1С. В архиве скрипт, файлы для Docker, примеры с ошибками и журналы проверки.

5 стартмани

23.10.2026    507    Ninel_S    4    

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