Навеяно многочисленными вопросами по работе с COM объектами.
Когда я начинал изучать COM соединение в 1С, то на первых порах сломал немало копий и бубнов, пытаясь реализовать то одну, то другую задачу. Все время приходилось держать в уме –«все, что пришло из той базы, кроме простых типов, –это не объекты 1С. Это объекты 1С, завернутые в оболочку COMObject». Это немного напрягало. Потом я открыл для себя модуль внешнего соединения и у меня случился «щелк» в мозгах, который поставил все на место.
Я прописал в этом модуле простецкую экспортную функцию и жить с COM стало намного проще и веселее.
Вот эта функция:
//--------------
Функция ИсполнитьВн(КодВыполнить, ВспомПараметр= "") Экспорт
Ответ= "ОК";//Если ничего не нужно будет возвращать, то при отсутствии ошибок в коде вернется просто ОК
//Т.к. переданный код может быть с ошибками, то завернем его исполнение в попытку.
Попытка
Выполнить(КодВыполнить);
Исключение
//если все таки ошибка, то вернем ее текст
Ответ=ОписаниеОшибки();
КонецПопытки;
Возврат Ответ;
КонецФункции
//--------------
Думаю особо объяснять тут ничего не надо.
Из вызывающей базы через переменную-соединение вызываем эту функцию и передаем в нее код, который надо выполнить. В переданном коде переменной Ответ присваиваем значение, которое нам надо получить из подключенной базы.
Причем код может быть сколь угодно сложный, вплоть до выполнения запросов, вызова экспортных процедур объектов и т.д. Главное правильно написать текст(особенно надо помнить про кавычки внутри текста)
Второй параметр «ВспомПараметр» является вспомогательным( если кто не догадался ). В нем можно передавать какие-то значения, которые потом можно использовать в передаваемом же коде соответственно через переменную ВспомПараметр.
Простой вопрос с получением значения перечисления(который задается чаще всего) решается предельно просто:
//--------------
ИсполнитьКод= "Ответ=Перечисления.КакоетоИмя.КакоетоЗначение";//код на исполнение
ОтветОттуда=Соединение.ИсполнитьВн(ИсполнитьКод);
//--------------
Если не напутали в буквах в Исполнить код, то в Ответ получим нужную ссылку на нужное значение перечисления.
Но я на всякий случай все таки проверяю.
//--------------
Если ТипЗнч(ОтветОттуда)=Тип("Строка") Тогда // значит была ошибка и вернулся ее текст
Сообщить("Ошибка выполнения кода: "+ ОтветОттуда);
КонецЕсли;
//--------------
Причем самая вкусность в том, что переданный в ВспомПараметр COMObject, полученный ранее, на той стороне снова становится нормальным объектом 1С.
Например если мы получили по COM ссылку на элемент справочника, то в вызываемой базе он будет COMObject. Но если мы передадим его в параметр ВспомПараметр при вызове ИсполнитьВн(), то в передаваемом коде на той стороне переменную ВспомПараметр можно уже использовать как нормальный объект СправочникСсылка
Например:
//--------------
СсылкаCOM=Соединение.Справочники.Номенклатура.НайтиПоКоду("666");
//поменяем наименование
ИсполнитьКод= "Об=ВспомПараметр.ПолучитьОбъект();
|Об.Наименование= ""Изменено в базе COM"";
|Об.Записать();";
ОтветОттуда=Соединение.ИсполнитьВн(ИсполнитьКод,СсылкаCOM);
Сообщить("Результат выполнения : "+ ОтветОттуда+ "
|Новое наименование:"+ СсылкаCOM.Наименование ) ;
//--------------
Конечно наименование можно поменять и в вызывающей базе, не сильно напрягаясь. Но это просто пример использования.
Вобщем правила простые: если нужно выполнить какие то действия на стороне подключенной базы, то шлем код выполнения и присвиаем, то хочем получить переменной Ответ.
Если нужно просто выполнить действия например над переданным ВспомПараметром и ничего возвращать не нужно, то про ответ забываем и он при удачном выполнении вернется со значением по умолчанию, т.е. «ОК».
Если вернулось не «ОК», значит была ошибка выполнения и надо разбираться.
С тех пор я обязательно вставляю эту функцию во все конфигурации, с которыми предстоит долгое общение или сопровождение. Очень облегчает жизнь впоследствии.