Почему внешняя обработка не запускается из справочника, но открывается через Файл — Открыть

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

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

Анализ технической проблемы и симптомов

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


{ОбщийМодуль.СоединенияИБКлиент.Модуль(143)}: Значение не является значением объектного типа (Открыть) 
ВнешниеОбработки.Создать(ИмяФайлаОбработки).ПолучитьФорму().Открыть();

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

Различия в механизмах инициализации платформы

Когда мы используем команду Файл — Открыть, платформа 1С проявляет определенную интеллектуальную гибкость. Она анализирует текущий режим запуска (Толстый клиент, обычное приложение) и состав форм внутри обработки. Даже если в метаданных обработки «Основной формой» назначена управляемая форма, платформа в режиме обычного приложения самостоятельно ищет подходящую обычную форму и открывает ее.

Ситуация кардинально меняется при программном запуске из справочника. В типовых конфигурациях (УПП, КА 1.1) за открытие внешних обработок отвечает программный код в общих модулях. Этот код обычно выглядит так:


ОбработкаОбъект = ВнешниеОбработки.Создать(ПутьКФайлу);
Форма = ОбработкаОбъект.ПолучитьФорму(); // Здесь и кроется проблема
Если Форма <> Неопределено Тогда
    Форма.Открыть();
КонецЕсли;

Метод ПолучитьФорму(), вызванный без параметров, пытается получить форму, которая указана в метаданных обработки как Основная форма. Если разработчик универсальной обработки (как в случае с «Клеверенс») указал в качестве основной управляемую форму (MainForm), то при работе в обычном приложении метод ПолучитьФорму() вернет Неопределено. Платформа в программном контексте не обязана «догадываться», что нужно искать альтернативную форму с префиксом ОФ_.

Пошаговое решение: изменение метаданных обработки

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

  1. Откроем внешнюю обработку в режиме Конфигуратор (через Файл — Открыть).
  2. В дереве объектов перейдем в корень обработки и нажмем правую кнопку мыши, выбрав пункт Свойства.
  3. Найдем раздел Основные формы.
  4. В поле Основная форма (или «Форма объекта»), скорее всего, будет указана форма с названием ГлавнаяФорма или MainForm (это управляемая форма).
  5. Нажмем на кнопку выбора («лупа» или «три точки») и выберем из списка форму, предназначенную для обычного интерфейса. Обычно она называется ОФ_ГлавнаяФорма или имеет аналогичный префикс.
  6. Сохраним изменения в файле обработки.
  7. Заново загрузим обновленный файл в справочник Внешние обработки в режиме 1С:Предприятие.

После этих манипуляций метод ПолучитьФорму() без параметров начнет возвращать корректный объект обычной формы, и ошибка исчезнет.

Почему не работает синтакс-контроль в коде формы

Проанализируем еще один нюанс, упомянутый в сообщениях форума — ошибки при проверке синтаксиса в блоке «Операторы основной программы». Рассмотрим фрагмент кода, который часто вызывает вопросы:


#Если ТолстыйКлиентОбычноеПриложение Тогда
    ПолноеИмяОбъекта = ЭтотОбъект.Метаданные.ПолноеИмя;
    Элементы = ЭлементыФормы;
    Объект = ЭтотОбъект;
#КонецЕсли

Проблема заключается в том, что в управляемых формах контекст выполнения кода вне процедур (в теле модуля) крайне ограничен. Когда платформа выполняет проверку кода для режима Тонкий клиент или Сервер, переменные ЭтотОбъект и ЭлементыФормы оказываются неопределенными, так как они специфичны для контекста обычной формы в толстом клиенте.

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

Дополнительные факторы: Безопасный режим и COM-объекты

Если после смены основной формы обработка все равно «мелькает» и закрывается, проанализируем процедуру ПриОткрытии (для обычных форм) или ПриСозданииНаСервере (для управляемых). Посмотрим на типичную причину отказа:


Процедура ПриОткрытии(Отказ)
    // Попытка инициализации драйвера ТСД
    РезультатИнициализации = ИнициализироватьДрайвер();
    Если Не РезультатИнициализации Тогда
        Сообщить("Драйвер не найден!");
        Отказ = Истина; // Форма закроется сразу после открытия
        Возврат;
    КонецЕсли;
КонецПроцедуры

В контексте работы со справочником «Внешние обработки» критически важна настройка Безопасный режим. Если обработка загружена с установленным флагом безопасного режима, 1С запрещает использование внешних компонентов (COM-объектов), работу с файловой системой и сетью. Поскольку обработки для ТСД активно используют драйверы (COM) и сетевые протоколы, работа в безопасном режиме для них невозможна. Убедимся, что при загрузке обработки в справочник флаг Безопасный режим снят.

Заключение

Подведем итоги нашего исследования. Главная причина неработоспособности универсальных обработок в справочниках УПП 1.3 и подобных систем — это несоответствие типа основной формы режиму запуска приложения. Платформа 1С при программном создании объекта через ВнешниеОбработки.Создать() жестко ориентируется на метаданные. Ручная корректировка основной формы в конфигураторе и отключение безопасного режима — самые эффективные способы решения данной проблемы без необходимости глубокого рефакторинга кода разработчика.

← На главную