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