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

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

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

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

Штрихкоды в SharePoint

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/// <summary>
/// Значение штрихкода
/// </summary>
[Column(Name = "_dlc_BarcodeValue", Storage = "_barCodeValue", 
 ReadOnly = true, FieldType = "Text")]
public string BarCodeValue
{
    get
    {
        return _barCodeValue;
    }
}
 
/// <summary>
/// Ссылка на изображение штрихкода
/// </summary>
[Column(Name = "_dlc_BarcodePreview", Storage = "_barCodeUrl", 
 ReadOnly = true, FieldType = "Url")]
public string BarCodeURL
{
    get
    {
        return _barCodeUrl;
    }
}

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

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

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

public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
    // ID политики штрихкодов
    const string featureId = "Microsoft.Office.RecordsManagement.PolicyFeatures.Barcode";
    // Данные для политики штрихкодов
    const string customData = "<barcode />";
    // Получаем текущий сайт
    var web = properties.Feature.Parent as SPWeb;
    if (web == null) return;
    // Получаем список для которого будем добавлять поитику
    var list = web.Lists["Employees"];
    // Получаем тип содержимого
    var ct = list.ContentTypes["Employee"];
    // Получаем текущую политику для данного типа содержимого
    var policyAudit = Policy.GetPolicy(ct);
    if (policyAudit == null)
    {
        // Если политика отсутствует, то создаем её
        Policy.CreatePolicy(ct, null);
        policyAudit = Policy.GetPolicy(ct);
    }
    policyAudit.Name = ct.Name;
    // Проверяем включен ли штрихкод в политику
    if (policyAudit.Items[featureId] == null)
    {
        // Включаем штрихкод в политику
        policyAudit.Items.Add(featureId, customData);
        // Сохраняем внесенные изменения
        policyAudit.Update();
    }
}

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

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

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

System.ArgumentException: Invalid field name.

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

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

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

Заключение

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

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

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

Теги

Поделиться

Виталий Жуков

Виталий Жуков

Техлид, Архитектор, Разработчик, Microsoft MVP. Более 20 лет опыта в области системной интеграции и разработки программного обеспечения. Специализируюсь на проектировании и внедрении масштабируемых высокопроизводительных программных решений в различных отраслях.