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