При автоматизации бизнес-процессов часто возникает задача связать таблицы Excel с платформой 1С. Например, кликая по ФИО сотрудника в таблице Excel, необходимо запустить 1С (если она еще не открыта) и автоматически отобразить форму элемента справочника Сотрудники или ФизическиеЛица.
В этой статье мы подробно разберем все доступные способы реализации этой задачи, проанализируем нюансы работы с COM-соединением, навигационными ссылками и параметрами командной строки.
Разберем классический подход с использованием программного кода VBA. Очень часто разработчики совершают ошибку, пытаясь использовать объект V83.COMConnector. Важно понимать разницу между типами подключений:
V83.COMConnector — предназначен только для работы с данными в фоновом режиме. Он не имеет пользовательского интерфейса, поэтому с его помощью не получится открыть форму на экране. Кроме того, этот объект требует наличия установленной платформы 1С на клиентском ПК.V83.Application — полноценный Automation-сервер, который запускает клиенскую часть 1С с графическим интерфейсом и позволяет манипулировать окнами и формами.Посмотрим на пример кода на VBA, который подключается к базе 1С, ищет сотрудника по наименованию и открывает его форму:
Sub Open1CEmployee()
Dim v83 As Object
Dim connectionString As String
Dim employeeRef As Object
' Формируем строку подключения к информационной базе
connectionString = "File=""C:\Bases\DemoBase"";Usr=""Администратор"";Pwd=""123"";"
On Error Resume Next
Set v83 = CreateObject("V83.Application")
On Error GoTo 0
If v83 Is Nothing Then
MsgBox "Не удалось создать объект V83.Application. Проверьте установку 1С.", vbCritical
Exit Sub
End If
' Подключаемся к базе
If v83.Connect(connectionString) Then
' Делаем окно 1С видимым
v83.Visible = True
' Выполняем поиск элемента в справочнике
Set employeeRef = v83.Справочники.Сотрудники.НайтиПоНаименованию("Иванов Иван Иванович")
If Not employeeRef.IsEmpty() Then
' Открываем форму найденного объекта
employeeRef.ПолучитьФорму().Открыть()
Else
MsgBox "Сотрудник не найден в базе 1С!", vbExclamation
End If
Else
MsgBox "Ошибка подключения к базе 1С!", vbCritical
End If
End Sub
Важное замечание о разрядности (32-bit vs 64-bit): Если при выполнении CreateObject("V83.Application") возникает ошибка «Класс не зарегистрирован», проанализируем разрядность программ. Разрядность Microsoft Excel и платформы 1С должна совпадать. Если Excel установлен в 64-разрядной версии, а 1С — в 32-разрядной, COM-объект не создастся, даже если выполнить регистрацию библиотеки comcntr.dll через regsvr32.
Рассмотрим более современный и быстрый способ, подходящий для конфигураций на управляемых формах. При установке платформы 1С в операционной системе автоматически регистрируются протоколы e1c и e1cib.
Каждый объект информационной базы имеет уникальную внешнюю навигационную ссылку. Формат ссылки выглядит следующим образом:
e1cib/data/Справочник.Сотрудники?ref=8b333abfaf8d323149e126f75af65a86
Если база опубликована на веб-сервере, ссылка принимает вид стандартного URL:
http://АдресСервера/ИмяБазы#e1cib/data/Справочник.Сотрудники?ref=8b333abfaf8d323149e126f75af65a86
Разберем преимущества этого метода:
Ограничение: Для формирования прямой ссылки из Excel необходимо заранее знать уникальный идентификатор (GUID) объекта в базе 1С.
Проанализируем еще один подход — запуск 1С через командную строку Windows из VBA с помощью функции Shell или объекта WScript.Shell с передачей параметра запуска /C.
Шаг 1. Код VBA в Excel запускает исполняемый файл 1С и передает наименование или код сотрудника:
Sub Launch1CWithParameter()
Dim ShellPath As String
Dim ExecCmd As String
Dim EmployeeName As String
EmployeeName = "Иванов Иван Иванович"
' Формируем команду запуска
ExecCmd = """C:\Program Files\1cv8\8.3.23.1865\bin\1cv8.exe"" ENTERPRISE /F ""C:\Bases\DemoBase"" /N ""Администратор"" /C """ & EmployeeName & """"
Shell ExecCmd, vbNormalFocus
End Sub
Шаг 2. В конфигурации 1С в модуле управляемого приложения обрабатываем параметр запуска в событии ПриНачалеРаботыСистемы:
Процедура ПриНачалеРаботыСистемы(Отказ)
Параметр = ПараметрЗапуска;
Если ЗначениеЗаполнено(Параметр) Тогда
СотрудникСсылка = Справочники.Сотрудники.НайтиПоНаименованию(Параметр);
Если ЗначениеЗаполнено(СотрудникСсылка) Тогда
ПараметрыФормы = Новый Структура("Ключ", СотрудникСсылка);
ОткрытьФорму("Справочник.Сотрудники.ФормаОбъекта", ПараметрыФормы);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Если на компьютере пользователя не установлена платформа 1С, использовать COM-соединение или Automation-сервер невозможно. В таком случае выясним, как решить задачу с помощью веб-технологий.
Если база 1С опубликована на веб-сервере и включен интерфейс OData, то из VBA можно отправлять обычные HTTP-запросы (MSXML2.ServerXMLHTTP), получать данные о сотруднике в формате JSON или XML и генерировать гиперссылку для открытия элемента в веб-клиенте через браузер.
Выясним, какой способ выбрать для вашей задачи:
V83.Application в VBA.