Как исправить ошибку "Поле объекта не обнаружено" при работе с документом из расширения?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Рассмотрим типичную проблему: вы создали в расширении новый документ, например, Документ.Атт. При попытке его создания или открытия формы появляется ошибка:

{ОбщийМодуль.УправлениеСвойствами.Модуль(1765)}: Поле объекта не обнаружено (Документ_Атт)

Давайте разберемся, почему возникает эта ошибка и как ее можно исправить.

Анализ причины ошибки

Проблема кроется в работе типового механизма дополнительных реквизитов и сведений (БСП). Когда система пытается отобразить форму объекта, она вызывает функции из общего модуля УправлениеСвойствами, чтобы проверить, используются ли для этого объекта дополнительные реквизиты.

Проанализируем фрагмент кода из функции ИспользуютсяСвойства, на который ссылается ошибка:


Функция ИспользуютсяСвойства(Форма, ДополнительныеПараметры)
    // ... пропущен код получения имени объекта ...
    ТипОбъекта = ТипЗнч(ОписаниеОбъекта.Ссылка);
    ПолноеИмя = Метаданные.НайтиПоТипу(ТипОбъекта).ПолноеИмя;
    МассивИмениФормы = СтрРазделить(ПолноеИмя, ".");
    ИмяЭлемента = МассивИмениФормы[0] + "_" + МассивИмениФормы[1];
    
    // Проблемная строка
    НаборСвойств = Справочники.НаборыДополнительныхРеквизитовИСведений[ИмяЭлемента];
    
    ИспользуютсяСвойства = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(НаборСвойств, "Используется");
    // ... остальной код ...
    Возврат ИспользуютсяСвойства;
КонецФункции

Ключевая строка здесь:

НаборСвойств = Справочники.НаборыДополнительныхРеквизитовИСведений[ИмяЭлемента];

Что она делает?

  1. Код формирует строку ИмяЭлемента. Для нашего документа Документ.Атт эта строка будет равна "Документ_Атт".
  2. Далее, конструкция Справочники.ИмяСправочника[ИмяЭлемента] пытается получить доступ к предопределенному элементу справочника НаборыДополнительныхРеквизитовИСведений по его имени.
  3. Именно здесь возникает сбой. В типовых конфигурациях для каждого объекта, поддерживающего доп. реквизиты, есть соответствующий предопределенный элемент в этом справочнике. Но когда мы добавляем новый документ через расширение, мы не можем добавить предопределенный элемент в заимствованный справочник.

В итоге система не находит предопределенный элемент с именем "Документ_Атт" и выбрасывает исключение "Поле объекта не обнаружено".

Способы решения проблемы

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

Решение 1: Отказаться от использования дополнительных реквизитов

Это самый простой и часто самый правильный путь для полностью нетипового объекта.

Суть метода: Если документ Атт является вашей собственной разработкой и не должен тесно интегрироваться с типовыми отчетами или обработками, которые массово используют доп. реквизиты, то проще всего добавить все необходимые поля непосредственно в сам объект метаданных.

  1. Откройте ваше расширение в конфигураторе.
  2. Найдите ваш документ Атт.
  3. Перейдите на вкладку "Данные" и добавьте нужные вам реквизиты напрямую в документ.

Преимущества:

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

Решение 2: Запустить обновление информационной базы

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

Суть метода: Запустить информационную базу со специальным параметром, который инициирует выполнение процедур обновления. Эти процедуры проанализируют метаданные, найдут ваш новый документ и программно создадут для него необходимую служебную запись (не предопределенную) в справочнике НаборыДополнительныхРеквизитовИСведений.

Как сделать:

  1. Откройте конфигуратор.
  2. Зайдите в меню "Сервис" -> "Параметры".
  3. Перейдите на вкладку "Запуск 1С:Предприятия".
  4. В поле "Параметры запуска" укажите ключ: /c ЗапуститьОбновлениеИнформационнойБазы
  5. Нажмите "ОК" и запустите базу в режиме "1С:Предприятие" (F5).

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

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

Решение 3: Программное создание элемента (если обновление не помогло)

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

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

Пример кода для обработки:


&НаСервере
Процедура СоздатьНаборСвойств()
    
    // Имя набора свойств, которое ожидает система
    ИмяНабораСвойств = "Документ_Атт";
    
    // Ищем элемент по наименованию
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    НаборыДополнительныхРеквизитовИСведений.Ссылка
        |ИЗ
        |    Справочник.НаборыДополнительныхРеквизитовИСведений КАК НаборыДополнительныхРеквизитовИСведений
        |ГДЕ
        |    НаборыДополнительныхРеквизитовИСведений.Наименование = &Наименование";
    
    Запрос.УстановитьПараметр("Наименование", ИмяНабораСвойств);
    
    Результат = Запрос.Выполнить();
    
    Если Результат.Пустой() Тогда
        // Элемент не найден, создаем его
        НовыйНабор = Справочники.НаборыДополнительныхРеквизитовИСведений.СоздатьЭлемент();
        НовыйНабор.Наименование = ИмяНабораСвойств;
        
        // Важно! Устанавливаем "владельца" - ссылку на тип метаданных.
        // Это нужно, чтобы система понимала, к какому объекту относится набор.
        НовыйНабор.Владелец = Справочники.ИдентификаторыОбъектовМетаданных.НайтиПоПолномуИмени("Документ.Атт");
        
        Попытка
            НовыйНабор.Записать();
            Сообщить("Набор свойств для документа 'Атт' успешно создан!");
        Исключение
            Сообщить("Не удалось создать набор свойств: " + ОписаниеОшибки());
        КонецПопытки;
    Иначе
        Сообщить("Набор свойств для документа 'Атт' уже существует.");
    КонецЕсли;
    
КонецПроцедуры

Этот код можно выполнить один раз через "Функции для технического специалиста" или встроить в обработчик обновления вашего расширения для автоматизации процесса.

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

Вывод

Ошибка "Поле объекта не обнаружено" при работе с документами из расширения — это штатная ситуация, связанная с ограничениями платформы на добавление предопределенных данных. Для ее решения выберите наиболее подходящий для вашей задачи путь:

← На главную