Как организовать взаимодействие 1С с кодом на C# для обработки файлов

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В современной разработке на платформе 1С часто возникают задачи, которые эффективнее решать с помощью сторонних инструментов. Одной из таких задач является сложная обработка PDF-документов (см. также вариант обработки без ВК), преобразование форматов или работа со специфическими библиотеками, написанными на .NET. В рамках данной статьи мы разберем несколько способов того, как вызвать код C# из 1С, передать в него параметры и получить результат.

Способ 1. Запуск исполняемого файла (EXE) с параметрами

Это самый простой и быстрый в реализации метод. Если у вас уже есть готовый консольный проект на C#, вы можете скомпилировать его в исполняемый EXE-файл и вызывать напрямую из кода 1С. Рассмотрим, как это сделать. Проанализируем ситуацию: нам нужно передать путь к файлу в качестве аргумента командной строки.

На стороне C# код получения аргумента будет выглядеть примерно так:


static void Main(string[] args)
{
    if (args.Length > 0)
    {
        string filePath = args[0];
        // Логика обработки PDF
    }
}

На стороне 1С мы используем метод ЗапуститьПриложение. Разберем по шагам создание команды:


ПутьКПрограмме = "C:\MyConverter\PdfProcessor.exe";
ПутьКФайлу = "C:\Docs\Report.pdf";

// Важно обернуть пути в кавычки, если в них могут быть пробелы
КомандаЗапуска = """" + ПутьКПрограмме + """ """ + ПутьКФайлу + """";

ЗапуститьПриложение(КомандаЗапуска, , Истина); // Истина — ждать завершения

Преимущества: простота, отсутствие необходимости регистрации DLL в системе (как в решении на базе Poppler). Недостатки: накладные расходы на создание нового процесса при каждом вызове, что критично для массовой обработки.

Способ 2. Использование COM-объектов

Традиционный способ интеграции в среде Windows — создание COM-видимой библиотеки (или Python COM-объекта). Это позволяет работать с объектом C# почти так же, как с обычным объектом 1С. Выясним причину, почему это удобно: вы можете вызывать методы объекта напрямую и получать возвращаемые значения без парсинга текстовых файлов.

Для реализации этого метода необходимо выполнить следующие действия:

  1. В проекте C# пометить класс и методы атрибутом [ComVisible(true)].
  2. Подписать сборку (Strong Name).
  3. Зарегистрировать библиотеку в системе с помощью утилиты regasm.exe /codebase.

Пример вызова из 1С:


Попытка
    Библиотека = Новый COMОбъект("MyCSharpLibrary.PdfHelper");
    Результат = Библиотека.ConvertPdf(ПутьКФайлу);
Исключение
    Сообщить("Ошибка подключения библиотеки: " + ОписаниеОшибки());
КонецПопытки;

Способ 3. Создание внешней компоненты (Native API)

Проанализируем более современный и кроссплатформенный подход. Платформа 1С поддерживает технологию Native API. Раньше такие компоненты писались преимущественно на C++, но с выходом .NET 5/6/7/8 и технологии NativeAOT мы можем создавать полноценные нативные DLL на C#.

Рассмотрим возможности NativeAOT. Этот механизм компилирует C# код в машинный код, который не требует наличия установленного .NET Runtime на целевой машине. Используя атрибут [UnmanagedCallersOnly], мы можем экспортировать функции, которые 1С воспримет как родные методы внешней компоненты.

Пример структуры экспорта функции:


[UnmanagedCallersOnly(EntryPoint = "CallMethod")]
public static unsafe bool CallMethod(byte* methodName, byte* paramsArray)
{
    // Реализация взаимодействия с 1С
    return true;
}

Этот способ является наиболее производительным для массовой обработки данных, так как библиотека загружается в адресное пространство процесса 1cv8.exe или rphost.exe один раз.

Способ 4. Микросервисная архитектура (HTTP/gRPC)

Если ваша задача требует высокой отказоустойчивости или вы работаете в кластерной среде, рассмотрим вариант создания микросервиса на C# (например, на базе ASP.NET Core). 1С будет общаться с сервисом по протоколу HTTP.

Разберем преимущества этого подхода:

Пример вызова из 1С через HTTPСоединение:


Соединение = Новый HTTPСоединение("localhost", 5000);
Запрос = Новый HTTPЗапрос("/api/pdf/convert");
Запрос.УстановитьТелоИзСтроки("{ ""path"": """ + ПутьКФайлу + """ }");
Ответ = Соединение.ОтправитьДляОбработки(Запрос);

Если Ответ.КодСостояния = 200 Тогда
    // Обработка успешного результата
КонецЕсли;

Оптимизация массовой обработки и управление памятью

При массовой обработке тысяч PDF-файлов важно помнить про управление ресурсами. В C# за это отвечает Garbage Collector (GC). Если вы используете DLL внутри процесса 1С, неуправляемые ресурсы (дескрипторы файлов, графические контексты) могут не освобождаться мгновенно.

Посмотрим на рекомендации по оптимизации:

  1. Всегда используйте конструкцию using в C# для объектов, реализующих IDisposable.
  2. При использовании EXE-файлов старайтесь передавать список файлов в одном запуске, а не запускать процесс на каждый отдельный файл.
  3. Для взаимодействия через DLL рассмотрите использование Named Pipes (именованных каналов) — это позволит держать один процесс C# открытым и передавать в него команды мгновенно.

Подводя итог, выбор метода зависит от ваших сроков и требований к производительности. Для разовых задач идеально подходит EXE. Для тесной интеграции в Windows-среде — COM. Для высокопроизводительных и современных решений — Native API или gRPC.

← На главную