Як підключити JDOC до Вчасно.ЕДО та M.E.Doc

Це приклад для програміста 1С: як передати PDF із Вчасно.ЕДО або M.E.Doc у JDOC без ручного вибору файла.

Схема однакова для будь-якої обробки ЕДО: отримати PDF документа, покласти шлях до файла в масив ФайлыJDOC і відкрити зовнішню обробку JDOC.

Після відкриття JDOC додає передані PDF у таблицю документів. Користувачу залишається запустити розпізнавання.

Як це виглядає у Вчасно.ЕДО

У форму Вчасно.ЕДО додається кнопка «Передати на розпізнавання».

Бухгалтер відкриває Документи Вчасно → Зовнішні документи, відмічає потрібні документи флажками й натискає кнопку над таблицею.

Кнопка Передати на розпізнавання у Вчасно.ЕДО
Кнопка передачі відмічених документів із Вчасно.ЕДО у JDOC.

PDF не потрібно вручну зберігати на робочий стіл і потім окремо завантажувати в JDOC. Це робить обробка.

Якщо в ЕДО вже є своє розпізнавання

У деяких сервісах ЕДО можуть бути власні інструменти розпізнавання. Але не кожній компанії зручно міняти під це свій процес, якщо основна робота з документами ведеться в 1С.

JDOC у такій схемі підключається як окремий шар розпізнавання: документи залишаються в ЕДО, а передача в JDOC виконується однією кнопкою з форми 1С.

Що саме робимо

Додаємо в обробку Вчасно.ЕДО або M.E.Doc кнопку, яка:

знаходить відмічені документи
        ↓
зберігає PDF у тимчасову папку
        ↓
відкриває зовнішню обробку JDOC
        ↓
передає в неї масив файлів ФайлыJDOC

У JDOC ці PDF автоматично з’являються в таблиці документів і готові до розпізнавання.

Код кнопки передачі у JDOC

&НаКлиенте
Процедура ПередатьВJDOC(Команда)

	ВыбранныеДокументы =
		ДокументыВчасноВнешние.НайтиСтроки(
			Новый Структура("Пометка,Гиперссылка", Истина, Истина)
		);

	Если ВыбранныеДокументы.Количество() = 0 Тогда
		Сообщить("Позначте документи Вчасно, які потрібно передати в JDOC.");
		Возврат;
	КонецЕсли;

	КаталогJDOC = мКаталогВременныхФайлов + "JDOC\";

	Попытка
		СоздатьКаталог(КаталогJDOC);
	Исключение
		Сообщить("Не вдалося створити тимчасовий каталог JDOC: " + ОписаниеОшибки());
		Возврат;
	КонецПопытки;

	ФайлыJDOC = Новый Массив;
	Ошибки = Новый Массив;

	Для Каждого ДокументВчасно Из ВыбранныеДокументы Цикл

		РезультатСкачивания =
			JDOC_СкачатьPDFВчасно(ДокументВчасно, КаталогJDOC);

		Если РезультатСкачивания.Успех Тогда
			ФайлыJDOC.Добавить(РезультатСкачивания.ПолныйПуть);
		Иначе
			Ошибки.Добавить(РезультатСкачивания.Сообщение);
		КонецЕсли;

	КонецЦикла;

	Если ФайлыJDOC.Количество() = 0 Тогда
		Сообщить("Не вдалося підготувати жодного PDF для JDOC.");
		Возврат;
	КонецЕсли;

	JDOC_ОткрытьJDOC(ФайлыJDOC);

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

Завантаження PDF із Вчасно.ЕДО

Беремо PDF-форму документа. Якщо її не вдалося отримати — пробуємо отримати оригінальний PDF.

&НаКлиенте
Функция JDOC_СкачатьPDFВчасно(ДокументВчасно, Знач КаталогJDOC)

	Если Не ЗначениеЗаполнено(ДокументВчасно.Идентификатор) Тогда
		Возврат Новый Структура(
			"Успех,ПолныйПуть,Сообщение",
			Ложь,
			"",
			"У документа Вчасно не заповнений ідентифікатор."
		);
	КонецЕсли;

	Идентификатор = СокрЛП(Строка(ДокументВчасно.Идентификатор));

	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Authorization", мНастройки.Токен);

	ПолныйПуть = КаталогJDOC + "Вчасно_" + Идентификатор + ".pdf";

	ФайлСохранен =
		мМодуль.HTTP(
			"GET",
			"https",
			мСерверЕДО,
			,
			"/api/v2/documents/" + Идентификатор + "/pdf/print",
			Заголовки,
			,
			,
			ПолныйПуть
		);

	Если Не ФайлСохранен Тогда

		ФайлСохранен =
			мМодуль.HTTP(
				"GET",
				"https",
				мСерверЕДО,
				,
				"/api/v2/documents/" + Идентификатор + "/original",
				Заголовки,
				,
				,
				ПолныйПуть
			);

	КонецЕсли;

	Если Не ФайлСохранен Тогда
		Возврат Новый Структура(
			"Успех,ПолныйПуть,Сообщение",
			Ложь,
			"",
			"Не вдалося отримати PDF Вчасно: " + Идентификатор + "."
		);
	КонецЕсли;

	ФайлОбъект = Новый Файл(ПолныйПуть);

	Если Не ФайлОбъект.Существует() Тогда
		Возврат Новый Структура(
			"Успех,ПолныйПуть,Сообщение",
			Ложь,
			"",
			"PDF Вчасно не збережено на диску: " + Идентификатор + "."
		);
	КонецЕсли;

	Возврат Новый Структура(
		"Успех,ПолныйПуть,Сообщение",
		Истина,
		ПолныйПуть,
		""
	);

КонецФункции

Відкриття JDOC з готовими PDF

&НаКлиенте
Процедура JDOC_ОткрытьJDOC(ФайлыJDOC)

	ПараметрыJDOC =
		Новый Структура(
			"ФайлыJDOC",
			ФайлыJDOC
		);

	ОткрытьФорму(
		"ВнешняяОбработка.JDOC.Форма.Форма",
		ПараметрыJDOC,
		ЭтаФорма
	);

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

Як JDOC приймає файли

В обробці JDOC при відкритті форми перевіряється параметр ФайлыJDOC.

Якщо параметр є, PDF-файли додаються в таблицю JDOC.

&НаКлиенте
Процедура JDOC_ЗагрузитьФайлыИзВчасно()

	ФайлыJDOC = Неопределено;

	Если Параметры = Неопределено
		Или Не Параметры.Свойство("ФайлыJDOC", ФайлыJDOC) Тогда
		Возврат;
	КонецЕсли;

	Если ТипЗнч(ФайлыJDOC) <> Тип("Массив")
		Или ФайлыJDOC.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	Для Каждого ПолныйПуть Из ФайлыJDOC Цикл

		ПолныйПуть = СокрЛП(Строка(ПолныйПуть));

		Если Не ЗначениеЗаполнено(ПолныйПуть) Тогда
			Продолжить;
		КонецЕсли;

		ФайлОбъект = Новый Файл(ПолныйПуть);

		Если Не ФайлОбъект.Существует() Тогда
			Продолжить;
		КонецЕсли;

		НоваяСтрока = ТаблицаФайлов.Добавить();
		НоваяСтрока.Выбран = Истина;
		НоваяСтрока.ИмяФайла = ФайлОбъект.Имя;
		НоваяСтрока.ПолныйПуть = ФайлОбъект.ПолноеИмя;

		УстановитьСтатусСтроки(
			НоваяСтрока,
			"Новий",
			""
		);

	КонецЦикла;

	ОбновитьСтатистику();

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

Як підключити M.E.Doc

Для M.E.Doc принцип такий самий: отримати PDF документа і передати його в JDOC через ФайлыJDOC.

&НаКлиенте
Процедура ПередатьДокументMEDocВJDOC(Команда)

	ФайлыJDOC = Новый Массив;

	ПолныйПутьКPDF = ПолучитьPDFДокументаMEDoc();

	Если Не ЗначениеЗаполнено(ПолныйПутьКPDF) Тогда
		Сообщить("Не вдалося отримати PDF з M.E.Doc.");
		Возврат;
	КонецЕсли;

	ФайлыJDOC.Добавить(ПолныйПутьКPDF);

	ОткрытьФорму(
		"ВнешняяОбработка.JDOC.Форма.Форма",
		Новый Структура("ФайлыJDOC", ФайлыJDOC),
		ЭтаФорма
	);

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

Підсумок

Інтеграція зводиться до трьох дій:

отримати PDF
передати шлях у ФайлыJDOC
відкрити форму JDOC

Після цього бухгалтер бачить документи в JDOC і запускає розпізнавання без ручного завантаження файлів.