Имя: Пароль:
1C
 
1С 7.7 Запрос по Ole !
0 1СМол
 
29.01.10
11:15
Помогите кто может!!!
Нужно выполнить такой запрос в базе открываемой по Ole из другой базы
ТекстЗапроса = " Период с '" + ДН + "' по '" + ДК + "';
       |Продукция       = Регистр.Остатки.Продукция;
       |Контрагент      = Регистр.Остатки.Контрагент;
       |КоличествоРеал  = Регистр.Остатки.КоличествоРеал;
       |СуммаРеал       = Регистр.Остатки.СуммаРеал;";
   Если (ГрПрод=1) Тогда
    ТекстЗапроса=ТекстЗапроса+"
    |ГрПродукции     = Регистр.Остатки.Продукция.Родитель;";
    КонецЕсли;
   ТекстЗапроса=ТекстЗапроса+"
       |Функция КоличествоОтгрузка = Расход(КоличествоРеал);
       |Функция СуммаОтгрузка      = Расход(СуммаРеал);
       |Функция КоличествоВозврат  = Приход(КоличествоРеал);
       |Функция СуммаВозврат       = Приход(СуммаРеал);";
   Если (ГрКонт=0) Тогда
       ТекстЗапроса=ТекстЗапроса+"Группировка Контрагент без групп;";
   КонецЕсли;
   Если (ГрПрод=1) Тогда
       ТекстЗапроса=ТекстЗапроса+"
       |Группировка ГрПродукции;";
   КонецЕсли;
   ТекстЗапроса=ТекстЗапроса+"Группировка Продукция без групп;";
   ТекстЗапроса=ТекстЗапроса+"
       |Условие (Контрагент в СписокЗначенийЗапроса[1]);
       |Условие(Контрагент.Выбран()=1);
       |";                            
   
   
   Запрос = БазаОле.CreateObject("Запрос");
   Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
       Предупреждение("Запрос невыполнен!");
       Возврат;
   КонецЕсли;

Как мне в СписокЗначенийЗапроса[1] занести контрагентов кот-е выбираются в форме "местной" базы, при этом могут быть и группы контрагентов выбраны.

Сам запутался, может кто делал такое?
1 VoditelKobyly
 
29.01.10
11:32
Пробуй так (может получится):
1. Накидай в местной базе список кодов Контрагентов
2. По этому списку кодов, сделай поиск в базе по которой делаешь запрос и накидай там нужный список элементов.
3. Делай запрос по полученному списку.

Лично я бы написал прямой запрос к соседней базе без подключения по OLE.
2 VoditelKobyly
 
29.01.10
11:34
(1)+ Или вообще ставь условие не по списку контрагентов, а по списку кодов контрагентов.
3 1СМол
 
29.01.10
11:34
(1) Последнее это как?
(Я неочень хорошо знаю 1С)
4 VoditelKobyly
 
29.01.10
11:37
Типа:
КодКонтрагента      = Регистр.Остатки.Контрагент.Код;
...
Условие (КодКонтрагента      в СписокЗначенийКодовКонтрагентов);
5 VoditelKobyly
 
29.01.10
11:39
(0),(3) А другая база 1С или это что-то другое?
6 1СМол
 
29.01.10
11:40
(4) СписокЗначенийКодовКонтрагентов - Как полулучить?

Я немогу сообразить как программно это сделать...
База другая тоже 1С ("Отрезаны" 2008 и 2009 года)
7 VoditelKobyly
 
29.01.10
11:46
(0) Вот это кто писал?
"...
Как мне в СписокЗначенийЗапроса[1] занести контрагентов кот-е выбираются в форме "местной" базы, при этом могут быть и группы контрагентов выбраны.
..."

Или коды в двух базах не совпадают?
8 1СМол
 
29.01.10
11:50
(7) Коды совпадают...

Я немогу набранный список в форме местной базы передать в Оле базу, чтобы запрос делался в Оле базе только по этому списку
9 VoditelKobyly
 
29.01.10
11:59
А так пробовал:

СписокЗначенийКодовКонтрагентов =V7.CreateObject("СписокЗначений");
СписокЗначенийКодовКонтрагентов.ДобавитьЗначение();

...
10 1СМол
 
29.01.10
12:01
(9) Кажется стал понимать, спасибо
11 Ёпрст
 
29.01.10
12:02
(0) в Оле для условий можно пихать только глобальный массив. элементами которго будет твой список значений.

(9) Не будет это работать ..
12 VoditelKobyly
 
29.01.10
12:09
(0) А как запрос запускаешшь?
13 1СМол
 
29.01.10
12:13
(12) Непонял..
Как надо?
14 VoditelKobyly
 
29.01.10
12:18
Покажи как запрос по OLE запускаешь.
15 Ёпрст
 
29.01.10
12:18
(13) Еще раз - не работает условие на список значений в оле запросе..
В условие можно только глобальный массив использовать, где элементом массива будет список значений.
16 VoditelKobyly
 
29.01.10
12:20
(13) Не буду спорить с Ёпрстом, он умный, а я давно по Оле ничего не делал.
Время тратить не охота.
17 1СМол
 
29.01.10
12:21
(14) я же в (0) написал

Запрос = БазаОле.CreateObject("Запрос");
   Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
       Предупреждение("Запрос невыполнен!");
       Возврат;
   КонецЕсли;
18 1СМол
 
29.01.10
12:23
(15) да у меня это масив, а первый элемент его список который я как раз немогу передать в Оле
19 VoditelKobyly
 
29.01.10
12:27
(15),(17) А если оформить запрос в качестве глобальной функции?
А потом вызывать через EvalExpression
20 Ёпрст
 
29.01.10
12:29
(18)
В оле базе

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

В обработине

ОЛЕ.ExecuteBatch("СписокКлиентосов[1] =СоздатьОбъект(""СписокЗначений"")");
м = ОЛЕ.EvalExpr("СписокКлиентосов[1]");
   
Спр = ОЛЕ.CreateObject("Справочник.Контрагенты");
Пока Спр.ПолучитьЭлемент() = 1 Цикл
  Если Спр.ЭтоГруппа()=0 Тогда
   м.ДобавитьЗначение(Спр.ТекущийЭлемент());
  КонецЕсли;
КонецЦикла;
Запрос = ОЛЕ.CreateObject("Запрос");
ТекстЗапроса = "
|Спр = Справочник.Номенклатура.ТекущийЭлемент;
|Условие (Спр в СписокКлиентосов[1]);
|Группировка Спр Без Групп;";
Запрос.Выполнить(ТекстЗапроса);
Пока Запрос.Группировка(1)=1 Цикл
   Сообщить(Запрос.Спр.Наименование);
КонецЦикла;
21 Ёпрст
 
29.01.10
12:30
+20 это для примера..
22 1СМол
 
29.01.10
12:31
(20)(21) спасибо буду разбираться
23 Ёпрст
 
29.01.10
12:36
(19) да можно что угодно делать
:)

Один хрен придёшь рано или поздно к тому - что оле гамно и долго..
Лучше прямиком из табличек тащить.. запросиком.
24 1СМол
 
29.01.10
12:48
(23) Где почитать про "Лучше прямиком из табличек тащить.. запросиком."

Или это - выгрузить из одной базы в Табл. потом загрузить в другую...?
25 VoditelKobyly
 
29.01.10
12:51
(23) Так я к этому давно и пришел. Смотри (1)
26 Ёпрст
 
29.01.10
12:53
(24) Ну.. с прямыми запросами работал ? Можно тут почитать, для начала:
http://www.1cpp.ru/forum/YaBB.pl?board=query
27 VoditelKobyly
 
29.01.10
12:53
(24) Если время на изучение нет, то лучше делай пока так, как наметил.
28 1СМол
 
29.01.10
12:57
(26)(27) еще раз спасибо
29 1СМол
 
29.01.10
14:08
(20) Вот написал так:

В ОлеБазе в Глобальном:
  Перем СписокКонтрОле[1] Экспорт;

В вызывающей процедуре Местной базы:
     БазаОле=СоздатьОбъект("V77.Application");
   КаталогБазыОле  = "E:\БазаОЛЕ\";
   ПользовательОле = "Администратор";
   ПарольОле       = "админ";
   МонопольныйРежимOLE = " /m"; // для немонопольного запуска указать пустую строку!
   ЗапускБезЗаставки = 1;       // для появления заставки (например, чтобы наблюдать
                            // процесс запуска базы OLE визуально) поставьте здесь "0"
   РезультатПодключения = БазаОле.Initialize ( БазаОле.RMTrade , "/d" +
                      СокрЛП(КаталогБазыОле) + " /n" + СокрЛП(ПользовательОле)+
                      " /p" + СокрЛП(ПарольОле) + МонопольныйРежимOLE,
                      ?(ЗапускБезЗаставки = 1,"NO_SPLASH_SHOW",""));
   Если РезультатПодключения = 0 Тогда
       Предупреждение("Не удалось подключится к указанной базе - проверьте вводные!");
   Иначе
       Предупреждение("Все Ок!");    
   КонецЕсли;

   //
   
   БазаОле.ExecuteBatch("СписокКонтрОле[1] =СоздатьОбъект(""СписокЗначений"")");
   скОле = БазаОле.EvalExpr("СписокКонтрОле[1]");
   
   СпрК = БазаОле.CreateObject("Справочник.Контрагенты");
   Пока СпрК.ПолучитьЭлемент() = 1 Цикл
       Пока ВыбКонтрагенты.ПолучитьЭлемент() = 1 Цикл
         Если СпрК.ТекущийЭлемент() = ВыбКонтрагенты.ТекущийЭлемент() Тогда
           скОле.ДобавитьЗначение(СпрК.ТекущийЭлемент());
       КонецЕсли;
       КонецЦикла;
   КонецЦикла;


   
   //Запрос=СоздатьОбъект("Запрос");
   Запрос1=СоздатьОбъект("Запрос");
   
   Если ДатаКон>=ПолучитьДатуТА() Тогда
       ДатаКон=ПолучитьДатуТА();
   КонецЕсли;    
   ДН=ДобавитьМесяц(ДатаНач,-12);
   ДК=ДобавитьМесяц(ДатаКон,-12);
   //ТекстЗапроса="
   ТекстЗапроса = " Период с '" + ДН + "' по '" + ДК + "';
       //|Период с ДН по ДК;
       |Продукция       = Регистр.Остатки.Продукция;
       |Контрагент      = Регистр.Остатки.Контрагент;
       |КоличествоРеал  = Регистр.Остатки.КоличествоРеал;
       |СуммаРеал       = Регистр.Остатки.СуммаРеал;";
   Если (ГрПрод=1) Тогда
       ТекстЗапроса=ТекстЗапроса+"
       |ГрПродукции     = Регистр.Остатки.Продукция.Родитель;";
   КонецЕсли;
   ТекстЗапроса=ТекстЗапроса+"
       |Функция КоличествоОтгрузка = Расход(КоличествоРеал);
       |Функция СуммаОтгрузка      = Расход(СуммаРеал);
       |Функция КоличествоВозврат  = Приход(КоличествоРеал);
       |Функция СуммаВозврат       = Приход(СуммаРеал);";
   Если (ГрКонт=0) Тогда
       ТекстЗапроса=ТекстЗапроса+"Группировка Контрагент без групп;";
   КонецЕсли;
   Если (ГрПрод=1) Тогда
       ТекстЗапроса=ТекстЗапроса+"
       |Группировка ГрПродукции;";
   КонецЕсли;
   ТекстЗапроса=ТекстЗапроса+"Группировка Продукция без групп;";
   ТекстЗапроса=ТекстЗапроса+"
       //|Условие(Контрагент в ВыбКонтрагенты);  
       |Условие (Контрагент в СписокКонтрОле[1]);
       |Условие(Контрагент.Выбран()=1);
       |";                            
   
   
   Запрос = БазаОле.CreateObject("Запрос");
   Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
       Предупреждение("Запрос невыполнен!");
       Возврат;
   КонецЕсли;

Получаю ошибку : Пока СпрК.ПолучитьЭлемент() = 1 Цикл
{D:\ВОЛЕ\СРАВНИТЕЛЬНАЯ РЕАЛИЗАЦИЯОЛЕ.ERT(84)}: 1С:Предприятие: Не выбран элемент!

В чем проблема?
30 Ёпрст
 
29.01.10
14:12
(29) а вот это нафига вообще ?
   СпрК = БазаОле.CreateObject("Справочник.Контрагенты");
   Пока СпрК.ПолучитьЭлемент() = 1 Цикл
       Пока ВыбКонтрагенты.ПолучитьЭлемент() = 1 Цикл
          Если СпрК.ТекущийЭлемент() = ВыбКонтрагенты.ТекущийЭлемент() Тогда
           скОле.ДобавитьЗначение(СпрК.ТекущийЭлемент());
       КонецЕсли;
       КонецЦикла;
   КонецЦикла;

+ что за нелепое условие ?
+ ВыбКонтрагенты - Это что ?


ЗЫ: в моём примере - просто показ того, как условие сделать - тупо перебор всего справочника, запихивание его в Список и использование в тексте запроса - который выводит этот же список..

Какая цель у вас - хз.
31 Ёпрст
 
29.01.10
14:12
+30 а ошибка у вас  - нет ВыбратьЭлементы..
32 Ёпрст
 
29.01.10
14:12
+31 хотя, читай (30).
33 1СМол
 
29.01.10
14:19
(30) Моя цель - я набираю контрагентов в местной базе в ВыбКонтрагены
Мне надо сравнить по ним реализацию с оле-базой... Поэтому и запрос должен только по этим контрагентам сделать в олебазе.

Про ВыбратьЭлементы да ошибся просто голова уже нета с этим отчетом...

Но суть почему у меня нет в СпрК ничего - по вашему примеру написал.?
34 aka AMIGO
 
29.01.10
14:20
+(31) Вот это условие:

Если СпрК.ТекущийЭлемент() = ВыбКонтрагенты.ТекущийЭлемент() Тогда

не выполнится никогда, потому, что СпрК.ТекущийЭлемент()= OLE.. и это всё!
надо-бы хоть коды сравнивать, если очень нужен этот участок
35 DrZombi
 
гуру
29.01.10
14:22
(33)Ты хоть в курсе, что "Контрагент" в базе "А" !!НЕ равен!! "Контрагенту" в базе "ОЛЕ"! ;)
.... прими это как аксиому!
36 1СМол
 
29.01.10
14:22
(34) (35) КАК быть
37 1СМол
 
29.01.10
14:23
Как прировнять чтоб потом сравнить?
38 aka AMIGO
 
29.01.10
14:23
+34 можно просто посмотреть в отладчике, что там видно по оле..

lkz byas^
http://web.archive.org/web/20080115002158/www.sinor.ru/~my1c/knowhow/v7&OLE.html
39 Ёпрст
 
29.01.10
14:25
(33) да ужж..
Контрагент в Оле базе <> контрагенту в этой базе...

ЗЫ: И смотри пример внимательнее - в список подбираются контрагенты !той базы! (оле) , а не откуда вызов обработки.
40 1СМол
 
29.01.10
14:28
(39) Но как мне набрать то в список только нужных контрагентов ???
Только определенный список из оле-базы но сформированный в местной базе ???
41 aka AMIGO
 
29.01.10
14:29
(37) по оле передаются: число, дата, строка ограниченной длины.
остальное видно, как "OLE", т.е. никак

(40) в список выбери коды контрагентов, а не контрагентов
42 Ёпрст
 
29.01.10
14:47
(40) Вот ты своих клиентосов по каком принципу идентифицируешь ?
По реквизиту, по коду, по инн, еще как.. вот и из этого и исходи, ежели по коду -
ищи "там"(в оле базе ) по коду и пихай в список для условия в запросе (создавай там справочник клиентосов и ищи по коду, который в этой базе)
43 1СМол
 
29.01.10
15:00
(42) ребят а может при вызове оле-базы показывать форму для выбора клиентов и в запросе уже этот список использовать???
44 1СМол
 
29.01.10
15:02
так наверное нельзя...
45 Ёпрст
 
29.01.10
15:06
(43) можно.. Открыть модальную форму и поиметь клиентосов с неё..
Либо СпрОле.Выбрать()
46 Ёпрст
 
29.01.10
15:08
А так, ежели клиентосы синхронизированы по какому-либо признаку, показываешь на форме список этой базы, а при запросе - ищешь в той базе по этому признаку.
47 1СМол
 
29.01.10
15:16
(45)(46) Буду плавать, спасибо