Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Ошибка при передаче параметров запроса по OLE

Ошибка при передаче параметров запроса по OLE
Я
   mTema32
 
23.10.15 - 17:49
Здравствуйте!
Прошу подсказок.
Делаю запрос из 8 в 77.

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

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

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

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


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

Вот этот код:

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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


в 8-ке:

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

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

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

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

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


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