Книга знаний

1С:Предприятие / Приемы программирования / OLE, COM

Выполнение произвольного кода на стороне подключенной базы 8.x при COM-соединении

Выполнение произвольного кода на стороне подключенной базы  8.x при COM-соединении и возврат произвольного значения в вызывающую базу.Автор статьи: Рэйв | Редакторы:
Последняя редакция №2 от 10.10.11 | История
URL: http://kb.mista.ru/article.php?id=854

Ключевые слова: COM,значение,перечисление


При COM- соединении часто возникают вопросы, как произвести то или иное действие с подключенной базой или получить какое-нибудь хитрое значение оттуда, когда свободно ходят только числа, строки и даты.

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

Смысл способа в следующем:
Если нельзя просто взять и через COM выполнить любой код на стороне текущей базы для подключенной, то ведь строки ходят вполне свободно, и значит текст кода, который нам нужно выполнить  мы можем передать.  А  т.к.в 8-ке есть замечательный метод Выполнить(), то мы можем полученный код отправить на выполнение в контексте и пространстве имен именно подключенной по COM базы.

Первое что мы делаем – это пишем функцию в модуле внешнего соединения подключаемой базы.


Функция ИсполнитьВн(КодВыполнить, ВспомПараметр= "") Экспорт

Ответ= "ОК";//Если ничего не нужно будет возвращать, то при отсутствии ошибок в коде            //вернется просто ОК
   
   //Т.к. переданный код может быть с ошибками, то завернем его исполнение в попытку.
   Попытка
       Выполнить(КодВыполнить);
   Исключение
       //если все таки ошибка, то вернем ее текст
       Ответ=ОписнаиеОшибки();
   КонецПопытки
   Возврат Ответ;
КонецФункции


Параметры:

КодВыполнить – это собственно сам код.

ВспомПараметр – вспомогательный параметр. Иногда вместе с кодом возникает необходимость передать еще   что-то. Вот для этого и зарезервирован этот параметр. Соответственно по этому имени он и будет доступен в передаваемом коде.

Собственно это все.

Дальше открывается широкое поле для использования.

Например, больной вопрос и наболевшая тема - как получить по СОМ значение ссылки-перечисления решается очень легко просто.

Пример:

Выборка= Соединение.Документы.ПоступлениеТоваровУслуг.Выбрать();

Пока Выборка.Следующий() Цикл
    Сообщить("Напрямую через СОМ:"+ Выборка.Ссылка.ВидОперации);
    ЗначениеПеречисления= Соединение.ИсполнитьВн("Ответ=Строка(ВспомПараметр)",Выборка.Ссылка.ВидОперации);    
    Сообщить("Через функцию ИсполнитьВн():"+ ЗначениеПеречисления);
    Прервать;
КонецЦикла;    


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

Результат выполнения :

Напрямую через СОМ:COMОбъект
Через функцию ИсполнитьВн():Покупка


Ну это просто маленький пример. На самом деле так  можно выполнять гигантские куски любого кода прямо в подключенной базе, используя просто встроенный язык 8.x

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2024 | Mista.ru

Яндекс.Метрика