| Выполнение произвольного кода на стороне подключенной базы  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
 |