Профессиональные приемы работы в Microsoft Excel

Обмен опытом => Другие офисные программы => 1C => Тема начата: Алексей Шмуйлович от 08.11.2010, 11:40

Название: Статья "Работа с 1С v.8 через COMConnector из Excel" (черновик)
Отправлено: Алексей Шмуйлович от 08.11.2010, 11:40
Коллеги, я в последнее время по работе активно использую доступ к 1С из внешнего приложения.
Думаю, эта тема будет интересна многим. В этой ветке я буду выкладывать примеры кода с пояснениями и прошу Ваших комментариев и пожеланий.

Подключение к 1С v.8 через COMConnector

Внешнее соединение с приложением 1С v.8 может осуществляться двумя способами - через объекты OLEAutomation и COMConnection.
Основное отличие - первый вариант обращается к полноценному приложению, включая интерфейсные объекты (окно приложения, формы, табло и т.п.). Второй вариант предназначен для работы с данными без обращения к интерфейсу. Второй вариант гораздо производительнее и требует меньше ресурсов.
Поскольку мне в работе приходится обращаться к 1С именно через COMConnection, я буду приводить примеры работы именно через этот механизм. Язык программирования - VBA.

Итак, первый код. Получаем подключение к 1С.
Подключаем к проекту VBA ссылку на библиотеку 1CV81 COMConnector Tipe Library (меню Tools - Refernces).
Копируем в модуль код:

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


В результате получаем публичную переменную v8 типа Object с активным подключением к заданной информационной базе.
Все параметры понятны интуитивно. Путь к базе, сервер и имя базы можно подсмотреть в окне запуска 1С.
Название: Re: Статья "Работа с 1С v.8 через COMConnector из Excel" (черновик)
Отправлено: Алексей Шмуйлович от 08.11.2010, 12:09
Пример работы со справочником Контрагенты

'Получение ссылки на элемент справочника Контрагенты
'В системе 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
Название: Re: Статья "Работа с 1С v.8 через COMConnector из Excel" (черновик)
Отправлено: Алексей Шмуйлович от 08.11.2010, 12:30
Получаем структуру данных документа для дальнейшего использования в коде

Код должен запускаться из VBA-модуля книги MS Excel.

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).InsertIndent -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).InsertIndent -1
   sht.Cells(r, 1).Font.Bold = True
For Each рек In тч.Реквизиты
   r = r + 1
   sht.Cells(r, 1).InsertIndent 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
Название: Re: Статья "Работа с 1С v.8 через COMConnector из Excel" (черновик)
Отправлено: Шпец Докапыч от 08.11.2010, 13:03
К примеру: Подключение к 1С v.8 через COMConnector

При таком способе у меня Excel аварийно завершает работу на строке подключения. Попробовал через позднее связывание, - выдаёт ошибку: "Method 'Connect' of object 'IV8COMConnector3' failed".

Public Sub v8connect()
 Set v8 = CreateObject("v81.COMConnector")
'Подключаемся через пользователя со всеми правами:
 ConnectionString = "File=""C:\База81"";Usr=""Шпец"";Pwd=""12345"";"
 Set v8con = v8.Connect(ConnectionString)
End Sub


База создана с нуля. Есть идеи как пофиксить ошибку?
Название: Re: Статья "Работа с 1С v.8 через COMConnector из Excel" (черновик)
Отправлено: Алексей Шмуйлович от 08.11.2010, 14:07
Нужно проверить у пользователя конкретно право внешнего соединения.
Название: Re: Статья "Работа с 1С v.8 через COMConnector из Excel" (черновик)
Отправлено: Алексей Шмуйлович от 08.11.2010, 14:16
Да, я посмотрел у себя в конфигурации. Ни одна роль, имеющаяся в типовой конфигурации, не имеет права внешнего подключения. У нас в конфигурацию добавлена роль, имеющая такое право. Право задается для самого верхнего объекта в дереве конфигурации, то есть для самой конфигурации.
Название: Re: Статья "Работа с 1С v.8 через COMConnector из Excel" (черновик)
Отправлено: iron priest от 10.11.2010, 16:18
ВБА для меня темный лес, в 1С постоянно что то изучаю и 95% нужной информации выгружаю через свои обработки :)
Название: Re: Статья "Работа с 1С v.8 через COMConnector из Excel" (черновик)
Отправлено: Алексей Шмуйлович от 10.11.2010, 17:11
Ну и хорошо, будем обращаться за советом :)
Название: Re: Статья "Работа с 1С v.8 через COMConnector из Excel" (черновик)
Отправлено: lanerus от 23.04.2012, 16:44
Доброго времени суток!
Спасибо за статью! Очень помогла! Подключение, пример - все работает.

Подскажите где в 1С взять данные такие как для формирования Книги покупок (в частности по счет-фактурам).
С объектной моделью 1С незнаком.

Может подскажите где посмотреть объектную модель 1С?
Спасибо
Название: Re: Статья "Работа с 1С v.8 через COMConnector из Excel" (черновик)
Отправлено: Алексей Шмуйлович от 23.04.2012, 18:11
Самые общие советы: посмотрите для начала в конфигураторе 1С дерево конфигурации, увидите какие бывают объекты, набор их свойств.
Там же есть синтакс-помощник, где системно описана структура объектной модели, свойства и методы языка.
Ваш вопрос относится к конкретному объекту конфигурации - документу Счета-фактуры полученные. Найдите его в дереве конфигурации, посмотрите набор реквизитов. В Синтакс помощнике посмотрите, какие методы существуют для документов.
Название: Re: Статья "Работа с 1С v.8 через COMConnector из Excel" (черновик)
Отправлено: Алексей Шмуйлович от 23.04.2012, 18:13
Еще один вариант познакомиться со структурой конкретной конфигурации, а точнее структурой данных - изучить Консоль отчетов. Это универсальный инструмент, позволяющий в режиме Предприятия (не в конфигураторе) строить запросы к различным таблицам данных. Ищите консоль отчетов в меню Отчеты - Универсальные отчеты - Консоль отчетов.
Название: Re: Статья "Работа с 1С v.8 через COMConnector из Excel" (черновик)
Отправлено: Алексей Шмуйлович от 23.04.2012, 18:15
На основной сайт добавлена статья http://msexcel.ru/content/view/142/1/ (http://msexcel.ru/content/view/142/1/) на аналогичную тему. На момент написания статьи я подзабыл про эту заготовку и написал статью с нуля.
Название: Re: Статья "Работа с 1С v.8 через COMConnector из Excel" (черновик)
Отправлено: lanerus от 24.04.2012, 13:40
Спасибо!
Уже рою в этом направлении.