Имя: Пароль:
1C
1C 7.7
v7: OLE, передаем параметры в запрос (да, опять)
0 ptrtss
 
19.06.12
12:30
Локальная задачка такая. Есть обработка, сравнивающая остатки и движения по резервам в двух базах. Данные одинаковые, разные только алгоритмы проведения. Это я так проверяю работу новых алгоритмов

В обработке есть таблица сравнения остатков. При даблклике на строчке хочу увидеть движения до этого момента в текущей базе и в OLE-шной

Соответственно, при даблклике я запускаю один и тот же запрос в обеих базах.

///////////////////////////////////////////////////////////////////////////
// ГЛОБАЛЬНЫЙ МОДУЛЬ
///////////////////////////////////////////////////////////////////////////

Перем глПараметрыЗапроса Экспорт;

//...

Процедура глУстановитьПараметрЗапроса(Имя, СтрокаВнутр) Экспорт
   глПараметрыЗапроса.Установить(Имя, ЗначениеИзСтрокиВнутр(СтрокаВнутр));
КонецПроцедуры

//...

глПараметрыЗапроса = СоздатьОбъект("СписокЗначений");

///////////////////////////////////////////////////////////////////////////
// ОБРАБОТКА
///////////////////////////////////////////////////////////////////////////

Процедура ПриВыбореСтрокиТаблицы()
   
   База = СоздатьОбъект("V77.Application");
   
   //Коннект и все такое...
   
   ТекстЗапроса =
   "//{{ЗАПРОС(Движения)
   |Период с НачДата по КонДата;
   |Без итогов;
   |Док = Регистр.РезервыТМЦ.ТекущийДокумент;
   |Номенклатура = Регистр.РезервыТМЦ.Номенклатура;
   |Склад = Регистр.РезервыТМЦ.Склад;
   |ЗаявкаПокупателя = Регистр.РезервыТМЦ.ЗаявкаПокупателя;
   |ДоговорПокупателя = Регистр.РезервыТМЦ.ДоговорПокупателя;
   |Количество = Регистр.РезервыТМЦ.Количество;
   |Функция КоличествоПриход = Приход(Количество);
   |Функция КоличествоРасход = Расход(Количество);
   |Группировка Док упорядочить по Док.ДатаДок, Док.ВремяДок;
   |"//}}ЗАПРОС
   ;
   
   ТекстЗапроса = ТекстЗапроса + "
   |Условие(Номенклатура = глПараметрыЗапроса.Получить('Номенклатура'));
   |Условие(Склад = глПараметрыЗапроса.Получить('Склад'));
   |Условие(ЗаявкаПокупателя = глПараметрыЗапроса.Получить('ЗаявкаПокупателя'));
   |Условие(ДоговорПокупателя = глПараметрыЗапроса.Получить('ДоговорПокупателя'));
   |";
   
   НачДата = '01.01.11';
   КонДата = ВыбДата;
   
   ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "НачДата", "'"+СокрЛП(Формат(НачДата, "ДДДММГГГГ"))+"'");
   ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "КонДата", "'"+СокрЛП(Формат(КонДата, "ДДДММГГГГ"))+"'");
   
   ///////////////////////////////////////////////////////////////////////////
   // ВОТ ЭТО - ОТРАБАТЫВАЕТ ХОРОШО
   ///////////////////////////////////////////////////////////////////////////
   
   Запрос = СоздатьОбъект("Запрос");
   глУстановитьПараметрЗапроса("Номенклатура", ЗначениеВСтрокуВнутр(ТаблСравнения.Номенклатура));
   глУстановитьПараметрЗапроса("Склад", ЗначениеВСтрокуВнутр(ТаблСравнения.Склад));
   глУстановитьПараметрЗапроса("ЗаявкаПокупателя", ЗначениеВСтрокуВнутр(ТаблСравнения.ЗаявкаПокупателя));
   глУстановитьПараметрЗапроса("ДоговорПокупателя", ЗначениеВСтрокуВнутр(ТаблСравнения.ДоговорПокупателя));
   Запрос.Выполнить(ТекстЗапроса);
   
   ///////////////////////////////////////////////////////////////////////////
   // А ВОТ ЭТО - НЕТ, пишет что
   //        
   //        Запрос.Выполнить(ТекстЗапроса);
   //        {F:\...\СРАВНЕНИЕ РЕЗЕРВОВ.ERT(145)}: 1С:Предприятие: Условие(Номенклатура = глПараметрыЗапроса.Получить('Номенклатура') <<?>> );
   //        Запрос[14] : Ошибка в выражении 'глПараметрыЗапроса'    Запрос = База.CreateObject("Запрос");
   ///////////////////////////////////////////////////////////////////////////
   
   База.глУстановитьПараметрЗапроса("Номенклатура", ЗначениеВСтрокуВнутр(ТаблСравнения.Номенклатура));
   База.глУстановитьПараметрЗапроса("Склад", ЗначениеВСтрокуВнутр(ТаблСравнения.Склад));
   База.глУстановитьПараметрЗапроса("ЗаявкаПокупателя", ЗначениеВСтрокуВнутр(ТаблСравнения.ЗаявкаПокупателя));
   База.глУстановитьПараметрЗапроса("ДоговорПокупателя", ЗначениеВСтрокуВнутр(ТаблСравнения.ДоговорПокупателя));
   Запрос.Выполнить(ТекстЗапроса);
КонецПроцедуры

Это почему так?
1 1Сергей
 
19.06.12
12:31
в базу ОЛЕ надо подсовывать объекты из баз ОЛЕ
2 1Сергей
 
19.06.12
12:32
И собственно объект Запрос у тебя из текущей базы
3 ptrtss
 
19.06.12
12:33
(1) я знаю
(2) нет
4 1Сергей
 
19.06.12
12:34
(3) чего нет? у тебя так написано
5 ptrtss
 
19.06.12
12:34
А ну да, сорри. В исконном коде он База.CreateObject
6 1Сергей
 
19.06.12
12:34
(5) у тебя база ОЛЕ - точная копия текущей?
7 ptrtss
 
19.06.12
12:35
Точнейшая. Только конфигурация немного старее
8 ptrtss
 
19.06.12
12:35
Обвязка для передачи параметров и в той и в той ))
9 Ёпрст
 
19.06.12
12:35
>>>|Условие(Номенклатура = глПараметрыЗапроса.Получить('Номенклатура'));


Вот это никогда не будет работать в оле
10 ptrtss
 
19.06.12
12:36
(9) Ну дык оно и не работает. А что там за правило, что только глобальные переменные можно, без точек и вызовов?
11 Ёпрст
 
19.06.12
12:37
(10) в условиях можно использовать только явные строковые переменные или глобальный массив, элементами которого может быть всё что угодно: элементы, списки значений и т.д..
12 dk
 
19.06.12
12:38
а что за синтаксис с одинарными кавычками?
глПараметрыЗапроса.Получить('Номенклатура')
13 akaBrr
 
19.06.12
12:38
что мешает ЗначениеВСтрокуВнутр(ТаблСравнения.Склад) прямо писать в текст запроса?
14 ptrtss
 
19.06.12
12:39
(12) Это у меня с двойными сразу чего-то не получилось, взял одинарные. Но в текущей то базе оно тем не менее отрабатывает
15 ptrtss
 
19.06.12
12:39
(13) Это OLE
16 1Сергей
 
19.06.12
12:40
(13) с кавычками придётся повозиться, а так взлетит
17 1Сергей
 
19.06.12
12:40
(15) используй массив
18 akaBrr
 
19.06.12
12:41
(15) спасибо за напоминание, ветка короткая, я помню, а по существу вопроса?
19 ptrtss
 
19.06.12
12:41
(13) Э... стоп, может имелось ввиду ДобавитьКавычек(ЗначениеИзСтрокиВнутр(ЗначениеВСтрокуВнутр(..)))
?
20 ptrtss
 
19.06.12
12:42
(13) То есть ЗначениеИзСтрокиВнутр(ДобавитьКавычек(ЗначениеВСтрокуВнутр(..)))
?
21 ptrtss
 
19.06.12
12:43
(17) пойду попробую массив...
22 akaBrr
 
19.06.12
12:43
глПараметрыЗапроса.Получить('Номенклатура') = ЗначениеВСтрокуВнутр(ТаблСравнения.Номенклатура)?
23 Ёпрст
 
19.06.12
12:44
На вот тебе пример, для понимания :

В оле базе

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

В обработине

ОЛЕ.ExecuteBatch("СписокКлиентосов[1] =СоздатьОбъект(""СписокЗначений"")");
м = ОЛЕ.EvalExpr("СписокКлиентосов[1]");
   
Спр = ОЛЕ.CreateObject("Справочник.Контрагенты");
Пока Спр.ПолучитьЭлемент() = 1 Цикл
  Если Спр.ЭтоГруппа()=0 Тогда
   м.ДобавитьЗначение(Спр.ТекущийЭлемент());
  КонецЕсли;
КонецЦикла;
Запрос = ОЛЕ.CreateObject("Запрос");
ТекстЗапроса = "
|Спр = Справочник.Номенклатура.ТекущийЭлемент;
|Условие (Спр в СписокКлиентосов[1]);
|Группировка Спр Без Групп;";
Запрос.Выполнить(ТекстЗапроса);
Пока Запрос.Группировка(1)=1 Цикл
   Сообщить(Запрос.Спр.Наименование);
КонецЦикла;
24 Ёпрст
 
19.06.12
12:44
(22) да не будет никогда список значений работать в оле-запросе.

Вот если он элемент массива - тогда запросто, а сам по себе никогда не работал.
25 ptrtss
 
19.06.12
12:46
(22)
глПараметрыЗапроса.Получить('Номенклатура') = глПараметрыЗапроса.Получить('Номенклатура')
?

Вроде да, но глПараметрыЗапроса.Получить('Номенклатура') использовать нельзя. Намек понятен?
26 akaBrr
 
19.06.12
12:47
(24) текст запроса можно сформировать сразу и без параметров, ЗначениеВСтрокуВнутр - строка, ничего не мешает ее включить в текст
(25) мне давно :), я и предлагаю заменить его на стороне отчета, динамически сформированным текстом запроса, намек понятен?
27 Ёпрст
 
19.06.12
12:48
(26) это всё хорошо, когда условие на одиночный параметр.. а вот если на вхождение в список ?
:))

тут только как в (23).
28 akaBrr
 
19.06.12
12:48
+(26) без всяких глоб. переменных в оле базе
29 akaBrr
 
19.06.12
12:49
(27) у него вроде только сравнение
30 Simod
 
19.06.12
13:02
Все уже давно написано: http://mista.ru/articles1c/hare/article.15.html
31 ptrtss
 
19.06.12
13:02
Массив конечно же помог большое спасибо, коллеги. akaBrr, сорри нет времени пробовать работают ли ЗначениеВСтрокуВнутр и ЗначениеИзСтрокиВнутр в запросах через OLE, в другой раз :)
32 Ёпрст
 
19.06.12
13:04
(30) написано, да не всё.
33 Ёпрст
 
19.06.12
13:05
(31) работают, вот только с кавычками и скобочками - тот еще подарок при передаче.
34 Simod
 
19.06.12
13:07
(32) Более чем достаточно для решения данной проблемы.
35 Ёпрст
 
19.06.12
13:08
(34) в статье нет фильтрации по списку значений.
36 Ёпрст
 
19.06.12
13:09
чего автор безусловно захочет сделать

+ фильтрация по коду элемента справочника - моветон
37 Simod
 
19.06.12
13:12
(35) Да ну?! Ищем по "СкорректироватьСписок".
38 ptrtss
 
19.06.12
13:14
Да статейку то я видел, но хотелось чтобы в запросе были имена параметров, думал может как-то можно извратиться
39 Ёпрст
 
19.06.12
13:15
(37) да ну да
40 Прохожий
 
19.06.12
13:20
(6,7) Вас надо на пятницу приберечь...
41 1Сергей
 
19.06.12
13:26
(40) а что такого? если у него базы не родственные, то вся эта писанина не взлетит
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн