HTTP API Диадок. Загружаем в Диадок любой документ. Посредством POST и GET запросов

12.10.20

Интеграция - Внешние источники данных

Поставили задачу через HTTP API Диадок (diadoc-api.kontur.ru) отправить любой файл в Диадок и подписать его (например, служебную записку в формате пдф). Посредством POST и GET запросов.

Скачать файлы

Наименование Файл Версия Размер
HTTP API Диадок. Загружаем в Диадок любой документ. Посредством POST и GET запросов.:
.epf 43,49Kb
118
.epf 1 43,49Kb 118 Скачать

Продолжаю разбирать API Диадок. 

Для работы с HTTP API нужно получить Ключ разработчика (ddauth_api_client_id).

1. Сначала нужно авторизоваться в API и получить token.

Про авторизацию можно прочитать в моей первой статье про API Диадок:

HTTP API Диадок. Пример авторизации и обращения к методам посредством POST и GET запросов

2. Передадим документ в диадок.

Для этого используем POST- запрос метод /V3/PostMessage

В теле POST-запроса передаем json в котором содержатся двоичные данные файла и параметры.

/V3/PostMessage можно послать внешним и внутренним получателям. За это отвечает параметр IsInternal = true.

Меня интересуют внутренние получатели организации.

Чтобы послать  нужно знать   параметры: FromBoxId, FromDepartmentId, ToDepartmentId.

FromDepartmentId и ToDepartmentId: Это отделы в организации, которые можно создать через Личный кабинет. Их ID можно узнать GET-запросом методом /GetMyOrganizations.(обработка кнопка ПолучитьСтрктуруОрганизации)

После выполнения. Метод нам вернет messageId, entityId.

(обработка кнопка ОтправитьФайл)

3. Далее подписываем документ учетной записью под которой авторизируемся (ЛогинНаСайтДиадок) и отправляем его конкретному пользователю.

Для этого используем POST- запрос метод /V3/PostMessagePatch

В тело устанавливаем json с параметрами: BoxId , messageId, entityId, TargetUserId, Type.

TargetUserId можно посмотреть тут веб-версии Диадока  в раздел "Настройки и оплата" -> "Сотрудники" -> "Скачать список сотрудников" и первый столбец в скачанном файле и будет ID пользователей.

(обработка кнопка ОтправитьНаПодпись)

После выполнения метода в веб-версии Диадока  во входящих TargetUserId будет сообщение с прикрепленным файлом.

Тестировал на платформе 1С:Предприятие 8.3 (8.3.13.1513)

API Диадок Контур POST запрос GET

См. также

Перенос данных из Парус 8 в ЗГУ 3

Зарплата Внешние источники данных Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

84000 руб.

19.08.2020    22449    19    1    

22

Перенос данных из Парус 10 в ЗГУ ред.3

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Обмен между базами 1C Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    9208    9    8    

10

Перенос данных из Парус 7.хх в ЗГУ ред.3

Внешние источники данных Зарплата Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 7.хх учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

24000 руб.

24.04.2017    48701    97    163    

86

Перенос начальных остатков из Парус 7.71 в БГУ

Внешние источники данных Взаиморасчеты Учет ОС и НМА Логистика, склад и ТМЦ Бюджетный учет Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 2.0 1С:Бухгалтерия государственного учреждения Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Перенос словарей и начальных остатков из ПП Парус-Бухгалтерия Бюджет 7.71 в 1Сv8 БГУ2. Заполнение словарей и документов по вводу начальных остатков. Не требуется установка ПП Парус7. Возможна дозагрузка. Позволит автоматически и наиболее полно ввести данные в программу для начала работы. 

15600 руб.

08.12.2011    81567    128    123    

147

Перенос данных из Парус 10 (Торнадо) в ЗГУ ред.3 через Excel

Внешние источники данных Загрузка и выгрузка в Excel Зарплата Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате из Парус 10(Торнадо) учреждений через файлы Excel в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ). В принципе, обработка может быть использована для загрузки из файлов Excel, полученных из любых информационных систем.

24000 руб.

16.11.2018    30002    20    31    

21

Загрузка спецификаций в УНФ из системы Базис-мебельщик

Производство готовой продукции (работ, услуг) Внешние источники данных Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 Лесное и деревообрабатывающее хозяйство Россия Управленческий учет Платные (руб)

Обработка предназначена для загрузки файлов, выгруженных из системы Базис-мебельщик, в справочник "Спецификации" для последующих процессов учета и диспетчирования полуфабрикатов и изделий.

7200 руб.

24.06.2021    19127    52    50    

29
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. memb3r 28.01.19 15:50 Сейчас в теме
/ShelfUpload не используете?

С сайта Диадок:
Следует придерживаться следующей схемы использования структуры SignedContent. Если подписываемый документ имеет небольшой размер (не превышает 500Кб), его бинарное представление можно разместить непосредственно в структуре SignedContent в поле Content.

Если же размер документа не укладывается в эти ограничения, следует предварительно загрузить этот документ на «полку документов» при помощи серии вызовов ShelfUpload, а затем указать имя документа на «полке» в поле NameOnShelf структуры SignedContent.
2. memb3r 28.01.19 15:54 Сейчас в теме
- TargetUserId можно посмотреть тут веб-версии Диадока в раздел "Настройки и оплата" -> "Сотрудники" -> "Скачать список сотрудников" и первый столбец в скачанном файле и будет ID пользователей.


Список сотрудников с данными (с UserId) можно получить с помощью:
GET /GetEmployees
3. John_d 5277 28.01.19 16:07 Сейчас в теме
(2) Спасибо, может пригодиться.
4. Vida 15 16.05.19 08:51 Сейчас в теме
Добрый день!

Я правильно понимаю, что перед PostMessage сначала вызывается ShelfUpload?

Если вызвать ShelfUpload и указать параметр nameOnShelf=__userId__/xyz, где __userId__ - это строковый литерал, то физическое имя файла будет user_private_files/{userId}/xyz. {userId} возьмется из текущего авторизационного токена. К таким файлам можно получить доступ через ShelfDownload, указав nameOnShelf=__userId__/xyz.


Не понимаю откуда брать параметры xyz.
Смотрела в браузере эти цифры каждый раз разные, но откуда инициализируются?
5. memb3r 09.01.20 15:04 Сейчас в теме
(4)
nameOnShelf

Эти цифры вы сами "генерируете". Как написано, по этому адресу вы можете получить доступ через nameOnShelf=__userId__/"ваши уникальные цифры".
Я делал примерно так:
ИмяФайлаНаПолке = Строка(Новый УникальныйИдентификатор())
__userId__ + ИмяФайлаНаПолке 
6. memb3r 09.01.20 15:07 Сейчас в теме
(4)
nameOnShelf=__userId__/xyz

Если ещё актуально - напишите мне в личку.
7. user1364624 19.02.20 06:56 Сейчас в теме
Здравствуйте.
Идет отправка уже подписанного документа, как я понял. А как отправить не подписанный документ?
8. Somebody1 68 20.03.20 15:35 Сейчас в теме
9. mvgfirst 6 12.10.20 11:35 Сейчас в теме
А это нормально что в исходниках этой обработки вы зашили свой "ключ разработчика"?
Конкретно в методе "Получить Организацию".

И есть некоторые неоднозначности в прочтении.
В статье написано "Далее подписываем документ учетной записью...."
Что это значит?!

При отправке этого метода произойдет автоматическое подписание ранее-отправленного документа?
Или будет отправлен запрос на подпись конкретному сотруднику?

Судя по исходникам (если я правильно понял) - выполняется отправка неподписанного документа на подпись другому сотруднику.

Но Вы пишете "Далее подписываем..."
Что же на самом деле будет выполнено по кнопке "Отправить на подпись"?
10. John_d 5277 12.10.20 12:51 Сейчас в теме
(9) Спасибо.
Именно так: выполняется отправка неподписанного документа на подпись другому сотруднику.
11. gnp90 03.12.20 12:11 Сейчас в теме
Добрый день, помогите пожалуйста уже всю голову сломал.
Есть документы в черновиках, знаю DraftID и EntityId, который появится в виде УПД после черновика.

Выполняю отправку методом /SendDraft, указываю подпись и отправляю. Документ отправляется и вроде даже подписывается НО в Исходящих на УПД висит ошибка, "Ошибка подписи" с сообщением "ФИО подписанта в документе не совпадает с ФИО владельца электронной подписи" по скаченной XML видно что нет данных о подписанте, т.е. они не внеслись туда. Тех. поддержка конечно не помогает, т.к. консультация по API платная. Собственно вопрос что я делаю не так и как делать правильно чтобы черновик подписался и отправился?:)

///Подключаем COM, компонента работает с криптоключами с компа
Попытка
    comStore = Новый COMОбъект("CAdESCOM.Store");
    comCPSigner = Новый COMОбъект("CAdESCOM.CPSigner"); // Аналог "CAPICOM.Signer".
    comSignedData = Новый COMОбъект("CAdESCOM.CadesSignedData");
Исключение
     Сообщить("Не установлен КриптоПро!");
     Возврат ;
КонецПопытки;

/// Тут получаем чистую подпись ранее подключенной КОМ
comCPSigner.Certificate = comСертификат;
comSignedData.Content = СтрДляПодписи;
ПодписанныеДанные = comSignedData.SignCades(
        comCPSigner, // Signer
        1, // CadesType, CADESCOM_CADES_BES.
        Истина, // bDetached - "флаг открепленной подписи (исходное сообщение не включается в итоговый CMS-контейнер)". Тут я получил чистую подпись
        ); // EncodingType - по умолчанию CAPICOM_ENCODE_BASE64
		
ЗапросWeb = Новый HTTPЗапрос("/SendDraft");
ЗапросWeb.Заголовки.Вставить("Authorization","DiadocAuth ddauth_api_client_id="+ApiKey1+",ddauth_token="+Token);
ЗапросWeb.Заголовки.Вставить("Content-Type", "application/json");

///Собираем структуру для запроса
ЗаписьJOIN = Новый ЗаписьJSON;
ЗаписьJOIN.УстановитьСтроку();
DraftToSend = новый Структура;
DraftToSend.Вставить("BoxId",BoxId);
DraftToSend.Вставить("DraftId",draftId);
Подписи = новый Массив;
Подпись = новый Структура;
Подпись.Вставить("ParentEntityId",EntityId);
Подпись.Вставить("Signature",ПодписанныеДанные);
Подписи.Добавить(Подпись);
DraftToSend.Вставить("DocumentSignatures",Подписи);
ЗаписатьJSON(ЗаписьJOIN,DraftToSend);
СтрокаДляЗапроса = ЗаписьJOIN.Закрыть();

ЗапросWeb.УстановитьТелоИзСтроки(СтрокаДляЗапроса,КодировкаТекста.UTF8);

ОтветWeb = Соединение.ОтправитьДляОбработки(ЗапросWeb);
Если (ОтветWeb.КодСостояния <> 200) Тогда
	Сообщить("Нам вернули код: " + ОтветWeb.КодСостояния);
	Сообщить(ОтветWeb.ПолучитьТелоКакСтроку());
иначе
	к = ОтветWeb.ПолучитьТелоКакСтроку("windows-1250"); ///в ответ возращается Xml самой УПД, подписантов тютю
КонецЕсли;
Показать
12. tva120 3 08.03.21 00:44 Сейчас в теме
(11) А что у вас содержится СтрДляПодписи?
13. spiller26 14.07.21 14:29 Сейчас в теме
(11) Где вы брали документацию по запросам к api диадока, т.к. их документация на сайте ужасная.
14. vsyaschenko 16.11.21 10:27 Сейчас в теме
(11) Приветствую. Получилось ли решить эту задачу? Если да, можете поделиться кодом?
15. CagoBHuK 32 09.03.22 13:24 Сейчас в теме
(11) Вас спасет PrepareDocumentsToSign. Отказ, ОписаниеОшибки - понятно. РезультатАвторизации содержит информацию по ключу АПИ и логину с паролем, с остальными параметрами должно быть понятно по их названию.

Функция   PrepareDocumentsToSign(Отказ, ОписаниеОшибки, РезультатАвторизации, BoxId, MessageId, entityId, ДвоичныеДанныеСертификата, Руководитель) Экспорт
	PrepareDocumentsToSignRequest = Новый Структура;
	PrepareDocumentsToSignRequest.Вставить("BoxId", BoxId);
	//Заполняем структура черновика для патчинга
	DraftDocuments = Новый Массив;
	//Описываем наш черновик.
	DraftDocumentToPatch = Новый Структура;
	DocumentId = Новый Структура;
	DocumentId.Вставить("MessageId", MessageId);
	DocumentId.Вставить("EntityId", EntityId);
	DraftDocumentToPatch.Вставить("DocumentId", DocumentId);
	DraftDocumentToPatch.Вставить("ExtendedSigner", Новый Массив); 
	//ФИО руководителя
	ExtendedSignerDetails = Новый Структура;
	ExtendedSignerDetails.Вставить("Surname", Руководитель.Фамилия);
	ExtendedSignerDetails.Вставить("FirstName", Руководитель.Имя);
	ExtendedSignerDetails.Вставить("Patronymic", Руководитель.Отчество);
	ExtendedSignerDetails.Вставить("JobTitle", "Генеральный директор");
	ExtendedSignerDetails.Вставить("SignerType", 1);
	ExtendedSignerDetails.Вставить("SignerPowers", 5);
	ExtendedSignerDetails.Вставить("SignerStatus", 1);
	//Информация о подписанте
	ExtendedSigner = Новый Структура; 
	ExtendedSigner.Вставить("SignerCertificate", Base64Строка(ДвоичныеДанныеСертификата));
	ExtendedSigner.Вставить("ExtendedSignerDetails", ExtendedSignerDetails);
	DraftDocumentToPatch.ExtendedSigner.Добавить(ExtendedSigner); //Тоже необязательный
	DraftDocuments.Добавить(DraftDocumentToPatch);
	//Добавляем массив черновиков в запрос.
	PrepareDocumentsToSignRequest.Вставить("DraftDocuments", DraftDocuments);
	//Отправляем запрос.
	Тело = омСериализацияДесериализация.СериализоватьJson(PrepareDocumentsToSignRequest);
	Ответ = ВыполнитьЗапрос(Отказ, ОписаниеОшибки, "POST", "/PrepareDocumentsToSign", РезультатАвторизации, Тело);
	Возврат Ответ;
КонецФункции
Показать

Рекомендую, также, пересмотреть подход к сертификатам: используйте все-таки 1Совские объекты.
Функция   ПолучитьДействующийСертификатПоИнн(ИНН) Экспорт
	МассивСертификатов = ПолучитьСписокСертификатов(ТипМенеджераКриптографии());
	Для Каждого Сертификат ИЗ МассивСертификатов Цикл
		Если Ложь Тогда
			//Для формата
		ИначеЕсли Сертификат.Субъект.Свойство("OID1_2_643_100_4")  		И Прав(Сертификат.Субъект.OID1_2_643_100_4		, СтрДлина(ИНН)) = ИНН Тогда
			Возврат Сертификат;	
		ИначеЕсли Сертификат.Субъект.Свойство("OID1_2_643_3_131_1_1")	И Прав(Сертификат.Субъект.OID1_2_643_3_131_1_1	, СтрДлина(ИНН)) = ИНН Тогда
			Возврат Сертификат;	
		КонецЕсли;
	КонецЦикла;
КонецФункции

Функция   ПодписатьДвоичныеДанные(Сертификат, ДанныеДляПодписания, ВключатьСертификатВСоставПодписи) Экспорт
	ТипыХранилищ = Новый Массив;
	ТипыХранилищ.Добавить(ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты);
	ТипыХранилищ.Добавить(ТипХранилищаСертификатовКриптографии.СертификатыПолучателей);
	МенеджерКриптографии = Новый МенеджерКриптографии("", "", ТипМенеджераКриптографии(), ИспользованиеИнтерактивногоРежимаКриптографии.НеИспользовать);
	Если ВключатьСертификатВСоставПодписи Тогда
		МенеджерКриптографии.ВключениеСертификатовВПодпись = РежимВключенияСертификатовКриптографии.ВключатьПолнуюЦепочку;
	КонецЕсли;
	//Нужно перевести все в двоичные данные.
	Если Ложь Тогда
		//Для формата
	ИначеЕсли ТипЗнч(ДанныеДляПодписания) = Тип("ДвоичныеДанные") Тогда	
		ЧтоПодписываем = ДанныеДляПодписания;
	ИначеЕсли ТипЗнч(ДанныеДляПодписания) = Тип("Строка") Тогда
		ЧтоПодписываем = ДанныеДляПодписания;
	КонецЕсли;
	//Пробуем подписать
	ВозвратноеЗначение = МенеджерКриптографии.Подписать(ЧтоПодписываем, Сертификат);
	Возврат ВозвратноеЗначение;
КонецФункции
Показать
16. sanfoto 502 19.07.22 09:38 Сейчас в теме
Нормально получать инфу код ниже. Важно ""application/json""

АдресСайта = "diadoc-api.kontur.ru/GetMyOrganizations";
	HTTPЗапрос2 = Новый HTTPЗапрос;
	HTTPЗапрос2.Заголовки.Вставить("GET /GetMyOrganizations HTTP/1.1");
	HTTPЗапрос2.Заголовки.Вставить("Host", "diadoc-api.kontur.ru");
	HTTPЗапрос2.Заголовки.Вставить("Authorization", "DiadocAuth ddauth_api_client_id="+ddauth_api_client+",ddauth_token="+ПолеДокумента1);
	
	HTTPЗапрос2.Заголовки.Вставить("Accept",		"application/json");  // без этого вернется протобуфер
	HTTPЗапрос2.Заголовки.Вставить("Content-Type",	"application/json; charset=utf-8");
Показать
JetBrain; +1 Ответить
19. JetBrain 78 24.02.24 20:20 Сейчас в теме
(16) Запрос немного поправить можно, чтобы использовать только одно соединение:
        ЗапросHTTP = Новый HTTPЗапрос();	
	ЗапросHTTP.Заголовки.Вставить("Authorization", "DiadocAuth ddauth_api_client_id="+ddauth_api_client+",ddauth_token="+token);
	ЗапросHTTP.Заголовки.Вставить("Accept",        "application/json");  
        ЗапросHTTP.Заголовки.Вставить("Content-Type",  "application/json; charset=utf-8");
	ЗапросHTTP.АдресРесурса = "/GetMyOrganizations"; 
17. nikson52 11 25.08.22 09:30 Сейчас в теме
Добрый день, может быть кто-нибудь подскажет, для документов УПД какой TypeNameId использовать, что-то в документации по api не нашел, а тех поддержка пока не отвечает.
18. Arkadag 11.01.24 14:45 Сейчас в теме
Здравствуйте! При первом нажатии "Отправить файл", файл отправляется и виден на веб-странице организации.

При повторном нажатии (тот же файл, тот же получатель) на странице организации изменений не происходит.
Хотя вроде должно быть своеобразное дублирование сообщения с тем же файлом.

Как добиться того, чтобы при повторном нажатии отправки файла создавалось новое сообщение с тем же файлом?
Ситуация: файл исправили, сохранили под тем же именем и отправили заново.
Оставьте свое сообщение