Всем привет! Я 1С-разработчик в IT-компании SimbirSoft Михаил, и в этой статье расскажу о создании автономной системы обработки электронных документов (ЭДО) для повышения эффективности и безопасности работы с данными. Решение актуально для компаний, использующих платформы электронного документооборота (например, Диадок), где требуются:

  • ограничение доступа к конфиденциальным документам;

  • автоматизация анализа и классификации входящих файлов;

  • интеграция ЭДО с внутренними учётными системами (1С).

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

Актуальность темы

Электронный документооборот (ЭДО) сейчас бурно развивается благодаря его надёжности и государственным нововведениям. Создание собственной формы обработки электронных документов обусловлено несколькими факторами: 

• необходимостью ограничения доступа менеджеров только к «своим» документам;

• недопущением к функциям электронной подписи;

• ускорением обработки документов по сравнению со стандартным модулем «Контур.Диадок» от СКБ Контур. 

Ведь всем, кто работал со стандартным модулем, известно, насколько он «тяжёлый и неповоротливый» в силу своей универсальности.

Клиент и начальные условия для задачи

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

В чистом виде задачи на разработку своей формы Диадок от заказчика не поступало. Идея создания такой формы родилась в процессе доработки существующей учётной системы и ЭДО клиента и добавления в неё новой подсистемы учёта заказов.

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

Постановка задачи

В процессе разработки была поставлена задача на автоматическое распознавание заказов от клиентов и спецификаций от заводов среди всего потока входящих электронных документов. Подсистема «Диадок» была уже внедрена в конфигурацию учётной системы заказчика (с ней работала бухгалтерия), было организовано дисковое хранение исходных файлов. И задача распознавания сперва была выполнена рекомендуемым способом в «Подключаемом модуле «Контур.Диадок». Но для того чтобы определить, что это за документ и для кого он пришёл, оказалось мало установить нужный тип, нужно было ещё парсить каждый файл в пакете документов и по их содержимому определять принадлежность всего пакета.

Например, пакет заводской спецификации состоял из двух файлов (xml и pdf), один из которых мог быть типа «Доп.соглашение к договору», а структура xml-файла должна была строго соответствовать определённому формату и содержать ключевые параметры и значения. По полученным значениям нужно было найти в базе данных 1С-документ, записать информацию для заполнения, найти расхождения по ключевым полям, сформировать список ошибок сравнения и отправить уведомление ответственным менеджерам.

Зато заказ от клиента, хотя и тоже был типа «Доп.соглашение к договору», но мог содержать в пакете любые файлы. Хотя бы один из файлов должен быть таблицей Excel в заранее оговоренном с клиентом формате, по этой таблице создавался 1С-документ, а все файлы из пакета прикреплялись к нему.

Нужно было ещё контролировать подписание Диадок-документов (в том числе и пришедших раньше) и проводить привязанные к ним 1С-документы, а также делать ещё и другие процедуры.

Первая реализация задачи: проблемы и новая идея автономной обработки

Однако, при внедрении уже выяснилось, что такой обширный анализ входящих документов сильно тормозит вообще весь обмен с сервером Диадок. Добавили метку «Чужой пакет» (о метках в Диадок-документах подробно чуть ниже), чтобы не проводить повторный анализ такого «мусора», но это помогло не сильно.

Вот тут-то и родилась идея вообще отказаться от использования «Подключаемого модуля». Пусть стандартный модуль выполняет свои транспортные функции отправки-получения, а также всё, что от него хочет бухгалтерия. А мы сделаем своё регламентное задание, которое в фоне будет периодически обрабатывать пришедшие уже пакеты документов и оповещать нужных менеджеров о проделанной работе. Плюс добавим в конфигурацию свою форму журнала документов из Диадок, в которой будут отображаться только необходимая нам информация.

Установка и запуск модуля «Контур. Диадок»

Напомним, где взять модуль «Контур.Диадок» и как его подключить в конфигурацию учётной системы (своей или заказчика). Остальные могут перейти сразу к следующей главе.

По ссылке https://www.diadoc.ru/1C-PRO забираем актуальный модуль «Контур. Диадок» – это внешняя обработка “diadoc_<номер версии>.epf”. Вопросы лицензирования за использование модуля и подключения организации к ЭДО Диадок мы в этой статье пропустим – для этого есть региональные представители СКБ Контур.

Сначала в конфигурацию учётной системы необходимо добавить объекты подсистемы «Диадок»:

Конфигурация с нужной подсистемой хранится в двоичных данных макета «ОбновлениеДляХраненияДанных_cf» в составе этой самой внешней обработки:

Её нужно сохранить в файл (кликнуть дважды мышью, как будто хотите открыть этот макет), при этом не забыть дать полное имя с расширением. А потом через сравнение-объединение добавить подсистему Диадок в свою конфигурацию (информации полно как это делать).

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

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

Другие способы запуска могут быть сделаны через добавленное регламентное задание (своё или из подсистемы Диадок), а можно через шедулер операционной системы или любой другой подходящий планировщик. При этом сама обработка модуля «Контур. Диадок» может быть как внутри конфигурации, так и во внешнем файле. Расписание запуска настраивать нужно аналогично, чаще 10 минут – это не целесообразно.

Инициализация модуля и запуск обмена с сервером Диадок производится через процедуру «ВыполнитьРегламентныеДействия» из общего модуля «Диадок_ФоновыеЗадания»

  • Если обработка находится в конфигурации, то в параметре «Обработка» надо передать её имя.

  • Если обработка будет запускаться из внешнего файла (не очень удачное решение – вдруг кто-то случайно удалит файл или изменит сетевой доступ к нему), то нужно загрузить её в объект «ДвоичныеДанные» и так передать в параметр «Обработка».

  • Третий вариант – надо передать ссылку на элемент справочника, где записана обработка в реквизит типа «ХранилищеЗначения» с именем «ХранилищеОбработки» или «ХранилищеВнешнейОбработки».

Так сделан стандартный запуск обмена с сервером Диадок. Но никто не запрещает вам сделать это по-своему.

Особенности хранения Диадок-документов, и как это можно использовать

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

Эти электронные сообщения (Документы) могут быть с файлами (чаще именно так) или без них. Несколько документов перед отправкой могут быть объединены в один Пакет. У некоторых документов есть требование подписи принимающей стороной. Есть ещё множество всяких нюансов в ЭДО, которые не относятся к теме этой статьи…

Взаимосвязи справочников

Нам для понимания нужно рассмотреть структуру хранения этих данных – Документов, Пакетов, подписей и всяких сопутствующих сведений.

  • На вершине этой структуры находится справочник «Диадок_ПакетыДокументов». Нет смысла показывать его на скриншоте, сами посмотрите в конфигураторе.

  • Ниже находится самый главный справочник «Диадок_Документы». Причём, отношения между Пакетами и Документами не построены как «Владелец - Подчинённый», а в Документе есть реквизит ссылка на Пакет. Вероятнее всего, так было сделано из-за предположения, что могут быть отдельные Документы без Пакета.

  • Ниже расположен подчинённый Документу справочник «Диадок_ХранениеДанных». В нём собраны характеристики пересылаемого файла (но не сам файл!) и информация о подписях.

  • Наконец, внизу этой иерархии находится справочник «Диадок_Файлы». Именно там лежат пересылаемые файлы в реквизите типа «ХранилищеЗначения», но только если так велят настройки модуля.

Переключатель режима хранения файлов

В зависимости от настроек модуля весь контент пересылаемых документов может храниться или в справочнике из подсистемы «Диадок» (только что рассмотрели этот вариант), или на дисковом ресурсе сервера (локальной сети) в виде отдельных файлов.

На всякий случай покажу эти настройки. Форма открывается так:

Страница настроек большая, но сейчас нас интересует только раздел «Оптимизация работы»:

Хранение файлов на диске

В том случае, если выбран режим хранения «на диске», в указанной папке будет автоматически (во время обмена с сервером Диадок) создаваться структура вложенных папок.

Структура простая: <Указанная в настройках папка> \ “П_”<код справочника Пакета> \ “Д_”<код справочника Документа> \ <три файла контента>.

Как говорится, «с этого места поподробнее»...

  • Файл «ХранилищеКонтента» является непосредственно тем самым файлом, который пересылали через Диадок. Его переименовали, чтобы привести к единому виду. А исходные имя и расширение файла хранится в соответствующих реквизитах справочника «Диадок_ХранениеДанных» – выше на скриншоте этого справочника можно их увидеть.

  • Файл «ХранилищеКонтента.sgn» содержит информацию об ЭЦП отправителя этого Документа.

  • Файл «web.url» текстовый, в нём записан веб-адрес на Документ в портале Диадок. При попытке перейти по этой ссылке может запрашиваться авторизация, если в этот момент ещё не был открыт Диадок вашей организации. Чуть ниже в запросе увидите, как составить эту строку веб-адреса из реквизитов справочников Пакета и Документа.

Честно говоря, не знаю, бывают ли другие наборы файлов в папке Документа, но я встречал только эти три, как на скриншоте. А нам для анализа нужен только файл «ХранилищеКонтента».

Примеры получения данных

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

Функция ПолучитьДанныеПакетаДиадок(ПакетДиадок, НастройкиДиадока) Экспорт
	
	Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	спрДиадокДокументы.Пакет							КАК ПакетДиадок,
	|	спрДиадокДокументы.Ссылка							КАК ДокументДиадок,
	|	спрДиадокДокументы.ТипДокумента							КАК ТипДокумента,
	|	спрДиадокДокументы.НомерДокумента						КАК НомерДокумента,
	|	спрДиадокДокументы.ДатаДокумента						КАК ДатаДокумента,
	|	спрДиадокДокументы.ИмяФайла							КАК Представление,
	|	спрДиадокДокументы.Статус							КАК Статус,
	|	спрДиадокДокументы.ДатаЗагрузки							КАК ДатаЗагрузки,
	|	спрДиадокХранениеДанных.ИмяФайла						КАК ИмяФайла,
	|	спрДиадокХранениеДанных.РасширениеФайла						КАК РасширениеФайла,
	|	ВЫБОР
	|		КОГДА &ХранитьДокументыНаДиске
	|			ТОГДА &КорневойКаталогДокументов
	|				+ ""\П_"" + спрДиадокДокументы.Пакет.Код
	|				+ ""\Д_"" + спрДиадокДокументы.Код
	|				+ ""\ХранилищеКонтента""
	|		ИНАЧЕ спрДиадокХранениеДанных.ХранилищеДанных.Хранилище
	|	КОНЕЦ										КАК ХранилищеИлиФайлДанных,
	|	""https://diadoc.kontur.ru/"" + спрДиадокДокументы.BoxId
	|		+ ""/Document/Show?letterId="" + спрДиадокДокументы.LetterId
	|		+ ""&documentId="" + спрДиадокДокументы.DocumentId				КАК ВебАдресДиадок
	|ИЗ
	|	Справочник.Диадок_Документы КАК спрДиадокДокументы
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Диадок_ХранениеДанных КАК спрДиадокХранениеДанных
	|		ПО спрДиадокДокументы.Ссылка = спрДиадокХранениеДанных.Владелец
	|			И (спрДиадокХранениеДанных.Наименование = ""ХранилищеКонтента"")
	|ГДЕ
	|	спрДиадокДокументы.Пакет = &ПакетДиадок
	|");
	
	Запрос.УстановитьПараметр("ПакетДиадок",			ПакетДиадок);
	Запрос.УстановитьПараметр("ХранитьДокументыНаДиске",	НастройкиДиадока.ХранитьДокументыНаДиске);
	Запрос.УстановитьПараметр("КорневойКаталогДокументов",	НастройкиДиадока.КорневойКаталогДокументов);
	
	Возврат Запрос.Выполнить().Выгрузить();
	
КонецФункции

В строках полученной таблицы есть всё, что нам нужно. Можно увидеть статус подписания Документа, его тип и дату-время, когда он был получен. Можно получить двоичные данные сохранённого файла и уже проанализировать его, а при необходимости можно сохранить файл с первоначальным именем и расширением. Непосредственно двоичные данные файла получаем, к примеру, через такую функцию:

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

Поделюсь ещё простой функцией для получения настроек модуля по нашей теме:

Функция ПолучитьНастройкиДиадока() Экспорт
	
	НастройкиДиадока = Новый Структура("ХранитьДокументыНаДиске,КорневойКаталогДокументов", Ложь, "");
	
	Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	спрНастройкиДиадока.ИмяРеквизита	КАК ИмяРеквизита,
	|	спрНастройкиДиадока.Значение		КАК Значение
	|ИЗ
	|	Справочник.Диадок_ДополнительныеСправочники.ДополнительныеРеквизиты КАК спрНастройкиДиадока
	|ГДЕ
	|	спрНастройкиДиадока.Ссылка.Наименование = ""ОбщиеНастройки""
	|	И спрНастройкиДиадока.ИмяРеквизита В (""ХранитьДокументыНаДиске"",""КорневойКаталогДокументов"")"
	);
	
	ВыборкаЗапроса = Запрос.Выполнить().Выбрать();
	Пока ВыборкаЗапроса.Следующий() Цикл
		НастройкиДиадока.Вставить(ВыборкаЗапроса.ИмяРеквизита, ВыборкаЗапроса.Значение);
	КонецЦикла;
	
	Возврат НастройкиДиадока;
	
КонецФункции

Таким образом, я надеюсь, становится понятно, как мы решили задачу автоматического анализа файлов, приходящих через Диадок.

  • Стандартный модуль «Контур. Диадок» занимался отправкой и получением документов по своему распорядку.

  • Наше регламентное задание со своим расписанием выбирало только входящие Пакеты за последнюю неделю, у которых отсутствовал признак «АнализПроведен» и отсутствовала метка «Чужой документ».

Дополнительные реквизиты или метки документов

Настал черёд поговорить про метки…

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

Благодаря этому можно сохранять вообще всё что угодно в привязке к конкретному Документу или Пакету! И сам модуль довольно интенсивно использует дополнительные реквизиты, например, вот:

или вот:

Поэтому очень важно соблюдать уникальность при добавлении своих доп.реквизитов. Важно придумывать такие имена, чтобы они никогда не пересекались ни с кем. Мы использовали такой шаблон имени: <имя проекта>”_”<имя доп.реквизита>, например, как здесь:

Результаты внедрения автоматического распознавания и своих дополнительных реквизитов

Благодаря решению разделить транспорт и обработку электронных документов вообще прекратились задержки с их доставкой. Бухгалтерия получила уверенность, что никто случайно не получит доступ к ЭЦП и не увидит важные документы. Отмечу, что внедрение своих меток документов не позволило скрыть от бухгалтерии «неугодные» документы. Но к моменту запуска нашего решения ИТ-служба заказчика настроила в Диадоке разделение документов по подразделениям, и вопрос был закрыт.

Помимо «Чужого пакета» сделали ещё метку с именем документа, чтобы сразу отличить заказ клиента от заводской спецификации (об этом я писал выше). Опираясь на этот факт, мы сделали две формы списков Диадок-документов: одну для клиентских менеджеров, а другую для тех, кто общается с заводами - исполнителями заказов. Каждую форму оснастили функционалом, необходимым для работы только с конкретными Документами и правами только для этих менеджеров. Позже добавили ещё форму для администратора учётной системы и добавили функционал для исправления ошибок. Рисовать здесь эти формы большого смысла нет, так как цель статьи была дать подсказки как можно использовать «в личных целях» внутреннее устройство подсистемы Диадок.

Идеи для развития

В каждой организации для своей учётной системы, конечно, могут возникнуть свои идеи использования рассказанных в этой статье методов. Накидаю несколько своих, которые свербят мозг.

  • Используя предложенные функции получения двоичных данных присланных файлов, можно сделать показ пользователю содержимого этих файлов, находясь в форме привязанного 1С-документа. К слову сказать, заказчик потом так пожелал, и мы сделали это.

  • Менеджер без доступа к ЭЦП может делать различные задания для Документов (подписать, отказать, аннулировать и т.п.). Эти задания записываются в доп.реквизит Документа. Стандартный модуль при очередном запуске выполняет эти задания (тут надо будет доработать Подключаемый модуль). В этом решении через доп.реквизиты не будет помех в работе стандартным обработкам через реквизиты «ТребуетсяДействие», «ТребуемоеДействие». А также, если есть уже работающая обработка заданий через реквизит «ТребуемоеДействиеВ1С», но нужно добавить что-то ещё без риска сломать всё.

  • Так как в табличной части доп.реквизитов есть, где хранить ссылки и объекты, большой текст и даже двоичные данные, то к Документу и к Пакету можно при необходимости привязать любой набор информации в любом виде.

Спасибо за внимание!

Больше авторских материалов для разработчиков от моих коллег читайте в соцсетях SimbirSoft – ВКонтакте и Telegram.

Комментарии (0)