Каталог решений - Использование внешних COM-компонент (.dll) или любых клиентских методов в регламентных заданиях серверной базы.

Использование внешних COM-компонент (.dll) или любых клиентских методов в регламентных заданиях серверной базы.

Использование внешних COM-компонент (.dll) или любых клиентских методов в регламентных заданиях серверной базы.

В наличии

Для расширения возможностей платформы 1С существует огромное количество внешних компонент (дополнительные функции, взаимодействие с софтом и железом других производителей, ключи защиты).
К сожалению, большинство из них написано на технологии .COM и не могут использоваться на сервере.
Для использования в регламентных заданиях серверной базы их приходится переписывать на Native API.
Однако, иногда нет возможности переписать компоненту на новую технологию, но нужно вызвать ее в регламентном задании на сервере.

Категория:

Описание

Например, не получится переписать компоненту, если вы не её автор и исходников просто нет. Либо если для ее работы недостаточно поддерживаемых технологией Native API простейших типов (число, строка, булево, дата).

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

Подробнее о том, почему недоступен, можно почитать на ИТС.

В этом случае можно вызывать компоненту на клиенте. Для этого достаточно выполнить из регламентного задания на сервере запуск еще одного сеанса 1С в котором на клиенте выполнить нужные действия. Ну и не забыть потом завершить запущенный сеанс.

Допустим, у нас в регламентном задании выполняется формирование и сохранение отчета, использующего для склонения ФИО внешнюю COM-компоненту NameDeclension.dll. На файловой базе такое регламентное задание будет работать корректно, на серверной компоненту подключить не получится.

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

#Если Клиент Тогда

Процедура ВыполнитьФормированиеИСохранениеОтчета() Экспорт

    Если ПодключитьВнешнююКомпоненту("ОбщийМакет.NAMEDECL","Скл",ТипВнешнейКомпоненты.COM) Тогда
	 Компонента = Новый ("AddIn.Скл.NameDeclension");
         //Тут код формирования и сохранения отчета 
    Иначе	
	 ЗаписьЖурналаРегистрации("РеглЗадания", УровеньЖурналаРегистрации.Ошибка,,, 
                                   "Не удалось подключить внешнюю компоненту на клиенте");
    КонецЕсли; 

КонецПроцедуры
	
#Иначе
	
Процедура ВыполнитьФормированиеИСохранениеОтчета() Экспорт
	
	ВыполнитьОперациюНаКлиенте("РеглЗадания.ВыполнитьФормированиеИСохранениеОтчета()"); 

КонецПроцедуры
		
Процедура ВыполнитьОперациюНаКлиенте(ПараметрДляВыполнения) Экспорт

	ИмяПользователя = "";
	ПарольПользователя = "";
	ПутьКВнешнейОбработке = "c:/temp/Автозапуск.epf";
	
	Кавычка = """";

	КаталогBIN = КаталогПрограммы();
	
	ПутьККонфигурации = СтрокаСоединенияИнформационнойБазы();
	ПутьККонфигурации = СтрЗаменить(ПутьККонфигурации, Кавычка, Кавычка + Кавычка);
	
	СтрокаЗапуска = Кавычка + КаталогBIN + "1cv8.exe" + Кавычка + " ENTERPRISE"
		+ " /IBConnectionString " + Кавычка + ПутьККонфигурации + Кавычка
		+ " /N "                  + Кавычка + ИмяПользователя + Кавычка
		+ " /P "                  + Кавычка + ПарольПользователя + Кавычка
		+ " /Execute  "           + Кавычка + ПутьКВнешнейОбработке + Кавычка
		+ " /C  "                 + Кавычка + ПараметрДляВыполнения + Кавычка;

	ЗапуститьПриложение(СтрокаЗапуска);	

КонецПроцедуры
 
#КонецЕсли

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

Попытка
    Выполнить(ПараметрЗапуска);
Исключение
КонецПопытки;
ЗавершитьРаботуСистемы(Ложь);

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

Код для обычного приложения. Теоретически полностью аналогично будет работать и в управляемом.

p.s. Также этот подход можно использовать для выполнения любых клиентских процедур в регламентных заданиях.

 


has been added to your cart:
Оформление заказа