Имя: Пароль:
1C
1С v8
Ошибка в запросе при работе по COM
, ,
0 Aldnepr
 
01.12.16
09:52
Подключаюсь по COM из 7,7 в 8,3 (УТП). Необходимо оттуда вытянуть остатки из регистра ОстаткиТоваров и записать их в Таблицу Значений

перем Соединение;// общ. переменная
База8=СоздатьОбъект("V83.ComConnector");  
Соединение= База8.Connect("File="""+СокрЛП(ПутьКбазе1)+""";Usr="""+СокрЛП(ИмяП)+""";Pwd = """ + СокрЛП(Пароль) + """;"); //из процедуры подключения
//...........................
Процедура ПолучитьОстатки ()
    Запрос = Соединение.NewObject("Запрос");  
    
    ТЗБух= Соединение.NewObject("ТаблицаЗначений");
    ТЗБух.Колонки.Добавить("Товар");//("Товар", Новый ОписаниеТипов("Строка"));
    ТЗБух.Колонки.Добавить("ОстатокТовара");//("ОстатокТовара", Новый ОписаниеТипов("Число"));

    
    //ТЗБух.НоваяКолонка("Товар","Строка");
    //ТЗБух.НоваяКолонка("ОстатокТовара","Число");

Запрос.Текст =
"ВЫБРАТЬ
| ТовОстатки.Номенклатура,
| ТовОстатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&ТекДата, ) КАК ТовОстатки
|СГРУППИРОВАТЬ ПО
|    ТовОстатки.Номенклатура,
|    ТовОстатки.КоличествоОстаток";

Запрос.УстановитьПараметр("ТекДата", ТекущаяДата());
Результат=Запрос.Выполнить().Выбрать();

Пока Результат.Следующий()=1 Цикл
    Стр=ТЗБух.Добавить();
    Стр.Товар= Результат.Номенклатура;
    Стр.ОстатокТовара= Результат.КоличествоОстаток;
Сообщить(Стр.Товар+"  "+Стр.ОстатокТовара);
КонецЦикла;
  
  
КонецПроцедуры

Отладчик в 7,7 сообщает такое:
Запрос   = OLE
Соединение = OLE
Результат = OLE
Результат.Следующий() = -1 // что здесь не так??
ТЗБух  = OLE
1 piter3
 
01.12.16
09:54
Стр.Товар= Строка(Результат.Номенклатура) или в запросе сразу
2 Господин ПЖ
 
01.12.16
09:54
Запрос.УстановитьПараметр("ТекДата", ТекущаяДата());

не проглотит так дату
3 Aldnepr
 
01.12.16
09:57
(2) Это из-за работы по СОМ? Пробовал запускать эту процедуру из 8 (измененную есс-но под синтаксис) то работает
4 Aldnepr
 
01.12.16
09:59
(1) Результат.Следующий() = -1  
может с этим что-то не так сперва? должен же быть 1
5 Мимохожий Однако
 
01.12.16
10:05
А может наоборот из 8 в 77 подключаться?
6 h-sp
 
01.12.16
10:06
(4) это лишнее

|СГРУППИРОВАТЬ ПО
|    ТовОстатки.Номенклатура,
|    ТовОстатки.КоличествоОстаток

выкинь, там и так сгруппировано.
7 Aldnepr
 
01.12.16
10:09
(5) Вероятно лучше, но я в 8 слабоват,а там много переписывать тогда. Там обработка, которая записывает данные из рег.остатки 2-х баз и сравнивает их
8 Господин ПЖ
 
01.12.16
10:09
(3) сделай сообщить("" + значение параметра "ТекДата" из Запрос
9 Aldnepr
 
01.12.16
10:10
(6) выкину, но мне бы по "процедурному вопросу"...)
10 h-sp
 
01.12.16
10:11
(9) так вопрос не озвучен пока
11 Господин ПЖ
 
01.12.16
10:12
так сделай, чего будет:

Запрос.УстановитьПараметр("ТекДата", "20161202");
12 Aldnepr
 
01.12.16
10:17
(11) 1C:Enterprise 8.3.9.1818: {(5, 2)}: Ошибка обработки представления "РегистрНакопления.ТоварыНаСкладах.Остатки:Несоответствие типов (Параметр номер ""1"")"
<<?>>Ре
13 Aldnepr
 
01.12.16
10:19
(11) Возможно надо прописывать ГГГГММДДЧЧММСС ?
14 Господин ПЖ
 
01.12.16
10:20
тогда так

Запрос.УстановитьПараметр("ТекДата", Соединение.Дата("20161202"));
15 Aldnepr
 
01.12.16
10:23
(14) Поле агрегатного объекта не обнаружено (Дата)
16 DrZombi
 
гуру
01.12.16
10:33
(14) А может тупо в тексте запроса прописать:

ДатаВремя(2016,12,02)
17 Господин ПЖ
 
01.12.16
10:35
да как угодно... хотя странно все это. границы com/ole для примитивных типов прозрачны
18 MUXACb
 
01.12.16
10:37
(0) Вместо следующий() попробуйте next(). иногда помогает
19 Господин ПЖ
 
01.12.16
10:38
нашел какую-то обработку по перекачке из 7.7 в 8.2

там автор даты для бухитогов так из 8.2 в ole 7.7 передает

Формат(ДатаОстатков, "ДФ=dd.MM.yyyy")
20 DrZombi
 
гуру
01.12.16
10:51
(19) У ТС же из 7.7 в 8.х :)
21 DrZombi
 
гуру
01.12.16
10:52
+ 7.7 же всегда страдала от ОЛЕ.
22 Aldnepr
 
01.12.16
10:53
(19) сделал в 8 Сообщить (ТекущаяДата()); выдает 01.12.2016 9:48:00
Взял и тупо прописал в 7,7  Запрос.УстановитьПараметр("ТекДата","01"+"."+"12"+"."+"2016"+" "+"9"+":"+"48"+":"+"00");
все равно "несответствие параметров" ((
23 Господин ПЖ
 
01.12.16
10:55
(22) не может неявно преобразовать... или через Дата() получать надо или как '200161202' писать
24 DrShad
 
01.12.16
10:56
(21) сколько работал по ОЛЕ в 7.7 никогда она не страдала, хотя приколы были
25 youalex
 
01.12.16
10:59
(11) тогда уж '20161202'
26 Aldnepr
 
01.12.16
11:00
(25) да писал же- не жуёт
27 DrShad
 
01.12.16
11:01
(26) читаю ветку и не могу уловить в чем проблема? нужно передать дату в параметр запроса на 8-ке?
28 Господин ПЖ
 
01.12.16
11:02
(27) это следствие. как вариант ответа "почему выборка из запроса пустая"
29 Aldnepr
 
01.12.16
11:03
(28) скорее всего- не получается передать дату в 8
30 youalex
 
01.12.16
11:04
(26) сделай в 8 внешник с экспортной функцией модуля и не мучайся. Из 7 - вызывай эту функцию.
31 DrZombi
 
гуру
01.12.16
11:05
(24) 1С не страдала. Страдал пользователь, а вернее программист, когда ОЛЕ запрос не возвращал ни ошибки и данных. При наличии последних :)
32 Господин ПЖ
 
01.12.16
11:05
(29) ты (8) сделал? может не туда копаем
33 DrShad
 
01.12.16
11:06
а меня вот это смущает

Результат.Следующий()

у выборки в 8-ке другой метод для обхода
34 DrZombi
 
гуру
01.12.16
11:06
(27) А я вот немогу понять, зачем он так уперся в передачу в качестве параметра Дату :)
35 DrShad
 
01.12.16
11:06
+(33) Результат.Следующая() не?
36 Господин ПЖ
 
01.12.16
11:07
(33) у него своя атмосфера

Результат=Запрос.Выполнить().Выбрать();
37 DrShad
 
01.12.16
11:07
(34) уже давно можно было в отладчике посмотреть параметры запроса как они установились
38 Господин ПЖ
 
01.12.16
11:08
(35) не
39 DrShad
 
01.12.16
11:08
(36) верно, но получается выборка, а у нее нет метода Следующий()
40 DrShad
 
01.12.16
11:10
можно было уже даже проверить

Запрос.Выполнить().Пустой()
41 Fish
 
01.12.16
11:10
(39) Как раз у выборки он есть :)
42 DrShad
 
01.12.16
11:12
(41) сорри, туплю
43 DrShad
 
01.12.16
11:16
и еще один маленький вопросик, а какие права у юзера который лезет по ОЛЕ?
44 Aldnepr
 
01.12.16
11:17
(43) юзер подключается, с этим проблем нет
45 DrShad
 
01.12.16
11:22
(44) может у него нет прав на регистр
46 DrShad
 
01.12.16
11:23
или вот такой запрос что возвращает?

ВЫБРАТЬ &ТекДата
47 Aldnepr
 
01.12.16
11:26
(32) я не совсем понял что нужно сделать (8). Там синтаксис не 7,7, ругается
48 Aldnepr
 
01.12.16
11:27
(45) Не, там администратор с полными правами
49 Aldnepr
 
01.12.16
11:28
(46) как его посмотреть из 7,7  Сообщить(Запрос.ТекДата) не работает
50 DrShad
 
01.12.16
11:31
(49) измени текст запроса на тот что в (46) и смотри результат
51 Aldnepr
 
01.12.16
12:38
(50) отладчик возвращает "Ошибка в выражении". Не так в табло зашону наверное?
52 DrShad
 
01.12.16
12:42
какое еще нах табло?
53 Aldnepr
 
01.12.16
12:47
(52) в отладчике заношу результат=. Запрос же по оле, или как смотреть?
54 h-sp
 
01.12.16
12:48
(53) там не будет такого поля Запрос.ТекДата. Ты что-то уже бредить начал на почве этого запроса.
55 Aldnepr
 
01.12.16
12:52
(54) да, так и есть не буду спорить. напиши как эту дату увидеть из запроса по оле
56 DrShad
 
01.12.16
13:08
Запрос.Параметры что показывает?
57 h-sp
 
01.12.16
13:18
(55) попробуй Сообщить("" + Запрос.Параметры.ТекДата); Хотя, не уверен.
58 Aldnepr
 
01.12.16
17:42
(57) Хм... в конструкции

Запрос.УстановитьПараметр("ТекДата", ТекущаяДата());

сообщает  01.12.16 . Но не выбирает
59 Aldnepr
 
01.12.16
17:43
дальше цикл идет но он не работает

Сообщить("" + Запрос.Параметры.ТекДата); // = 01.12.16
Результат=Запрос.Выполнить().Выбрать();

Пока Результат.Next()=1 Цикл
    Стр=ТЗБух.Добавить();
    Стр.Товар= Строка(Результат.Номенклатура);
    Стр.ОстатокТовара= Число(Результат.КоличествоОстаток);
Сообщить(Стр.Товар+"  "+Стр.ОстатокТовара);
КонецЦикла;
60 Serginio1
 
01.12.16
17:59
Используй внешние отчеты.
Премущества отладка т минимум ограничений
Как через оле задать отбор?
Программист всегда исправляет последнюю ошибку.