Как реализовать автоматическое подключение к Диадок через API и выгрузку документов в 1С

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

В современной практике автоматизации бизнес-процессов часто возникает задача исключить ручной труд при работе с электронным документооборотом (ЭДО). Одной из наиболее востребованных задач является настройка регламентного задания в 1С, которое будет самостоятельно подключаться к системе Диадок, забирать новые входящие документы и пересылать их ответственным сотрудникам или сохранять в базу. В этой статье мы подробно разберем, как реализовать такую интеграцию, используя программный интерфейс (API) и COM-компоненту Диадок.

Инициализация подключения и создание COM-объекта

Первым делом проанализируем процесс создания связи между 1С и сервером Диадок. Для работы нам потребуется установленная на компьютере или сервере 1С библиотека DiadocApi.dll. Основным инструментом взаимодействия выступает объект Diadoc.DiadocClient. Рассмотрим базовый пример инициализации подключения, который успешно применили участники обсуждения:


// Инициализация клиента
DiadocClient = Новый COMОбъект("Diadoc.DiadocClient");

// Установка параметров доступа
DiadocClient.ApiClientId = КлючРазработчика; // Получается в техподдержке Диадока
DiadocClient.ServerUrl = "https://diadoc-api.kontur.ru";

// Выбор способа авторизации (в данном примере по логину и паролю)
Логин = "ваш_логин";
Пароль = "ваш_пароль";

Попытка
    DiadocConnection = DiadocClient.CreateConnectionByLogin(Логин, Пароль);
    Сообщить("Подключение успешно установлено!");
Исключение
    Сообщить("Ошибка подключения: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

Разберем этот код подробнее. Метод CreateConnectionByLogin создает объект соединения, через который в дальнейшем будут вызываться все методы работы с документами. Однако стоит помнить, что для регламентных заданий на сервере более безопасным и стабильным способом является авторизация по сертификату КЭП с использованием метода AuthenticateByCertificate.

Получение списка организаций

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


OrganizationList = DiadocConnection.GetOrganizationList();

Для Индекс = 0 По OrganizationList.Count - 1 Цикл
    Organization = OrganizationList.GetItem(Индекс);
    // Проверяем по ИНН или названию
    Если Organization.Inn = "1234567890" Тогда
        НужнаяОрганизация = Organization;
        Прервать;
    КонецЕсли;
КонецЦикла;

Если НужнаяОрганизация = Неопределено Тогда
    ВызватьИсключение "Организация не найдена в списке доступных!";
КонецЕсли;

Важно помнить, что объект Organization содержит уникальный идентификатор OrgId, который потребуется нам для большинства последующих запросов к документам.

Поиск и получение списка документов

Когда мы определились с организацией, перейдем к решению основной задачи: получению списка активных документов. Рассмотрим работу метода GetDocuments. Этот метод позволяет фильтровать документы по различным критериям, таким как период, тип документа или статус.

Для реализации логики "забрать все текущие активные документы" мы рекомендуем использовать фильтрацию по категории. Выясним, как это выглядит в коде:


// Создаем фильтр для поиска
Фильтр = DiadocConnection.CreateDocumentsFilter();
Фильтр.FilterCategory = "Any.Inbound"; // Выбираем все входящие
Фильтр.FromTimestamp = ТекущаяДата() - 86400; // Например, за последние сутки

// Получаем коллекцию документов
DocumentsList = НужнаяОрганизация.GetDocuments(Фильтр);

Для Индекс = 0 По DocumentsList.Count - 1 Цикл
    Документ = DocumentsList.GetItem(Индекс);
    Сообщить("Найден документ: " + Документ.FileName + " от " + Документ.DocumentDate);
    
    // Здесь можно вызвать процедуру обработки вложения
    ОбработатьВложение(Документ);
КонецЦикла;

Обратите внимание на совет из обсуждения: сервера Диадока могут работать с задержкой при первом обращении к файлу. Поэтому при получении конкретных данных рекомендуется устанавливать достаточно большой таймаут (например, 1000 секунд) и оборачивать вызовы в блок Попытка...Исключение.

Получение печатных форм (PDF) и бинарных данных

Один из самых частых вопросов — как получить визуальное представление документа (PDF с синими штампами подписей). Для этого в API предусмотрен механизм генерации печатных форм. Процесс состоит из двух этапов: отправка задания на генерацию и ожидание готовности файла.

Проанализируем алгоритм получения PDF:

  1. Вызываем метод GeneratePrintForm для нужного документа.
  2. Получаем идентификатор задания.
  3. В цикле опрашиваем статус готовности через GetPrintFormStatus.
  4. После готовности скачиваем бинарные данные.

Если же вам нужны исходные данные (например, XML-файл накладной или акта), следует использовать метод GetEntityContent, передав в него идентификатор сущности (EntityId) документа. Для работы с файлами утвержденных форматов без самостоятельной разработки обмена можно применить инструмент для групповой выгрузки и загрузки XML-файлов ЭДО.

Технические нюансы работы на 64-битных серверах 1С

Рассмотрим важную техническую проблему, с которой часто сталкиваются программисты при настройке регламентных заданий. Если ваш сервер 1С работает в 64-битном режиме, прямая попытка создать Новый COMОбъект("Diadoc.DiadocClient") может завершиться ошибкой, так как компонента Диадока является 32-битной.

Выясним, как обойти это ограничение через Службы компонентов Windows (COM+):

  1. Откройте "Службы компонентов" (dcomcnfg).
  2. Создайте новое пустое приложение COM+.
  3. В разделе "Компоненты" добавьте новую компоненту, выбрав DLL Диадока.
  4. В настройках созданного приложения на вкладке "Удостоверение" укажите пользователя, от имени которого будет запускаться объект (обычно это системная учетная запись или администратор).

После этой настройки 64-битный процесс сервера 1С сможет прозрачно обращаться к 32-битному объекту Диадока через механизм прокси-процесса dllhost.exe.

Оптимизация: использование событий (GetEvents)

Если ваше регламентное задание должно работать постоянно и оперативно реагировать на новые документы, использование GetDocuments с фильтром по дате может стать неэффективным (из-за повторной обработки одних и тех же данных). Проанализируем более продвинутый подход — работу через список событий.

Используя метод GetEvents, вы запоминаете идентификатор последнего обработанного события (LastEventId). При следующем запуске вы запрашиваете только те события, которые произошли после этого ID. Это гарантирует, что каждый документ будет обработан ровно один раз, и значительно снизит нагрузку на систему.

Таким образом, мы рассмотрели полный цикл интеграции: от инициализации COM-объекта и решения проблем с разрядностью сервера до эффективных методов получения документов и их печатных форм. Использование этих рекомендаций позволит вам создать надежную систему автоматического обмена документами в 1С. При необходимости организовать локальное хранение полученных файлов можно воспользоваться решением для ведения электронного архива документов.

← На главную