Вход | Регистрация
 

Задание условия в запросе через OLE

Задание условия в запросе через OLE
Я
   DMM
 
13.07.09 - 10:23
Пишу обработку, которая из 8-ки подключается к 7-ке по OLE.

В 7-ке в Глобальном модуле добавил:

Перем глOLEПерем1 Экспорт;

В моей обработке пишу:

База77.ExecuteBatch("глOLEПерем1 = СоздатьОбъект(""СписокЗначений"")");
СписокДоговоров77 = База77.EvalExpr("глOLEПерем1");

Потом в цикле заполняю этот список:

СписокДоговоров77.ДобавитьЗначение(Договор77);

Список заполняется нормально, проверял.

А вот дальше проблема:

Запрос77 = База77.CreateObject("Запрос");
   
ТекстЗапроса77 =
"//{{ЗАПРОС(Сформировать)
|Период с '01.01.1980' по '31.12.2099';
|Без итогов;
|Накладная = Документ.Накладная.ТекущийДокумент;
|Договор = Документ.Накладная.Договор;
|Группировка Накладная;
|Условие(Договор в глOLEПерем1);
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос77.Выполнить(ТекстЗапроса77) = 0 Тогда
   Возврат;
КонецЕсли;

Пока Запрос77.Группировка() = 1 Цикл
   Накладная77 = Запрос77.Накладная;        
КонецЦикла;


Ошибка при вызове метода контекста (Выполнить): Произошла исключительная ситуация (1С:Предприятие): Условие(Договор в глOLEПерем1 <<?>> );
Запрос[7] : Ошибка в выражении 'глOLEПерем1'
по причине:
Произошла исключительная ситуация (1С:Предприятие): Условие(Договор в глOLEПерем1 <<?>> );
Запрос[7] : Ошибка в выражении 'глOLEПерем1'

Кто знает, почему?
   Ёпрст
 
1 - 13.07.09 - 10:26
(0) я знаю.. не работает СЗ/ТЗ в условиях в оле-запросе... точка.
   Ёпрст
 
2 - 13.07.09 - 10:27
+1 но это легко обойти.
   DMM
 
3 - 13.07.09 - 10:27
а как?
   Aleksey_3
 
4 - 13.07.09 - 10:32
(3) Вторая ссылка в яндексе. Работа с запросами и EvalExpr(). (с) http://unitkey.narod.ru/DATA/progamming/1c/ole.htm
   Ёпрст
 
5 - 13.07.09 - 10:35
(3) делаешь в оле базе в глобальнике переменную:

Перем глУсловиеОле[1] Экспорт//можешь и большей размерности 


Далее в обработке:

   ОЛЕ.ExecuteBatch("глУсловиеОле[1] =СоздатьОбъект(""СписокЗначений"")");
   м = ОЛЕ.EvalExpr("глУсловиеОле[1]");
   Спр = ОЛЕ.CreateObject("Справочник.Номенклатура");
   Спр.ВыбратьЭлементы();
   Пока Спр.ПолучитьЭлемент() = 1 Цикл
    Если Спр.ЭтоГруппа()=0 Тогда
         м.ДобавитьЗначение(Спр.ТекущийЭлемент());
        КонецЕсли;
   КонецЦикла;
   Запрос = ОЛЕ.CreateObject("Запрос");
   ТекстЗапроса = "
   |Спр = Справочник.Номенклатура.ТекущийЭлемент;
   |Условие (Спр в глУсловиеОле[1]);
   |Группировка Спр Без Групп;";
   Запрос.Выполнить(ТекстЗапроса);
   Пока Запрос.Группировка(1)=1 Цикл
    Сообщить(Запрос.Спр.Наименование);
   КонецЦикла;
   Ёпрст
 
6 - 13.07.09 - 10:37
(4) и.. там ничего НЕТ ..
   DMM
 
7 - 13.07.09 - 10:38
(5) т.е. получается нужно именно через массив делать, я правильно понял?

а то у меня вроде то же самое, но простая переменная 
Перем глOLEПерем1 Экспорт;
   Rie
 
8 - 13.07.09 - 10:39
(5) И в чём глубинная разница между (1) и (5), кроме названий переменных?
   Rie
 
9 - 13.07.09 - 10:39
+(8) То есть, между (0) и (5)?
   Aleksey_3
 
10 - 13.07.09 - 10:39
(6) Смотрю функцию СкорректироватьСписок() и как они юзают ее результат
   Ёпрст
 
11 - 13.07.09 - 10:40
(7) да.. элементом которого будет список значений.
   Ёпрст
 
12 - 13.07.09 - 10:41
(8,9) тем что (5) работает, а (0) никогда не работало и работать не будет.
   DMM
 
13 - 13.07.09 - 10:41
(11) сейчас попробую
   Ёпрст
 
14 - 13.07.09 - 10:41
(10) Хреново смотришь, там - массив!
   Serginio1
 
15 - 13.07.09 - 10:42
Судя по http://www.mista.ru/articles1c/ole.htm
Возможно глOLEПерем1 не помечена как Экспорт
Ну и проще установить значение как.
СписокДоговоров77 = База77.глOLEПерем1;
   Serginio1
 
16 - 13.07.09 - 10:45
Возможно из запроса не видит глобальную переменную.
Можно еще создать функцию которая будет выполнять запрос.
   Ёпрст
 
17 - 13.07.09 - 10:51
(15,16) Это не поможет.. хоть сам список создай в оле базе - в запросе работает только массив.
   DMM
 
18 - 13.07.09 - 11:00
Ёпрст3, спасибо большое, сработало!
   Serginio1
 
19 - 13.07.09 - 11:09
(17) Это я вспомнил. А создание функции которая выполняет запрос с глобальной переменнй тоже не прокатывет?
   Ёпрст
 
20 - 13.07.09 - 11:30
(19) да.
   Serginio1
 
21 - 13.07.09 - 12:16
(20) Неправда твоя
Не поленился.
 На сервере делаем

Функция ВыполнитьТекстЗапроса(Стр) Экспорт
    Запрос=СоздатьОбъект("Запрос");
    Если Запрос.Выполнить(стр)=0 Тогда
        Возврат ""
    Иначе
        Возврат Запрос;
    КонецЕсли;
КонецФункции

На клиенте

    ТекстЗапроса = 
    "//{{ЗАПРОС(Сформировать)
 
    |ТекущийЭлемент = Справочник.Контрагенты.ТекущийЭлемент;
    |Код = Справочник.Контрагенты.Код;
    |Группировка ТекущийЭлемент;
    |Условие(Код в глРасшифровка);
    |//}}ЗАПРОС
 
    ;

.....................................................    
    База77.ExecuteBatch("глРасшифровка = СоздатьОбъект(""СписокЗначений"")");
СписокДоговоров77 = База77.глРасшифровка;
СписокДоговоров77.ДобавитьЗначение("00000001");
СписокДоговоров77.ДобавитьЗначение("00000002");

Запрос=База77.ВыполнитьТекстЗапроса(ТекстЗапроса);
Пока Запрос.Группировка(1)=1 Цикл
    Сообщить(Запрос.ТекущийЭлемент.Наименование);
    
КонецЦикла;

СписокДоговоров77="";
База77.глРасшифровка="";
 
Отрабатывает
   Ёпрст
 
22 - 13.07.09 - 12:18
(21) Ё .. еще бы выполнил запрос в самой оле базе и еще чего то хочет..
   Ёпрст
 
23 - 13.07.09 - 12:19
+22 Я про внешнюю функцию к запросу говорил.
   Serginio1
 
24 - 13.07.09 - 12:24
Мы не поняли друг друга.
Ну по идее запрос тоже на стороне сервера. Ньюансы 1С77.
По мне проще сделать такую функцию, чем возиться с массивами.
На любителя. А ще проще Работа с регистрами через ОЛЕ
20 создать функцию вызывающую внешний отчет
   Ёпрст
 
25 - 13.07.09 - 12:33
(24) ну да...недопоняли :)
ЗЫ: мне проще написать прямой запрос к сторонней базе.. чем мегатормоз оле использовать..
   Serginio1
 
26 - 13.07.09 - 12:33
Тоесть зосдать глобальную функцию, которая будет вызывать внешний отчет с параметрами, и возвращать результат в этом же списке.
Функция ВызватьВнешнийОтчет(Отчет,СприсокПараметров)Экспорт
ОткрытьФорму("Отчет#",СприсокПараметров,Отчет");
 
возврат СприсокПараметров
КонецФункции
   Serginio1
 
27 - 13.07.09 - 12:35
(25) Согласен сам также и поступаю, но иногда логика бывает очень сложной, поэтому вариант (26) тоже пригоден. Все от задачи
   Ёпрст
 
28 - 13.07.09 - 12:45
(26) да можно и обработку запускать...
а можно и в этой обработке кнопки понажимать или визуально управлять, если оле-сеанс показать для просмотра сторонней приблудой..
   Serginio1
 
29 - 13.07.09 - 12:56
(28) Полностью согласен


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.