Почему не открывается форма обработки и возникает ошибка Переменная с указанным именем уже определена в 1С?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При обновлении нетиповых или доработанных конфигураций разработчики нередко сталкиваются с ситуацией, когда штатный программный код перестает открывать нужную форму объекта. Внешне это проявляется как исключительная ситуация: «Ошибка при вызове метода контекста (ПолучитьФорму)». Разберем по шагам, почему возникает эта неполадка, как правильно локализовать реальную причину сбоя и исправить конфликт объявлений в модуле формы.

Анализ проблемы и диагностика реальной ошибки

Рассмотрим типовой сценарий, в котором выполняется открытие формы управления обменом через контекст обработки:


КонтекстЭДО = Обработки.ДокументооборотСКонтролирующимиОрганами.Создать();    
Попытка
    КонтекстЭДО.ПолучитьФорму("УправлениеОбменом").Открыть();
Исключение
    Предупреждение("Недостаточно прав!");
КонецПопытки;

Часто разработчики оборачивают вызовы в конструкцию Попытка ... Исключение с выводом общего сообщения о правах доступа. В результате реальная системная ошибка скрывается. При вызове метода ПолучитьФорму() платформа 1С выполняет инициализацию элементов и предварительную компиляцию модуля открываемой формы. Если в модуле содержится синтаксическая ошибка или конфликт объявлений, исключение происходит именно на этапе вызова ПолучитьФорму(), а не при последующем Открыть().

Чтобы выяснить точную причину сбоя, временно отключим подавление ошибки или выведем системное описание в блок Исключение:


Попытка
    КонтекстЭДО.ПолучитьФорму("УправлениеОбменом").Открыть();
Исключение
    Сообщить(ОписаниеОшибки());
КонецПопытки;

В диагностическом сообщении отображается ключевая формулировка: «Переменная с указанным именем уже определена (ВидДокумента)» с указанием конкретной строки и модуля формы.

Причины возникновения конфликта имен

Проанализируем, почему после обновления конфигурации возникает дублирование имен переменных:

  1. Конфликт пространств имен формы: В платформе 1С реквизиты формы, реквизиты объекта и переменные модуля находятся в общей области видимости для процедур этой формы. Если в модуле объявлена переменная через Перем ВидДокумента;, а в структуру реквизитов формы или объекта поставщик добавил одноименный реквизит ВидДокумента, платформа фиксирует критический конфликт имен.
  2. Некорректное трехстороннее объединение: При обновлении конфигурации, находящейся на поддержке с возможностью изменения, изменения поставщика объединяются с пользовательскими доработками. Если разработчик ранее создавал свою локальную или модульную переменную, а в новом релизе типовой конфигурации появился такой же реквизит или реквизит формы, возникает наложение идентификаторов.

Пошаговое решение проблемы

Разберем способы устранения ошибки в конфигураторе.

  1. Переход к строке с ошибкой: При получении полного описания ошибки дважды щелкнем по строке сообщения в окне сообщений конфигуратора или вручную перейдем в модуль формы УправлениеОбменом обработки ДокументооборотСКонтролирующимиОрганами на указанную строку.
  2. Устранение дублирующего объявления:

    Если в модуле формы присутствует явное объявление переменной на уровне модуля:

    Перем ВидДокумента;

    А в реквизитах формы уже существует реквизит с именем ВидДокумента, удалим строку с директивой Перем, если предполагается использование реквизита формы. Если же переменная использовалась для внутренних расчетов доработки, переименуем ее в уникальное имя (например, мВидДокумента или ВнутреннийВидДокумента) во всех процедурах модуля.

  3. Проверка синтаксиса модуля: В открытом окне модуля формы нажмем комбинацию клавиш Ctrl + F7 для выполнения локального синтаксического контроля. Модуль должен компилироваться без ошибок.
  4. Восстановление типового состояния (альтернативный вариант): Если форма не содержала индивидуальных проектных доработок и должна полностью соответствовать типовой конфигурации поставщика, в дереве метаданных выполним сравнение/объединение с конфигурацией поставщика и снимем признак редактирования для данной формы, вернув ее к исходному состоянию релиза.

Профилактика подобных ошибок после обновления

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

  1. В главном меню Конфигуратора откроем Конфигурация -> Проверка конфигурации...
  2. Установим флаги Проверка логической целостности конфигурации, Поиск некорректных ссылок и Синтаксический контроль модулей (для режимов тонкого, толстого клиента и сервера).
  3. Нажмем Выполнить и проанализируем сформированный список ошибок до запуска программы в пользовательском режиме.
← На главную