Страница: 1 |
Страница: 1 |
Вопрос: Из VBA в 1С
Добавлено: 10.03.08 16:50
Автор вопроса: Godmademefunky
Привет всем.
Хочу из VBa (допустим Excel) получать данные отчета 1С. Не могу понять в чем ошибка..библиотеку v8 подключил. говорит что такаого метода или объекта не существует (про result).
Dim v8 As Object
Set v8 = CreateObject("V8.COMConnector")
result = v8.Connect("Srvr=""Alfa"";Ref=""AlfaU=""иванов"";Pwd=""12345""")
Set Query = result.NewObject("Запрос")
Set Query2 = result.NewObject("Запрос")
далее идет сам запрос 1С в "... " .
Ответы
Всего ответов: 12
Номер ответа: 1
Автор ответа:
SAY
Вопросов: 1
Ответов: 6
Профиль | | #1
Добавлено: 11.03.08 11:07
Привет!
Опиши проблему более детально - конкретно какой запрос и к чему ты хочешь написать.
Номер ответа: 2
Автор ответа:
Godmademefunky
Вопросов: 1
Ответов: 6
Профиль | | #2
Добавлено: 11.03.08 21:36
Есть десяток еженедельных отчетов, данные для которых обновляются через 1С.
Работаю над минимизацией времени составления отчетов и рассылки по адресатам. Алгоритм создания отчетов следующий:данные из отчетов (либо файлов) 1C перемещаются в соответствующие базы данных (Access), далее отчеты с помощью запросов формируются и перемещаются в Excel где форматируются, далее перемещаются в OUtLook и рассылаются. Все это сейчас полностью автоматизировано (т.е. все отчеты формируются по средставм пары процедур VBA). Осталось лишь одно - автоматизировать перенос информации из первичного источника данных т.е. 1С. Сейчас на все отчеты уходит 20 минут (19 из них на получение данных из 1С)..хочется сократить то время т.к. число отчетов будет только расти и возможно прибавятся ежедневные.
Dim v8 As Object
Set v8 = CreateObject("V8.COMConnector"
result = v8.Connect("Srvr=""Alfa"";Ref=""AlfaU=""иванов"";Pwd=""12345"""
«процедура на языке 1С»
Итак, через VBa открываю 1С (создаю объект v8 и получаю связь указывая логин и пароль (см. код выше)). Далее полсе того как связь я получил хочу ввести код на языке 1С (который заготовлен уже)...ввожу в "". И получаю ошибку по переменной result.
Что это может быть за ошибка…может как то по другому подсоединится
И еще сразу возникает проблема….дело в том что сама процедура на 1С довольно длинная поэтому приходится пользоваться переносами «_». VBA показывает еще ошибку ссыласясь на то что много переносов..может есть совет как избежать этого )))
Номер ответа: 3
Автор ответа:
SAY
Вопросов: 1
Ответов: 6
Профиль | | #3
Добавлено: 12.03.08 09:44
Понятно. Ну судя по аргументам процедуры Connect у вас клиент-серверная версия 1С на SQL Server. Исходя из этого сразу возникают вопросы:
1. По какой причине Вы пишите запрос к базе 1С по кому, если можно сразу писать запрос к базе SQL по дмо? По времени все это будет быстрее в разы.
2. Какой код и куда вы пытаетесь ввести? Если Вы хотите выполнить запрос к 1С-ой базе, то необходимо (в 8.1.) сделать в модуле отчета фиктивную функцию, объявить ее как экспортную, в ее теле вернуть выборку запросу, и уж ее дергать по кому.
3.Вы зачем огород городите такой с рассылкой отчетов по адресам? Почему нельзя посредством 1С все это разослать? Верните выборку в табличный документ и сохраните его посредством самого 1С в excel. Далее уже форматируйте и отошлите куда нужно самим 1С-ом. Просто совсем нелогично (на первый взгляд) производить такие манипуляции 1C-Access - Excel только ради того, чтобы отослать отчет по емайлу.
Если Вы боритесь за минимизацию времени, то максимальной производительность в вашем случае можно достичь используя SSIS в случае 2005-2008, или же прямой запрос к скулю через дмо в 1С с рассылкой оттуда же.
Ну а про ошибку по переменной результ: попробуйте подклюиться из аналайзера с вашими параметрами. Ошибка есть или нет?
Номер ответа: 4
Автор ответа:
Godmademefunky
Вопросов: 1
Ответов: 6
Профиль | | #4
Добавлено: 12.03.08 12:55
Спасибо за советы. к некоторым прислушаюсь. Но:
1. У нас SQL Server вообще понять невозможно, поэтому приходится писать к 1С (пока что)
2. В модуле VBA пытаюсь сделать запрос в 1С и качнуть его в эксель. Смотрите что сейчас получилось
Sub Calin1C()
Dim V8 As Object
Set V8 = CreateObject("V8.COMConnector"
Set Con = V8.Connect("Srvr=""Feldman"";Ref=""keraton_trade_2005"";Usr=""Иванов"";Pwd=""123"""
Set q1 = Con.newObject("Запрос"
q1.Text = "ВЫБРАТЬ Валюты.Наименование ИЗ Справочник.Валюты КАК Валюты"
Set Result = q1.Execute()
End sub
Запрос реально действет только поянть не могу как далее готовый запрос в переменной result вгрузить куданибудь в офис (в Фксесс и эксель)
Может вы подскажите?
Про функцию обязателбно подумаю (у меня с ними пока плохо я ж не програмист по роду деятельности так что могут быть проблемы)
3. Из 1С действительно можно но я работаю только с VBA к сожалению. Манипуляции производятся преде всего для создания отчетов из СУБД (по запросам и новым переменным по дате например) а у ж потом чтоб время не тратить они еще и в аутлу идут. Кончено в 1с было бы гораздо удобнее и не через огород но я не зняю языка 1С.
4. В дальнейшем этот вариант конечно рассмотрю так будет гораздо более оптимально
Номер ответа: 5
Автор ответа:
SAY
Вопросов: 1
Ответов: 6
Профиль | | #5
Добавлено: 12.03.08 13:36
1. про невозможно понять - так сделайте вьюху "Валюты" на вашу таблицу Справочник.Валюты с названием полей на русском языке и можно будет писать писать запрос типа "Select Наименование from Валюты". Потом через адо или дмо дернете этот запрос на сервере и получите вашу выборку. Это 2 минуты работы.
Про ваши старания. Метод Выполнить(), он же Execute(), возвращает значение типа РезультатЗапроса. С этим типом по кому работать не удастаться. Поэтому необходимо получить таблицу значений из результата запроса, а уж потом ее обойти в цикле и почитать те данные которые вам необходимы. Т.е. в Вашем случае нужно просто подписать ниже строчку:
Set TZ = Result.Unload() И далее эту ТЗ обойти в цикле и выудить то, что Вам нужно.
Повторюсь все это очень не оптимально. Все таки создайте вььху русскую на таблицу Валюты и дерните через дмо все это. Будет и быстрее, да и грамотнее.
Номер ответа: 6
Автор ответа:
Godmademefunky
Вопросов: 1
Ответов: 6
Профиль | | #6
Добавлено: 12.03.08 14:27
Что значит "Вьюха" ))
Про Upload понял. Про цикл не очень. Т.е. я не понимаю как обращаться к полям этого запроса...ну допустим в Excel я обращусь через .offset ( индекс цикла, ...) а в акссе допустим через Fields (индекс цикла ). Но здесь то в запрсое другие объекты. Как мне через цикл выгрузить знчаения переменной TZ?
Номер ответа: 7
Автор ответа:
Godmademefunky
Вопросов: 1
Ответов: 6
Профиль | | #7
Добавлено: 12.03.08 14:27
Что значит "Вьюха" ))
Про Upload понял. Про цикл не очень. Т.е. я не понимаю как обращаться к полям этого запроса...ну допустим в Excel я обращусь через .offset ( индекс цикла, ...) а в акссе допустим через Fields (индекс цикла ). Но здесь то в запрсое другие объекты. Как мне через цикл выгрузить знчаения переменной TZ?
Номер ответа: 8
Автор ответа:
SAY
Вопросов: 1
Ответов: 6
Профиль | | #8
Добавлено: 12.03.08 14:59
Что значит другие объекты? Там массив вариантов - обойдите массив, попутно читая вариантные строки.
Запустите дебаггер, добавьте туда TZ и поробуйте понажимать на "+" в отладчике - увидите то что вам нужно.
"вьюха" - View. Представление таблицы скуля. Т.к. в 1С все поля в таблицах имеют англоязычное представление, то для большей понятности рекомендуется сделать к ним русские вьюхи, т.е. тупо переименовать поле типа _SP6693 во что-то более понятное, например "Цена". Соотв. также поступить с таблицами. В результате можно писать осмысленные запросы.
Номер ответа: 9
Автор ответа:
Godmademefunky
Вопросов: 1
Ответов: 6
Профиль | | #9
Добавлено: 12.03.08 15:29
Извиняюсь за настырность ))
Дебагер показывает 3 значения Item 1 2 и 3. В каждом Iteme (при нажатии на +) есть текстовая строка: рублий доллары и евром соответственно.
Я не понимаю как мне обойти этот массив в цикле
если я не знаю как к нему обращаться.
Номер ответа: 10
Автор ответа:
SAY
Вопросов: 1
Ответов: 6
Профиль | | #10
Добавлено: 12.03.08 16:46
Совсем что-то у вас мозг Ваш затуманился...
Итак...
Set TZ = Result.Unload() '- получили вариантную коллекцию (1С-овская таблица значений)
Далее смотрим в дибагере что это...Видим, что дибагер показывает плюсик - раскрываем и видим:
+ Item 1
|----------item 1 (рубли)
+ Item 2
|----------item 2 (доллары)
+ Item 3
|----------item 3 (евро)
Возник вопрос, как обойти этот "массив".
Set TZ = Result.Unload()
For Each TekStr In TZ ' это мы идем по первой ступеньки иерархии
For Each Item In TekStr
' в Item храниться нужное значение
Next
Next
P.s.: я VBA не знаю. Посмотрел по хелпу как обойти коллекцию в бейсике ) Может и Вам следует туда почаще посматривать?
Номер ответа: 11
Автор ответа:
Godmademefunky
Вопросов: 1
Ответов: 6
Профиль | | #11
Добавлено: 12.03.08 23:08
))) Вы соверешенно правы.Свво Item. Вот что мне нужно было )). Спасибо!!!
Номер ответа: 12
Автор ответа:
SAY
Вопросов: 1
Ответов: 6
Профиль | | #12
Добавлено: 13.03.08 09:07
Пожалуйста