Штрихкоды в DIRECTUM. Бонус - QR-код с гиперссылкой

19 1

Cейчас штрихкодом никого не удивить: они на всех продуктах в магазине, на чеках и на платёжках... И в документообороте штрихкоды нашли применение. Зашифрованная в «полосках» и «клеточках» информация с бумажных документов готова быть считана ручными и автоматическими сканерами. А дальше – автоматизация… С ограничениями в виде в виде фантазии и здравого смысла.

Стандартные средства для работы с штрихкодом

Система DIRECTUM «из коробки» готова работать с штрихкодами: поддержка формирования и распознавания штрихкодов есть в стандартной поставке. Для быстрого поиска и сопоставления бумажной и электронной версии документов существует дополнительный модуль Быстрая идентификация документа DIRECTUM RapID.

Сейчас стандартная версия DIRECTUM может формировать штрихкоды 4 типов:

  • одномерный (линейный) Code128:

 

  • одномерный "Interleaved 2 of 5" по стандарту Почты России (штрикод такого типа генерируется в интегрированном отчёте Конверт со штрихкодом для почты России справочника Регистрационно-контрольные карточки):

  • двумерный PFD417:

  • двумерный QR:

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

Функции GenerateBarCode() и Generate2DBarcode(). Непосредственно формированием штрихкодов занимаются внешние библиотеки. Взаимодействием с этими библиотеками занимаются эти функции. Для прикладного кода эти функции – самый низкий уровень.

Наравне с формированием штрихкодов, системе необходимо уметь распознавать штрихкоды различных форматов. Такую задачу может выполнять Служба преобразования документов. Со стороны прикладного разработчика доступны функции DCTSRecognizeBarCodeInEDocument() и DCTSRecognizeBarCodeInFile(), которые взаимодействуют с сервисом преобразования. Также доступны функции Recognize2DBarcodeInFile() и Recognize2DBarcodeInDocument(): работая с библиотеками DTK Barcode Reader, распознают 2D штрихкоды в документах с расширением bmp, tiff, tif, jpg, jpeg, png и pdf не используя службу преобразования.

Справочник Форматы штрихкодов электронных документов содержит настройки формата и тип штрихкодов в разрезе Видов документов.

Работу со справочником обеспечивает функция GetDocumentBarcodeString(), получая настройки штрихкода для произвольного документа системы.

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

Функция PrintEDocumentBarCode() формирует штрихкод по заданному формату, отправляя результат на печать или отображая отчёт Штрихкод. Эта функция, например, используется в справочнике Регистрационно-контрольные карточки и вызывается при нажатии на кнопку Штрихкод.

И, наконец, функция RefreshBarcodes(), на входе имея документ системы, ищет в его теле штрихкоды, обновляет их в соответствии с настройками в справочнике форматов штрихкодов. Наиболее частый сценарий обновления штрихкодов в документах – при генерации документов из макетов в прикладном коде.

Сценарий GetEDocumentBarCodeString – это обёртка соответствующей фунукции. Сценарий используется в интеграции с Office.

Об интеграции с MS Office стоит сказать подробнее: это необходимый минимальный набор работы с документами и штрихкодами. Именно интеграция является основным инструментом работы с штрихкодами, если нет лицензии разработчика. Нужная в контексте темы группа команд интеграции (как работают пункты можно почитать в справке):

Без пояснений всё же не обойтись. Вставлять в текст поля карточки документа, штрихкоды, обновлять поля и штрихкоды можно только при работе с документом, который привязан к системе. Интеграция проверяет факт такой привязки сравнивая ИД инсталляции системы DIRECTUM и значение свойства документа INSTALL_ID. Посмотреть свойства документа в MS Word 2010 можно так (как открыть список свойств в других редакторах написано здесь):

Вставляются штрихкоды в документ в соответствии с настройками в справочнике Форматы штрихкодов электронных документов.

Штрихкод - по сути графическое поле документа, поэтому обновляется с помощью пункта меню интеграции Обновить поля. Следует также отметить, что это действие выполняется при каждом открытии документа в редакторе. Логика обновления штрихкодов напрямую связана со значением свойства документа XBarCodeDocID. В этом свойстве хранится ИД документа как объекта системы DIRECTUM. Поле пригождается в случае, когда необходимо принудительно обновить поля и штрихкоды, если документ создан путём копирования (явного или неявного) другого, например, при создании из шаблона или макета. Обращаю внимание, что свойство XBarCodeDocID определяет логику обновления только штрихкодов, не полей.

Задача

Потребность в штрихкоде появилась в рамках доработки DIRECTUM: Комплексная система предоставления государственных (муниципальных) услуг региона у одного из заказчиков. Для понимания сценария работы приведу несложную схему:

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

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

Начинаем модификации. Но для начала - немного «секретной» информации про штрихкоды в DIRECTUM. Штрихкод в документе – это картинка с особым замещающим текстом. В MS Office Word 2010 это выглядит так:

Как видно, для всех штрихкодов DIRECTUM используется замещающий текст «XBarCodePicture».

Теперь пришло время рассказать про несложную логику работы функции RefreshBarcodes(): она в цикле перебирает все изображения документа. Если замещающий текст - «XBarCodePicture», то изображение удаляется, на его место вставляется новое, сгенерированное в соответствии с настройками из справочника Форматы штрихкодов электронных документов.

После этого становится понятно, что нужно сделать дальше для решения прикладной задачи, озвученной выше:

  • «научить» справочник с форматами штрихкодов хранить настройки для штрихкодов нескольких типов для одного вида документа. Ведь сейчас при попытке определить формат второго штрихкода для одного вида документа появится сообщение:

  • доработать функцию RefreshBarcodes() так, чтобы она умела обновлять штрихкоды нескольких форматов в одном документе. На самом деле я создам её копию, RefreshBarcodesExt(), и дальше буду менять именно её, таким образом избегая возможных проблем при обновлении в будущем: ведь RefreshBarcodes() - функция из стандартной разработки.

Поехали. Добавим новый реквизит в справочник – Идентификатор штрихкода – тот самый замещающий текст в документах.


Теперь записи будут отличаться по виду документа и по такому идентификатору. Чтобы ничего не сломалось, по умолчанию в реквизит нужно записывать «XBarCodePicture». А в уже существующих записях справочника (как правило, их немного) нужно заполнить новый обязательный новый реквизит этим значением.

Внимательный читатель заметит, что вместо добавления нового реквизита для решения задачи достаточно начать учитывать тип штрихкода. Но ещё более внимательный читатель понимает, что этого недостаточно: при обновлении, штрихкод для вычислений – лишь картинка с особым замещающим текстом, а тип штрихкода является исключительно внутренним прикладным обозначением типа. Идентификатор же ещё и универсален – возможно без труда добавлять в документ штрихкоды одного типа, но с разным идентификатором. Вот только с реальной необходимостью такого я не сталкивался. А вы?

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

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

Доработку вставки нескольких штрихкодов в соответствии с настройкой средствами прикладной разработки не получится: логика зашита в интеграции с Office. Но это нисколько не мешает решению поставленной задачи. Штрихкоды должны быть разово добавлены в макет документа, а после формирования конечного документа будут обновлены с помощью функции RefreshBarcodesExt().

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

  • верхний колонтитул:

  • нижний колонтитул (и обратите внимание на исправленный мной замещающий текст штрихкода):

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

Теперь остаётся только выполнить соответствующую настройку в доработанном справочнике с форматами:

Формирование ссылки в поле соответствующего ТКЭД я не буду рассматривать – задача тривиальная.

Готовый результат выглядит так:

...тело документа...

Пакет разработки с изменённым справочником и 2 функциями: MultiBarcodesDev.zip (28,06 Кб)

Надеюсь, информация в моей статье будет кому-нибудь полезна.

Забыл отметить: конечными пользователями QR-кодов на документах к выдаче в рамках предоставления государственных услуг будут люди, не имеющие ничего общего с DIRECTUM. Или имеющие, то есть мы :) Конечно, такой факт - следствие развития решений для гос. органов. Направление само по себе массовое - ведь это работа с людьми. У кого-нибудь есть примеры функционала для совсем внешних пользователей? А поделитесь в комментариях?..

Юра Халявицкий

Значение переменной BarCodeAltText не определено.
Функция "GetDocumentBarcodeStringExt": ошибка в строке 116.

Авторизуйтесь, чтобы написать комментарий