Имя: Пароль:
1C
1С v8
Ошибка при передаче параметров запроса по OLE
0 mTema32
 
23.10.15
17:49
Здравствуйте!
Прошу подсказок.
Делаю запрос из 8 в 77.

Код:
ОбъектЦБ.ExecuteBatch("сКлиент = CreateObject(""Справочник.Контрагенты"")");
ОбъектЦБ.ExecuteBatch("сКлиент.НайтиПоКоду(" + IDКлиента +")");        
ОбъектЦБ.ExecuteBatch("ТекКлиент = сКлиент.ТекущийЭлемент()");
    
ЗапросЗаявок = ОбъектЦБ.CreateObject("Запрос");
ТекстЗапроса =
"Док = Документ.Контакт.ТекущийДокумент;
|НомерДок = Документ.Контакт.НомерДок;
|ДатаДок = Документ.Контакт.ДатаДок;
|Клиент = Документ.Контакт.Клиент;
|Группировка Док Без Групп;
|Условие(Клиент = ТекКлиент);
|";    

Пишет: "Ошибка в выражении 'ТекКлиент'"
Условие(Клиент = ТекКлиент<???>)

В семерке я почти не писал ничего. Гугл... хз, может плохо гуглил.
Пробовал отсюда похожие примеры через список значение - тот же результат.
1 Чайник Рассела
 
23.10.15
17:59
Попробуй по коду в запросе отбирать.
2 mTema32
 
23.10.15
18:02
(1) Такая же фигня.
3 mTema32
 
23.10.15
18:03
+(0) В семерке этот год работает.
4 sonne666
 
23.10.15
18:36
(0) не получится передать объект в качестве параметра в запросе, т.к. сначала сформируется текст запроса, а потом он попадет в 77. Пишите в запросе условие на код клиента. Причем скорее всего надо так:
"...
|Условие(Клиент.Код = " + IDКлиента + ");
..."
5 mTema32
 
26.10.15
09:36
(4) Я так уже пробовал, но это все печально... слишком медленно работает.
6 НЕА123
 
26.10.15
09:54
(0)
может поможет...
вроде ExecuteBatch(<СписокОператоров>).
7 HawkEye
 
26.10.15
09:59
(0) а оставшийся код где?
8 mTema32
 
26.10.15
10:05
(7) Оставшийся код - это какой? Как запрос выполняется?
9 HawkEye
 
26.10.15
10:06
(8) ну минимум как запрос выполняешь, впрочем можешь и дальше гадать по куску строки...
10 mTema32
 
26.10.15
10:08
(9) "ЗапросЗаявок.Выполнить(ТекстЗапроса)"
Вот так выполняю.
11 HawkEye
 
26.10.15
10:28
(10) ну раз из тебя все по строчкам тащить надо... давай гадать:

|кодКлиента = Документ.Контакт.Клиент.Код;


|Условие(кодКлиента = " + IDКлиента + ");
12 mTema32
 
26.10.15
10:54
(11)

Вот этот код:

ЗапросЗаявок = ОбъектЦБ.CreateObject("Запрос");
ТекстЗапроса =
"Док = Документ.Контакт.ТекущийДокумент;
|НомерДок = Документ.Контакт.НомерДок;
|ДатаДок = Документ.Контакт.ДатаДок;
|Клиент = Документ.Контакт.Клиент;
|КодКлиента = Документ.Контакт.Клиент.Код;
|Группировка Док;
|Условие(КодКлиента = " + IDКлиента + ");
|";    
    
Если ЗапросЗаявок.Выполнить(ТекстЗапроса) = 0 Тогда
Сообщить("Косяк!");
Иначе        
Пока ЗапросЗаявок.Группировка() = 1 Цикл    
НоваяСтрока = ТЗДоков.Добавить();
НоваяСтрока.НомерКонтакта = ЗапросЗаявок.НомерДок;
НоваяСТрока.ДатаКонтакта = ЗапросЗаявок.ДатаДок;
КонецЦикла;    
КонецЕсли;

Не работает. Не возвращает нужные значения по конкретному ID.

А вот этот:
ЗапросТест = СоздатьОбъект("Запрос");
ТекстЗапроса =
"Док = Документ.Контакт.ТекущийДокумент;
|НомерДок = Документ.Контакт.НомерДок;
|ДатаДок = Документ.Контакт.ДатаДок;
|Клиент = Документ.Контакт.Клиент;
|Группировка Док;
|Условие(Клиент.Код = " + IDКлиента + ");
|";

Если ЗапросЗаявок.Выполнить(ТекстЗапроса) = 0 Тогда
Сообщить("Косяк!");
Иначе
Пока ЗапросЗаявок.Группировка() = 1 Цикл    
НоваяСтрока = ТЗДоков.Добавить();
НоваяСтрока.НомерКонтакта = ЗапросЗаявок.НомерДок;
НоваяСТрока.ДатаКонтакта = ЗапросЗаявок.ДатаДок;
КонецЦикла;    
КонецЕсли;

Работает корректно, но вот этот кусок "ЗапросЗаявок.Выполнить(ТекстЗапроса)" выполняется 57 секунд. Это неприемлимо много.
13 НЕА123
 
26.10.15
11:18
Тип, уникальность контрагенты.Код?
14 mTema32
 
26.10.15
11:33
(13) Я прошу прощения. В семерке плаваю. Чего имеется в виду в вашем вопросе?
15 НЕА123
 
26.10.15
12:28
(14)
тип коды.
уникальность в пределах группировки.
16 mTema32
 
26.10.15
12:41
(15)
Тип - Строка.
"уникальность в пределах группировки" - хз где это посмотреть, галка контроль уникальности стоит.
17 mTema32
 
26.10.15
12:42
+(16) То есть тип - Текстовый конечно
18 hhhh
 
26.10.15
12:52
длина кода какая? может там пробелы в конце добавить? или убрать?
19 HawkEye
 
26.10.15
13:45
(12) ты думаешь, если запрос по другому напишешь - будет быстрее?

может проще перебором?
20 mTema32
 
26.10.15
14:08
(18) Длина кода 22. Сейчас попробую добавить пробелов.

(19) Проще и удобнее не по коду, а по ссылке в параметре. Мгновенно отрабатывает.
Я вот только способа пока не нашел, как бы так на стороне семерки найти по коду ссылку на элемент справочника, сохранить там где-нибудь, а потом вытащить и скормить в запрос.
21 НЕА123
 
26.10.15
14:15
ОбъектЦБ.ExecuteBatch("сКлиент.НайтиПоКоду(" + IDКлиента +")");

сКлиент все нормально?
если то что надо, не достаточно ли без ТекКлиент?
|Условие(Клиент = ТекКлиент);
22 mTema32
 
26.10.15
14:25
(21) Самое интересное что с сКлиент все нормально.
А в этой конструкции "|Условие(Клиент = ТекКлиент);" возникает ошибка как в сабже.

Я даже сохранял значение сКлиент в глобальную переменную, и при попытке подставить в запрос значение этой переменной (которое тоже нужное) - возникает ошибка как в сабже.
23 HawkEye
 
26.10.15
14:29
(22) она и будет возникать... в 8-ке же по другому передаются параметры запроса...

если уж так принципиально запросом делать, напиши этот запрос в 7.7 и вызывай его там-же...
24 dk
 
26.10.15
14:30
там как-то мутно - 1с не держит значения переменных, если я ничего не путаю
либо все внутри одного executebatch должно быть
25 mTema32
 
26.10.15
14:39
(24) Ок. Как скормить executebatch кусок кода? Не одну строку, а сразу процедуру какую-нибудь?
26 mTema32
 
26.10.15
14:41
(23)"если уж так принципиально запросом делать, напиши этот запрос в 7.7 и вызывай его там-же..."

Мне все равно как. Главное чтоб быстро поиск отрабатывал.

И можно примерчик схематичный как "напиши этот запрос в 7.7 и вызывай его там-же.."??
27 Serginio1
 
26.10.15
14:42
Сделай внешний отчет и не мучайся
28 mTema32
 
26.10.15
14:44
(27) В смысле? И как с ним работать потом? Я че-т не очень понимаю в чем будет плюс.
29 Serginio1
 
26.10.15
14:47
Например
Создаешь ert
Процедура ПриОткрытии()
    Если ПустоеЗначение(Форма.Параметр)=0 Тогда
        Форма.Параметр=Форма.Параметр+" привет из V7";
        
        СтатусВозврата(0);
    КонецЕсли;
КонецПроцедуры // ПриОткрытии


В Форма.Параметр будет содержаться как входные параметры так и выходные

Например

Ссылка="123";
        База1с77.ОткрытьФормуМодально("Отчет",Ссылка,ФайлВнешнейОбработки);
        Сообщить(Ссылка);
30 dk
 
26.10.15
14:48
31 Serginio1
 
26.10.15
14:50
В База1с77 ОткрытьФормуМодально("Отчет",Ссылка,ФайлВнешнейОбработки);

Вторым параметром передавай например СписокЗначений заполненный нужными параметрами.

При открытии анализируй и возвращай данные через Форма.Параметр

Плюсы отладка на стороне 1С без COM и уже применение отлаженного алгоритма, переменных отчета итд
32 HawkEye
 
26.10.15
14:59
(26) а что ты дальше делаешь с полученными данными?
33 mTema32
 
26.10.15
15:04
(26) Их нужно сохранить/преобразовать (но в основном это числа). А потом они будут основанием для других расчетов.

Сохраняю тупо в реквизиты документа.
34 HawkEye
 
26.10.15
15:05
(26) в принципе все отписали уже...

создаешь обработку, на вход ей суешь кодклиента, внутри делаешь запрос и возвращаешь через Форма.параметр то, что тебе надо вернуть..

далее в 8-ке.. делаешь База.ОткрытьФормуМодально( ну и т.д.
только учти, что вернуть надо простые типа.. строка\число\дата
35 mTema32
 
26.10.15
15:07
(29), (34)
Спасибо. Попробую.
Ну а то что примитивные типы только гоняются - это понятно.
36 mTema32
 
26.10.15
15:08
(34) Так, стоп!
Мне потом нужно будет эти данные брать подключением к базе автоматически в фоне.
Никаких форм не будет.
37 HawkEye
 
26.10.15
15:15
(36) ну блин....
в 7-ке в глобальнике пишешь функцию

Функция Запросиз8ки(кодклента) Экспорт
тут запрос
рез = тут результат запроса
конецфункции


в 8-ке:

НужныйРезультат = База1с77.Запросиз8ки(кодклиента)

ну или через обработку загоняешься как в (29)
38 НЕА123
 
26.10.15
15:15
(36)
не надо форм.
экспортная функция в модуле.
39 mTema32
 
26.10.15
15:17
(38) Хм. А если добавить условие, что нельзя вносить изменения в семерочную конфу?
40 mTema32
 
26.10.15
15:18
(37) Отличный вариант. Но он мне не подходит в виду (39).
Так давно бы уже сделал.
41 HawkEye
 
26.10.15
15:18
(39) давай ты все свои условия сразу скажешь ))))

тогда тоже-самое, но через внешнюю обработку как в (29)...
42 НЕА123
 
26.10.15
15:19
(38)+
ну я бы попробовал сначала (6)
ОбъектЦБ.ExecuteBatch(
"сКлиент = CreateObject(""Справочник.Контрагенты"");"
"сКлиент.НайтиПоКоду(" + IDКлиента +");"
........
);      

+ EvalExp()
43 mTema32
 
26.10.15
15:20
(41) Ладно. Спасибо всем.
Условия вроде бы все теперь выложил)
Буду пробовать через вн. обработку.
44 HawkEye
 
26.10.15
15:20
(40) принципиально от (29) ничем не отличается...

в обработке только возвращаемые значения надо будет в форма.параметр записать при закрытии....
45 mTema32
 
26.10.15
15:20
(42) Пробовал. Не работает.
46 mTema32
 
26.10.15
15:21
+(45) Ну или я как-то криво ExecuteBatch вызвал, где многострочный параметр.
47 Serginio1
 
26.10.15
15:32
(36) А в чем проблема? У тебя так или иначе запускается приложение 1С 7.7 в котором можно отрыть форму со статусВозврата(0) по сути форма не открывается.
48 Serginio1
 
26.10.15
15:33
Можешь кстати и визуализировать приложение http://catalog.mista.ru/public/238584/
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.