Обращение к 1С из C#
13 мая 2021

Обращение к 1С из C#

Мы научили Личный Кабинет создавать базы 1С из DT, ZIP файлов и из файлов шаблонов.

Личный кабинет (далее - ядро) построен на платформе .NET. Для работы своих приложений мы используем ASP.NET MVC.

И когда перед нами стал вопрос подключения к базе 1С, первым делом мы пошли искать готовое решение на просторах интернета. Но увы, подходящего варианта не нашлось.

Методом проб и ошибок мы пришли к собственному варианту решения проблемы, о котором сейчас и расскажем.

Проблема

Различные базы 1С требуют определенную версию платформы, будь то 8.3.18.1208 или же 8.3.16.1063.

Также есть разделение на файловые и серверные базы.

При подключении для базы услуги Автообновление, ядро должно провести авторизацию в базе, прочитать метаданные, определить текущую версию релиза и определить следующую доступную версию для обновления.

Сейчас остановимся на проблеме подключения к базе и чтения метаданных.

Для обеспечения подключения к базе 1С мы остановили свой выбор на классических COM коннекторах. И столкнулись с проблемой наличия разнообразных версий платформ. COM коннектор - довольно нестабильная вещь и требует к себе повышенного внимания.

Фабрика COM компонентов

Выглядит она так:

Для каждого COM коннектора платформы 1С по пути Службы компонентов -> Компьютер -> Приложения COM+ регистрируется новый компонент и далее используется в коде по необходимости.

Компонент регистрируется стандартной утилитой Windows под названием RegSvr.

Это решение имеет право на жизнь, если в вашем случае используется 2-3 версии платформы.

Для нас оно не подошло, так как со временем версий становилось все больше, и каждый раз регистрировать их становилось все труднее.

Перерегистрация по необходимости

Это был наш второй вариант, который мы используем по сей день.

Метод подключения выглядит следующим образом:

Атрибут HandleProcessCorruptedStateExceptions позволяет отловить исключения в неуправляемом коде и не допустить падения системы.

Как это работает:

1) Первым делом формируем строку подключения к базе

  • File=\'{Путь к файлу}\';Usr=\'{Логин администратора базы}\';pwd=\'{Пароль администратора базы}\' для файловых баз
  • Srvr=\'{Адрес сервера предприятия}\';Ref=\'{Название базы}\';Usr=\'{Логин администратора базы}\';pwd=\'{Пароль администратора базы}\' для серверных баз

Далее по указанной строке будет произведено подключение к базе.

2) Вторым шагом формируем название COM коннектора для получения его экземпляра

3) Далее запускается процесс создания экземпляра COM коннектора. На выходе получаем готовый экземпляр. Остается только вызвать его метод Connect() и получить подключение к базе 1С.

Проверка регистрации экземпляра COM коннектора.

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

Как понять, что в реестре есть зарегистрированный COM коннектор нужной версии?

  • 1) В реестре по пути HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\CLSID\ID Коннектора\InprocServer32 должно быть значение.
  • 2) По тому же пути необходимо прочитать пустой ключ и взять его значение.
  • Если путь совпадает с COM коннектором нужной вам версии, то, значит, регистрировать заново ничего не нужно.

Регистрация новой версии COM коннектора.

1) Необходимо проверить наличие незавершенных процессов COM Surrogate. Делается это при помощи встроенного класса Process из пространства имен

					System.Diagnostics: 
					var comSurrogateProcesses = Process.GetProcesses().Where(pr =>
					pr.ProcessName.Equals(_dllHostProcessName.Value, StringComparison.InvariantCultureIgnoreCase));

				

где _dllHostProcessName.Value равно dllhost - стандартное название подобного рода процессов.

2) Если такие процессы есть, их необходимо завершить для высвобождения ресурсов и обеспечения корректной работы.

					comSurrogateProcesses.ToList().ForEach(process =>
					{
						try
						{
							process.Kill();
						}
						catch (Exception ex)
						{
							_logger.Error($"Ошибка завершения процесса ComSurrogate. Причина: {ex.Message}");
						}
					});

				

3) Далее нужно воспользоваться стандартной утилитой RegSvr32 и зарегистрировать необходимую версию COM коннектора.

Строка параметров для платформы 8.3.18.1208 будет выглядеть следующим образом:

/s "C:\Program Files (x86)\1cv8\8.3.18.1208\bin\comcntr.dll

Запуск процесса регистрации осуществляется опять же стандартным механизмом

4) Для обеспечения полной совместимости COM коннектора с 64 разрядной версией Windows необходимо записать в реестр дополнительные значения.

По пути HKEY_CLASSES_ROOT\WOW6432Node\CLSID{2B0C1632-A199-4350-AA2D-2AEE3D2D573A} для ключа AppID записывается ID зарегистрированного COM коннектора. В нашем случае это 2B0C1632-A199-4350-AA2D-2AEE3D2D573A

По пути HKEY_CLASSES_ROOT\Wow6432Node\AppID\ создается подраздел с ID зарегистрированного COM коннектора и внутрь записывается ключ DllSurrogate с пустым значением

Такие же действия необходимо провести по пути HKEY_LOCAL_MACHINE\Software\Classes\AppID

На этом процесс регистрации завершен.

Создание экземпляра COM коннектора

По идентификатору программы (ProgID) мы можем определить тип COM коннектора и по типу создать его экземпляр.

Как правило, для COM коннекторов 1С используется всего 2 идентификатора программы (ProgId):

  • V83.COMConnector для COM коннекторов платформы 8.3
  • V82.COMConnector для COM коннекторов платформы 8.2

Тип определяется следующим образом:

					var comConnectorType = Type.GetTypeFromProgID(comConnectorName);
				

Далее при помощи класса Activator из пространства имен System создается экземпляр объекта.

					var connectorInstance = Activator.CreateInstance(comConnectorType);
				

Использование экземпляра COM коннектора

После того как мы получили его экземпляр остается только вызвать метод Connect() и передать туда строку подключения к базе

Далее можно, например, прочитать метаданные базы так:

					_connector1C.Метаданные.Версия;
					_connector1C.Метаданные.Синоним;

				

P.S Все описанные действия содержатся в этом примере. А как и зачем использовать готовый COM коннектор, решать уже вам!

Комментарии для сайта Cackle

Сервисы 1С для работы с маркетплейсами