Имя: Пароль:
1C
 
Задание условия в запросе через OLE
0 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 но это легко обойти.
3 DMM
 
13.07.09
10:27
а как?
4 Aleksey_3
 
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) и.. там ничего НЕТ ..
7 DMM
 
13.07.09
10:38
(5) т.е. получается нужно именно через массив делать, я правильно понял?

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

Функция ВызватьВнешнийОтчет(Отчет,СприсокПараметров)Экспорт
ОткрытьФорму("Отчет#",СприсокПараметров,Отчет");

возврат СприсокПараметров
КонецФункции
27 Serginio1
 
13.07.09
12:35
(25) Согласен сам также и поступаю, но иногда логика бывает очень сложной, поэтому вариант (26) тоже пригоден. Все от задачи
28 Ёпрст
 
гуру
13.07.09
12:45
(26) да можно и обработку запускать...
а можно и в этой обработке кнопки понажимать или визуально управлять, если оле-сеанс показать для просмотра сторонней приблудой..
29 Serginio1
 
13.07.09
12:56
(28) Полностью согласен
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.