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