Как передать в запрос параметры при обращении к другой базе через 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 277 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 Сейчас в теме
ИМХО примитивные типы так должны сработать.
Оставьте свое сообщение
Вакансии
Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)

Программист 1С
Москва
зарплата от 250 000 руб.
Полный день

Программист 1C
Волгоград
зарплата от 200 000 руб.
Полный день

Аналитик
Санкт-Петербург
зарплата от 200 000 руб. до 250 000 руб.
Полный день