Использование штрихкодов в SharePoint 2010

Многие компании в качестве корпоративного портала используют SharePoint, в котором есть малоизвестная возможность, автоматически генерировать и назначать уникальный штрихкодовый идентификатор элементу списка или документу. Штрихкод незаменим для обеспечения контроля как над документами в печатном виде так и над другими физическими элементами организации (офисная/компьютерная техника, мебель и прочее). К сожалению, данная возможность доступна только в SharePoint Standart и Enterprise.

Пример штрихкода в SharePoint 2010

Штрихкоды в SharePoint

По умолчанию SharePoint использует для генерации штрихкодов стандарт Code39 (он же Code 3 of 9, Alpha39). Для поддержки штрихкодов других стандартов необходимо зарегистрировать в SharePoint соответствующие провайдеры. Генерация штрихкода происходит автоматически средствами самого SharePoint при создании нового элемента и не требует от пользователя никаких дополнительных действий.

В соответствие со стандартом Code39 в штрихкоде могут быть использованы латинские символы A-Z, цифры и спецсимволы. SharePoint позволяет указать, будут ли использоваться символы при генерации кода:

Параметры генерации штрихкода в SharePoint 2010

Штрихкодовые идентификаторы в SharePoint реализованы в виде политики управления сведениями типа содержимого. Сами политики могут быть настроены как на уровне коллекции сайтов, так и для конкретного типа содержимого в конкретном списке или библиотеке документов.

Политика для коллекции сайтов

Для настройки политики на уровне коллекции сайтов надо на странице параметров узла в разделе Администрирование семейства сайта перейти по ссылке Политики семейства сайтов:

На странице Политики можно просмотреть все политики управления сведениями, созданные для данной коллекции сайтов:

Для добавления штрихкодов в политику управления сведениями необходимо в разделе Штрихкоды поставить флаги:

  • Включить Штрихкоды элементу списка/библиотеки документов будет присваиваться штрихкодовый идентификатор;
  • Запрашивать вставку штрихкода перед сохранением или печатью - при попытке распечатать документ, используя Microsoft Office, пользователю будет предложено предварительно вставить в документ штрихкод;

Политика для типа содержимого

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

После чего будет предложено выбрать политику из списка тех, которые присутствуют в данной коллекции сайтов или определить свою политику:

Результат добавления штрихкода

После включения штрихкода в политику управления сведениями типа содержимого будут добавлены следующий поля:

  • Штрихкод - картинка (ссылка на неё);
  • Значение штрихкода;

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

Штрихкод и документ Microsoft Office

При использовании Microsoft Office можно запретить печать документов без предварительной вставки в него штрихкода. Если в политике управления сведениями стоит флаг Запрашивать вставку штрихкода перед сохранением или печатью, то Microsoft Office предложит это сделать при попытке распечатать документ:

Также это можно сделать самостоятельно простым нажатием соответствующей кнопки на панели инструментов:

Применение штрихкодов в решениях

С применением штрихкодов пользователями все просто и понятно. Теперь о том, как применять штрихкоды в своих решениях.

Поддержка штрихкодов в LINQ to SharePoint

Для начала я покажу как реализовать поддержку новых полей при использовании в качестве провайдера доступа к данным Linq to SharePoint. В классах, описывающий тип содержимого (content type) достаточно создать два поля (для штрихкода и значения штрихкода):

  1. /// <summary>
  2. /// Значение штрихкода
  3. /// </summary>
  4. [Column(Name = "_dlc_BarcodeValue", Storage = "_barCodeValue"
  5.  ReadOnly = true, FieldType = "Text")]
  6. public string BarCodeValue
  7. {
  8.     get
  9.     {
  10.         return _barCodeValue;
  11.     }
  12. }
  13.  
  14. /// <summary>
  15. /// Ссылка на изображение штрихкода
  16. /// </summary>
  17. [Column(Name = "_dlc_BarcodePreview", Storage = "_barCodeUrl"
  18.  ReadOnly = true, FieldType = "Url")]
  19. public string BarCodeURL
  20. {
  21.     get
  22.     {
  23.         return _barCodeUrl;
  24.     }
  25. }

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

Добавление штрихкодов в политику программно

Вот пример метода FeatureActivated из FeatureReceiver'а который включает политику для определенного типа содержимого.

  1. public override void FeatureActivated(SPFeatureReceiverProperties properties)
  2. {
  3.     // ID политики штрихкодов
  4.     const string featureId = "Microsoft.Office.RecordsManagement.PolicyFeatures.Barcode";
  5.     // Данные для политики штрихкодов
  6.     const string customData = "<barcode />";
  7.     // Получаем текущий сайт
  8.     var web = properties.Feature.Parent as SPWeb;
  9.     if (web == nullreturn;
  10.     // Получаем список для которого будем добавлять поитику
  11.     var list = web.Lists["Employees"];
  12.     // Получаем тип содержимого
  13.     var ct = list.ContentTypes["Employee"];
  14.     // Получаем текущую политику для данного типа содержимого
  15.     var policyAudit = Policy.GetPolicy(ct);
  16.     if (policyAudit == null)
  17.     {
  18.         // Если политика отсутствует, то создаем её
  19.         Policy.CreatePolicy(ct, null);
  20.         policyAudit = Policy.GetPolicy(ct);
  21.     }
  22.     policyAudit.Name = ct.Name;
  23.     // Проверяем включен ли штрихкод в политику
  24.     if (policyAudit.Items[featureId] == null)
  25.     {
  26.         // Включаем штрихкод в политику
  27.         policyAudit.Items.Add(featureId, customData);
  28.         // Сохраняем внесенные изменения
  29.         policyAudit.Update();
  30.     }
  31. }

Теперь при активации фичи для типа содержимого Employee в списке Employees будет создана политика управления сведениями с включенной в неё генерацией штрихкодов.

Ошибки при активации фичи

При развертывании решения во время активации фичи, возможно возникновение вот такого исключения:

System.ArgumentException: Invalid field name. {b0227f1a-b179-4d45-855b-a18f03706bcb}

Причина в том, что не активирована фича на уровне коллекции сайтов Инфраструктура публикации SharePoint Server (SharePoint Server Publishing Infrastructure), которая используется политиками управления сведениями. Для того, чтобы указать эту зависимость, необходимо описать её в определении фичи:

  1. <Feature xmlns="http://schemas.microsoft.com/sharepoint/">
  2.   <ActivationDependencies>
  3.     <ActivationDependency FeatureId="{f6924d36-2fa8-4f0b-b16d-06b7250180fa}" />
  4.   </ActivationDependencies>
  5. </Feature>

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

Заключение

В заключении я приведу пару примеров применения штрихкодов.

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

Второй, не менее популярный сценарий инвентаризация имущества, потребность в которой есть у любой организации. Используя SharePoint 2010 в качестве корпоративного портала, всего за 20-30 минут можно создать для этих целей отдельный сайт, список на нем, описывающий инвентаризуемые ценности и назначить соответствующие права пользователям:


Поделиться

Коментарии