При работе в программах 1С:Предприятие пользователи и разработчики часто сталкиваются с ситуацией, когда проверенные временем внешние обработки или отчеты внезапно перестают запускаться после очередного обновления конфигурации. Типичным примером такой проблемы является аварийное завершение работы системы с ошибкой: «Поле объекта не обнаружено (ФормаОтмена)». Особенно часто эта ошибка проявляется при использовании популярного инструмента Универсальные подбор и обработка объектов (УФ).
В этой статье мы подробно разберем, почему возникает данная неполадка, проанализируем внутренние механизмы Библиотеки стандартных подсистем (БСП), которые приводят к сбою, и рассмотрим несколько вариантов решения — от быстрого «костыля» до правильного и безопасного исправления кода.
Для того чтобы понять природу ошибки, обратимся к стеку вызова и коду, на который указывает платформа в момент сбоя:
ФормаДлительнойОперации = ДлительныеОперацииКлиент.ОткрытьФормуДлительнойОперации(ЭтаФорма, "");
ФормаДлительнойОперации.Заголовок = ТекстСостояния;
ФормаДлительнойОперации.Элементы.ФормаОтмена.Видимость = Ложь;
В данном фрагменте кода внешняя обработка пытается запустить фоновое задание через механизм длительных операций. Она обращается к общему модулю ДлительныеОперацииКлиент, вызывает метод ОткрытьФормуДлительнойОперации(), получает ссылку на открытую форму ожидания и пытается программно скрыть кнопку отмены операции, установив свойство Видимость в значение Ложь для элемента управления с именем ФормаОтмена.
Проблема кроется в том, что в современных версиях Библиотеки стандартных подсистем (начиная с БСП 3.0 и выше) разработчики фирмы «1С» провели масштабный рефакторинг интерфейса и логики работы с фоновыми процессами. В новой версии общей формы ДлительнаяОперация элемент управления с именем ФормаОтмена был переименован, удален или заменен совершенно другими механизмами управления асинхронными вызовами.
Когда старый код внешней обработки пытается обратиться к несуществующему элементу формы напрямую через конструкцию ФормаДлительнойОперации.Элементы.ФормаОтмена, платформа закономерно генерирует исключение «Поле объекта не обнаружено» и аварийно прерывает выполнение операции.
Традиционные методы обслуживания базы данных, такие как тестирование и исправление (ТиИ), очистка локального кэша конфигурации или выгрузка/загрузка информационной базы в файл .dt, в данном случае абсолютно бесполезны, так как проблема носит чисто программный характер и заключается в несовместимости кода обработки с текущей версией БСП.
Если речь идет об официальной обработке от фирмы «1С», такой как Универсальные подбор и обработка объектов, наиболее правильным решением будет установка ее обновленной версии.
Разработчики фирмы «1С» оперативно адаптируют свои сервисные инструменты под новые релизы БСП и конфигураций (ERP, Комплексная автоматизация, Управление торговлей, Бухгалтерия предприятия). Скачайте актуальную версию обработки с портала информационно-технологического сопровождения (ИТС). В новой версии обработки код взаимодействия с длительными операциями уже переписан под современные стандарты платформы.
Если у вас нет возможности оперативно скачать обновление или вам необходимо восстановить работоспособность системы немедленно, можно прибегнуть к простому комментированию проблемного участка кода. Разберем, как это сделать по шагам:
Файл -> Открыть... и укажите путь к файлу вашей внешней обработки (файл с расширением .epf).ПодборИОбработка).Ctrl + F) и найдите строку, содержащую обращение к элементу ФормаОтмена.// в начале строки:
ФормаДлительнойОперации = ДлительныеОперацииКлиент.ОткрытьФормуДлительнойОперации(ЭтаФорма, "");
ФормаДлительнойОперации.Заголовок = ТекстСостояния;
// ФормаДлительнойОперации.Элементы.ФормаОтмена.Видимость = Ложь; // Строка закомментирована
После этого сохраните изменения во внешней обработке и запустите ее заново в режиме предприятия. Ошибка исчезнет, так как программа больше не будет обращаться к несуществующей кнопке отмены. Единственным минусом данного решения является то, что кнопка отмены на форме длительной операции (если она там физически присутствует в вашей текущей версии БСП) теперь останется видимой для пользователя.
Комментирование кода — быстрый, но довольно грубый подход. Если вы хотите сделать обработку действительно универсальной, чтобы она без ошибок работала как на новых, так и на старых релизах конфигураций, необходимо использовать безопасное обращение к элементам формы через метод Найти().
Давайте проанализируем правильный вариант написания кода:
ФормаДлительнойОперации = ДлительныеОперацииКлиент.ОткрытьФормуДлительнойОперации(ЭтаФорма, "");
ФормаДлительнойОперации.Заголовок = ТекстСостояния;
// Безопасное получение элемента управления формы
ЭлементФормаОтмена = ФормаДлительнойОперации.Элементы.Найти("ФормаОтмена");
Если ЭлементФормаОтмена <> Неопределено Тогда
ЭлементФормаОтмена.Visibility = Ложь;
КонецЕсли;
Рассмотрим подробнее, как работает этот алгоритм:
Элементы.Найти("ИмяЭлемента") осуществляет поиск элемента управления на форме по его строковому имени.ФормаОтмена существует на форме (как это было в старых версиях БСП), метод возвращает ссылку на этот элемент, и программа успешно скрывает его с экрана.Найти() не вызывает ошибку выполнения. Вместо этого он просто возвращает значение Неопределено.Если ЭлементФормаОтмена <> Неопределено защищает программу от падения: блок изменения видимости просто пропускается, и обработка продолжает свою корректную работу в штатном режиме.Используя этот подход при разработке собственных расширений, внешних обработок и отчетов, вы обезопасите свои программные продукты от «болезненных» обновлений типовых конфигураций 1С.