Имя: Пароль:
1C
1C 7.7
v7: ошибка в OLE-запросе
0 SanchoPancho
 
30.10.12
11:03
ЗапросОЛЕ = RoznOle.CreateObject("Запрос");
   
       ТекстЗапроса =
   "//{{ЗАПРОС(Сформировать)
   |Период с '"+ВыбНачПериода+"' по '"+ВыбКонПериода+"';
   |Фирма = Регистр.ПартииНаличие.Фирма;
   |Док = Регистр.ПартииНаличие.ТекущийДокумент;
   |КодОперации = Регистр.ПартииНаличие.КодОперации;
   |СуммаРуб = Регистр.ПартииНаличие.СуммаРуб;
   |Функция НачОст = НачОст(СуммаРуб);
   |Функция Приход = Приход(СуммаРуб);
   |Функция Расход = Расход(СуммаРуб);
   |Функция КонОст = КонОст(СуммаРуб);
   |Группировка Фирма;
   |"//}}ЗАПРОС
   ;
   
   ТекстЗапроса = ТекстЗапроса + "Условие ((Фирма в '"+спРознФирм+"'));";
   
   ТекстЗапроса = ТекстЗапроса +
   "Условие ((КодОперации <> '"+глКО.ПередачаВРозницу+"') или ((Док.Вид()<>'"+"РеализацияРозница"+"') и (Док.Вид()<>'"+"ОтчетККМ"+"')));";
   
    Если ЗапросОЛЕ.Выполнить(ТекстЗапроса) = 0 Тогда
         Сообщить("Ошибка выполнения запроса");
         Возврат;
    КонецЕсли;

Сам запрос работает, но, условия, почему-то не выполняются - доки вида "ОтчетККМ" - попадают
Что делаю не так?
1 1Сергей
 
30.10.12
11:05
глКО = ?
2 МишКа
 
30.10.12
11:05
По твоим условиям ОтчетККМ и должен попадать в результат. А ты как думал?
3 Ёпрст
 
30.10.12
11:06
"Условие ((Фирма в '"+спРознФирм+"'));";

вот это никогда не будет работать
4 Ёпрст
 
30.10.12
11:06
(Док.Вид()<>'"+"РеализацияРозница"+"')

это вообще зачет, строку с датой сравнивать
5 Ёпрст
 
30.10.12
11:07
если че, то что между '   ' - всегда дата
6 SanchoPancho
 
30.10.12
11:09
(3) это как раз работает! уже проверил
(5) вот за это спасибо! проверю
7 cw014
 
30.10.12
11:10
(1) +1
8 cw014
 
30.10.12
11:10
(6) Если работает ЭТО - тогда это особая уличная магия
9 mvk
 
30.10.12
11:11
Отрабатывает часть условия
КодОперации <> '"+глКО.ПередачаВРозницу+"'
Оно у тебя всегда истина.
10 SanchoPancho
 
30.10.12
11:12
(1) (7) пробовал глКО  - не работает, ругается
11 МишКа
 
30.10.12
11:12
(6) Проверяй - не проверяй...
Какой код операции у документа ОтчетККМ? Передача в розницу?
12 mvk
 
30.10.12
11:13
Запрос отработает в ОЛЕ-базе.
Что для ОЛЕ-базы глКО твоей текущей базы?
И спРознФирм - это список в ОЛЕ-базе?
13 Ёпрст
 
30.10.12
11:13
(6) ну-ну.. удачи.
14 1Сергей
 
30.10.12
11:15
ТекстЗапроса = ТекстЗапроса +
   "Условие ((КодОперации <> Перечисление.КодыОпераций.ПередачаВРозницу) или ((Док.Вид()<>'"+"РеализацияРозница"+"') и (Док.Вид()<>'"+"ОтчетККМ"+"')));";

что-то типа этого
15 МишКа
 
30.10.12
11:16
(14) Хорошая попытка )))))
16 1Сергей
 
30.10.12
11:17
(15) ну, с учётом (11) не взлетит конечно, но ошибкой будет меньше :)
17 МишКа
 
30.10.12
11:21
Вопрос - почти чемпион.
- Где у меня ошибка?
- А где ее нет?
18 SanchoPancho
 
30.10.12
11:22
(11) да, передача в розницу
19 МишКа
 
30.10.12
11:24
(18) Чудны дела твои. Значит, продажа из магазина - это поступление в магазин?
20 SanchoPancho
 
30.10.12
11:25
(17) ну, так подскажи если знаешь
21 pofigos
 
30.10.12
11:26
(0) а мне что-то подсказывает, что ошибка в:

"Условие ((КодОперации <> '"+глКО.ПередачаВРозницу+"') или ((Док.Вид()<>'"+"РеализацияРозница"+"') и (Док.Вид()<>'"+"ОтчетККМ"+"')));";

"Или" меняй на "и"
22 МишКа
 
30.10.12
11:26
(20) Так я и подсказываю. Сначала надо разобраться с логикой, а потом с техникой.
23 SanchoPancho
 
30.10.12
11:27
(19) да там база вообще чудно заточена
часть Отчетов ККМ проходит как поступление, а часть как реализация
24 МишКа
 
30.10.12
11:30
(23) По логике твоего условия, те документы, которые проходят как реализация попадут в результат.
25 SanchoPancho
 
30.10.12
11:35
(24) разве условие Док.Вид()<>'"+"РеализацияРозница"+"' не должно сработать?
26 МишКа
 
30.10.12
11:37
с какого? оно после ИЛИ стоит.
27 SanchoPancho
 
30.10.12
11:59
(5) а как строку-условие выделять? двойные кавычки не работают
28 1Сергей
 
30.10.12
12:02
(27) типа того:

Док.Вид()<>"""+"РеализацияРозница"+"""

или

Док.Вид()<>""РеализацияРозница""
29 МишКа
 
30.10.12
12:03
(27) В этом случае ставятся двойные кавычки два раза.

Док.Вид()<>"""+"РеализацияРозница"+""") и

или (еще проще)

Док.Вид()<>""РеализацияРозница"") и
30 МишКа
 
30.10.12
12:03
)))))
31 SanchoPancho
 
30.10.12
12:24
(28) (29) спасибо! сейчас попробую
32 SanchoPancho
 
30.10.12
12:36
да, и заодно подскажите как правильно вставить условие

Условие (Фирма в спРознФирм)

учитывая что,
спРознФирм = RoznOle.CreateObject("СписокЗначений");
РознФирм = RoznOle.CreateObject("Справочник.Фирмы");
РознФирм.ВыбратьЭлементы();
Пока РознФирм.ПолучитьЭлемент() = 1 Цикл        спРознФирм.ДобавитьЗначение(РознФирм.ТекущийЭлемент());
КонецЦикла;
33 Ёпрст
 
30.10.12
12:38
(32) это никогда не заработает
34 Ёпрст
 
30.10.12
12:39
И.. как же (6)
>>>>(3) это как раз работает! уже проверил

^))))
35 SanchoPancho
 
30.10.12
12:47
(33) слушай, дорогой, возможно ты, прекрасно все знаешь лучше всех - но, в отличие от других собеседников в этой ветке - ты еще не сказал ничего даже на йоту полезного или познавательного
не трать свое время зря
36 Ёпрст
 
30.10.12
12:48
Я в курсе - дураков учить, только портить.
37 Ёпрст
 
30.10.12
12:48
На счет твоих ошибок сказано было еще в (3,4).
38 SanchoPancho
 
30.10.12
12:57
(37) а что ты толкового сказал в (3,4), кроме констатации, что не будет работать?
39 Ёпрст
 
30.10.12
12:59
еще (5).
40 Ёпрст
 
30.10.12
12:59
на счет списка, в оле запросе работает только массив.
41 Ёпрст
 
30.10.12
13:02
Изучай:

В оле базе

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

В обработине

ОЛЕ.ExecuteBatch("СписокКлиентосов[1] =СоздатьОбъект(""СписокЗначений"")");
м = ОЛЕ.EvalExpr("СписокКлиентосов[1]");
   
Спр = ОЛЕ.CreateObject("Справочник.Контрагенты");
Пока Спр.ПолучитьЭлемент() = 1 Цикл
  Если Спр.ЭтоГруппа()=0 Тогда
   м.ДобавитьЗначение(Спр.ТекущийЭлемент());
  КонецЕсли;
КонецЦикла;
Запрос = ОЛЕ.CreateObject("Запрос");
ТекстЗапроса = "
|Спр = Справочник.Номенклатура.ТекущийЭлемент;
|Условие (Спр в СписокКлиентосов[1]);
|Группировка Спр Без Групп;";
Запрос.Выполнить(ТекстЗапроса);
Пока Запрос.Группировка(1)=1 Цикл
   Сообщить(Запрос.Спр.Наименование);
КонецЦикла;
42 SanchoPancho
 
30.10.12
13:21
(41) вот за это большое спасибо!
а то, что я пока мало знаю - так это я и сам в курсе )))
43 SanchoPancho
 
30.10.12
14:03
(41) а массив где объявлять? в начале модуле объявил - ругается, что СписокКлиентосов[1] не объявлена как массив
объявил в процедуре - тоже самое

в Главном модуле?
44 Junior1s
 
30.10.12
14:18
угу
45 Ёпрст
 
30.10.12
14:25
(43) в глобальнике.
46 SanchoPancho
 
30.10.12
17:59
(45) уже сделал, спасибо
и еще вопрос - рылся везде честно - нигде не нашел
как два условия объединить в Оле-запросе по "И" или "ИЛИ"?
47 Ёпрст
 
31.10.12
09:35
(46) дык так и пиши:
|Условие((вася=Федя)Или(Маша=Таня));
48 SanchoPancho
 
31.10.12
10:05
не работает
Условие (КодОперации <>"ПередачаВРозницу") <<?>> ИЛИ(Док.Вид()<>"РеализацияРозница")
Запрос[14] : Ожидается ';' перед 'ИЛИ'
49 1Сергей
 
31.10.12
10:06
(48) оберни всё ещё в одни скобки
50 1Сергей
 
31.10.12
10:07
(49) И КодОперации - это не строка ведь?
51 SanchoPancho
 
31.10.12
10:09
вот сам текст

ТекстЗапроса = ТекстЗапроса +
   "Условие (КодОперации <>"""+"ПередачаВРозницу"+""")ИЛИ(Док.Вид()<>"""+"РеализацияРозница"+""") ИЛИ (Док.Вид()<>"""+"ОтчетККМ"+""");";
52 1Сергей
 
31.10.12
10:10
(51) см (14)
53 1Сергей
 
31.10.12
10:10
(52)+ только от одинарных кавычек избавься
54 SanchoPancho
 
31.10.12
10:13
(53) спасибо! по (14) сработало
буду проверять
55 Ёпрст
 
31.10.12
10:45
(51) КодОперации - це же не строка!
56 Ёпрст
 
31.10.12
10:47
Условие ((КодОперации <> Перечисление.КодыОпераций.ПередачаВРозницу) и ((Док.Вид()<>""РеализацияРозница"") и (Док.Вид()<>""ОтчетККМ"")));

И всё же там и нужно везде, не ?
57 SanchoPancho
 
31.10.12
12:55
(56) сделал
ПередачаВРозн = RoznOle.Перечисление.КодыОпераций.ПередачаВРозницу;
ТекстЗапроса = ТекстЗапроса +    
   "Условие (КодОперации <> ПередачаВРозн);";

ругается: Ошибка в выражении 'ПередачаВРозн'
58 Ёпрст
 
31.10.12
12:58
(57) а нафига этот изврат ?
как в (56) не работатет ужо ?
59 Ёпрст
 
31.10.12
12:59
ПередачаВРозн  - это должен быть объект оле базы в оле базе..
60 Ёпрст
 
31.10.12
13:00
если уж хочется изврата - обходи через массив, в который пихай оле перечисление, только вот нафига - не ясно.
61 Ёпрст
 
31.10.12
13:01
а так, оле в топку, прямой запрос к сторонней базе и привет, и быстро и нет таймаута оленого при "доооолгом запросе"
62 SanchoPancho
 
31.10.12
13:03
(58) как в (56) не работает ругается на
Перечисление.КодыОпераций.ПередачаВРозницу
63 SanchoPancho
 
31.10.12
13:07
и потом, для прямых запросов надо какое-то дополнение громоздить?
64 Ёпрст
 
31.10.12
13:09
(62) а это перечисление вообще есть в базе оле то ?

с таким видом и значением ?
(63) нет
65 SanchoPancho
 
31.10.12
13:30
(64) есть, и в самой этой базе запрос по этому перечислению фильтруется
а на вариант (56) пишет:
Условие (КодОперации <> Перечисление.КодыОпераций.ПередачаВРозницу <<?>> );
Запрос[14] : Ошибка в выражении 'Перечисление'

насчет прямых запросов, вроде, надо 1С++ использовать - я про это
66 Ёпрст
 
31.10.12
13:45
(63)
проверь синтаксис, перечисления отлично работают в оле запросе.
можешь использовать ado
67 Ёпрст
 
31.10.12
13:47
в крайнем случае, через глобальный массив передай, хотя, это лишнее
68 1Сергей
 
31.10.12
13:47
чудиса какие-то :)
69 SanchoPancho
 
31.10.12
14:18
во, такая конструкция сработала!
ПередачаВРозн = RoznOle.evalexpr("Перечисление.КодыОпераций.ПередачаВРозницу.ПорядковыйНомер()");
ТекстЗапроса = ТекстЗапроса +    
   "Условие (КодОперации.ПорядковыйНомер() <> "+ПередачаВРозн+");";
AdBlock убивает бесплатный контент. 1Сергей