При попытке вызвать метод ПолучитьФорму() или ОткрытьФорму() у внешней обработки, подключенной через COM-соединение, разработчики сталкиваются со следующей ошибкой:
Ошибка при вызове метода контекста (ПолучитьФорму): Произошла исключительная ситуация: Интерактивные операции недоступны
Разберем подробнее, почему возникают такие ограничения платформы 1С и какими способами можно правильно организовать выполнение алгоритмов во внешней базе.
Проанализируем контекст выполнения кода при использовании объекта V83.COMConnector (или V82.COMConnector). Данное соединение создает неинтерактивный сеанс исключительно на стороне сервера. В этом сеансе графическая подсистема и пользовательская среда не инициализируются.
Поскольку в сеансе внешнего соединения визуальный интерфейс полностью отсутствует, платформа 1С блокирует любые попытки работы с UI-объектами. Метод ПолучитьФорму() имеет доступность только в клиенте (толстом или тонком) и недоступен во внешнем соединении. Аналогичные ограничения действуют на диалоговые окна (Предупреждение(), Вопрос()) и методы выбора файлов.
Если цель заключается в том, чтобы выполнить расчет или обработку данных на стороне внешней информационной базы, интерактивная форма не требуется. Рассмотрим по шагам, как правильно переработать внешнюю обработку:
Экспорт.Посмотрим на пример кода подключения и вызова процедуры:
// Создаем соединение с удаленной базой
мБазаИсточникСоединение = Новый COMОбъект("V83.COMConnector");
мБазаИсточник = мБазаИсточникСоединение.Connect("Srvr=""Server1C"";Ref=""BaseName"";Usr=""User"";Pwd=""Password"";");
// Создаем объект внешней обработки во внешней базе
ВнешнОбработка = мБазаИсточник.ВнешниеОбработки.Создать(ПутьКФайлуОбработки, Ложь);
// Вызываем экспортную процедуру модуля объекта
ВнешнОбработка.ВыполнитьДействиеНаСервере();
Код процедуры в модуле объекта внешней обработки будет выглядеть следующим образом:
Процедура ВыполнитьДействиеНаСервере() Экспорт
// Алгоритм обработки данных на стороне внешней базы
// Без использования экранных форм и визуальных диалогов
КонецПроцедуры
Если задача действительно требует инициализации полноценной клиентской среды 1С с возможностью работы с формами, вместо COMConnector следует использовать Automation-сервер V83.Application.
При таком подходе запускается полноценное клиентское приложение 1С:Предприятие, где доступен контекст толстого или тонкого клиента.
Посмотрим пример реализации:
// Запускаем полнофункциональное клиентское приложение
Приложение1С = Новый COMОбъект("V83.Application");
Приложение1С.Connect("Srvr=""Server1C"";Ref=""BaseName"";Usr=""User"";Pwd=""Password"";");
// Создаем объект внешней обработки
ВнешнОбработка = Приложение1С.ВнешниеОбработки.Создать(ПутьКФайлуОбработки);
// В данном контексте метод ПолучитьФорму() доступен
ФормаОбработки = ВнешнОбработка.ПолучитьФорму();
ФормаОбработки.Открыть();
Обратите внимание на ограничения данного способа:
V83.Application задействует полноценный клиентский сеанс и расходует дополнительную клиентскую лицензию.COMConnector.В случаях, когда необходимо визуально отобразить форму внешней обработки на компьютере пользователя, наилучшим решением будет запуск исполняемого файла 1С через командную строку с помощью функции ЗапуститьПриложение().
Рассмотрим пример команды для запуска:
СтрокаЗапуска = """C:\Program Files\1cv8\8.3.23.1867\bin\1cv8.exe"" ENTERPRISE"
+ " /S ""Server1C\BaseName"""
+ " /N ""User"" /P ""Password"""
+ " /Execute """ + ПутьКФайлуОбработки + """";
ЗапуститьПриложение(СтрокаЗапуска);
Параметр /Execute указывает платформе открыть указанную внешнюю обработку сразу после запуска сеанса пользователя.
При проектировании современной архитектуры взаимодействия баз 1С рекомендуется отказываться от COM-технологий в пользу HTTP- или Web-сервисов. Сервисы работают быстро, не зависят от разрядности платформы (x86/x64) и операционной системы, а также полностью исключают ошибки, связанные с вызовом недопустимого пользовательского интерфейса.