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

Пожалуйста, войдите или зарегистрируйтесь.


Расширенный поиск  

Новости:

Читайте новые сообщения форума форума в RRS-агрегаторах

Автор Тема: Статья "Работа с 1С v.8 через COMConnector из Excel" (черновик)  (Прочитано 14552 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Алексей Шмуйлович

  • Ветеран
  • *****
  • Уважение: +31/-0
  • Оффлайн Оффлайн
  • Сообщений: 1 085
  • WORK SMARTER, NOT HARDER

Коллеги, я в последнее время по работе активно использую доступ к 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С.
« Последнее редактирование: 08.11.2010, 12:32:35 от Алексей Шмуйлович »
Записан

Алексей Шмуйлович

  • Ветеран
  • *****
  • Уважение: +31/-0
  • Оффлайн Оффлайн
  • Сообщений: 1 085
  • WORK SMARTER, NOT HARDER

Пример работы со справочником Контрагенты

'Получение ссылки на элемент справочника Контрагенты
'В системе 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
« Последнее редактирование: 08.11.2010, 12:32:53 от Алексей Шмуйлович »
Записан

Алексей Шмуйлович

  • Ветеран
  • *****
  • Уважение: +31/-0
  • Оффлайн Оффлайн
  • Сообщений: 1 085
  • WORK SMARTER, NOT HARDER

Получаем структуру данных документа для дальнейшего использования в коде

Код должен запускаться из 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
« Последнее редактирование: 08.11.2010, 12:33:06 от Алексей Шмуйлович »
Записан

Шпец Докапыч

  • Ветеран
  • *****
  • Уважение: +189/-4
  • Оффлайн Оффлайн
  • Сообщений: 1 918
  • ОБЛАДАТЕЛЬ УНИКАЛЬНЫХ НАВЫКОВ!!! :)

К примеру: Подключение к 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

База создана с нуля. Есть идеи как пофиксить ошибку?
« Последнее редактирование: 08.11.2010, 13:06:02 от Шпец Докапыч »
Записан
Знания недостаточно, необходимо применение. Желания недостаточно, необходимо действие. (с) Брюс Ли

Алексей Шмуйлович

  • Ветеран
  • *****
  • Уважение: +31/-0
  • Оффлайн Оффлайн
  • Сообщений: 1 085
  • WORK SMARTER, NOT HARDER

Нужно проверить у пользователя конкретно право внешнего соединения.
Записан

Алексей Шмуйлович

  • Ветеран
  • *****
  • Уважение: +31/-0
  • Оффлайн Оффлайн
  • Сообщений: 1 085
  • WORK SMARTER, NOT HARDER

Да, я посмотрел у себя в конфигурации. Ни одна роль, имеющаяся в типовой конфигурации, не имеет права внешнего подключения. У нас в конфигурацию добавлена роль, имеющая такое право. Право задается для самого верхнего объекта в дереве конфигурации, то есть для самой конфигурации.
 
Записан

iron priest

  • Глобальный модератор
  • Старожил
  • *****
  • Уважение: +34/-0
  • Оффлайн Оффлайн
  • Сообщений: 766
  • почётный флудераст

ВБА для меня темный лес, в 1С постоянно что то изучаю и 95% нужной информации выгружаю через свои обработки :)
Записан

Алексей Шмуйлович

  • Ветеран
  • *****
  • Уважение: +31/-0
  • Оффлайн Оффлайн
  • Сообщений: 1 085
  • WORK SMARTER, NOT HARDER

Ну и хорошо, будем обращаться за советом :)
Записан

lanerus

  • Новичок
  • *
  • Уважение: +0/-0
  • Оффлайн Оффлайн
  • Сообщений: 2

Доброго времени суток!
Спасибо за статью! Очень помогла! Подключение, пример - все работает.

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

Может подскажите где посмотреть объектную модель 1С?
Спасибо
Записан

Алексей Шмуйлович

  • Ветеран
  • *****
  • Уважение: +31/-0
  • Оффлайн Оффлайн
  • Сообщений: 1 085
  • WORK SMARTER, NOT HARDER

Самые общие советы: посмотрите для начала в конфигураторе 1С дерево конфигурации, увидите какие бывают объекты, набор их свойств.
Там же есть синтакс-помощник, где системно описана структура объектной модели, свойства и методы языка.
Ваш вопрос относится к конкретному объекту конфигурации - документу Счета-фактуры полученные. Найдите его в дереве конфигурации, посмотрите набор реквизитов. В Синтакс помощнике посмотрите, какие методы существуют для документов.
Записан

Алексей Шмуйлович

  • Ветеран
  • *****
  • Уважение: +31/-0
  • Оффлайн Оффлайн
  • Сообщений: 1 085
  • WORK SMARTER, NOT HARDER

Еще один вариант познакомиться со структурой конкретной конфигурации, а точнее структурой данных - изучить Консоль отчетов. Это универсальный инструмент, позволяющий в режиме Предприятия (не в конфигураторе) строить запросы к различным таблицам данных. Ищите консоль отчетов в меню Отчеты - Универсальные отчеты - Консоль отчетов.
Записан

Алексей Шмуйлович

  • Ветеран
  • *****
  • Уважение: +31/-0
  • Оффлайн Оффлайн
  • Сообщений: 1 085
  • WORK SMARTER, NOT HARDER

На основной сайт добавлена статья http://msexcel.ru/content/view/142/1/ на аналогичную тему. На момент написания статьи я подзабыл про эту заготовку и написал статью с нуля.
Записан

lanerus

  • Новичок
  • *
  • Уважение: +0/-0
  • Оффлайн Оффлайн
  • Сообщений: 2

Спасибо!
Уже рою в этом направлении.
Записан
 



Темы без ответов

06.09.2017 10:43 Solver VBA не решает гиперболическое уравнение, но при этом решает гармоническое 99
17.08.2017 12:15 Гиперссылка и фильтр одновременно макрос 210
13.06.2017 00:27 Сводная таблица: как не вручную отсортировать в опред. порядке (не Custom List) 617
23.05.2017 11:20 Копирование данных из одной таблицы в умную таблицу по условию 1067
18.05.2017 15:45 Не работает гиперссылка при копировании. 589
15.03.2017 15:45 автозамена картинок PowerPoint 829
13.03.2017 07:09 Использование базы КЛАДР в exel 1178
11.03.2017 13:43 Изменить нумерацию страниц 1055
10.03.2017 08:40 Как делать бекапы гугл таблицы? 896
18.02.2017 11:31 Изменить ввод данных помогите...из столбца в таблицу. 1126





Яндекс цитирования msexcel.ru Яндекс.Метрика

Страница сгенерирована за 0.082 секунд. Запросов: 48.