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

1С 7.7 Запрос по Ole !

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

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

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

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

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

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

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

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

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

(9) Не будет это работать ..
   VoditelKobyly
 
12 - 29.01.10 - 12:09
(0) А как запрос запускаешшь?
   1СМол
 
13 - 29.01.10 - 12:13
(12) Непонял..
Как надо?
   VoditelKobyly
 
14 - 29.01.10 - 12:18
Покажи как запрос по OLE запускаешь.
   Ёпрст
 
15 - 29.01.10 - 12:18
(13) Еще раз - не работает условие на список значений в оле запросе..
В условие можно только глобальный массив использовать, где элементом массива будет список значений.
   VoditelKobyly
 
16 - 29.01.10 - 12:20
(13) Не буду спорить с Ёпрстом, он умный, а я давно по Оле ничего не делал.
Время тратить не охота.
   1СМол
 
17 - 29.01.10 - 12:21
(14) я же в (0) написал
Запрос = БазаОле.CreateObject("Запрос");
    Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
        Предупреждение("Запрос невыполнен!");
        Возврат;
    КонецЕсли;
   1СМол
 
18 - 29.01.10 - 12:23
(15) да у меня это масив, а первый элемент его список который я как раз немогу передать в Оле
   VoditelKobyly
 
19 - 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 это для примера..
   1СМол
 
22 - 29.01.10 - 12:31
(20)(21) спасибо буду разбираться
   Ёпрст
 
23 - 29.01.10 - 12:36
(19) да можно что угодно делать
:)

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

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

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

Но суть почему у меня нет в СпрК ничего - по вашему примеру написал.?
   aka AMIGO
 
34 - 29.01.10 - 14:20
+(31) Вот это условие:
Если СпрК.ТекущийЭлемент() = ВыбКонтрагенты.ТекущийЭлемент() Тогда

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

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

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


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