Чтобы вызвать код на C# из 1С, достаточно оформить класс как COM-объект: сделать его публичным и видимым для COM (атрибуты ComVisible, Guid, ProgId), собрать библиотеку классов, зарегистрировать её утилитой RegAsm с нужной разрядностью — и в 1С создать объект через Новый COMОбъект("ProgId"). Это рабочий способ подключить к 1С .NET-библиотеки: криптографию, работу с оборудованием, сторонние SDK. Ограничение — только Windows.
Ниже — минимальный COM-сервер на C#, настройка проекта, регистрация для 32- и 64-битной платформы, вызов из 1С и разбор ошибок, на которых обычно теряется полдня.
Когда COM — подходящий выбор
| Задача | COM-объект на C# | Альтернатива |
|---|---|---|
| Есть готовая .NET-библиотека или SDK, база на Windows | Подходит | — |
| Нужна работа на Linux-сервере или в веб-клиенте | Не подходит | Внешняя компонента Native API |
| Интеграция с внешней системой по сети | Избыточно | HTTP-сервисы, HTTPСоединение |
| Тиражируемое решение для многих клиентов | Неудобно: регистрация на каждой машине | Внешняя компонента в макете конфигурации |
Если база уже работает на Windows и нужно быстро подключить существующий .NET-код, COM — самый короткий путь.
Код COM-сервера
Создайте в Visual Studio проект «Библиотека классов (.NET Framework)». Код класса:
using System;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;
namespace Integration1C
{
// Интерфейс, через который 1С вызывает методы (позднее связывание через IDispatch)
[ComVisible(true)]
[Guid("3F2A8C61-5B7E-4D2A-9E4C-1A6B7D8E9F01")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IHashTools
{
[DispId(1)]
string Sha256(string text);
[DispId(2)]
string Version();
}
[ComVisible(true)]
[Guid("8B1D4E72-6C3F-4A9B-8D5E-2F7A1C3B4D02")]
[ProgId("Integration1C.HashTools")]
[ClassInterface(ClassInterfaceType.None)]
public class HashTools : IHashTools
{
public string Sha256(string text)
{
using (var sha = SHA256.Create())
{
byte[] hash = sha.ComputeHash(Encoding.UTF8.GetBytes(text ?? ""));
return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
}
}
public string Version()
{
return "1.0.0";
}
}
}Что здесь важно:
- Интерфейс и класс —
public, иначе COM их не увидит. Guidу интерфейса и класса — свои, уникальные. Сгенерируйте их утилитой «Создать GUID» в Visual Studio или командой[guid]::NewGuid()в PowerShell. Не копируйте GUID из чужих примеров: две библиотеки с одинаковым GUID будут конфликтовать в реестре.ProgId— имя, по которому 1С создаёт объект. Если не указать, будет использованоПространство.Класс.InterfaceIsIDispatch— 1С вызывает методы через позднее связывание, ему нуженIDispatch.- Без окон. В примерах часто показывают
MessageBox, но на сервере 1С окно не увидит никто, а процесс зависнет в ожидании. COM-объект для 1С должен принимать параметры и возвращать результат.
Настройка проекта
- Свойства проекта → «Сборка»: включите «Зарегистрировать для взаимодействия с COM» — Visual Studio будет регистрировать сборку при каждой сборке на машине разработчика (нужен запуск студии от администратора).
- В
AssemblyInfo.csможно оставить[assembly: ComVisible(false)]— тогда наружу будут видны только типы, явно помеченныеComVisible(true). Это аккуратнее, чем открывать всю сборку. - «Подписывание»: создайте файл ключа строгого имени (
.snk). Подпись обязательна для установки в GAC и снимает предупреждения RegAsm. - Целевая платформа —
Any CPU: тогда одна и та же DLL подойдёт и для 32-, и для 64-битного процесса 1С, а разрядность определится регистрацией.
Регистрация на рабочей машине
На машинах пользователей и на сервере Visual Studio нет, поэтому регистрируем вручную утилитой RegAsm из .NET Framework. Разрядность утилиты должна совпадать с разрядностью процесса 1С, который будет создавать объект.
:: Для 64-битного клиента или сервера 1С
%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe Integration1C.dll /codebase /tlb
:: Для 32-битного клиента 1С
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe Integration1C.dll /codebase /tlb
Ключ /codebase записывает в реестр путь к DLL, поэтому файл должен лежать в постоянном месте, а не в папке загрузок. Если на машине работают и 32-, и 64-битные клиенты, регистрируйте обеими утилитами. Удаление регистрации — тот же вызов с ключом /unregister.
Для библиотек на современном .NET (не Framework) механизм другой: в проекте включается EnableComHosting, при сборке создаётся отдельная DLL-оболочка, и регистрируется она через regsvr32. Принцип вызова из 1С при этом тот же.
Вызов из 1С
// Возвращает SHA-256 строки через COM-объект на C#.
Функция ХешSHA256(Текст) Экспорт
Попытка
Инструменты = Новый COMОбъект("Integration1C.HashTools");
Исключение
ВызватьИсключение СтрШаблон(
НСтр("ru = 'Не удалось создать COM-объект Integration1C.HashTools. Проверьте регистрацию библиотеки и её разрядность.
|%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат Инструменты.Sha256(Текст);
КонецФункцииГде выполнять такой код:
- На клиенте — объект создаётся в процессе клиента 1С, регистрация нужна на каждом рабочем месте. Веб-клиент
COMОбъектне поддерживает. - На сервере — объект создаётся в рабочем процессе сервера 1С (rphost) под учётной записью службы. Регистрация нужна на всех рабочих серверах кластера, разрядность — как у сервера 1С. Обычно этот вариант удобнее: одна регистрация вместо десятков.
Типы данных передаются автоматически: строки, числа, булево и даты конвертируются в соответствующие типы .NET. Сложные структуры удобнее передавать строкой JSON и разбирать на стороне C#.
Если объект нужен многократно в одном сеансе, создавайте его один раз и переиспользуйте, а не вызывайте Новый COMОбъект в цикле: создание объекта заметно дороже вызова метода.
Типичные ошибки
- «Недопустимая строка с указанием класса». Объект не зарегистрирован в той ветке реестра, которую видит процесс 1С: не та разрядность
RegAsmили регистрация не выполнялась на этой машине. - Объект создаётся, но методов нет. Интерфейс не публичный, не
ComVisibleили не поддерживаетIDispatch. - Работает у разработчика, не работает на сервере. На сервере не зарегистрирована DLL, нет нужной версии .NET Framework или у учётной записи службы 1С нет доступа к папке с библиотекой.
- Сервер 1С «зависает» на вызове. В коде C# открывается окно или ожидается ввод пользователя.
- После обновления DLL старое поведение. Файл заблокирован работающим процессом rphost — перезапустите рабочие процессы или службу сервера 1С.
- Конфликт GUID. GUID скопирован из примера и уже используется другой библиотекой.
Настройку серверной части, включая регистрацию компонентов на всех рабочих серверах кластера, я делаю в рамках обслуживания сервера 1С. Если же задача — обмен с внешней системой, обычно правильнее не COM, а интеграция по API.
Коротко
- COM-объект на C# для 1С — публичный класс с атрибутами
ComVisible,Guid,ProgIdи интерфейсомIDispatch. - Регистрация —
RegAsm /codebaseтой же разрядности, что и процесс 1С; при необходимости обеими версиями. - В 1С объект создаётся через
Новый COMОбъект("ProgId")на Windows-клиенте или Windows-сервере. - Никаких окон в коде COM-объекта: только параметры и возвращаемые значения.
- Для Linux, веб-клиента и тиражных решений выбирайте внешние компоненты Native API или HTTP-интеграцию.




