|
Ошибка при передаче параметров запроса по 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/
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |