Чтобы вызвать код на 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)». Код класса:

csharp
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С должен принимать параметры и возвращать результат.

Настройка проекта

  1. Свойства проекта → «Сборка»: включите «Зарегистрировать для взаимодействия с COM» — Visual Studio будет регистрировать сборку при каждой сборке на машине разработчика (нужен запуск студии от администратора).
  2. В AssemblyInfo.cs можно оставить [assembly: ComVisible(false)] — тогда наружу будут видны только типы, явно помеченные ComVisible(true). Это аккуратнее, чем открывать всю сборку.
  3. «Подписывание»: создайте файл ключа строгого имени (.snk). Подпись обязательна для установки в GAC и снимает предупреждения RegAsm.
  4. Целевая платформа — Any CPU: тогда одна и та же DLL подойдёт и для 32-, и для 64-битного процесса 1С, а разрядность определится регистрацией.

Регистрация на рабочей машине

На машинах пользователей и на сервере Visual Studio нет, поэтому регистрируем вручную утилитой RegAsm из .NET Framework. Разрядность утилиты должна совпадать с разрядностью процесса 1С, который будет создавать объект.

bash
:: Для 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
COM-объект для 1С: разрядность регистрации должна совпадать с разрядностью 1С
COM-объект для 1С: разрядность регистрации должна совпадать с разрядностью 1С

Ключ /codebase записывает в реестр путь к DLL, поэтому файл должен лежать в постоянном месте, а не в папке загрузок. Если на машине работают и 32-, и 64-битные клиенты, регистрируйте обеими утилитами. Удаление регистрации — тот же вызов с ключом /unregister.

Для библиотек на современном .NET (не Framework) механизм другой: в проекте включается EnableComHosting, при сборке создаётся отдельная DLL-оболочка, и регистрируется она через regsvr32. Принцип вызова из 1С при этом тот же.

Вызов из 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-интеграцию.