При автоматизации электронного документооборота (ЭДО) через систему «Контур.Диадок» разработчики часто сталкиваются с необходимостью обработки документов, которые находятся в статусе черновиков. Особенно актуальна эта проблема при интеграции с EDI-системами (например, при работе с крупными торговыми сетями или корпорациями вроде «Газпромнефть»), когда документы (УПД) создаются автоматически на стороне сервиса в виде черновиков после прохождения цепочки заказа и отгрузки.
В этой статье мы подробно разберем, как реализовать работу с черновиками Диадока из учетной системы 1С. Мы проанализируем возможности стандартных модулей «Диадок.Стандарт» и «Диадок.PRO», изучим методы прямого обращения к API Диадока и рассмотрим сценарии использования интеграционного модуля «Контур.EDI».
Разберем типичную ситуацию, с которой сталкиваются компании. Внедрена схема обмена, при которой цепочка EDI (заказ — подтверждение — отгрузка — приемка) полностью автоматизирована через API. По завершении отгрузки в EDI-системе автоматически формируется документ УПД и помещается в Диадок в папку «Черновики». Задача разработчика — научить 1С автоматически забирать эти черновики, подписывать их действующей КЭП и отправлять контрагенту.
При попытке использовать стандартную обработку «Диадок.Стандарт» выясняется, что данный инструмент работает по принципу односторонней выгрузки («из 1С в облако»). Он умеет:
IsDraft = True);Попытки решить задачу «из коробки» стандартным модулем не принесут результата. Выясним, какие альтернативные пути существуют.
Модуль «Диадок.PRO» предоставляет более гибкие механизмы за счет использования подключаемых модулей (ПМ). Рассмотрим подробнее, как здесь устроена работа с черновиками.
В архитектуре ПРО-версии используется объектная структура Пакет. При подготовке документов к отправке вызывается предопределенное событие ПослеПодготовкиПакета. Внутри этого обработчика разработчик имеет доступ к свойствам пакета.
Проанализируем пример кода в подключаемом модуле Диадок.PRO:
// Пример управления статусом черновика в модуле Диадок.PRO
Процедура ПослеПодготовкиПакета(Пакет, Отказ) Экспорт
// Если нам нужно, чтобы пакет не отправлялся сразу, а сохранялся в черновиках:
Пакет.IsDraft = Истина;
// Также можно переопределить параметры отправки в зависимости от условий
Если Пакет.ВидДокумента = "УПД" Тогда
// Дополнительная логика обработки УПД
КонецЕсли;
КонецПроцедуры
Важный нюанс: изменение свойства Пакет.IsDraft = Истина позволяет программно создавать черновики на сервере Диадока при выгрузке из 1С. Однако готового интерактивного интерфейса для работы со списком «чужих» или ранее созданных черновиков в модуле ПРО по умолчанию также нет. Если вам требуется полноценная синхронизация входящих черновиков, логику получения событий по типу Draft придется дописывать самостоятельно, используя методы низкоуровневого API Диадока.
Если вы разрабатываете собственную автоматическую систему и хотите полностью контролировать процесс без использования тяжелых типовых обработок, оптимальным решением будет прямое обращение к API Диадока. REST API предоставляет исчерпывающий набор методов для работы с черновиками. Для отладки и проверки таких HTTP-запросов к сервису прямо из базы можно использовать инструмент для тестирования REST API на платформе 1С.
Разберем по шагам алгоритм работы с черновиками через API:
Если идентификаторы (ID) черновиков в 1С неизвестны, нам нужно получить их список с сервера. Для этого используются методы получения событий ящика. Мы можем применить:
GetNewEvents (V8) с установленным фильтром по типу сообщения: messageType = Draft. Это позволит получать только новые события, связанные с созданием или изменением черновиков.GetDocflowEvents (V4), передавая в теле запроса структуру GetDocflowEventsRequest, в которой флаг MessageTypes установлен в значение Draft.После того как мы получили список событий и определили идентификаторы пакетов (MessageId) и документов (EntityId), мы запрашиваем детальные данные по каждому документу с помощью метода GetMessage (V6). Это позволит нам проанализировать содержимое черновика перед его подписанием.
Для того чтобы черновик стал полноценным документом и улетел клиенту, его нужно подписать КЭП и отправить. Для этого в API Диадока предусмотрен специализированный метод SendDraft. В теле запроса передается структура DraftToSend, которая содержит:
DraftId);Обратите внимание: черновик можно отправить через метод SendDraft только один раз. После успешного вызова черновик превращается в отправленный документ, а его статус в системе меняется.
Если черновик потерял актуальность (например, изменились параметры сделки и был сформирован новый документ), его необходимо удалить, чтобы он не засорял ящик организации. Для этого используется метод 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);
Возврат Истина;
Исключение
ЗаписатьВЛог("Ошибка отправки черновика: " + ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
КонецФункции
Если черновики УПД в Диадоке генерируются как следствие завершения EDI-цепочки (после обработки сообщения INVOIC покупателем), то наиболее эффективным и надежным решением является использование специализированного модуля «Контур.EDI для 1С», а не стандартного модуля Диадока.
Разберем, почему этот вариант предпочтительнее:
Очень часто разработчики сталкиваются с тем, что код написан верно, методы API вызываются без ошибок синтаксиса, но сервер возвращает ошибку доступа при попытке работать с черновиками.
Выясним причину. При автоматизации работы под учетной записью API-пользователя (или конкретного сотрудника, чей сертификат/логин используется при авторизации в коде) администратор организации в веб-интерфейсе Диадока должен явно предоставить права на работу с черновиками. Проверьте следующие флажки в карточке сотрудника:
SendDraft будут заблокированы на уровне прав доступа.RecycleDraft для удаления некорректных черновиков.Убедитесь, что данные права предоставлены учетной записи, под которой выполняется интеграция, перед началом тестирования вашего программного кода.
Таким образом, автоматизация работы с черновиками в Диадок из 1С полностью реализуема. Вы можете пойти по пути разработки собственного решения через Diadoc API, задействовать гибкие события модуля «Диадок.PRO» или воспользоваться готовым функционалом модуля «Контур.EDI», если ваша задача тесно связана с торговыми сетями и EDI-цепочками поставки.