helpf.pro
Регистрация

v8: Работа через COMObject

Anton_12321
03.02.2013 16:23Прочитано: 6944
Здравствуйте, пытаюсь работать с 1С через Com в Visual Studio на VB.Net
Я подключаюсь к базе и вывожу список всех справочников в ListBox. Как сделать так чтобы при нажатии на строку в ListBox'е в таблицу выводилось содержимое справочника?

мой код :
Код VBS
 

Function get_AllSpravochnik() As Boolean
'Dim i As Integer
Dim spr_iz_met As Object
Dim met_sprav As New Object
Try
met_sprav = connection.Метаданные.Справочники
For Each spr_iz_met In met_sprav
ListBox1.Items.Add(spr_iz_met.Имя)
Next
Return True
Catch ex As Exception
MsgBox("Error")
Return False
End Try

End Function

' Я написал пункцию для нахождения справочника по имени

Function Find_Spravochnik(ByVal name As String) As Object
Dim sprizmet As Object
Dim metsprav As New Object
Try
metsprav = connection.Метаданные.Справочники
For Each sprizmet In metsprav
If sprizmet.Имя = name Then
Return sprizmet

End If
Next
Catch ex As Exception
MsgBox("Error")
Return Nothing
End Try
End Function




Дошел до того что у меня есть нужный справочник теперь задача как из него вытащить информацию о полях и записях в нем?
Помогите кто чем может)))
Yandex
Возможно, вас также заинтересует
Реклама на портале
E_Migachev
03.02.2013 16:43Ответ № 1
Вот пример работы с 1С 8.х через COMConnector из Excel, делай по аналогии

Получаем подключение к 1С, подключаем к проекту VBA ссылку на библиотеку 1CV81 COMConnector Tipe Library (меню Tools - Refernces).
Код VBS
 Public v8 As Object
Dim v8con As New V81.COMConnector

Public Sub v8connect()

'Версия для файлового варианта 1С
'Set v8 = v8con.Connect("File=""C:\Путь к папке с конфигурацией""; Usr =""ИмяПользователя"";Pwd=""Пароль""")

'Версия для серверного варианта 1С
Set v8 = v8con.Connect("Srvr=ИмяСервера1С;Ref=ИмяИнформационнойБазы;Usr =""ИмяПользователя"";Pwd=""Пароль""")

End Sub


Пример работы со справочником Контрагенты
Код VBS
 'Получение ссылки на элемент справочника Контрагенты
'В системе 1С принято организациями назвать юрлица, бухгалтерский учет которых ведется в информационной системе (свои фирмы).
'Все остальные юрлица учитываются в справочнике Контрагенты. Причем организации также присутствуют в справочнике Контрагенты,
'но не наоборот.
'SpravContragent - функция возвращает логическое значение True, если удалось получить ссылку на элемент справочника Контрагенты
'v8 - объект COMConection, с установленным подключеннием к базе 1С
'INN - Строка ИНН для поиска элемента в справочнике
'Name - Строка Наименования для проверки на соответствие ИНН и наименования (некоторые госучреждения имеют одинаковый ИНН)
'Org - Срока с названием нашей организации. В случае добавления нового контрагента будет создан договор на эту организацию.
'Ref - в эту объектную переменную будет помещена ссылка на элемент справочника в случае успешного исполнения функции
'Message - Строка с сообщением об ошибках и прочих особых обстоятельствах
Public Function SpravContragent(v8 As Object, INN As String, Name As String, Org As String, Ref As Object, Message As String) As Boolean

'Ищем элемент справочника
Set Ref = v8.Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", INN)
If Ref.Наименование = "" Then 'Если получили пустую ссылку, создаем нового контрагента
Set Ref = v8.Справочники.Контрагенты.СоздатьЭлемент()
Ref.Наименование = Name
Ref.ИНН = INN
'Предварительно создайте в справочнике Контрагенты папку (группу) "Новые контрагенты"
Ref.Родитель = v8.Справочники.Контрагенты.НайтиПоНаименованию("Новые контрагенты")
Ref.Записать
Set Дог = v8.Справочники.ДоговорыКонтрагентов.СоздатьЭлемент()
Дог.Наименование = "Основной договор"
Дог.Владелец = Ref.ссылка
Дог.Организация = v8.Справочники.Организации.НайтиПоНаименованию(Org)
Дог.ВалютаВзаиморасчетов = v8.Справочники.Валюты.НайтиПоНаименованию("руб")
Дог.ВидДоговора = v8.Перечисления.ВидыДоговоровКонтрагентов.Прочее
Дог.ВедениеВзаиморасчетов = v8.Перечисления.ВедениеВзаиморасчетовПоДоговорам.ПоДоговоруВЦелом
Дог.Записать
Ref.ОсновнойДоговорКонтрагента = Дог
Ref.Записать
'Создаем задачу в системе 1С. Код процедуры CreateTask будет приведен позже. Пока эту строку нужно закомментировать
'CreateTask v8, "Добавлен новый контрагент """ & Name & """. Проверьте правильность заполнения реквизитов.", Ref.ссылка
SpravContragent = True
Else
If Ref.Наименование = Name Then
'Определяем, что делать, если элемент помечен на удаление. Например, снимаем пометку.
If Ref.ПометкаУдаления Then Ref.ПолучитьОбъект.УстановитьПометкуУдаления 0
SpravContragent = True
Else
Message = "Сообщение менеджеру: Контрагент с указанным ИНН найден в справочнике, но его наименование не совпадает с запрошенным (""" & Name & """). Наименование в справочнике """ & Ref.Наименование & """. Свяжитесь с департаментом финансов."
SpravContragent = False
End If
End If
End Function


'Пример использования
Sub testSpravContragent()
Dim text As String
Dim OutRef As Object

If v8 Is Nothing Then v8connect

'Замените параметры вызова функции на правильные наименования и ИНН, чтобы получить ссылку на существующий элемент
If SpravContragent(v8, "Тестовое название", "123456789012", "Тестовая организация", OutRef, text) Then
Debug.Print OutRef.Наименование
Debug.Print text
Debug.Print OutRef.ОсновнойДоговорКонтрагента.Наименование
End If
End Sub


Получаем структуру данных документа для дальнейшего использования в коде
Код VBS
 Sub RunDocumentStructure()
If v8 Is Nothing Then v8connect
DocumentStructure v8.метаданные.Документы.ПлатежноеПоручениеВходящее
DocumentStructure v8.метаданные.Документы.СчетНаОплатуПокупателю
'DocumentStructure v8.метаданные.Документы...
End Sub

Sub DocumentStructure(Документ) 'Выводит структуру данных документа на лист Excel
'Dim Документ As Object, sht As Worksheet
If v8 Is Nothing Then v8connect
Set sht = ActiveWorkbook.Sheets.Add
sht.Name = Left(Документ.Имя & " Структура", 31)
On Error Resume Next

For Each рек In Документ.Реквизиты
r = r + 1
sht.Cells(r, 1) = "Документ." & рек.Имя
sht.Cells(r, 1).I_nsertIndent -1
sht.Cells(r, 1).Font.Bold = True
sht.Cells(r, 2) = рек.Синоним
sht.Cells(r, 3) = v8.String(рек.тип)
If v8.String(рек.тип) = "Строка" Then sht.Cells(r, 3) = v8.String(рек.тип) & "(" & v8.String(рек.тип.квалификаторыстроки.длина) & ")"
If v8.String(рек.тип) = "Число" Then sht.Cells(r, 3) = v8.String(рек.тип) & "(" & v8.String(рек.тип.квалификаторычисла.разрядность) & "," & v8.String(рек.тип.квалификаторычисла.разрядностьдробнойчасти) & ")"
Next
For Each тч In Документ.Табличныечасти
r = r + 1
sht.Cells(r, 1) = "Документ." & тч.Имя
sht.Cells(r, 2) = "Табличная часть (подчиненная таблица)"
sht.Cells(r, 1).I_nsertIndent -1
sht.Cells(r, 1).Font.Bold = True
For Each рек In тч.Реквизиты
r = r + 1
sht.Cells(r, 1).I_nsertIndent 1
sht.Cells(r, 1).Font.Bold = False
sht.Cells(r, 1) = тч.Имя & "." & рек.Имя
sht.Cells(r, 2) = рек.Синоним
sht.Cells(r, 3) = v8.String(рек.тип)
If v8.String(рек.тип) = "Строка" Then sht.Cells(r, 3) = v8.String(рек.тип) & "(" & v8.String(рек.тип.квалификаторыстроки.длина) & ")"
If v8.String(рек.тип) = "Число" Then sht.Cells(r, 3) = v8.String(рек.тип) & "(" & v8.String(рек.тип.квалификаторычисла.разрядность) & "," & v8.String(рек.тип.квалификаторычисла.разрядностьдробнойчасти) & ")"
Next
Next
sht.Columns("A:B").EntireColumn.AutoFit
End Sub
Anton_12321
03.02.2013 16:53Ответ № 2
Спасибо за помощь буду разбираться
Anton_12321
04.02.2013 11:52Ответ № 3
в процессе разработки столкнулся с проблемой к обращению к справочнику
мне нужно избежать фиксированного обращения к полям таблицы
Пример:
Справочник.Поле

Есть ли возможность обратиться к полю через строку
Пример:

Справочник("поле")
возможно ли это реализовать?
E_Migachev
04.02.2013 15:00Ответ № 4
Так:
Код 1C v 8.2 УП
 Справочник["поле"]   
Подсказка: Щелникни по Имени пользователя напротив ответа, и тем самым покажешь, что сообщение адресовано ему.
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.