Интеграция с системой ЭДО Диадок часто вызывает затруднения из-за сложности архитектуры типовых модулей и специфики работы с DiadocComApi. В данном материале мы разберем, как самостоятельно реализовать алгоритм подписания документов, используя COM-объект, минуя громоздкие типовые обработки.
Когда вы разрабатываете интеграцию для нетиповой конфигурации, наиболее устойчивым решением является создание общего модуля, который управляет вызовами DiadocComApi. Это позволяет избежать проблем с динамической загрузкой кода, характерной для модуля «Диадок.ПРО», и сохранить контроль над процессом отладки.
Для начала работы с COM-библиотекой вам потребуется инициализировать объект соединения. Помните, что для корректной работы с объектами Диадока часто требуется вспомогательный объект AddIn.Diadoc.Reflector, который помогает «отразить» структуру данных, передаваемых через COM, и получить доступ к свойствам документов.
Подписание документа — это ключевой этап взаимодействия. Рассмотрим, как выполнить подписание универсального передаточного документа (УПД). Алгоритм состоит из создания задачи на подписание, идентификации содержимого и установки параметров подписанта.
Разберем процесс подписания для документов, находящихся вне закрытого пакета:
// Предполагаем, что переменная ДокументДиадок уже инициализирована
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();
КонецЦикла;
AddIn.Diadoc.Reflector для исследования динамических свойств COM-объектов. Это единственный надежный способ понять, какие свойства доступны в текущем контенте документа, не гадая по документации.COM вы получаете прямой доступ к API, обязательно оборачивайте вызовы в блоки Попытка...Исключение, чтобы отлавливать ошибки сериализации или проблемы доступа к сертификатам на ранних стадиях.ДиадокДокументы, и только после прохождения всех внутренних этапов согласования вызывайте приведенный выше алгоритм подписания.Использование COM-библиотеки требует более высокой квалификации разработчика, чем работа с «Диадок.ПРО», но именно этот путь обеспечивает максимальную гибкость для нестандартных бизнес-процессов компании.