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