В современной разработке на платформе 1С часто возникают задачи, которые эффективнее решать с помощью сторонних инструментов. Одной из таких задач является сложная обработка PDF-документов (см. также вариант обработки без ВК), преобразование форматов или работа со специфическими библиотеками, написанными на .NET. В рамках данной статьи мы разберем несколько способов того, как вызвать код C# из 1С, передать в него параметры и получить результат.
Это самый простой и быстрый в реализации метод. Если у вас уже есть готовый консольный проект на 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). Недостатки: накладные расходы на создание нового процесса при каждом вызове, что критично для массовой обработки.
Традиционный способ интеграции в среде Windows — создание COM-видимой библиотеки (или Python COM-объекта). Это позволяет работать с объектом C# почти так же, как с обычным объектом 1С. Выясним причину, почему это удобно: вы можете вызывать методы объекта напрямую и получать возвращаемые значения без парсинга текстовых файлов.
Для реализации этого метода необходимо выполнить следующие действия:
[ComVisible(true)].regasm.exe /codebase.Пример вызова из 1С:
Попытка
Библиотека = Новый COMОбъект("MyCSharpLibrary.PdfHelper");
Результат = Библиотека.ConvertPdf(ПутьКФайлу);
Исключение
Сообщить("Ошибка подключения библиотеки: " + ОписаниеОшибки());
КонецПопытки;
Проанализируем более современный и кроссплатформенный подход. Платформа 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 один раз.
Если ваша задача требует высокой отказоустойчивости или вы работаете в кластерной среде, рассмотрим вариант создания микросервиса на C# (например, на базе ASP.NET Core). 1С будет общаться с сервисом по протоколу HTTP.
Разберем преимущества этого подхода:
Пример вызова из 1С через HTTPСоединение:
Соединение = Новый HTTPСоединение("localhost", 5000);
Запрос = Новый HTTPЗапрос("/api/pdf/convert");
Запрос.УстановитьТелоИзСтроки("{ ""path"": """ + ПутьКФайлу + """ }");
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния = 200 Тогда
// Обработка успешного результата
КонецЕсли;
При массовой обработке тысяч PDF-файлов важно помнить про управление ресурсами. В C# за это отвечает Garbage Collector (GC). Если вы используете DLL внутри процесса 1С, неуправляемые ресурсы (дескрипторы файлов, графические контексты) могут не освобождаться мгновенно.
Посмотрим на рекомендации по оптимизации:
using в C# для объектов, реализующих IDisposable.Подводя итог, выбор метода зависит от ваших сроков и требований к производительности. Для разовых задач идеально подходит EXE. Для тесной интеграции в Windows-среде — COM. Для высокопроизводительных и современных решений — Native API или gRPC.