Как реализовать обмен с Диадоком через COM-библиотеку для самописных конфигураций?

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

Интеграция с системой ЭДО Диадок часто вызывает затруднения из-за сложности архитектуры типовых модулей и специфики работы с DiadocComApi. В данном материале мы разберем, как самостоятельно реализовать алгоритм подписания документов, используя COM-объект, минуя громоздкие типовые обработки.

Подход к реализации интеграции

Когда вы разрабатываете интеграцию для нетиповой конфигурации, наиболее устойчивым решением является создание общего модуля, который управляет вызовами DiadocComApi. Это позволяет избежать проблем с динамической загрузкой кода, характерной для модуля «Диадок.ПРО», и сохранить контроль над процессом отладки.

Для начала работы с COM-библиотекой вам потребуется инициализировать объект соединения. Помните, что для корректной работы с объектами Диадока часто требуется вспомогательный объект AddIn.Diadoc.Reflector, который помогает «отразить» структуру данных, передаваемых через COM, и получить доступ к свойствам документов.

Алгоритм подписания документа через COM-API

Подписание документа — это ключевой этап взаимодействия. Рассмотрим, как выполнить подписание универсального передаточного документа (УПД). Алгоритм состоит из создания задачи на подписание, идентификации содержимого и установки параметров подписанта.

Разберем процесс подписания для документов, находящихся вне закрытого пакета:


// Предполагаем, что переменная ДокументДиадок уже инициализирована
ReplySendTask = ДокументДиадок.CreateReplySendTask2("AcceptDocument");
Reflector = Новый ComОбъект("AddIn.Diadoc.Reflector");

// Получаем элементы пакета
МассивItem = ПолучитьМассивИзКоллекции(ReplySendTask.ContentItems);

Для каждого Item Из МассивItem Цикл
    Content = Item.Content;
    TypeDesc = Reflector.Describe(Content);
    МассивСвойств = TypeDesc.GetPropertiesNames();
    ИмяСвойства = МассивСвойств.GetItem(0);
    
    Doc = Content[ИмяСвойства];
    Doc.DocumentCreator = Организация.НаименованиеПолное;
    Doc.OperationContent = "Реализация";
    
    Signers = Doc.Signers;
    Signers.AddItems();
    
    SignerReference = Signers.items.GetItem(0).SignerReference;
    SignerReference.BoxId = ОрганизацияДиадок.Id;
    SignerReference.CertificateThumbprint = ОрганизацияДиадок.Certificate.Thumbprint;
    
    ReplySendTask.Send();
КонецЦикла;

Особенности подписания в закрытом пакете

Если документ уже упакован в закрытый пакет, процедура незначительно меняется: нам необходимо сначала получить объект пакета, а затем инициализировать задачу на ответ.


// Если документ находится в закрытом пакете
ПакетДиадок = ДокументДиадок.GetDocumentPackage();
ReplySendTask = ПакетДиадок.CreateReplySendTask2("AcceptDocument");
Reflector = Новый ComОбъект("AddIn.Diadoc.Reflector");

МассивItem = ПолучитьМассивИзКоллекции(ReplySendTask.ContentItems);
Для каждого Item Из МассивItem Цикл
    Content = Item.Content;
    TypeDesc = Reflector.Describe(Content);
    МассивСвойств = TypeDesc.GetPropertiesNames();
    ИмяСвойства = МассивСвойств.GetItem(0);
    
    // Пропускаем метаданные типа
    Если ИмяСвойства = "Type" Тогда
        Продолжить;
    КонецЕсли;
    
    Doc = Content[ИмяСвойства];
    // Заполнение данных подписанта
    Doc.DocumentCreator = Организация.НаименованиеПолное;
    Signers = Doc.Signers;
    Signers.AddItems();
    
    SignerReference = Signers.items.GetItem(0).SignerReference;
    SignerReference.BoxId = ОрганизацияДиадок.Id;
    SignerReference.CertificateThumbprint = ОрганизацияДиадок.Certificate.Thumbprint;
    
    ReplySendTask.Send();
КонецЦикла;

Рекомендации по отладке и развитию системы

  1. Использование Reflector: Всегда используйте AddIn.Diadoc.Reflector для исследования динамических свойств COM-объектов. Это единственный надежный способ понять, какие свойства доступны в текущем контенте документа, не гадая по документации.
  2. Обработка ошибок: Поскольку при работе с COM вы получаете прямой доступ к API, обязательно оборачивайте вызовы в блоки Попытка...Исключение, чтобы отлавливать ошибки сериализации или проблемы доступа к сертификатам на ранних стадиях.
  3. Интеграция с внутренним согласованием: Если ваша бизнес-логика требует многоэтапного согласования, реализуйте этот процесс в собственной учетной системе. Храните входящие документы в справочнике ДиадокДокументы, и только после прохождения всех внутренних этапов согласования вызывайте приведенный выше алгоритм подписания.
  4. Отладка модулей Контура: Если вы решите использовать части кода из типовых обработок, не забывайте про флаг «Отладка» в настройках модуля интеграции. Это позволит выгрузить скрытые модули во временные файлы и полноценно использовать отладчик 1С.

Использование COM-библиотеки требует более высокой квалификации разработчика, чем работа с «Диадок.ПРО», но именно этот путь обеспечивает максимальную гибкость для нестандартных бизнес-процессов компании.

← На главную