Имя: Пароль:
1C
1С v8
Получить результат выборки в VBA
,
0 The_Immortal
 
17.06.14
18:13
Всех приветствую!

Необходимо вернуть результат запроса в переменную типа Object через COM (VBA):

Set Запрос = v8.NewObject("Запрос")
Запрос.Текст = "ВЫБРАТЬ ... "
Set Выборка = Запрос.Выполнить()

На последней строчке вылетает "Application-defined or object-defined error 1001".

Что делаю не так?

Спасибо!
1 shuhard
 
17.06.14
18:15
(0)[Что делаю не так? ]
не то выбираешь в запросе
2 Crush
 
17.06.14
18:31
Причем здесь VBA?
(На сколько мне известно эта аббревиатура расшифровывается как Visual Basic Application)
3 The_Immortal
 
17.06.14
18:32
(1) Подскажите нубу, пожалуйста, что тут может быть не так:

ВЫБРАТЬ
   РаботникиОрганизацийСрезПоследних.Сотрудник КАК Сотрудник,
   РаботникиОрганизацийСрезПоследних.ЗанимаемыхСтавок

ИЗ  РегистрСведений.РаботникиОрганизаций.СрезПоследних(&ДатаАктуальности, ) КАК РаботникиОрганизацийСрезПоследних

ГДЕ
РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)

Что в запросе страшного?
4 Wobland
 
17.06.14
18:36
а параметр где?
5 Crush
 
17.06.14
18:39
Туплю. Это ты из бейсика к 1С подключаешься.
Как переменную v8 определяешь? Получается с её помощью хоть что то из базы дернуть?
6 Crush
 
17.06.14
18:42
И, кстати, посмотри какие данные можно передавать через COM-соединение. Сомневаюсь, что результат запроса, выборка или ТЗ пролезут. Но сам не пробовал.
7 The_Immortal
 
17.06.14
18:43
(4) Эм... А он тут нужен? :) Признаюсь честно, запрос этот подогнали, но он вроде как должен работать.

(5) - Как переменную v8 определяешь?
Да обычно:
Dim v8con As New V82.COMConnector

Public Sub v8connect()

Set v8 = v8con.Connect("File=""C:\test1c""; Usr =""..."";Pwd=""...""")

- Получается с её помощью хоть что то из базы дернуть?
Ну да, банальный список наименований контрагентов через запрос получил...
8 Crush
 
17.06.14
18:44
(7) Покажи запрос, коим "банальный список наименований контрагентов" получил
9 The_Immortal
 
17.06.14
18:46
(8)         Set Запрос = v8.NewObject("Запрос")
        Запрос.Текст = "ВЫБРАТЬ Наименование ИЗ Справочник.Контрагенты"
        Set Выборка = Запрос.Выполнить().Выбрать()
        
        Y = 1
        Do While Выборка.Следующий()
            Cells(Y, 1).Value = Выборка.Наименование
            Y = Y + 1
        Loop
10 Crush
 
17.06.14
18:47
(9) Ага. Наименование - это строка. А сотрудник - это ссылка.
11 Wobland
 
17.06.14
18:48
(7) а он у тебя есть в тексте
12 Crush
 
17.06.14
18:48
Попробуй так
ВЫБРАТЬ
   Сотрудник.Наименование КАК Сотрудник,
   ЗанимаемыхСтавок

ИЗ  РегистрСведений.РаботникиОрганизаций.СрезПоследних(&ДатаАктуальности, )

ГДЕ
ПричинаИзмененияСостояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение
13 Crush
 
17.06.14
18:49
+(12) скобку после Перечисление.ПричиныИзмененияСостояния.Увольнение забыл
14 The_Immortal
 
17.06.14
18:53
(13) Скобку заметил, но ошибка та же...
15 Crush
 
17.06.14
19:02
Примени метод тыка
Сначала:

ВЫБРАТЬ
   Сотрудник.Наименование КАК Сотрудник
ИЗ  РегистрСведений.РаботникиОрганизаций.СрезПоследних

Далее прибавляй к запросу всё остальное.

И попробуй этот запрос в самой базе выполнить. Может там измерение не сотрудник, а работник или регистр по другому называется
16 The_Immortal
 
17.06.14
19:14
(15) Измерение точно "Сотрудник" - проверял.
Этот запрос выполняется, но Выбрать() в VBA не срабатывает. Это нормально?
17 The_Immortal
 
17.06.14
19:20
(15) В общем, косяк из-за "(&ДатаАктуальности, )" похоже.
Если это убрать, то изначальный запрос выполняется, но Выбрать() все равно не срабатывает. Вероятно, так и должно быть...
18 Crush
 
17.06.14
19:24
(17) если у тебя это работает

       Запрос.Текст = "ВЫБРАТЬ Наименование ИЗ Справочник.Контрагенты"
        Set Выборка = Запрос.Выполнить().Выбрать()
        
        Y = 1
        Do While Выборка.Следующий()
            Cells(Y, 1).Value = Выборка.Наименование
            Y = Y + 1
        Loop

То всё срабатывает

Как параметр устанавливаешь?
19 The_Immortal
 
17.06.14
19:27
(18) Пока никак :-) Пойду читать...

Кстати, а как безобидно выполнить запрос в самой базе? Просто никогда этого не делал. Обязательно ли создавать свою форму, вешать на нее кнопку, на которую вешать запрос, а потом еще эту форму как-то вызывать...? Проще никак нельзя?
20 Wobland
 
17.06.14
19:28
9 минут до часа не дотянул ;)
21 Wobland
 
17.06.14
19:28
и открой для себя консоль запросов
22 The_Immortal
 
17.06.14
19:40
(20) Дурак я, согласен =\
(21) Отличная вещь, спасибо!

(18) В общем, параметр выкинул, осталось вот так:

        Set Запрос = v8.NewObject("Запрос")
        Запрос.Текст = "ВЫБРАТЬ Сотрудник.Наименование КАК Сотрудник ИЗ  РегистрСведений.РаботникиОрганизаций.СрезПоследних ГДЕ ПричинаИзмененияСостояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)"
        Set Выборка = Запрос.Выполнить().Выбрать()

На последней строчке ругается. Если убрать "Выбрать()", то все нормально... Но мне же надо выбрать результат запроса =/
23 Wobland
 
17.06.14
19:41
(22) а дай строку подключения
24 The_Immortal
 
17.06.14
19:42
В консоли запросов последний запрос нормально срабатывает и выводит инфу.
25 The_Immortal
 
17.06.14
19:43
(23)

Dim v8con As New V82.COMConnector
Public Sub v8connect()
Set v8 = v8con.Connect("File=""C:\test1c""; Usr =""..."";Pwd=""...""")
26 Wobland
 
17.06.14
20:06
работает всё
27 The_Immortal
 
17.06.14
20:17
(26) А можно Ваш полный рабочий вариант увидеть?
28 Wobland
 
17.06.14
20:17
а вот с передачей даты я не справился. не хочет оно признвавать чужие даты
http://i.imgur.com/FvQyEWu.png
29 Wobland
 
17.06.14
20:18
+(28) то, что не влезло:
    Запрос.Текст = "ВЫБРАТЬ Сотрудник.Наименование КАК Сотрудник ИЗ РегистрСведений.РаботникиОрганизаций.СрезПоследних ГДЕ ПричинаИзмененияСостояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)"
30 The_Immortal
 
17.06.14
20:20
(29) Ну сейчас сделаю один-в-один, за исключением того момента, что у меня 8.2
31 The_Immortal
 
17.06.14
20:24
(29) Нашел косяк в цикле Do While, хотя дебаггер явно показывал на более раннюю строчку.

Благодарю!

Осталось теперь разобраться с передачей параметров, а именно даты...
32 Wobland
 
17.06.14
20:34
адов бейсик..

    Запрос.Текст = "выбрать &ЧасЧ как Сотрудник"
    p = Запрос.УстановитьПараметр("ЧасЧ", #5/5/2014#)
33 The_Immortal
 
17.06.14
20:50
(32) Бесконечно благодарен!