Как исправить ошибку «Поле объекта не обнаружено (ФормаОтмена)» в 1С:Предприятие

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

В этой статье мы подробно разберем, почему возникает данная неполадка, проанализируем внутренние механизмы Библиотеки стандартных подсистем (БСП), которые приводят к сбою, и рассмотрим несколько вариантов решения — от быстрого «костыля» до правильного и безопасного исправления кода.

Выясняем причину возникновения ошибки

Для того чтобы понять природу ошибки, обратимся к стеку вызова и коду, на который указывает платформа в момент сбоя:


ФормаДлительнойОперации = ДлительныеОперацииКлиент.ОткрытьФормуДлительнойОперации(ЭтаФорма, "");
ФормаДлительнойОперации.Заголовок = ТекстСостояния;
ФормаДлительнойОперации.Элементы.ФормаОтмена.Видимость = Ложь;

В данном фрагменте кода внешняя обработка пытается запустить фоновое задание через механизм длительных операций. Она обращается к общему модулю ДлительныеОперацииКлиент, вызывает метод ОткрытьФормуДлительнойОперации(), получает ссылку на открытую форму ожидания и пытается программно скрыть кнопку отмены операции, установив свойство Видимость в значение Ложь для элемента управления с именем ФормаОтмена.

Проблема кроется в том, что в современных версиях Библиотеки стандартных подсистем (начиная с БСП 3.0 и выше) разработчики фирмы «1С» провели масштабный рефакторинг интерфейса и логики работы с фоновыми процессами. В новой версии общей формы ДлительнаяОперация элемент управления с именем ФормаОтмена был переименован, удален или заменен совершенно другими механизмами управления асинхронными вызовами.

Когда старый код внешней обработки пытается обратиться к несуществующему элементу формы напрямую через конструкцию ФормаДлительнойОперации.Элементы.ФормаОтмена, платформа закономерно генерирует исключение «Поле объекта не обнаружено» и аварийно прерывает выполнение операции.

Традиционные методы обслуживания базы данных, такие как тестирование и исправление (ТиИ), очистка локального кэша конфигурации или выгрузка/загрузка информационной базы в файл .dt, в данном случае абсолютно бесполезны, так как проблема носит чисто программный характер и заключается в несовместимости кода обработки с текущей версией БСП.

Вариант 1. Обновление внешней обработки до актуальной версии (Рекомендуемый способ)

Если речь идет об официальной обработке от фирмы «1С», такой как Универсальные подбор и обработка объектов, наиболее правильным решением будет установка ее обновленной версии.

Разработчики фирмы «1С» оперативно адаптируют свои сервисные инструменты под новые релизы БСП и конфигураций (ERP, Комплексная автоматизация, Управление торговлей, Бухгалтерия предприятия). Скачайте актуальную версию обработки с портала информационно-технологического сопровождения (ИТС). В новой версии обработки код взаимодействия с длительными операциями уже переписан под современные стандарты платформы.

Вариант 2. Быстрое исправление кода (Метод «в лоб»)

Если у вас нет возможности оперативно скачать обновление или вам необходимо восстановить работоспособность системы немедленно, можно прибегнуть к простому комментированию проблемного участка кода. Разберем, как это сделать по шагам:

  1. Откройте информационную базу 1С:Предприятие в режиме Конфигуратор.
  2. В главном меню выберите Файл -> Открыть... и укажите путь к файлу вашей внешней обработки (файл с расширением .epf).
  3. В открывшемся окне конфигуратора обработки найдите форму, в которой происходит сбой (в нашем случае это форма ПодборИОбработка).
  4. Перейдите на вкладку Модуль этой формы.
  5. Воспользуйтесь поиском по тексту (сочетание клавиш Ctrl + F) и найдите строку, содержащую обращение к элементу ФормаОтмена.
  6. Закомментируйте эту строку, добавив два символа косой черты // в начале строки:

ФормаДлительнойОперации = ДлительныеОперацииКлиент.ОткрытьФормуДлительнойОперации(ЭтаФорма, "");
ФормаДлительнойОперации.Заголовок = ТекстСостояния;
// ФормаДлительнойОперации.Элементы.ФормаОтмена.Видимость = Ложь; // Строка закомментирована

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

Вариант 3. Универсальное и безопасное исправление (Лучшая практика программирования)

Комментирование кода — быстрый, но довольно грубый подход. Если вы хотите сделать обработку действительно универсальной, чтобы она без ошибок работала как на новых, так и на старых релизах конфигураций, необходимо использовать безопасное обращение к элементам формы через метод Найти().

Давайте проанализируем правильный вариант написания кода:


ФормаДлительнойОперации = ДлительныеОперацииКлиент.ОткрытьФормуДлительнойОперации(ЭтаФорма, "");
ФормаДлительнойОперации.Заголовок = ТекстСостояния;

// Безопасное получение элемента управления формы
ЭлементФормаОтмена = ФормаДлительнойОперации.Элементы.Найти("ФормаОтмена");
Если ЭлементФормаОтмена <> Неопределено Тогда
    ЭлементФормаОтмена.Visibility = Ложь;
КонецЕсли;

Рассмотрим подробнее, как работает этот алгоритм:

Используя этот подход при разработке собственных расширений, внешних обработок и отчетов, вы обезопасите свои программные продукты от «болезненных» обновлений типовых конфигураций 1С.

← На главную