Имя: Пароль:
1C
 
Передача параметров в запрос к базе, подключенной через OLE
0 kolobroder
 
20.04.09
19:10
Имеем:
1. Текущюю базу Бух 7.7
2. Другую базу Бух 7.7, открытую из п. 1. через OLE.

Надо:
В 1. выполнить запрос по данным 2.. Условие: в запрос надо передать рядо параметров.

Как я делаю:

олеБазаОАО = олеИБ.Перечисление.Учет.ОАО;
олеЗапрос = ИБ.CreateObject("Запрос");
ТЗап = "
|Период с '"+хНачДата+"' по '"+хКонДата+"'
|Док  = Документ.ОтгрузкаТовара.ТекущийДокумент;
|База =  Документ.ОтгрузкаТовара.База;
|
|Группировка Док;
|
|Условие(База = олеБазаОАО);
|";
...
олеЗапрос.Выполнить(ТЗап);

последняя строка выдает ошибку:
Запрос[21] : Ошибка в выражении 'олеБазаОАО'

КАК правильно передать параметр олеБазаОАО в OLE запрос?
1 Cthulhu
 
20.04.09
19:15
1) по значению реквизита примитивного типа;
2) по внутреннему представлению
2 ZDenis
 
20.04.09
19:15
(0) В контексте данного запроса не проще ИБ.ВыбратьДокументы(...), Пока ПолучитьДокумент()? И не совсем ясно оле база у тебя олеИБ или ИБ?
3 GreyK
 
20.04.09
19:43
Перечисление в олешной базе ищи по примитиву, то-есть по идинтификатору или порядковому номеру.
4 Cthulhu
 
20.04.09
20:02
олеБазаОАО = СтрЗаменить(олеИБ.ЗначениеВСтрокуВнутр(олеИБ.Перечисление.Учет.ОАО),"""","""""");
...
|Условие(База = ЗначениеИзСтрокиВнутр("+олеБазаОАО+"));
-- как-то так... не получится - эксперементируй...
5 kolobroder
 
20.04.09
22:40
конечно там. не ИБ, а олеИБ.
я текст не копировал, а примерно набрал.

На самом деле текст запроса значительно более сложный и просто Док.ВыбратьДокументы() - не получится. Я просто привел гипотетический пример.
6 EuVod
 
20.04.09
22:54
передать в оле-базу можно только примитивные типы данных (чтрока, число, дата) (Кстати а что со ссылочными, типа СЗ, ТЗ - видимо тоже низзя). Поэтому ежели у тебя объекты синхронизованы например по коду, то необходимо передать этот код, а в базе ОЛЕ преобразовать его уже в объект через НайтиПокоду.
7 EuVod
 
20.04.09
22:58
или как в (4) тока лучше сначала ЗначениеИзСтрокиВнутр, а имя переменной куда занесем результат уже в запрос. Но если базы слишком разные, то это может неправильно по смыслу срабатывать... то бишь нужный тебе элемент в ОЛЕ базе может иметь другое внутренне представление чем в исходной базе.
8 kolobroder
 
20.04.09
23:08
Мне надо также передавать в OLE запрос СписокЗначений с номенклатурой (ном-ру ищу по кодам в OLE базе)
9 EuVod
 
20.04.09
23:51
про спиок - не знаю, думаю что не передасться даже список простых типов - преобразую в строку с разделителями, разбирай строку на коду, выковыривай по коду объекты.
10 Cthulhu
 
21.04.09
00:01
(6): в ОЛЕ-базу можно передавать и объекты ОЛЕ-базы (полученные "на этой стороне" с использованием (через точку) контекста ОЛЕ-базы) а также предавать и использовать объекты глобального контекста ОЛЕ-базы, так что глупость говоришь...
В использовании запроса всё ухудшается из-за того, что сам текст запроса компилируется в контексте ОЛЕ-базы, поэтому в нем могут быть использованы только доступные объекты глобального контекста ОЛЕ-базы.
11 Cthulhu
 
21.04.09
00:04
(10)+: про запрос пояснение наверно нужно: использование в тексте запроса любых переменных "местного" контектста недопустимо, потому что текст запроса передается в ОЛЕ-базу as is, и уже в ОЛЕ-базе компилируется - а в том контексте переменные, имена(!) которых используются в запросе и де-факто описаны в этой базе, просто не понимаются (даже если "тут" в этих переменных содержатся объекты ОЛЕ-базы)..
12 Cthulhu
 
21.04.09
00:08
(8): "передавать в запросе список значений" -- это использовать в тексте запроса имя(!) переменной "тутошнего" контектста, содержащей СЗ?.. тогда нельзя, см.выше.. потому что ты НЕ "список значений" передвешь, а ТЕКСТ запроса, содержащий имя переменной... которая должна быть доступна (по имени!) в глобальном контексте ОЛЕ-базы..
Для того, чтобы означенным образом передавать СЗ в тексте запроса - есть "обходной маневр".. использовать в тесте запроса имя глобальной переменной ОЛЕ-базы, в которую поместить предварительно СЗ с объектами ОЛЕ-базы...
13 КонецЦикла
 
21.04.09
00:10
Все есть в факах, не надо рекомендовать :)
14 Cthulhu
 
21.04.09
00:13
(13): а ты меня забань... или не лезь с указаниями...
15 КонецЦикла
 
21.04.09
00:36
(14) Чего нервный такой, а?
Автор просто нажал в БЗню
16 kolobroder
 
21.04.09
16:51
(13) дайте ссылку на фак плиз!
17 kolobroder
 
21.04.09
16:53
(10, 11, 12) дайте же пример передачи СЗ в OLE запрос.
18 Ёпрст
 
гуру
21.04.09
16:56
(17) В запросе через олю будет работать только массив... элементами которго может быть СЗ..
А сам СЗ - обломись.
19 Cthulhu
 
21.04.09
16:57
(18): не будет.
20 Cthulhu
 
21.04.09
16:59
(17): тебе всю необходимую для решения задачи информацию предоставили..
наморщить за тебя ум и сделать твою работу?..
21 Ёпрст
 
гуру
21.04.09
17:00
(19) не будет что ?
Скунки тут давеча пытался меня переубедить, что в оле-запросе можно запихать СЗ .. но примеров так и не привёл.
А с массивом всё работает.
Причем пофиг, что СЗ будет глобальным СЗ оле-базы - один фиг не работает.
22 Cthulhu
 
21.04.09
17:05
(21): не будет работать массив в запросе - если только для хранения этого массива не используется переменная глобального контекста ОЛЕ-базы (каковая переменная и фигурирует в тексте запроса)... так таким образом и СХ работает..
запихать в запрос СЗ - можно, в виде внутреннего представления, но небольшие СЗ (а то длина текста запроса "зашкалит").
"Причем пофиг, что СЗ будет глобальным СЗ оле-базы - один фиг не работает." -- при желании и таким образом может не работать, согласен.. при желании ))))
23 Ёпрст
 
гуру
21.04.09
17:06
(22) В том то и дело, что глобальный оле-массив будет работать, а вот СЗ - нет.
24 kolobroder
 
21.04.09
17:07
(23) пример приведите плиз. с глобальным массивом
25 Cthulhu
 
21.04.09
17:07
(23): у мееня - работает СЗ.. что я делаю не так?..
26 Ёпрст
 
гуру
21.04.09
17:12
(25) не вопрос... напиши аналог вот этого, чтоб работал:
В оле базе

Перем СписокКлиентосов[1] Экспорт;

В обработине

ОЛЕ.ExecuteBatch("СписокКлиентосов[1] =СоздатьОбъект(""СписокЗначений"")");
м = ОЛЕ.EvalExpr("СписокКлиентосов[1]");
   
Спр = ОЛЕ.CreateObject("Справочник.Контрагенты");
Пока Спр.ПолучитьЭлемент() = 1 Цикл
  Если Спр.ЭтоГруппа()=0 Тогда
   м.ДобавитьЗначение(Спр.ТекущийЭлемент());
  КонецЕсли;
КонецЦикла;
Запрос = ОЛЕ.CreateObject("Запрос");
ТекстЗапроса = "
|Спр = Справочник.Номенклатура.ТекущийЭлемент;
|Условие (Спр в СписокКлиентосов[1]);
|Группировка Спр Без Групп;";
Запрос.Выполнить(ТекстЗапроса);
Пока Запрос.Группировка(1)=1 Цикл
   Сообщить(Запрос.Спр.Наименование);
КонецЦикла;
27 Ёпрст
 
гуру
21.04.09
17:14
+ 26 там в тексте запроса нужно тока
|Спр = Справочник.Контрагенты.ТекущийЭлемент;
28 kolobroder
 
21.04.09
17:23
(26) Пишет: Сервер занят. Действие не может быть завершено так как другая программа занята. Для перехода к этой программе воспользуйтесь кнопкой "Переключиться".

Жму "Переключиться" .. и опять это сообщение

Шо за напасть?
29 Ёпрст
 
гуру
21.04.09
17:25
(28) таймаут 2 минуты..
переписывай запрос или жди...
30 Ёпрст
 
гуру
21.04.09
17:26
+29 есть даже шняга, которая "сама" на кнопки нажимает..
толи на проклабе, толи на инфостарте валяется..
31 kolobroder
 
21.04.09
17:29
вроде получилось. всем спасибо.
использовал глобальный массив