Инструкция по обращению к 1С из С#
Мы научили Личный Кабинет создавать базы 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 коннектора.
1) Необходимо проверить наличие незавершенных процессов COM Surrogate. Делается это при помощи встроенного класса Process из пространства имен
где _dllHostProcessName.Value равно dllhost — стандартное название подобного рода процессов.
2) Если такие процессы есть, их необходимо завершить для высвобождения ресурсов и обеспечения корректной работы.
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
Тип определяется следующим образом:
Далее при помощи класса Activator из пространства имен System создается экземпляр объекта.
Использование экземпляра COM коннектора
После того как мы получили его экземпляр остается только вызвать метод Connect() и передать туда строку подключения к базе

Далее можно, например, прочитать метаданные базы так:
P.S Все описанные действия содержатся в этом примере. А как и зачем использовать готовый COM коннектор, решать уже вам!
Retrieve COM ProgID from exe without registering it
I would like to extract the COM data from a VB6 application so I can register it correctly (according to Microsoft best practice) the application. I am using WiX 3.0 and heat.exe will not extract the data (known issue with heat) and I do not have ready access to the associated TLB file. The VB6 application does not have compatibility turned on so it regenerates the COM GUIDs every build (They want to have the application be able to run side by side with an older version.)
I created a C# application that will collect the TypeLib, interface and CoClass information from the VB6 application without registering it and create a wxs file for candle to use. My company has several other older applications like this and I would like to make it a more generic solution.
1.Is there a way to collect the ‘true’ ProgID (programmer intended one) from the application with out the project or TLB file and without registering it?
2.Is there a way to find out the intended Threading Model from a DLL without registering it? (I intend that it can handle all COM active items, might as well be complete) Thank you.
С++ Как получить COM-объект Coclass progid во время выполнения
Мне нужно написать функцию, которая динамически извлекает progid из COM-объекта.
Возможно ли это?
Какой лучший способ сделать это?
РЕДАКТ: Все соклассы, которые мне нужно обработать, реализуют IProvideClassInfo
Прежде всего, нет гарантии, что информация доступна на первом месте. Даже если вы просто создали экземпляр объекта с помощью ProgID, вы можете его восстановить, чтобы вернуть его.
Самый простой способ — запросить один из интерфейсов IPersist и друзей ( IPersistStream и т.д.) и вызвать IPersist::GetClassID , чтобы получить CLSID . Затем конвертируйте в ProgID с помощью ProgIDFromCLSID или через поиск в реестре.
Другой вариант — запросить IProvideClassInfo и IProvideClassInfo2 для доступа к CLSID, представляющему интерес для этого альтернативного способа.
Третий вариант, если ни один из двух выше не работал, заключается в запросе IDispatch и попытке открыть библиотеку типов, а затем повторить поиск информации о соклассе.
Как узнать progid класса com
ProgID элемента управления Windows — это имя, которое идентифицирует элемент управления в Windows. ProgID отображается в форме «Vendor.Component.Version», например «Word.Document.6». Хотя CLSID, состоящие из длинной строки цифр и букв, гарантированно уникальны, ProgID — нет; Используйте ProgID только в ситуациях программирования, когда вы не можете использовать CLSID. Идентификаторы ProgID не отображаются в графическом интерфейсе пользователя элемента управления, но могут быть перечислены в его документации. Тем не менее, Windows поддерживает список установленных ProgID в реестре Windows; найдите ProgID элемента управления с его именем, используя редактор реестра Windows.
Шаг 1
Откройте редактор реестра, нажав «Пуск», набрав «regedit» в поле поиска в меню «Пуск» и нажав «Ввод». В старых версиях Windows нажмите «Пуск», нажмите «Выполнить», введите «regedit» в поле «Выполнить» и нажмите «Ввод».
Шаг 2
Нажмите «Да» в окне приглашения контроля учетных записей, если оно появляется.
Шаг 3
Откройте диалоговое окно «Найти», нажав «Изменить» и «Найти».
Шаг 4
Введите имя элемента управления в поле «Найти что» и нажмите «Найти далее».
Шаг 5
Продолжайте поиск, нажимая клавишу «F3», пока в левой панели окна редактора реестра не откроется папка «ProgID». ProgID отображается в столбце «Данные» на правой панели окна редактора реестра.
Как найти ваш потерянный или украденный Android-смартфон с помощью функции «Найти мое устройство»

Как использовать Find My Device, чтобы найти ваш потерянный или украденный Android-смартфон или планшет. Как удаленно позвонить на устройство, заблокировать его на расстоянии и изменить его пароль или стереть.
Как получить файлы через Bluetooth и как найти их в Windows 10 Mobile

Как вы получаете файлы на Windows 10 Mobile с помощью Bluetooth? Где хранятся ваши полученные файлы? Где их найти на вашем смартфоне?
Как найти ваши яблочные часы с помощью функции найти мои часы

В неудачной ситуации, когда вы потеряете свои Apple Watch, вы можете воспользоваться функцией «Найти мои часы», чтобы найти их. И если произойдет худшее, вы можете удаленно стереть его, чтобы сохранить ваши личные данные.
Как узнать progid класса com
$process = get-process | ?
В первой строке получаем объект нужного процесса (у меня это mstsc.exe), а во второй возвращаем его PID. И в дальнейшем в качестве PID используете $process.id
Обратная операция делается так же:
$process = get-process | ?
Спасибо, но это индетификатор процесса, но не то что мне надо например:
$ie = new-object -comobject InternetExplorer.Application
Подставляя понятное дело вместо InternetExplorer.Application PID or
iexplore.exe ничего не будет а будет ошибка "Cannot load COM type explorer.exe.
"
Не уверен, что это возможно, поскольку с конкретным .exe файлом может быть связано несколько CLSID. Список всех ProgID можно посмотреть в реестре, в ветке HKCR. Т.е. привязки к исполняемому файлу нету. Есть только привязка CLSID к ProgID.
Спасибо за ответ. Я неправильно задал вопрос. Необходимо для существующего приложения майкрософт офиса (например ворда, в котором запущены документы), узнать какие доки открыты и путь к этим файлам.
А может кто-то пробовал с помощью объектов (для пакета вин.офиса), например:
$shell = New-Object -ComObject "word.Application" — данный текст создает новый объект, и он понятное дело никакой информации не предоставляет, разве что можно получить данные о
$shell.recentfiles | select-object Name,Path
Но это не то что нужно.
Каким командлетом или чем ещё можно получить необходимые данные с рабочего приложения, например Word?
С++ Как получить COM-объект Coclass progid во время выполнения
Мне нужно написать функцию, которая динамически извлекает progid из COM-объекта.
Возможно ли это?
Какой лучший способ сделать это?
РЕДАКТ: Все соклассы, которые мне нужно обработать, реализуют IProvideClassInfo
Прежде всего, нет гарантии, что информация доступна на первом месте. Даже если вы просто создали экземпляр объекта с помощью ProgID, вы можете его восстановить, чтобы вернуть его.
Самый простой способ — запросить один из интерфейсов IPersist и друзей ( IPersistStream и т.д.) и вызвать IPersist::GetClassID , чтобы получить CLSID . Затем конвертируйте в ProgID с помощью ProgIDFromCLSID или через поиск в реестре.
Другой вариант — запросить IProvideClassInfo и IProvideClassInfo2 для доступа к CLSID, представляющему интерес для этого альтернативного способа.
Третий вариант, если ни один из двух выше не работал, заключается в запросе IDispatch и попытке открыть библиотеку типов, а затем повторить поиск информации о соклассе.
Sorry, you have been blocked
This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data.
What can I do to resolve this?
You can email the site owner to let them know you were blocked. Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page.
Cloudflare Ray ID: 77bf0dc3681e22f5 • Your IP: Click to reveal 88.135.219.175 • Performance & security by Cloudflare