Рассмотрим распространенную задачу интеграции в экосистеме «1С:Предприятие»: нам необходимо автоматизировать регулярную (например, ночную) выгрузку документов из двух информационных баз-источников и загрузить полученные данные в одну базу-приемник. Для этого планируется использовать типовую или модифицированную обработку УниверсальныйОбменДаннымиXML с готовыми правилами обмена.
Логичным решением на первый взгляд кажется создание регламентного задания в базе-приемнике, которое будет подключаться к базам-источникам через COM-соединение, загружать туда внешнюю обработку, выполнять выгрузку данных в файл и затем импортировать этот файл обратно. Однако при реализации этой схемы разработчики часто сталкиваются с ошибками ограничений прав доступа, в частности: «Установлен безопасный режим. Выполнение операции запрещено». Выясним причины возникновения этой ошибки и разберем по шагам, как правильно настроить запуск обработки через COM-соединение.
Проанализируем ситуацию, которая возникает при выполнении следующего кода на стороне COM-клиента:
Обработка = ZUP_COM.ВнешниеОбработки.Создать(ИмяФайла);
Обработка.ВыполнитьВыгрузку();
По умолчанию метод ВнешниеОбработки.Создать() принимает в качестве второго параметра значение БезопасныйРежим (тип Булево). Если этот параметр не указан явно, платформа 1С автоматически инициализирует его в значение Истина. В безопасном режиме работы платформы накладываются жесткие ограничения на использование операционной системы, среди которых:
Поскольку обработке УниверсальныйОбменДаннымиXML требуется записать файл выгрузки на диск, платформа немедленно блокирует выполнение и возвращает исключение.
Для того чтобы обойти это ограничение, мы должны явно передать значение Ложь во второй параметр метода Создать(). Это укажет платформе 1С на необходимость запуска обработки с полными правами текущего COM-пользователя.
Посмотрим на пример правильного вызова:
// Передаем Ложь во второй параметр метода Создать
Обработка = ZUP_COM.ВнешниеОбработки.Создать(ИмяФайла, Ложь);
В этом случае обработка будет создана вне безопасного режима и сможет беспрепятственно работать с файлами на стороне COM-сервера.
Начиная с версии платформы 8.3.9, в системе реализован механизм предупреждения об опасных действиях при запуске внешних обработок. При программном создании файлов из внешних источников платформа может выдать интерактивный диалог или заблокировать выполнение операции в фоновом задании.
Чтобы избежать подобных блокировок при автоматическом ночном запуске, мы можем использовать два подхода:
Вариант А: Отключение защиты в Конфигураторе. Нам необходимо запустить Конфигуратор базы-источника, открыть список пользователей, выбрать учетную запись, под которой выполняется COM-подключение, и снять флажок «Защита от опасных действий».
Вариант Б: Программный обход через объект защиты. Мы можем инициализировать специальный объект защиты прямо в коде вызова. Важно создавать этот объект именно в контексте COM-подключения. Разберем этот пример подробнее:
// Создаем объект описания защиты от опасных действий в контексте COM
Защита = ZUP_COM.NewObject("ОписаниеЗащитыОтОпасныхДействий");
Защита.ПредупреждатьОбОпасныхДействиях = Ложь;
// Передаем объект защиты третьим параметром в метод Создать
Обработка = ZUP_COM.ВнешниеОбработки.Создать(ИмяФайла, Ложь, Защита);
Если базы-источники работают под управлением конфигураций на базе БСП (Библиотеки стандартных подсистем) и внешняя обработка запускается из справочника «Дополнительные отчеты и обработки», простого изменения функции СведенияОВнешнейОбработке() в модуле объекта обработки будет недостаточно.
Разберем по шагам, почему это происходит и как поступить правильно:
СведенияОВнешнейОбработке() и прописываете там строку ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);, эти изменения хранятся только внутри самого файла .epf.Объединим все вышеописанные решения в готовый рабочий программный код, который можно разместить в модуле регламентного задания базы-приемника:
Процедура ВыполнитьНочнуюВыгрузкуИзИсточника() Экспорт
// 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-соединений является проверенным временем методом интеграции, в современных реалиях он имеет ряд существенных недостатков:
comcntr.dll не всегда стабильно освобождают оперативную память сервера, что при частых обменах может снижать общую производительность серверного кластера.Рассмотрим более современные и надежные альтернативы организации ночного обмена без использования COM-соединений:
1. Файловый обмен по расписанию в сетевом каталоге. В каждой базе-источнике настраивается независимое регламентное задание, которое ночью в определенное время (например, в 01:00) запускает встроенную обработку выгрузки данных и сохраняет файлы в общий сетевой ресурс или на FTP-сервер. База-приемник запускает свое регламентное задание позже (например, в 03:00), забирает файлы из сетевого каталога и импортирует их. Этот подход полностью исключает прямые соединения между базами.
2. Использование HTTP-сервисов. В базе-приемнике разрабатывается простой HTTP-сервис, принимающий POST-запросы с XML-пакетами данных. Базы-источники самостоятельно инициируют выгрузку и отправляют данные напрямую на веб-сервер базы-приемника. Данный подход является стандартом для современной веб-интеграции и обеспечивает высочайшую надежность и независимость платформ.