При работе с механизмом расширений в 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда после обновления основной конфигурации расширение начинает работать некорректно. Одной из самых коварных ошибок является внезапное «исчезновение» реквизитов формы, добавленных в расширении. При этом в конфигураторе реквизит отображается, но при запуске в режиме «Предприятие» система выдает критическую ошибку: «Поле объекта не обнаружено» или «Переменная не определена». Рассмотрим подробно, почему это происходит и как решить данную проблему.
Проанализируем типичную ситуацию. В расширении заимствована общая форма или форма документа, в которую добавлен собственный реквизит, например, расш_ТТН. После обновления основной конфигурации (даже если изменения в форме были минимальными, например, добавлена одна строка кода) платформа перестает инициализировать этот реквизит в контексте формы. Выясним основные причины такого поведения:
Прежде чем приступать к радикальным мерам, проверим, действительно ли реквизит отсутствует в памяти. Рассмотрим программный код, который вызывает ошибку:
&НаКлиенте
Процедура ВидимостьДопПолей()
// Здесь возникает ошибка: Поле объекта не обнаружено (расш_ТТН)
Элементы.расш_ТТН.Видимость = ТипЗнч(Документ) = Тип("ДокументСсылка.Поставка");
КонецПроцедуры
Для диагностики установим точку останова в начале процедуры ПриОткрытии или в любой процедуре, вызываемой из модуля формы. В окне «Вычислить выражение» проверим наличие реквизита в коллекции ЭтаФорма. Если отладчик показывает все реквизиты основной конфигурации, но игнорирует расш_ТТН, значит, мы имеем дело со сбоем регистрации метаданных расширения.
Как показывает практика, наиболее быстрым и надежным способом решения является «обновление» метаданных через создание дубликата. Разберем этот алгоритм пошагово:
расш_ТТН).расш_ТТН_Новый, и установим ему тот же тип данных.Рассмотрим пример исправленного кода:
&НаСервере
Процедура СохранитьДанныеНаСервере()
ДокументОбъект = Документ.ПолучитьОбъект();
// Используем новый реквизит формы для записи в объект
ДокументОбъект.расш_ТТН = расш_ТТН_Новый;
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
КонецПроцедуры
Важное примечание: Если после этой манипуляции новый реквизит появился в режиме «Предприятие», значит, проблема была именно в «зависшем» идентификаторе старого реквизита. Старый реквизит после этого можно удалить.
Если визуальное добавление реквизитов продолжает давать сбои, проанализируем метод программного создания элементов. Это более сложный, но максимально стабильный путь, так как он не зависит от визуального редактора форм расширения. Добавление можно выполнить в обработчике ПриСозданииНаСервере:
&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Массив для новых реквизитов
ДобавляемыеРеквизиты = Новый Массив;
ТипРеквизита = Новый ОписаниеТипов("СправочникСсылка.Файлы");
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("расш_ТТН_Программный", ТипРеквизита, , "ТТН"));
// Добавляем реквизит на форму
ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
// Создаем элемент управления для этого реквизита
ЭлементТТН = Элементы.Добавить("расш_ТТН_Поле", Тип("ПолеФормы"), ЭтаФорма);
ЭлементТТН.Вид = ВидПоляФормы.ПолеВвода;
ЭлементТТН.ПутьКДанным = "расш_ТТН_Программный";
КонецПроцедуры
Использование метода ИзменитьРеквизиты() позволяет динамически модифицировать структуру формы в обход возможных проблем с заимствованием метаданных.
Чтобы минимизировать риск возникновения подобных ошибок в будущем, рекомендуем придерживаться следующих правил:
имя_Расш1). Это предотвратит конфликты, если в будущем разработчики основной конфигурации добавят реквизит с таким же именем.Подводя итог, можно сказать, что проблема «невидимости» реквизитов в расширениях — это чаще всего следствие нарушения связей в кэшированных метаданных платформы. Метод «пересоздания» или «дублирования» реквизита является самым эффективным практическим решением, позволяющим быстро вернуть работоспособность системы без глубокой переработки расширения.