Как в 1С работать с черновиками Диадок: получение списка, подписание и отправка

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

При автоматизации электронного документооборота (ЭДО) через систему «Контур.Диадок» разработчики часто сталкиваются с необходимостью обработки документов, которые находятся в статусе черновиков. Особенно актуальна эта проблема при интеграции с EDI-системами (например, при работе с крупными торговыми сетями или корпорациями вроде «Газпромнефть»), когда документы (УПД) создаются автоматически на стороне сервиса в виде черновиков после прохождения цепочки заказа и отгрузки.

В этой статье мы подробно разберем, как реализовать работу с черновиками Диадока из учетной системы 1С. Мы проанализируем возможности стандартных модулей «Диадок.Стандарт» и «Диадок.PRO», изучим методы прямого обращения к API Диадока и рассмотрим сценарии использования интеграционного модуля «Контур.EDI».

Постановка проблемы: почему «Диадок.Стандарт» не видит черновики

Разберем типичную ситуацию, с которой сталкиваются компании. Внедрена схема обмена, при которой цепочка EDI (заказ — подтверждение — отгрузка — приемка) полностью автоматизирована через API. По завершении отгрузки в EDI-системе автоматически формируется документ УПД и помещается в Диадок в папку «Черновики». Задача разработчика — научить 1С автоматически забирать эти черновики, подписывать их действующей КЭП и отправлять контрагенту.

При попытке использовать стандартную обработку «Диадок.Стандарт» выясняется, что данный инструмент работает по принципу односторонней выгрузки («из 1С в облако»). Он умеет:

Попытки решить задачу «из коробки» стандартным модулем не принесут результата. Выясним, какие альтернативные пути существуют.

Решение 1. Использование возможностей модуля «Диадок.PRO»

Модуль «Диадок.PRO» предоставляет более гибкие механизмы за счет использования подключаемых модулей (ПМ). Рассмотрим подробнее, как здесь устроена работа с черновиками.

В архитектуре ПРО-версии используется объектная структура Пакет. При подготовке документов к отправке вызывается предопределенное событие ПослеПодготовкиПакета. Внутри этого обработчика разработчик имеет доступ к свойствам пакета.

Проанализируем пример кода в подключаемом модуле Диадок.PRO:


// Пример управления статусом черновика в модуле Диадок.PRO
Процедура ПослеПодготовкиПакета(Пакет, Отказ) Экспорт
    
    // Если нам нужно, чтобы пакет не отправлялся сразу, а сохранялся в черновиках:
    Пакет.IsDraft = Истина;
    
    // Также можно переопределить параметры отправки в зависимости от условий
    Если Пакет.ВидДокумента = "УПД" Тогда
        // Дополнительная логика обработки УПД
    КонецЕсли;

КонецПроцедуры

Важный нюанс: изменение свойства Пакет.IsDraft = Истина позволяет программно создавать черновики на сервере Диадока при выгрузке из 1С. Однако готового интерактивного интерфейса для работы со списком «чужих» или ранее созданных черновиков в модуле ПРО по умолчанию также нет. Если вам требуется полноценная синхронизация входящих черновиков, логику получения событий по типу Draft придется дописывать самостоятельно, используя методы низкоуровневого API Диадока.

Решение 2. Прямая интеграция через Diadoc API (REST-сервис)

Если вы разрабатываете собственную автоматическую систему и хотите полностью контролировать процесс без использования тяжелых типовых обработок, оптимальным решением будет прямое обращение к API Диадока. REST API предоставляет исчерпывающий набор методов для работы с черновиками. Для отладки и проверки таких HTTP-запросов к сервису прямо из базы можно использовать инструмент для тестирования REST API на платформе 1С.

Разберем по шагам алгоритм работы с черновиками через API:

  1. Поиск и получение списка черновиков.

    Если идентификаторы (ID) черновиков в 1С неизвестны, нам нужно получить их список с сервера. Для этого используются методы получения событий ящика. Мы можем применить:

    • Метод GetNewEvents (V8) с установленным фильтром по типу сообщения: messageType = Draft. Это позволит получать только новые события, связанные с созданием или изменением черновиков.
    • Метод GetDocflowEvents (V4), передавая в теле запроса структуру GetDocflowEventsRequest, в которой флаг MessageTypes установлен в значение Draft.
  2. Получение данных конкретного черновика.

    После того как мы получили список событий и определили идентификаторы пакетов (MessageId) и документов (EntityId), мы запрашиваем детальные данные по каждому документу с помощью метода GetMessage (V6). Это позволит нам проанализировать содержимое черновика перед его подписанием.

  3. Подписание и отправка черновика контрагенту.

    Для того чтобы черновик стал полноценным документом и улетел клиенту, его нужно подписать КЭП и отправить. Для этого в API Диадока предусмотрен специализированный метод SendDraft. В теле запроса передается структура DraftToSend, которая содержит:

    • Идентификатор черновика (DraftId);
    • Сформированные КЭП подписи для каждого документа в пакете;
    • Сведения о получателе и отправителе.

    Обратите внимание: черновик можно отправить через метод SendDraft только один раз. После успешного вызова черновик превращается в отправленный документ, а его статус в системе меняется.

  4. Удаление устаревших черновиков.

    Если черновик потерял актуальность (например, изменились параметры сделки и был сформирован новый документ), его необходимо удалить, чтобы он не засорял ящик организации. Для этого используется метод RecycleDraft.

Рассмотрим примерную схему вызова методов на встроенном языке 1С (псевдокод для понимания логики взаимодействия с COM-компонентой API):


// Псевдокод авторизации и отправки черновика через API Диадок
Функция ОтправитьЧерновикДиадок(ИдентификаторЧерновика, ДанныеСертификата)
    
    // Инициализируем подключение к API
    ДиадокПодключение = Новый COMОбъект("Diadoc.DiadocApi");
    Connection = ДиадокПодключение.CreateConnection(ТокенАвторизации);
    
    // Формируем структуру DraftToSend
    DraftToSend = Новый Структура;
    DraftToSend.Вставить("DraftId", ИдентификаторЧерновика);
    
    // Получаем документ для подписания
    Message = Connection.GetMessage(ИдентификаторЧерновика);
    
    // Формируем подпись с использованием КриптоПро CSP
    Подпись = СформироватьЭЦП(Message.Content, ДанныеСертификата);
    
    DraftToSend.Вставить("Signature", Подпись);
    
    // Отправляем черновик
    Попытка
        РезультатОтправки = Connection.SendDraft(DraftToSend);
        Возврат Истина;
    Исключение
        ЗаписатьВЛог("Ошибка отправки черновика: " + ОписаниеОшибки());
        Возврат Ложь;
    КонецПопытки;
    
КонецФункции

Решение 3. Использование интеграционного модуля «Контур.EDI» для 1С

Если черновики УПД в Диадоке генерируются как следствие завершения EDI-цепочки (после обработки сообщения INVOIC покупателем), то наиболее эффективным и надежным решением является использование специализированного модуля «Контур.EDI для 1С», а не стандартного модуля Диадока.

Разберем, почему этот вариант предпочтительнее:

Крайне важная деталь: настройка прав доступа в Диадоке

Очень часто разработчики сталкиваются с тем, что код написан верно, методы API вызываются без ошибок синтаксиса, но сервер возвращает ошибку доступа при попытке работать с черновиками.

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

  1. «Создавать документы и работать с черновиками» — без этой галочки методы создания черновиков и вызова SendDraft будут заблокированы на уровне прав доступа.
  2. «Удалять документы и черновики, восстанавливать документы» — это разрешение критически важно, если ваша логика подразумевает очистку базы и вызов метода RecycleDraft для удаления некорректных черновиков.

Убедитесь, что данные права предоставлены учетной записи, под которой выполняется интеграция, перед началом тестирования вашего программного кода.

Таким образом, автоматизация работы с черновиками в Диадок из 1С полностью реализуема. Вы можете пойти по пути разработки собственного решения через Diadoc API, задействовать гибкие события модуля «Диадок.PRO» или воспользоваться готовым функционалом модуля «Контур.EDI», если ваша задача тесно связана с торговыми сетями и EDI-цепочками поставки.

← На главную