Передача параметров в запросы при подключении через COM-соединение
Здравствуйте, уважаемые коллеги. Спасибо Вам огромное за внимание к этой теме.
Подскажите пожалуйста - каким образом можно корректно передать в запрос к базе 8.х, к которой я подключился через COM-соединение, ссылку, например, на элемент справочника, или документ, для того чтобы в запросе отобрать записи только со ссылкой на этот элемент справочника или документ?
Например - я подключаюсь к базе 1С 8.1 через COM-соединение и записываю соединение с базой в переменную БазаИсточник. Далее, я создаю запрос при помощи метода NewObject:
Далее - я задаю текст запроса (допустим, мне нужно получить движения по взаиморасчетам по определенному контрагенту и по конкретным организациям из списка):
7.7 без проблем сравнивала ссылки на объекты, полученные через OLE, а вот 8-ка не считает одну и ту же ссылку на объект, полученную через COM-соединение даже равной самой себе!
Например, вот такой вод код
выдаст сообщение "Ссылки не идентичны". И, соответственно, при передаче параметров в вышеприведенный запрос, он тоже не сможет сделать правильно отбор по контрагенту и по списку организаций, и результат запроса будет пустым.
Может быть кто-нибудь знает какое-нибудь решение этой небольшой проблемки?
Как вариант - можно сравнивать не ссылки, а коды справочников или номера документов, но, может быть, все-таки, есть решение, в котором 8-ка нормально будет понимать ссылки?
Заранее всем огромное спасибо.
Подскажите пожалуйста - каким образом можно корректно передать в запрос к базе 8.х, к которой я подключился через COM-соединение, ссылку, например, на элемент справочника, или документ, для того чтобы в запросе отобрать записи только со ссылкой на этот элемент справочника или документ?
Например - я подключаюсь к базе 1С 8.1 через COM-соединение и записываю соединение с базой в переменную БазаИсточник. Далее, я создаю запрос при помощи метода NewObject:
Запрос = БазаИсточник.NewObject("Запрос");
Далее - я задаю текст запроса (допустим, мне нужно получить движения по взаиморасчетам по определенному контрагенту и по конкретным организациям из списка):
Запрос.Текст =
"ВЫБРАТЬ
| ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Регистратор КАК Регистратор,
| ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента,
| ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовПриход КАК Приход,
| ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовРасход КАК Расход,
| ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток КАК Остаток
|ИЗ
| РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(, &НаДату, Регистратор, , ДоговорКонтрагента.Владелец = &Контрагент И ДоговорКонтрагента.Организация В(&ФильтрПоОрганизациям)
|";
Показать7.7 без проблем сравнивала ссылки на объекты, полученные через OLE, а вот 8-ка не считает одну и ту же ссылку на объект, полученную через COM-соединение даже равной самой себе!
Например, вот такой вод код
КонтрагентИсточникСсылка = БазаИсточник.Справочники.Контрагенты.НайтиПоКоду("00004288");
Если КонтрагентИсточникСсылка = КонтрагентИсточникСсылка Тогда
Предупреждение("Ссылки идентичны");
Иначе
Предупреждение("Ссылки не идентичны");
КонецЕсли;
выдаст сообщение "Ссылки не идентичны". И, соответственно, при передаче параметров в вышеприведенный запрос, он тоже не сможет сделать правильно отбор по контрагенту и по списку организаций, и результат запроса будет пустым.
Может быть кто-нибудь знает какое-нибудь решение этой небольшой проблемки?
Как вариант - можно сравнивать не ссылки, а коды справочников или номера документов, но, может быть, все-таки, есть решение, в котором 8-ка нормально будет понимать ссылки?
Заранее всем огромное спасибо.
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Alchemist, Столкнулся с такой же проблемой.
Решил следующим образом:
Когда в параметр передаете ссылку, то передайте ее так Запрос.УстановитьПараметр("Ссылка", Ссылка.Ref);
Проблема должна решиться.....
Решил следующим образом:
Когда в параметр передаете ссылку, то передайте ее так Запрос.УстановитьПараметр("Ссылка", Ссылка.Ref);
Проблема должна решиться.....
Насчет тождественности самой себе не знаю, а в параметрах запроса у меня ссылки из COM-объекта передаются нормально и все отрабатывает верно... Ошибка где-то в другом месте.
Запрос = ИБ81.NewObject("Query");
Запрос.Текст =
"ВЫБРАТЬ
| ХозрасчетныйОстатки.Субконто1.Код КАК Код,
| ХозрасчетныйОстатки.СуммаОстаток КАК Долг
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(
| &Период,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПокупателями)
| ИЛИ Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоАвансамПолученным),
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты),
| Организация В (&СписокОрганизаций)) КАК ХозрасчетныйОстатки
|ГДЕ
| ХозрасчетныйОстатки.Субконто1.Код ПОДОБНО ""_____ %""
|
|УПОРЯДОЧИТЬ ПО
| Код";
Запрос.УстановитьПараметр("Период", Период);
ОсновнаяОрганизация = ИБ81.Справочники.Организации.НайтиПоНаименованию(СтрокаПараметров.НаименованиеОрганизации, Истина);
Запрос.УстановитьПараметр("СписокОрганизаций", ОсновнаяОрганизация);
ПоказатьSpartan пишет:
Насчет тождественности самой себе не знаю, а в параметрах запроса у меня ссылки из COM-объекта передаются нормально и все отрабатывает верно... Ошибка где-то в другом месте.
Насчет тождественности самой себе не знаю, а в параметрах запроса у меня ссылки из COM-объекта передаются нормально и все отрабатывает верно... Ошибка где-то в другом месте.
Хм...
luns пишет:
А КонтрагентИсточникСсылка чему равно в отладчике?
А КонтрагентИсточникСсылка чему равно в отладчике?
У меня пишет "COMObject", но если обращаться к реквизитам - то код и наименование соответствующие.
Вот что мне пишет 1С при попытке сравнить ссылку на документ в тексте запроса:
Похоже, что он воспринимает COM-объектовскую ссылку на документ, как текст.
Ошибка при вызове метода контекста (Выполнить): {(7, 29)}: Неверные параметры в операции сравнения. Нельзя сравнивать поля
неограниченной длины и поля несовместимых типов.
ПродажиОбороты.Регистратор <<?>>= &Регистратор
неограниченной длины и поля несовместимых типов.
ПродажиОбороты.Регистратор <<?>>= &Регистратор
Похоже, что он воспринимает COM-объектовскую ссылку на документ, как текст.
смотря к какой базе подключаться... известно, что ссылки на документы и справочники конкретной базы уникальны во вселенной баз. Но если база работает через РИБ то можно упаковывать ссылки через XMLСтрока() и распаковывать через XMLЗначение(). Тада нужно писать так:
СтрЗначен = XMLСтрока(Ссылка)
УдалЗапрос.УстановитьПараметр("Ссылка", XMLЗначение("СправочникСсылка.МойСправочник", СтрЗначен);
СтрЗначен = XMLСтрока(Ссылка)
УдалЗапрос.УстановитьПараметр("Ссылка", XMLЗначение("СправочникСсылка.МойСправочник", СтрЗначен);
Насколько я понимаю разница в таком коде:
КонтрагентИсточникСсылка = БазаИсточник.Справочники.Контрагенты.НайтиПоКоду("00004288");
Если КонтрагентИсточникСсылка = КонтрагентИсточникСсылка Тогда
Предупреждение("Ссылки идентичны");
Иначе
Предупреждение("Ссылки не идентичны");
КонецЕсли;
и в параметрах запроса - это то что тут сравнивается ссылка полученная по ОЛЕ а когда параметр сформирован в базе к которой подключены по оле, то там должно все нормально отработаться, потому что, там ссылка - это ссылка.
а уж преобразуется она когда приходит в текущую базу (откуда подключались)....
КонтрагентИсточникСсылка = БазаИсточник.Справочники.Контрагенты.НайтиПоКоду("00004288");
Если КонтрагентИсточникСсылка = КонтрагентИсточникСсылка Тогда
Предупреждение("Ссылки идентичны");
Иначе
Предупреждение("Ссылки не идентичны");
КонецЕсли;
и в параметрах запроса - это то что тут сравнивается ссылка полученная по ОЛЕ а когда параметр сформирован в базе к которой подключены по оле, то там должно все нормально отработаться, потому что, там ссылка - это ссылка.
а уж преобразуется она когда приходит в текущую базу (откуда подключались)....
мне кажется если основную организацию прописать руками через форму то запрос сработает.
может чем поможет пример моего работающего кода.
может чем поможет пример моего работающего кода.
Запрос = БазаКоннект.NewObject("Запрос");
Запрос.Текст = "ВЫБРАТЬ
| ДоговорыКонтрагентов.Код,
| ДоговорыКонтрагентов.Наименование
|ИЗ
| Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
|ГДЕ
| ДоговорыКонтрагентов.Владелец.ИНН = &Контрагент
| И ДоговорыКонтрагентов.Организация.ИНН = &Организация";
Запрос.УстановитьПараметр("Контрагент", Выборка.Организация.ИНН);
Запрос.УстановитьПараметр("Организация", Выборка.Контрагент.ИНН);
ПоступлениеДоговор = Запрос.Выполнить().Выбрать();
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот