Как передать в запрос параметры при обращении к другой базе через COMObject

1. Iveperfect 02.12.16 16:10 Сейчас в теме
Здравствуйте!

Создаю внешний отчет для БП2.0, есть необходимость подтянуть данные из другой базы (ЗУП), привожу отрывок кода:

v8 = Новый COMObject(УправлениеСоединениямиИБ.ИмяCOMСоединителя());
Открыта = v8.Connect("Srvr =""server"";Ref=Base2;Usr=""***"";Pwd=""***"";");

Query =  Открыта.NewObject("Запрос");
Query.Текст = 
	
	"ВЫБРАТЬ
	|	ТЗ.Сумма,
	|	ТЗ.НоменклатурнаяГруппа,
	|	ТЗ.ВидДеятельности,
	|	ТЗ.Период
	|ПОМЕСТИТЬ ВТ_05ПРОЦЕНТ
	|ИЗ
	|	&ВнешнийИсточник КАК ТЗ
	|; и т.д.

Query.УстановитьПараметр("НачалоПериода",   НачалоПериода); 
Query.УстановитьПараметр("КонецПериода",    КонецПериода);
Query.УстановитьПараметр("ВнешнийИсточник",ЗапросПроценты.Выполнить().Выгрузить));
Показать

Возникает ошибка:
Произошла исключительная ситуация (1C:Enterprise 8.3.8.1675): {(8, 2)}: Неверные параметры "ВнешнийИсточник"

Где ВнешнийИсточник - это результат запроса в текушей базе БП, как передать его в параметры такого запроса?
По теме из базы знаний
Найденные решения
5. vovan_victory 63 02.12.16 16:32 Сейчас в теме
Ну или попробуйте так:
ТекТЗ = ЗапросПроценты.Выполнить().Выгрузить();

КомТЗ = Открыта.NewObject("ТаблицаЗначений");

Для Каждого Стр Из ТекТЗ Цикл
НоваСтрока = КомТЗ.Добавить();
НоваСтрока.Сумма = Стр.Сумма; 
НоваСтрока.Период = Стр.СумПериод; 

НГ = Открыта.Справочники.НоменклатурнаяГруппа.НайтиПоНаименованию(Стр.НоменклатурнаяГруппа.Наименование);

НоваСтрока.НоменклатурнаяГруппа = НГ; 

ВД = Открыта.Справочники.ВидДеятельности.НайтиПоНаименованию(Стр.ВидДеятельности .Наименование);
НоваСтрока.ВидДеятельности = ВД 

КонецЦикла

Query.УстановитьПараметр("ВнешнийИсточник",КомТЗ);
Показать


P/s (4) опередил
Iveperfect; +1 Ответить
13. fromtomike 48 05.12.16 12:53 Сейчас в теме
(11) Наверное все-таки нужно так:
ВнешнийИсточник.Колонки.Добавить("Сумма", Открыта.NewObject("ОписаниеТипов", "Число"));
Iveperfect; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. vovan_victory 63 02.12.16 16:16 Сейчас в теме
(1)Сдается мне , что так не прокатит. ВнешнийИсточник должен содержать типы конечной базы , т.е что то типа Открыта.NewObject("ТаблицаЗначений"). И внутри это ТЗ должны быть сом объекты

Похожая тема
3. binex 278 02.12.16 16:21 Сейчас в теме
Сохранить ТЗ через ЗначениеВФайл, восстановить его в КОМ-овской базе. Только в ТЗ должны быть примитивные данные. Строка, число, дата.
4. Drak0n 187 02.12.16 16:25 Сейчас в теме
ВнешнийИсточник заполняйте примерно так...
ВнешнийИсточник = Открыта.NewObject("ТаблицаЗначений");
.....

Выборка = ЗапросПроценты.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл 
НоваяСтрока = ВнешнийИсточник .Добавить();
НоваяСтрока.Колонка1 = Открыта.Справочники.НазваниеСправочника.НийтиПоНаименованию/Коду(Выборка.Колонка1Наименование);
.....
КонецЦикла
Показать
5. vovan_victory 63 02.12.16 16:32 Сейчас в теме
Ну или попробуйте так:
ТекТЗ = ЗапросПроценты.Выполнить().Выгрузить();

КомТЗ = Открыта.NewObject("ТаблицаЗначений");

Для Каждого Стр Из ТекТЗ Цикл
НоваСтрока = КомТЗ.Добавить();
НоваСтрока.Сумма = Стр.Сумма; 
НоваСтрока.Период = Стр.СумПериод; 

НГ = Открыта.Справочники.НоменклатурнаяГруппа.НайтиПоНаименованию(Стр.НоменклатурнаяГруппа.Наименование);

НоваСтрока.НоменклатурнаяГруппа = НГ; 

ВД = Открыта.Справочники.ВидДеятельности.НайтиПоНаименованию(Стр.ВидДеятельности .Наименование);
НоваСтрока.ВидДеятельности = ВД 

КонецЦикла

Query.УстановитьПараметр("ВнешнийИсточник",КомТЗ);
Показать


P/s (4) опередил
Iveperfect; +1 Ответить
6. v3rter 02.12.16 16:36 Сейчас в теме
Странный способ передачи результата запроса в качестве параметра... Может так?
Query.УстановитьПараметр("ВнешнийИсточник",ЗапросПроценты.Выполнить().Выгрузить())); 
Чисто интересно - прокатит или нет.
7. vovan_victory 63 02.12.16 16:40 Сейчас в теме
(6)да быстрее всего, у него просто описка, а ошибка то правильно озвучена.

Query.УстановитьПараметр("ВнешнийИсточник",ЗапросПроценты.Выполнить().Выгрузить())); 

Так работать не будет
8. v3rter 02.12.16 17:42 Сейчас в теме
Здесь http://1c-pro.ru/threads/podkljuchenie-ib-cherez-com-obekt-i-poluchenie-dannyx.42056/ нашёл
объекты, передаваемые в базу через коннектор должны быть созданы в той базе, структуры и запросы через коннектор не передаются, так же как не передаются и ссылочные типы из текущей базы. если вы получили ссылочный тип из коннектора, его можно передавать в качестве параметров

Здесь http://j008.ru/ps/035_COMConnector_TT предлагают передавать значения через .ЗначениеВСтрокуВнутр() .ЗначениеИзСтрокиВнутр();

Здесь http://j008.ru/ps/031_1c_COMConnector_Ex предлагают переделать запрос на стороне com-объекат под возврат простых типов
    |    ПРЕДСТАВЛЕНИЕ(ПРЕДСТАВЛЕНИЕССЫЛКИ(Док.Контрагент.Наименование)) как Контрагент    

Здесь http://forum.infostart.ru/forum9/topic40234/ есть идея
Когда в параметр передаете ссылку, то передайте ее так Запрос.УстановитьПараметр("Ссылка", Ссылка.Ref);
но нет подтверждения правильности

П.С. Давно понял, что гугль - это квест, а не решебник.
9. jobtorn 02.12.16 19:29 Сейчас в теме
Пример, который написал Алексей будет работать (и нужно именно так), а тема с конвертацией значений через .ЗначениеВСтрокуВнутр() .ЗначениеИзСтрокиВнутр(); от Роберта прекрасно работает если в базах совпадают ссылки (то есть не нужно по коду или наименованию искать), на худой конец, если не верите этим функциям, то для ссылочных типов можно получить идентификатор, преобразовывать в строку, а в базе удаленной через получитьссылку получать ссылку на элемента ссылочного типа
10. Serginio 938 02.12.16 19:46 Сейчас в теме
С оле проще всего работать через внешние отчеты. Премущества отладка и минимум ограничений
http://www.forum.mista.ru/topic.php?id=761328#37
11. Iveperfect 05.12.16 12:30 Сейчас в теме
Всем большое спасибо за отклики!

Сделал так:

ВнешнийИсточник = Открыта.NewObject("ТаблицаЗначений");

ВнешнийИсточник.Колонки.Добавить("Сумма");
ВнешнийИсточник.Колонки.Добавить("НоменклатурнаяГруппа");
ВнешнийИсточник.Колонки.Добавить("ВидДеятельности");
ВнешнийИсточник.Колонки.Добавить("Период");
	
Пока Выборка.Следующий() Цикл
	НоваяСтрока = ВнешнийИсточник.Добавить();
	НоваяСтрока.Сумма                = Выборка.Сумма; 
	НоваяСтрока.НоменклатурнаяГруппа = Выборка.НоменклатурнаяГруппа;
	НоваяСтрока.ВидДеятельности      = Выборка.ВидДеятельности; 
	НоваяСтрока.Период               = Выборка.Период;
КонецЦикла;
	
Query.УстановитьПараметр("ВнешнийИсточник", ВнешнийИсточник);
Показать


Но теперь возникает другая ошибка:
Тип не может быть выбран в запросе <<?>>ТЗ.Сумма,

Видимо, нужно сделать примерно так:
ТЗ.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));

Пробовал так: ВнешнийИсточник.Колонки.Добавить("Сумма", Открыта.NewObject(Открыта.ОписаниеТипов("Число"))); Но не прокатило
12. vovan_victory 63 05.12.16 12:40 Сейчас в теме
(11)

Видимо, нужно сделать примерно так: 
ТЗ.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число")); 


Да. Так. колонки ТЗ которая в далнейшем будет использоваться в запросе, обязательно должны быть типизированны.

13. fromtomike 48 05.12.16 12:53 Сейчас в теме
(11) Наверное все-таки нужно так:
ВнешнийИсточник.Колонки.Добавить("Сумма", Открыта.NewObject("ОписаниеТипов", "Число"));
Iveperfect; +1 Ответить
14. vovan_victory 63 05.12.16 13:53 Сейчас в теме
ИМХО примитивные типы так должны сработать.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот