Как запустить внешнюю обработку через COM-соединение в 1С и обойти ошибку безопасного режима?

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

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

Логичным решением на первый взгляд кажется создание регламентного задания в базе-приемнике, которое будет подключаться к базам-источникам через COM-соединение, загружать туда внешнюю обработку, выполнять выгрузку данных в файл и затем импортировать этот файл обратно. Однако при реализации этой схемы разработчики часто сталкиваются с ошибками ограничений прав доступа, в частности: «Установлен безопасный режим. Выполнение операции запрещено». Выясним причины возникновения этой ошибки и разберем по шагам, как правильно настроить запуск обработки через COM-соединение.

Почему возникает ошибка безопасного режима при COM-вызове?

Проанализируем ситуацию, которая возникает при выполнении следующего кода на стороне COM-клиента:


Обработка = ZUP_COM.ВнешниеОбработки.Создать(ИмяФайла);
Обработка.ВыполнитьВыгрузку();

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

  1. Запрет на работу с файловой системой (вы не сможете записать сформированный XML-файл выгрузки на диск).
  2. Запрет на вызов внешних COM-объектов.
  3. Запрет на выполнение кода на сервере без контроля прав.

Поскольку обработке УниверсальныйОбменДаннымиXML требуется записать файл выгрузки на диск, платформа немедленно блокирует выполнение и возвращает исключение.

Решение 1. Явное отключение безопасного режима при создании объекта

Для того чтобы обойти это ограничение, мы должны явно передать значение Ложь во второй параметр метода Создать(). Это укажет платформе 1С на необходимость запуска обработки с полными правами текущего COM-пользователя.

Посмотрим на пример правильного вызова:


// Передаем Ложь во второй параметр метода Создать
Обработка = ZUP_COM.ВнешниеОбработки.Создать(ИмяФайла, Ложь);

В этом случае обработка будет создана вне безопасного режима и сможет беспрепятственно работать с файлами на стороне COM-сервера.

Решение 2. Обход защиты от опасных действий

Начиная с версии платформы 8.3.9, в системе реализован механизм предупреждения об опасных действиях при запуске внешних обработок. При программном создании файлов из внешних источников платформа может выдать интерактивный диалог или заблокировать выполнение операции в фоновом задании.

Чтобы избежать подобных блокировок при автоматическом ночном запуске, мы можем использовать два подхода:

Вариант А: Отключение защиты в Конфигураторе. Нам необходимо запустить Конфигуратор базы-источника, открыть список пользователей, выбрать учетную запись, под которой выполняется COM-подключение, и снять флажок «Защита от опасных действий».

Вариант Б: Программный обход через объект защиты. Мы можем инициализировать специальный объект защиты прямо в коде вызова. Важно создавать этот объект именно в контексте COM-подключения. Разберем этот пример подробнее:


// Создаем объект описания защиты от опасных действий в контексте COM
Защита = ZUP_COM.NewObject("ОписаниеЗащитыОтОпасныхДействий");
Защита.ПредупреждатьОбОпасныхДействиях = Ложь;

// Передаем объект защиты третьим параметром в метод Создать
Обработка = ZUP_COM.ВнешниеОбработки.Создать(ИмяФайла, Ложь, Защита);

Решение 3. Обновление настроек безопасности в справочнике БСП

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

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

  1. Когда вы меняете код функции СведенияОВнешнейОбработке() и прописываете там строку ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);, эти изменения хранятся только внутри самого файла .epf.
  2. Платформа 1С и БСП считывают эти настройки безопасности только в момент загрузки или обновления элемента справочника и записывают их в реквизиты элемента в СУБД.
  3. Чтобы настройки вступили в силу, необходимо зайти в режим «1С:Предприятие», открыть справочник «Дополнительные отчеты и обработки», найти нужную обработку, нажать кнопку «Обновить из файла», выбрать измененный файл обработки на диске и записать элемент справочника.

Полный пример реализации автоматической выгрузки через COM-соединение

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


Процедура ВыполнитьНочнуюВыгрузкуИзИсточника() Экспорт

    // 1. Инициализируем COM-соединение с базой-источником
    КомКоннектор = ОбщегоНазначенияКлиентСервер.ПолучитьКомКоннектор();
    СтрокаСоединения = "Srvr=""msk02serv1c04"";Ref=""Demo3"";Usr=""АдминистраторОбмена"";Pwd=""Пароль"";";
    
    Попытка
        ZUP_COM = КомКоннектор.Connect(СтрокаСоединения);
    Исключение
        ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Ошибка, , , 
            "Не удалось подключиться к базе-источнику: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;

    Попытка
        // 2. Находим обработку УниверсальныйОбменДаннымиXML в справочнике нашей базы-приемника
        ВнешняяОбработкаСсылка = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("УниверсальныйОбменДаннымиXML");
        ДвоичныеДанные = ВнешняяОбработкаСсылка.ХранилищеВнешнейОбработки.Получить();
        
        // 3. Получаем имя временного файла на сервере COM-соединения
        ИмяФайлаНаСервере = ZUP_COM.ПолучитьИмяВременногоФайла("epf");
        
        // Записываем двоичные данные файла на диск
        ДвоичныеДанные.Записать(ИмяФайлаНаСервере);
        
        // 4. Настраиваем обход защиты от опасных действий
        Защита = ZUP_COM.NewObject("ОписаниеЗащитыОтОпасныхДействий");
        Защита.ПредупреждатьОбОпасныхДействиях = Ложь;
        
        // 5. Создаем обработку без безопасного режима с отключенной защитой
        Обработка = ZUP_COM.ВнешниеОбработки.Создать(ИмяФайлаНаСервере, Ложь, Защита);
        
        // Заполняем реквизиты обработки для выгрузки (правила обмена, имя файла выгрузки и т.д.)
        Обработка.ИмяФайлаПравилОбмена = "C:\Exchange\Rules.xml";
        Обработка.ИмяФайлаДанных       = "C:\Exchange\DataOut.xml";
        Обработка.РежимОбмена          = "Выгрузка";
        
        // 6. Запускаем процедуру выгрузки
        Обработка.ВыполнитьВыгрузку();
        
        ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Информация, , , 
            "Выгрузка из базы-источника успешно завершена.");
            
    Исключение
        ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Ошибка, , , 
            "Ошибка при выполнении выгрузки через COM: " + ОписаниеОшибки());
    КонецПопытки;

КонецПроцедуры

Альтернативные архитектурные решения (почему COM — это не всегда лучший выбор)

Несмотря на то, что использование COM-соединений является проверенным временем методом интеграции, в современных реалиях он имеет ряд существенных недостатков:

Рассмотрим более современные и надежные альтернативы организации ночного обмена без использования COM-соединений:

1. Файловый обмен по расписанию в сетевом каталоге. В каждой базе-источнике настраивается независимое регламентное задание, которое ночью в определенное время (например, в 01:00) запускает встроенную обработку выгрузки данных и сохраняет файлы в общий сетевой ресурс или на FTP-сервер. База-приемник запускает свое регламентное задание позже (например, в 03:00), забирает файлы из сетевого каталога и импортирует их. Этот подход полностью исключает прямые соединения между базами.

2. Использование HTTP-сервисов. В базе-приемнике разрабатывается простой HTTP-сервис, принимающий POST-запросы с XML-пакетами данных. Базы-источники самостоятельно инициируют выгрузку и отправляют данные напрямую на веб-сервер базы-приемника. Данный подход является стандартом для современной веб-интеграции и обеспечивает высочайшую надежность и независимость платформ.

← На главную