В практике разработчиков и администраторов 1С часто встречается странная ситуация: внешняя обработка (например, популярные решения от компании «Клеверенс» для ТСД) прекрасно работает при интерактивном открытии через меню Файл — Открыть, но наотрез отказывается запускаться, если ее добавить в справочник Внешние обработки. При попытке запуска из справочника пользователь видит лишь «мелькание» интерфейса, либо получает критическую ошибку в общем модуле. Рассмотрим подробно, почему это происходит и как это исправить на стороне клиента.
Разберем конкретный случай на базе конфигурации «Управление производственным предприятием 1.3» (УПП), работающей в режиме обычного приложения. При попытке запуска обработки из справочника система выдает ошибку следующего вида:
{ОбщийМодуль.СоединенияИБКлиент.Модуль(143)}: Значение не является значением объектного типа (Открыть)
ВнешниеОбработки.Создать(ИмяФайлаОбработки).ПолучитьФорму().Открыть();
Проанализируем это сообщение. Ошибка «Значение не является значением объектного типа (Открыть)» означает, что метод ПолучитьФорму() вернул Неопределено. Следовательно, метод Открыть() вызывается не у объекта «Форма», а у пустого значения. Выясним причину, по которой платформа не может получить форму в одном случае, но успешно делает это в другом.
Когда мы используем команду Файл — Открыть, платформа 1С проявляет определенную интеллектуальную гибкость. Она анализирует текущий режим запуска (Толстый клиент, обычное приложение) и состав форм внутри обработки. Даже если в метаданных обработки «Основной формой» назначена управляемая форма, платформа в режиме обычного приложения самостоятельно ищет подходящую обычную форму и открывает ее.
Ситуация кардинально меняется при программном запуске из справочника. В типовых конфигурациях (УПП, КА 1.1) за открытие внешних обработок отвечает программный код в общих модулях. Этот код обычно выглядит так:
ОбработкаОбъект = ВнешниеОбработки.Создать(ПутьКФайлу);
Форма = ОбработкаОбъект.ПолучитьФорму(); // Здесь и кроется проблема
Если Форма <> Неопределено Тогда
Форма.Открыть();
КонецЕсли;
Метод ПолучитьФорму(), вызванный без параметров, пытается получить форму, которая указана в метаданных обработки как Основная форма. Если разработчик универсальной обработки (как в случае с «Клеверенс») указал в качестве основной управляемую форму (MainForm), то при работе в обычном приложении метод ПолучитьФорму() вернет Неопределено. Платформа в программном контексте не обязана «догадываться», что нужно искать альтернативную форму с префиксом ОФ_.
Чтобы заставить обработку работать корректно в конфигурациях на обычных формах, нам необходимо принудительно указать платформе, какую форму считать основной. Выполним следующие действия:
ГлавнаяФорма или MainForm (это управляемая форма).ОФ_ГлавнаяФорма или имеет аналогичный префикс.После этих манипуляций метод ПолучитьФорму() без параметров начнет возвращать корректный объект обычной формы, и ошибка исчезнет.
Проанализируем еще один нюанс, упомянутый в сообщениях форума — ошибки при проверке синтаксиса в блоке «Операторы основной программы». Рассмотрим фрагмент кода, который часто вызывает вопросы:
#Если ТолстыйКлиентОбычноеПриложение Тогда
ПолноеИмяОбъекта = ЭтотОбъект.Метаданные.ПолноеИмя;
Элементы = ЭлементыФормы;
Объект = ЭтотОбъект;
#КонецЕсли
Проблема заключается в том, что в управляемых формах контекст выполнения кода вне процедур (в теле модуля) крайне ограничен. Когда платформа выполняет проверку кода для режима Тонкий клиент или Сервер, переменные ЭтотОбъект и ЭлементыФормы оказываются неопределенными, так как они специфичны для контекста обычной формы в толстом клиенте.
Однако, как мы видим, разработчики используют директивы препроцессора #Если...#КонецЕсли. Это позволяет коду успешно исполняться в нужном окружении, несмотря на предупреждения синтакс-помощника. Если вы видите такие ошибки в конфигураторе, это не всегда означает неработоспособность кода; часто это издержки «универсализации» обработки под разные типы клиентов.
Если после смены основной формы обработка все равно «мелькает» и закрывается, проанализируем процедуру ПриОткрытии (для обычных форм) или ПриСозданииНаСервере (для управляемых). Посмотрим на типичную причину отказа:
Процедура ПриОткрытии(Отказ)
// Попытка инициализации драйвера ТСД
РезультатИнициализации = ИнициализироватьДрайвер();
Если Не РезультатИнициализации Тогда
Сообщить("Драйвер не найден!");
Отказ = Истина; // Форма закроется сразу после открытия
Возврат;
КонецЕсли;
КонецПроцедуры
В контексте работы со справочником «Внешние обработки» критически важна настройка Безопасный режим. Если обработка загружена с установленным флагом безопасного режима, 1С запрещает использование внешних компонентов (COM-объектов), работу с файловой системой и сетью. Поскольку обработки для ТСД активно используют драйверы (COM) и сетевые протоколы, работа в безопасном режиме для них невозможна. Убедимся, что при загрузке обработки в справочник флаг Безопасный режим снят.
Подведем итоги нашего исследования. Главная причина неработоспособности универсальных обработок в справочниках УПП 1.3 и подобных систем — это несоответствие типа основной формы режиму запуска приложения. Платформа 1С при программном создании объекта через ВнешниеОбработки.Создать() жестко ориентируется на метаданные. Ручная корректировка основной формы в конфигураторе и отключение безопасного режима — самые эффективные способы решения данной проблемы без необходимости глубокого рефакторинга кода разработчика.