Передача параметров в запросы при подключении через COM-соединение

1. Alchemist 20.06.11 08:34 Сейчас в теме
Здравствуйте, уважаемые коллеги. Спасибо Вам огромное за внимание к этой теме.
Подскажите пожалуйста - каким образом можно корректно передать в запрос к базе 8.х, к которой я подключился через COM-соединение, ссылку, например, на элемент справочника, или документ, для того чтобы в запросе отобрать записи только со ссылкой на этот элемент справочника или документ?

Например - я подключаюсь к базе 1С 8.1 через COM-соединение и записываю соединение с базой в переменную БазаИсточник. Далее, я создаю запрос при помощи метода NewObject:

Запрос = БазаИсточник.NewObject("Запрос");


Далее - я задаю текст запроса (допустим, мне нужно получить движения по взаиморасчетам по определенному контрагенту и по конкретным организациям из списка):

Запрос.Текст =
"ВЫБРАТЬ
|	ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Регистратор КАК Регистратор,
|	ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента,
|	ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовПриход КАК Приход,
|	ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовРасход КАК Расход,
|	ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток КАК Остаток
|ИЗ
|	РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(, &НаДату, Регистратор, , ДоговорКонтрагента.Владелец = &Контрагент И ДоговорКонтрагента.Организация В(&ФильтрПоОрганизациям)
|";
Показать


7.7 без проблем сравнивала ссылки на объекты, полученные через OLE, а вот 8-ка не считает одну и ту же ссылку на объект, полученную через COM-соединение даже равной самой себе!
Например, вот такой вод код

КонтрагентИсточникСсылка = БазаИсточник.Справочники.Контрагенты.НайтиПоКоду("00004288");
Если КонтрагентИсточникСсылка = КонтрагентИсточникСсылка Тогда
	Предупреждение("Ссылки идентичны");
Иначе
	Предупреждение("Ссылки не идентичны");
КонецЕсли;


выдаст сообщение "Ссылки не идентичны". И, соответственно, при передаче параметров в вышеприведенный запрос, он тоже не сможет сделать правильно отбор по контрагенту и по списку организаций, и результат запроса будет пустым.
Может быть кто-нибудь знает какое-нибудь решение этой небольшой проблемки?

Как вариант - можно сравнивать не ссылки, а коды справочников или номера документов, но, может быть, все-таки, есть решение, в котором 8-ка нормально будет понимать ссылки?

Заранее всем огромное спасибо.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
12. director04 3657 29.01.13 11:01 Сейчас в теме
(1) Alchemist, Столкнулся с такой же проблемой.
Решил следующим образом:
Когда в параметр передаете ссылку, то передайте ее так Запрос.УстановитьПараметр("Ссылка", Ссылка.Ref);

Проблема должна решиться.....
Andy_NTG; kimskiysanya; NewLifeMan; Smile1984arm; jsuh; +5 Ответить
2. Spartan 365 20.06.11 09:18 Сейчас в теме
Насчет тождественности самой себе не знаю, а в параметрах запроса у меня ссылки из COM-объекта передаются нормально и все отрабатывает верно... Ошибка где-то в другом месте.
Запрос = ИБ81.NewObject("Query");
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ХозрасчетныйОстатки.Субконто1.Код КАК Код,
	|	ХозрасчетныйОстатки.СуммаОстаток КАК Долг
	|ИЗ
	|	РегистрБухгалтерии.Хозрасчетный.Остатки(
	|			&Период,
	|			Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПокупателями)
	|				ИЛИ Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоАвансамПолученным),
	|			ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты),
	|			Организация В (&СписокОрганизаций)) КАК ХозрасчетныйОстатки
	|ГДЕ
	|	ХозрасчетныйОстатки.Субконто1.Код ПОДОБНО ""_____ %""
	|
	|УПОРЯДОЧИТЬ ПО
	|	Код";
	
	Запрос.УстановитьПараметр("Период", Период);
	ОсновнаяОрганизация = ИБ81.Справочники.Организации.НайтиПоНаименованию(СтрокаПараметров.НаименованиеОрганизации, Истина);
	Запрос.УстановитьПараметр("СписокОрганизаций", ОсновнаяОрганизация);
Показать
5. luns 22.06.11 10:50 Сейчас в теме
в (2) верно написано. все отработает.
что касаемо сравнения сом объекта с самим собой, возможно это особенность платформы.
хотя например

А = Новый COMОбъект("V81.Application");

Сообщить(А=А);


выдает

Истина
3. luns 20.06.11 09:25 Сейчас в теме
А КонтрагентИсточникСсылка чему равно в отладчике?
4. Alchemist 22.06.11 10:34 Сейчас в теме
Spartan пишет:
Насчет тождественности самой себе не знаю, а в параметрах запроса у меня ссылки из COM-объекта передаются нормально и все отрабатывает верно... Ошибка где-то в другом месте.

Хм...

luns пишет:
А КонтрагентИсточникСсылка чему равно в отладчике?

У меня пишет "COMObject", но если обращаться к реквизитам - то код и наименование соответствующие.
6. Alchemist 22.06.11 14:00 Сейчас в теме
Вот что мне пишет 1С при попытке сравнить ссылку на документ в тексте запроса:
Ошибка при вызове метода контекста (Выполнить): {(7, 29)}: Неверные параметры в операции сравнения. Нельзя сравнивать поля
неограниченной длины и поля несовместимых типов.
ПродажиОбороты.Регистратор <<?>>= &Регистратор

Похоже, что он воспринимает COM-объектовскую ссылку на документ, как текст.
7. alexk-is 6534 22.06.11 14:08 Сейчас в теме
(6) &Регистратор это точно Ссылка или это Объект?
8. WKBAPKA 214 28.06.11 10:56 Сейчас в теме
смотря к какой базе подключаться... известно, что ссылки на документы и справочники конкретной базы уникальны во вселенной баз. Но если база работает через РИБ то можно упаковывать ссылки через XMLСтрока() и распаковывать через XMLЗначение(). Тада нужно писать так:

СтрЗначен = XMLСтрока(Ссылка)
УдалЗапрос.УстановитьПараметр("Ссылка", XMLЗначение("СправочникСсылка.МойСправочник", СтрЗначен);
9. a1ex4ndr 5 04.06.12 13:34 Сейчас в теме
Насколько я понимаю разница в таком коде:

КонтрагентИсточникСсылка = БазаИсточник.Справочники.Контрагенты.НайтиПоКоду("00004288");
Если КонтрагентИсточникСсылка = КонтрагентИсточникСсылка Тогда
Предупреждение("Ссылки идентичны");
Иначе
Предупреждение("Ссылки не идентичны");
КонецЕсли;

и в параметрах запроса - это то что тут сравнивается ссылка полученная по ОЛЕ а когда параметр сформирован в базе к которой подключены по оле, то там должно все нормально отработаться, потому что, там ссылка - это ссылка.
а уж преобразуется она когда приходит в текущую базу (откуда подключались)....
10. sai_NT 04.06.12 14:12 Сейчас в теме
Пост №8 почти верен, вот только так надо было написать:
Запрос.УстановитьПараметр("Ссылка", БазаИсточник.XMLValue("СправочникСсылка.МойСправочник", XMLСтрока(Ссылка));
11. popro 04.06.12 14:47 Сейчас в теме
мне кажется если основную организацию прописать руками через форму то запрос сработает.
может чем поможет пример моего работающего кода.

		Запрос = БазаКоннект.NewObject("Запрос");
		Запрос.Текст = "ВЫБРАТЬ
		               |	ДоговорыКонтрагентов.Код,
		               |	ДоговорыКонтрагентов.Наименование
		               |ИЗ
		               |	Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
		               |ГДЕ
		               |	ДоговорыКонтрагентов.Владелец.ИНН = &Контрагент
		               |	И ДоговорыКонтрагентов.Организация.ИНН = &Организация";
							
							
		Запрос.УстановитьПараметр("Контрагент", Выборка.Организация.ИНН);
		Запрос.УстановитьПараметр("Организация", Выборка.Контрагент.ИНН);
		
		ПоступлениеДоговор = Запрос.Выполнить().Выбрать();
Показать
Оставьте свое сообщение

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