Ещё одна версия настройки TFS под командную работу

в 15:54, , рубрики: agile, tfs
Структура публикации

  • Немного о том – почему так?
  • Схема работы команд разработки под которую делается настройка
  • Настройка XML-ек
  • Сохранение XML-ек
  • Настройка TFS через интерфейс

Ещё одна версия настройки TFS под командную работу - 1
Использовалась TFS 2015, однако многое справедливо и для более ранних версий.

Немного о том – почему так?

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

Схема работы команд разработки под которую делается настройка

Итак, предположим имеется несколько команд разработки. Каждая команда организована по принципу «операционной бригады», в которой есть разные специалисты. У каждой команды своя зона ответственности, свой участок разработки. Иногда удобно заводить в TFS даже отделы, не занимающиеся разработкой.
Предположим нам необходимо три уровня задач:

  1. Нижний – сами задачи нескольких типов. Каждый тип должен соответствовать специальности разработчика. Их создают сами разработчики. В результате декомпозиции или иным образом.
  2. Средний – задания от заказчика. Это уровень Product Backlog item. Или Story. Здесь каждый элемент содержит «хотелки» с требованиями. Предположим их создаёт или заказчик или менеджер команды.
  3. Верхний – проекты или крупные цели. Это уровень Features. Здесь можно группировать «хотелки».

Также предположим, что прежде чем брать в работу некоторое задание, оно должно быть согласовано у кого-то. Это может быть руководитель ИТ, отдел бизнес-анализа, руководитель отдела для которого производится автоматизация, все сразу или кто-то ещё.
Предположим, что каждая задача проходит 4 стадии:

  • ожидание,
  • разработка,
  • проверка и выкладка в продакшн,
  • сделано.

Предположим, что каждое задание или проект проходит 3 стадии:

  • новый,
  • в работе,
  • готово.

И наконец предположим, что необходимо передавать задачи в соседние команды разработки так, чтобы видеть это на своих досках. Чтобы на вашей доске вы понимали, что задачи отданы в другую команду. А другая команда видела, что это сторонние задачи.
Допустим это всё, что требуется от вкладки «Работа» вашего TFS. Далее – как это настроить.

Настройка XML-ек

1. Настройки необходимо начинать, если у вас ещё нет задач. Иначе будет много ошибок и трудноразрешимых ситуаций.
2. Сначала нужно создать коллекцию и несколько команд в TFS, раздать права.
3. Далее необходимо установить Visual Studio, если у вас она ещё не установлена.
4. Запускаем Visual Studio.
Ещё одна версия настройки TFS под командную работу - 2

5. Тыкаем “Сервис / Расширения и обновления”. Далее выбираем “В сети”. Далее “Visual Studio Gallery”. Находим и устанавливаем оттуда. Или скачиваем и устанавливаем “Microsoft Visual Studio Team Foundation Server 2015 Power Tools” с сайта. Это бесплатная утилита.
6. Далее запускаем консоль. Набираем вот это:

cd c:Program…Microsoft Visual Studio 14.0Common7IDE

Здесь понятно будет путь к вашей студии. Далее набираем вот это, заменяя пути, названия проекта и коллекции.

witadmin exportprocessconfig /f:"c:worktfs2015ProcessConfig.xml" /p:projectname /collection:"http://tfs2015:8080/tfs/CollectionName"

7. Создаётся файл «ProcessConfig.XML». Его текст необходимо изменить.на вот такой:

ProcessConfig.XML

<?xml version="1.0" encoding="utf-8"?>
<ProjectProcessConfiguration>
  <FeedbackRequestWorkItems category="Microsoft.FeedbackRequestCategory" pluralName="Запросы на отзыв" singularName="Запрос отзыва">
    <States>
      <State type="InProgress" value="Активный" />
      <State type="Complete" value="Закрыто" />
    </States>
  </FeedbackRequestWorkItems>
  <FeedbackResponseWorkItems category="Microsoft.FeedbackResponseCategory" pluralName="Ответы на отзывы" singularName="Ответ на отзыв">
    <States>
      <State type="InProgress" value="Активный" />
      <State type="Complete" value="Закрыто" />
    </States>
  </FeedbackResponseWorkItems>
  <PortfolioBacklogs>
    <PortfolioBacklog category="Microsoft.EpicCategory" pluralName="Ситуации" singularName="Ситуация" workItemCountLimit="1000">
      <AddPanel>
        <Fields>
          <Field refname="System.Title" />
        </Fields>
      </AddPanel>
      <Columns>
        <Column width="100" refname="System.WorkItemType" />
        <Column width="400" refname="System.Title" />
        <Column width="100" refname="System.State" />
        <Column width="50" refname="Microsoft.VSTS.Scheduling.Effort" />
        <Column width="50" refname="Microsoft.VSTS.Common.BusinessValue" />
        <Column width="100" refname="Microsoft.VSTS.Common.ValueArea" />
        <Column width="200" refname="System.Tags" />
      </Columns>
      <States>
        <State type="Proposed" value="Новый" />
        <State type="InProgress" value="Активный" />
        <State type="InProgress" value="Разрешено" />
        <State type="Complete" value="Закрыто" />
      </States>
    </PortfolioBacklog>
  <PortfolioBacklog category="Microsoft.FeatureCategory" parent="Microsoft.EpicCategory" pluralName="Projects" singularName="Project" workItemCountLimit="1000">
      <AddPanel>
        <Fields>
          <Field refname="System.Title" />
        </Fields>
      </AddPanel>
      <Columns>
        <Column width="100" refname="System.WorkItemType" />
        <Column width="400" refname="System.Title" />
        <Column width="100" refname="System.State" />
        <Column width="50" refname="Microsoft.VSTS.Scheduling.Effort" />
        <Column width="50" refname="Microsoft.VSTS.Common.BusinessValue" />
        <Column width="100" refname="Microsoft.VSTS.Common.ValueArea" />
        <Column width="200" refname="System.Tags" />
      </Columns>
      <States>
        <State type="Proposed" value="New" />
        <State type="InProgress" value="In progress" />
        <State type="Complete" value="Done" />
      </States>
    </PortfolioBacklog>
  </PortfolioBacklogs>
  <RequirementBacklog category="Microsoft.RequirementCategory" parent="Microsoft.FeatureCategory" pluralName="Stories" singularName="Story" workItemCountLimit="1000">
    <AddPanel>
      <Fields>
        <Field refname="System.Title" />
      </Fields>
    </AddPanel>
    <Columns>
      <Column width="100" refname="System.WorkItemType" />
      <Column width="400" refname="System.Title" />
      <Column width="100" refname="System.State" />
      <Column width="50" refname="Microsoft.VSTS.Scheduling.StoryPoints" />
      <Column width="100" refname="Microsoft.VSTS.Common.ValueArea" />
      <Column width="200" refname="System.IterationPath" />
      <Column width="200" refname="System.Tags" />
    </Columns>
    <States>
      <State type="Proposed" value="New" />
      <State type="InProgress" value="In progress" />
      <State type="Complete" value="Done" />
    </States>
  </RequirementBacklog>
  <TaskBacklog category="Microsoft.TaskCategory" parent="Microsoft.RequirementCategory" pluralName="Задачи" singularName="Задача" workItemCountLimit="1000">
    <AddPanel>
      <Fields>
        <Field refname="System.Title" />
      </Fields>
    </AddPanel>
    <Columns>
      <Column width="400" refname="System.Title" />
      <Column width="100" refname="System.State" />
      <Column width="100" refname="System.AssignedTo" />
      <Column width="50" refname="Microsoft.VSTS.Scheduling.RemainingWork" />
    </Columns>
    <States>
      <State type="Proposed" value="ToDo" />
      <State type="InProgress" value="In progress" />
      <State type="InProgress" value="Review" />
      <State type="Complete" value="Done" />
    </States>
  </TaskBacklog>
  <TypeFields>
    <TypeField refname="Microsoft.VSTS.Common.Activity" type="Activity" />
    <TypeField refname="Microsoft.VSTS.Common.StackRank" type="Order" />
    <TypeField refname="Microsoft.VSTS.Feedback.ApplicationLaunchInstructions" type="ApplicationLaunchInstructions" />
    <TypeField refname="Microsoft.VSTS.Feedback.ApplicationStartInformation" type="ApplicationStartInformation" />
    <TypeField refname="Microsoft.VSTS.Feedback.ApplicationType" type="ApplicationType">
      <TypeFieldValues>
        <TypeFieldValue type="ClientApp" value="Клиентское приложение" />
        <TypeFieldValue type="RemoteMachine" value="Удаленный компьютер" />
        <TypeFieldValue type="WebApp" value="Веб-приложение" />
      </TypeFieldValues>
    </TypeField>
    <TypeField format="{0} ч" refname="Microsoft.VSTS.Scheduling.RemainingWork" type="RemainingWork" />
    <TypeField refname="Microsoft.VSTS.Scheduling.StoryPoints" type="Effort" />
    <TypeField refname="System.AreaPath" type="Team" />
  </TypeFields>
  <Weekends>
    <DayOfWeek>Sunday</DayOfWeek>
    <DayOfWeek>Saturday</DayOfWeek>
  </Weekends>
  <Properties>
    <Property name="HiddenBacklogs" value="Microsoft.EpicCategory" />
    <Property name="BugsBehavior" value="AsTasks" />
  </Properties>
  <WorkItemColors>
    <WorkItemColor primary="FF30A062" secondary="FF50D092" name="1C task" />
    <WorkItemColor primary="FFF2CB1D" secondary="FFF6F5D2" name="C# task" />
    <WorkItemColor primary="FFC0C0C0" secondary="FFC8C8C8" name="SQL task" />
    <WorkItemColor primary="FF009CCC" secondary="FFD6ECF2" name="Story" />
    <WorkItemColor primary="FF773B93" secondary="FFEEE2F2" name="Project" />
    <WorkItemColor primary="FFFF9D00" secondary="FFFCEECF" name="Запрос на проверку кода" />
    <WorkItemColor primary="FFFF9D00" secondary="FFFCEECF" name="Запрос отзыва" />    
    <WorkItemColor primary="FFFF9D00" secondary="FFFCEECF" name="Набор тестов" />
    <WorkItemColor primary="FFFF9D00" secondary="FFFCEECF" name="Общие шаги" />
    <WorkItemColor primary="FFFF9D00" secondary="FFFCEECF" name="Общий параметр" />
    <WorkItemColor primary="FFFF9D00" secondary="FFFCEECF" name="Ответ на отзыв" />
    <WorkItemColor primary="FFFF9D00" secondary="FFFCEECF" name="Отклик на проверку кода" />
    <WorkItemColor primary="FFCC293D" secondary="FFFAEAE5" name="Ошибка" />
    <WorkItemColor primary="FFFF9D00" secondary="FFFCEECF" name="План тестирования" />
    <WorkItemColor primary="FFFF9D00" secondary="FFFCEECF" name="Проблема" />
    <WorkItemColor primary="FFFF7B00" secondary="FFFFD7B5" name="Ситуация" />
    <WorkItemColor primary="FFFF9D00" secondary="FFFCEECF" name="Тестовый случай" />
  </WorkItemColors>
</ProjectProcessConfiguration>

Здесь я убрал всё, что можно убрать. Данный файл описывает настройки досок, левой панели, списка и панели добавления элементов. Внизу перечислены цвета элементов. Обратите внимание, что в описании использована русская версия TFS. В английской «Задачи» и «Задача» будут называться «Tasks» и «Task» соответственно. Это же касается и остального.
8. Далее в консоли набираем:

cd c:Program…Microsoft Visual Studio 14.0Common7IDE
witadmin exportcategories /f:"c:worktfs2015Categories.xml" /p:projectname /collection: "http://tfs2015:8080/tfs/CollectionName"

9. Содержимое появившегося файла заменяем на:

Categories.XML
<?xml version="1.0" encoding="utf-8"?>
<cat:CATEGORIES xmlns:cat="http://schemas.microsoft.com/VisualStudio/2008/workitemtracking/categories">
  <CATEGORY refname="Microsoft.BugCategory" name="Категория ошибки">
    <DEFAULTWORKITEMTYPE name="Ошибка" />
  </CATEGORY>
  <CATEGORY refname="Microsoft.EpicCategory" name="Категория ситуации">
    <DEFAULTWORKITEMTYPE name="Ситуация" />
  </CATEGORY>
  <CATEGORY refname="Microsoft.FeatureCategory" name="Категория компонента">
    <DEFAULTWORKITEMTYPE name="Project" />
  </CATEGORY>
  <CATEGORY refname="Microsoft.RequirementCategory" name="Категория требований">
    <DEFAULTWORKITEMTYPE name="Story" />
  </CATEGORY>
  <CATEGORY refname="Microsoft.TestCaseCategory" name="Категория тестовых случаев">
    <DEFAULTWORKITEMTYPE name="Тестовый случай" />
  </CATEGORY>
  <CATEGORY refname="Microsoft.SharedStepCategory" name="Категория общих шагов">
    <DEFAULTWORKITEMTYPE name="Общие шаги" />
  </CATEGORY>
  <CATEGORY refname="Microsoft.SharedParameterCategory" name="Категория общих параметров">
    <DEFAULTWORKITEMTYPE name="Общий параметр" />
  </CATEGORY>
  <CATEGORY refname="Microsoft.CodeReviewRequestCategory" name="Категория запроса проверки кода">
    <DEFAULTWORKITEMTYPE name="Запрос на проверку кода" />
  </CATEGORY>
  <CATEGORY refname="Microsoft.CodeReviewResponseCategory" name="Категория отклика на проверку кода">
    <DEFAULTWORKITEMTYPE name="Отклик на проверку кода" />
  </CATEGORY>
  <CATEGORY refname="Microsoft.FeedbackRequestCategory" name="Категория запроса отзыва">
    <DEFAULTWORKITEMTYPE name="Запрос отзыва" />
  </CATEGORY>
  <CATEGORY refname="Microsoft.FeedbackResponseCategory" name="Категория отзыва">
    <DEFAULTWORKITEMTYPE name="Ответ на отзыв" />
  </CATEGORY>
  <CATEGORY refname="Microsoft.TestPlanCategory" name="Категория плана тестирования">
    <DEFAULTWORKITEMTYPE name="План тестирования" />
  </CATEGORY>
  <CATEGORY refname="Microsoft.TestSuiteCategory" name="Категория набора тестов">
    <DEFAULTWORKITEMTYPE name="Набор тестов" />
  </CATEGORY>
  <CATEGORY refname="Microsoft.TaskCategory" name="Категория задачи">
    <DEFAULTWORKITEMTYPE name="SQL task" />
    <WORKITEMTYPE name="C# task" />
    <WORKITEMTYPE name="1C task" />
  </CATEGORY>
  <CATEGORY refname="Microsoft.HiddenCategory" name="Категория скрытых типов">
    <DEFAULTWORKITEMTYPE name="Запрос на проверку кода" />
    <WORKITEMTYPE name="Отклик на проверку кода" />
    <WORKITEMTYPE name="Запрос отзыва" />
    <WORKITEMTYPE name="Ответ на отзыв" />
    <WORKITEMTYPE name="Общие шаги" />
    <WORKITEMTYPE name="Общий параметр" />
    <WORKITEMTYPE name="План тестирования" />
    <WORKITEMTYPE name="Набор тестов" />
    <WORKITEMTYPE name="Ошибка" />
    <WORKITEMTYPE name="Ситуация" />
  </CATEGORY>
</cat:CATEGORIES>

В TFS-е есть более 3-х классов элементов. Среди них: задачи, ошибки, тестовые случаи и прочее. Данный файл описывает, что нам из этого нужно и сколько вариантов элементов может быть для каждого класса. Например, мы задаём, что будет три типа задач. Внизу перечисляем то, что нам не нужно.
10. Далее нам необходимо настроить интерфейс элементов, а также их жизненный цикл. Для этого в Visual Studio тыкаем «Сервис / Process Editor / Work Item Types / Export WIT»
Ещё одна версия настройки TFS под командную работу - 3

11. В открывшемся окне задаём параметры для подключения к своему TFS.
12. Выбираем из списка элемент «Задача».
Ещё одна версия настройки TFS под командную работу - 4

13. Сохраняем в файл с тем же именем. Далее соглашаемся. Нажимаем ОК.
14. Далее повторяем для типа «Пользовательская история» (Product Backlog) и «Возможность» (Feature).
15. Далее получившийся XML задачи заменяем на вот это и сохраняем с именем «SQL task»:

SQL task.XML

<q1:WITD application="Work item type editor" version="1.0" xmlns:q1="http://schemas.microsoft.com/VisualStudio/2008/workitemtracking/typedef">
  <WORKITEMTYPE name="SQL task">
    <DESCRIPTION>Отслеживание требуемых работ.</DESCRIPTION>
    <FIELDS>
      <FIELD name="Путь итерации" refname="System.IterationPath" type="TreePath" reportable="dimension">
        <HELPTEXT>Итерация, в которой будет завершена эта задача</HELPTEXT>
      </FIELD>
      <FIELD name="Идентификатор итерации" refname="System.IterationId" type="Integer" />
      <FIELD name="Подсчет внешних ссылок" refname="System.ExternalLinkCount" type="Integer" />
      <FIELD name="Командный проект" refname="System.TeamProject" type="String" reportable="dimension" />
      <FIELD name="Подсчет гиперссылок" refname="System.HyperLinkCount" type="Integer" />
      <FIELD name="Подсчет вложенных файлов" refname="System.AttachedFileCount" type="Integer" />
      <FIELD name="Имя узла" refname="System.NodeName" type="String" />
      <FIELD name="Путь к области" refname="System.AreaPath" type="TreePath" reportable="dimension">
        <HELPTEXT>Область продукта, в которой задействована эта задача</HELPTEXT>
      </FIELD>
      <FIELD name="Дата последнего изменения" refname="System.RevisedDate" type="DateTime" reportable="detail" />
      <FIELD name="Дата изменения" refname="System.ChangedDate" type="DateTime" reportable="dimension" />
      <FIELD name="Идентификатор" refname="System.Id" type="Integer" reportable="dimension" />
      <FIELD name="Идентификатор области" refname="System.AreaId" type="Integer" />
      <FIELD name="Авторизован как" refname="System.AuthorizedAs" type="String" syncnamechanges="true" />
      <FIELD name="Название" refname="System.Title" type="String" reportable="dimension">
        <REQUIRED />
        <HELPTEXT>Требуемая работа и как будет реализована пользовательская история</HELPTEXT>
      </FIELD>
      <FIELD name="Состояние" refname="System.State" type="String" reportable="dimension">
        <HELPTEXT>Новый = новая работа, которая пока не активирована; Активный = оставшаяся работа, которую нужно выполнить; Закрыто = протестировано и возвращено.</HELPTEXT>
      </FIELD>
      <FIELD name="Дата авторизации" refname="System.AuthorizedDate" type="DateTime" />
      <FIELD name="Филигрань" refname="System.Watermark" type="Integer" />
      <FIELD name="Вер" refname="System.Rev" type="Integer" reportable="dimension" />
      <FIELD name="Кем изменено" refname="System.ChangedBy" type="String" syncnamechanges="true" reportable="dimension">
        <ALLOWEXISTINGVALUE />
        <VALIDUSER />
      </FIELD>
      <FIELD name="Причина" refname="System.Reason" type="String" reportable="dimension">
        <HELPTEXT>Причина, по которой задача находится в текущем состоянии</HELPTEXT>
      </FIELD>
      <FIELD name="Кому назначено" refname="System.AssignedTo" type="String" syncnamechanges="true" reportable="dimension">
        <ALLOWEXISTINGVALUE />
        <VALIDUSER />
        <HELPTEXT>Лицо, которое в настоящее время занимается решением этой задачи</HELPTEXT>
      </FIELD>
      <FIELD name="Тип рабочего элемента" refname="System.WorkItemType" type="String" reportable="dimension" />
      <FIELD name="Дата создания" refname="System.CreatedDate" type="DateTime" reportable="dimension" />
      <FIELD name="Кем создано" refname="System.CreatedBy" type="String" syncnamechanges="true" reportable="dimension" />
      <FIELD name="Описание" refname="System.Description" type="HTML">
        <HELPTEXT>Что предполагается сделать, указатели на ресурсы и входные данные, заметки разработки, условия выхода</HELPTEXT>
      </FIELD>
      <FIELD name="Журнал" refname="System.History" type="History">
        <HELPTEXT>Поток дискуссии плюс автоматическая запись изменений</HELPTEXT>
      </FIELD>
      <FIELD name="Подсчет связанных ссылок" refname="System.RelatedLinkCount" type="Integer" />
      <FIELD name="Теги" refname="System.Tags" type="PlainText" />
      <FIELD name="Столбец доски" refname="System.BoardColumn" type="String" reportable="dimension" />
      <FIELD name="Готовый столбец доски" refname="System.BoardColumnDone" type="Boolean" reportable="dimension" />
      <FIELD name="Строка доски" refname="System.BoardLane" type="String" reportable="dimension" />
      <FIELD name="Оставшаяся работа" refname="Microsoft.VSTS.Scheduling.RemainingWork" type="Double" reportable="measure">
        <HELPTEXT>Оценка числа единиц работы, оставшихся до завершения выполнения задачи</HELPTEXT>
      </FIELD>
      <FIELD name="Исходная оценка" refname="Microsoft.VSTS.Scheduling.OriginalEstimate" type="Double" reportable="measure">
        <HELPTEXT>Начальное значение оставшейся работы - задается единожды, при начале работы</HELPTEXT>
      </FIELD>
      <FIELD name="Завершенная работа" refname="Microsoft.VSTS.Scheduling.CompletedWork" type="Double" reportable="measure">
        <HELPTEXT>Количество единиц работы, потраченных на эту задачу</HELPTEXT>
      </FIELD>
      <FIELD name="Активность" refname="Microsoft.VSTS.Common.Activity" type="String" reportable="dimension">
        <SUGGESTEDVALUES expanditems="true">
          <LISTITEM value="Документация" />
          <LISTITEM value="Проектирование" />
          <LISTITEM value="Развертывание" />
          <LISTITEM value="Разработка" />
          <LISTITEM value="Тестирование" />
          <LISTITEM value="Требования" />
        </SUGGESTEDVALUES>
        <HELPTEXT>Тип связанной работы</HELPTEXT>
      </FIELD>
      <FIELD name="Дата изменения состояния" refname="Microsoft.VSTS.Common.StateChangeDate" type="DateTime">
        <WHENNOTCHANGED field="System.State">
          <READONLY />
        </WHENNOTCHANGED>
        <WHENCHANGED field="System.State">
          <SERVERDEFAULT from="clock" />
        </WHENCHANGED>
      </FIELD>
      <FIELD name="Дата активации" refname="Microsoft.VSTS.Common.ActivatedDate" type="DateTime" reportable="dimension">
        <WHENNOTCHANGED field="System.State">
          <READONLY />
        </WHENNOTCHANGED>
      </FIELD>
      <FIELD name="Кем активировано" refname="Microsoft.VSTS.Common.ActivatedBy" type="String" syncnamechanges="true" reportable="dimension">
        <WHENNOTCHANGED field="System.State">
          <ALLOWEXISTINGVALUE />
          <READONLY />
        </WHENNOTCHANGED>
      </FIELD>
      <FIELD name="Дата закрытия" refname="Microsoft.VSTS.Common.ClosedDate" type="DateTime" reportable="dimension">
        <WHENNOTCHANGED field="System.State">
          <READONLY />
        </WHENNOTCHANGED>
      </FIELD>
      <FIELD name="Кем закрыто" refname="Microsoft.VSTS.Common.ClosedBy" type="String" syncnamechanges="true" reportable="dimension">
        <WHENNOTCHANGED field="System.State">
          <ALLOWEXISTINGVALUE />
          <READONLY />
        </WHENNOTCHANGED>
      </FIELD>
      <FIELD name="Приоритет" refname="Microsoft.VSTS.Common.Priority" type="Integer" reportable="dimension">
        <DEFAULT from="value" value="2" />
        <ALLOWEDVALUES expanditems="true">
          <LISTITEM value="1" />
          <LISTITEM value="2" />
          <LISTITEM value="3" />
          <LISTITEM value="4" />
        </ALLOWEDVALUES>
        <HELPTEXT>Производственная важность</HELPTEXT>
      </FIELD>
      <FIELD name="Ранг стека" refname="Microsoft.VSTS.Common.StackRank" type="Double" reportable="dimension">
        <HELPTEXT>Сначала обработайте элементы с меньшим значением ранга стека. Установить в рассмотрении.</HELPTEXT>
      </FIELD>
      <FIELD name="Сборка интеграции" refname="Microsoft.VSTS.Build.IntegrationBuild" type="String" reportable="dimension">
        <SUGGESTEDVALUES expanditems="true">
          <LISTITEM value="<Нет>" />
        </SUGGESTEDVALUES>
        <HELPTEXT>Сборка, в которой ошибка была исправлена</HELPTEXT>
      </FIELD>
      <FIELD name="Дата начала" refname="Microsoft.VSTS.Scheduling.StartDate" type="DateTime" reportable="dimension">
        <HELPTEXT>Дата начала задачи</HELPTEXT>
      </FIELD>
      <FIELD name="Дата завершения" refname="Microsoft.VSTS.Scheduling.FinishDate" type="DateTime" reportable="dimension">
        <HELPTEXT>Дата завершения задачи</HELPTEXT>
      </FIELD>
    </FIELDS>
    <WORKFLOW>
      <STATES>    
        <STATE value="Done">
          <FIELDS>
            <FIELD refname="Microsoft.VSTS.Common.ClosedDate">
              <REQUIRED />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Scheduling.RemainingWork">
              <EMPTY />
            </FIELD>
          </FIELDS>
        </STATE>
        <STATE value="Review">
          <FIELDS>
            <FIELD refname="Microsoft.VSTS.Common.ClosedBy">
              <ALLOWEXISTINGVALUE />
              <EMPTY />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ClosedDate">
              <EMPTY />
            </FIELD>
          </FIELDS>
        </STATE>
        <STATE value="In progress">
          <FIELDS>
            <FIELD refname="Microsoft.VSTS.Common.ClosedBy">
              <ALLOWEXISTINGVALUE />
              <EMPTY />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ClosedDate">
              <EMPTY />
            </FIELD>
          </FIELDS>
        </STATE>
        <STATE value="ToDo">
          <FIELDS>
            <FIELD refname="Microsoft.VSTS.Common.ClosedBy">
              <ALLOWEXISTINGVALUE />
              <EMPTY />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ClosedDate">
              <EMPTY />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ActivatedBy">
              <ALLOWEXISTINGVALUE />
              <EMPTY />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ActivatedDate">
              <EMPTY />
            </FIELD>
          </FIELDS>
        </STATE>
        <STATE value="Removed" />
      </STATES>
      <TRANSITIONS>
        <TRANSITION from="" to="ToDo">
          <REASONS>
            <DEFAULTREASON value="ToDo" />
          </REASONS>
        </TRANSITION>
        <TRANSITION from="ToDo" to="Removed">
          <REASONS>
            <DEFAULTREASON value="Удалено из невыполненной работы" />
          </REASONS>
        </TRANSITION>
        <TRANSITION from="ToDo" to="In progress">
          <ACTIONS>
            <ACTION value="Microsoft.VSTS.Actions.StartWork" />
          </ACTIONS>
          <REASONS>
            <DEFAULTREASON value="Работа запущена" />
          </REASONS>
          <FIELDS>
            <FIELD refname="Microsoft.VSTS.Common.ActivatedBy">
              <ALLOWEXISTINGVALUE />
              <COPY from="currentuser" />
              <VALIDUSER />
              <REQUIRED />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ActivatedDate">
              <SERVERDEFAULT from="clock" />
            </FIELD>
            <FIELD refname="System.AssignedTo">
              <DEFAULT from="currentuser" />
            </FIELD>
          </FIELDS>
        </TRANSITION>
        <TRANSITION from="In progress" to="ToDo">
          <ACTIONS>
            <ACTION value="Microsoft.VSTS.Actions.StopWork" />
          </ACTIONS>
          <REASONS>
            <DEFAULTREASON value="Работа остановлена" />
          </REASONS>
        </TRANSITION>
        <TRANSITION from="In progress" to="Removed">
          <REASONS>
            <DEFAULTREASON value="Удалено из невыполненной работы" />
          </REASONS>
        </TRANSITION>
        <TRANSITION from="In progress" to="Review">
          <REASONS>
            <DEFAULTREASON value="На выкладку" />
          </REASONS>
        </TRANSITION>
        <TRANSITION from="Review" to="In progress">
          <REASONS>
            <DEFAULTREASON value="Возвращено на доработку" />
          </REASONS>
        </TRANSITION>
        <TRANSITION from="Review" to="Done">
          <ACTIONS>
            <ACTION value="Microsoft.VSTS.Actions.Checkin" />
          </ACTIONS>
          <REASONS>
            <DEFAULTREASON value="Завершенный" />
          </REASONS>
          <FIELDS>
            <FIELD refname="Microsoft.VSTS.Common.ClosedBy">
              <ALLOWEXISTINGVALUE />
              <COPY from="currentuser" />
              <VALIDUSER />
              <REQUIRED />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ClosedDate">
              <SERVERDEFAULT from="clock" />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ActivatedBy">
              <ALLOWEXISTINGVALUE />
              <READONLY />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ActivatedDate">
              <READONLY />
            </FIELD>
          </FIELDS>
        </TRANSITION>
        <TRANSITION from="Removed" to="ToDo">
          <REASONS>
            <DEFAULTREASON value="Пересмотр задачи" />
          </REASONS>
        </TRANSITION>
        <TRANSITION from="Done" to="Review">
          <REASONS>
            <DEFAULTREASON value="Реактивированные" />
          </REASONS>
          <FIELDS>
            <FIELD refname="System.AssignedTo">
              <COPY from="field" field="Microsoft.VSTS.Common.ClosedBy" />
            </FIELD>
          </FIELDS>
        </TRANSITION>
      </TRANSITIONS>
    </WORKFLOW>
    <FORM>
      <Layout HideControlBorders="true" HideReadOnlyEmptyFields="true">
        <Group Margin="(4,0,0,0)">
          <Column PercentWidth="90">
            <Control FieldName="System.Title" Type="FieldControl" LabelPosition="Top" ControlFontSize="large" EmptyText="<Введите здесь заголовок>" />
          </Column>
          <Column PercentWidth="10">
            <Control FieldName="System.ID" Type="FieldControl" LabelPosition="Top" ControlFontSize="large" />
          </Column>
        </Group>
        <Group Margin="(10,0,0,0)">
          <Column PercentWidth="30">
            <Group Label="Статус">
              <Column PercentWidth="100">
                <Control FieldName="System.AssignedTo" Type="FieldControl" Label="&Кому назначено" LabelPosition="Left" EmptyText="<Никто>" />
                <Control FieldName="System.State" Type="FieldControl" Label="&Состояние" LabelPosition="Left" />
                <Control FieldName="System.Reason" Type="FieldControl" Label="Причина" LabelPosition="Left" />
              </Column>
            </Group>
          </Column>
          <Column PercentWidth="30">
            <Group Label="Классификация">
              <Column PercentWidth="100">
                <Control FieldName="System.AreaPath" Type="WorkItemClassificationControl" Label="&Область" LabelPosition="Left" />
                <Control FieldName="System.IterationPath" Type="WorkItemClassificationControl" Label="Ите&рация" LabelPosition="Left" />
              </Column>
            </Group>
          </Column>
          <Column PercentWidth="20">
            <Group Label="Планирование">
              <Column PercentWidth="100">
                <Control FieldName="Microsoft.VSTS.Common.Priority" Type="FieldControl" Label="Приоритет" LabelPosition="Left" />
                <Control FieldName="Microsoft.VSTS.Common.Activity" Type="FieldControl" Label="Активность" LabelPosition="Left" EmptyText="<Нет>" />
              </Column>
            </Group>
          </Column>
          <Column PercentWidth="20">
            <Group Label="Трудозатраты (часы)">
              <Column PercentWidth="100">
                <Control FieldName="Microsoft.VSTS.Scheduling.OriginalEstimate" Type="FieldControl" Label="Исходная оценка" LabelPosition="Left" />
                <Control FieldName="Microsoft.VSTS.Scheduling.RemainingWork" Type="FieldControl" Label="Остаток" LabelPosition="Left" />
                <Control FieldName="Microsoft.VSTS.Scheduling.CompletedWork" Type="FieldControl" Label="Завершенный" LabelPosition="Left" />
              </Column>
            </Group>
          </Column>
        </Group>
        <Group>
          <Column PercentWidth="50">
            <TabGroup>
              <Tab Label="Описание">
                <Control FieldName="System.Description" Type="HtmlFieldControl" LabelPosition="Top" Dock="Fill" />
              </Tab>
              <Tab Label="Реализация">
                <Group>
                  <Column PercentWidth="50">
                    <Control FieldName="Microsoft.VSTS.Build.IntegrationBuild" Type="FieldControl" Label="Встроено в сборку" LabelPosition="Left" />
                  </Column>
                  <Column PercentWidth="50" />
                </Group>
                <Control Type="LinksControl" LabelPosition="Top" Name="Hierarchy">
                  <LinksControlOptions>
                    <LinkColumns>
                      <LinkColumn RefName="System.ID" />
                      <LinkColumn RefName="System.WorkItemType" />
                      <LinkColumn RefName="System.Title" />
                      <LinkColumn RefName="System.AssignedTo" />
                      <LinkColumn RefName="System.State" />
                      <LinkColumn LinkAttribute="System.Links.Comment" />
                    </LinkColumns>
                    <WorkItemLinkFilters FilterType="include">
                      <Filter LinkType="System.LinkTypes.Hierarchy" />
                    </WorkItemLinkFilters>
                    <ExternalLinkFilters FilterType="excludeAll" />
                    <WorkItemTypeFilters FilterType="include">
                      <Filter WorkItemType="Задача" />
                      <Filter WorkItemType="Пользовательская история" />
                    </WorkItemTypeFilters>
                  </LinksControlOptions>
                </Control>
              </Tab>
            </TabGroup>
          </Column>
          <Column PercentWidth="50">
            <TabGroup Margin="(5,0,0,0)">
              <Tab Label="Журнал">
                <Control FieldName="System.History" Type="WorkItemLogControl" LabelPosition="Top" Dock="Fill" />
              </Tab>
              <Tab Label="Все ссылки">
                <Control Type="LinksControl" LabelPosition="Top" Name="GeneralLinks">
                  <LinksControlOptions>
                    <LinkColumns>
                      <LinkColumn RefName="System.ID" />
                      <LinkColumn RefName="System.WorkItemType" />
                      <LinkColumn RefName="System.Title" />
                      <LinkColumn RefName="System.AssignedTo" />
                      <LinkColumn RefName="System.State" />
                      <LinkColumn LinkAttribute="System.Links.Comment" />
                    </LinkColumns>
                  </LinksControlOptions>
                </Control>
              </Tab>
              <Tab Label="Вложения">
                <Control Type="AttachmentsControl" LabelPosition="Top" />
              </Tab>
            </TabGroup>
          </Column>
        </Group>
      </Layout>
    </FORM>
  </WORKITEMTYPE>
</q1:WITD>

Здесь описываются атрибуты, которыми будет владеть элемент. Описание интерфейса элемента. Возможные состояния элемента. А так же возможные переходы из состояния в состояние.
16. Скопируйте данный файл дважды с новыми именами «C# task.XML» и «1C task.XML». В каждом из них необходимо в третьей строке «» заменить название на соответствующее.
17. Скопируйте файл «Пользовательская история.XML» в «Story.XML» и замените содержимое на:

Story.XML

<?xml version="1.0" encoding="utf-8"?>
<witd:WITD application="Work item type editor" version="1.0" xmlns:witd="http://schemas.microsoft.com/VisualStudio/2008/workitemtracking/typedef">
  <WORKITEMTYPE name="Story">
    <DESCRIPTION>Отслеживает действие, которое пользователь сможет выполнять с использованием продукта</DESCRIPTION>
    <FIELDS>
      <FIELD name="Путь итерации" refname="System.IterationPath" type="TreePath" reportable="dimension">
        <HELPTEXT>Итерация, в рамках которой эта пользовательская история будет реализована</HELPTEXT>
      </FIELD>
      <FIELD name="Идентификатор итерации" refname="System.IterationId" type="Integer" />
      <FIELD name="Подсчет внешних ссылок" refname="System.ExternalLinkCount" type="Integer" />
      <FIELD name="Командный проект" refname="System.TeamProject" type="String" reportable="dimension" />
      <FIELD name="Подсчет гиперссылок" refname="System.HyperLinkCount" type="Integer" />
      <FIELD name="Подсчет вложенных файлов" refname="System.AttachedFileCount" type="Integer" />
      <FIELD name="Имя узла" refname="System.NodeName" type="String" />
      <FIELD name="Путь к области" refname="System.AreaPath" type="TreePath" reportable="dimension">
        <HELPTEXT>Область продукта, с которой связана эта пользовательская история</HELPTEXT>
      </FIELD>
      <FIELD name="Дата последнего изменения" refname="System.RevisedDate" type="DateTime" reportable="detail" />
      <FIELD name="Дата изменения" refname="System.ChangedDate" type="DateTime" reportable="dimension" />
      <FIELD name="Идентификатор" refname="System.Id" type="Integer" reportable="dimension" />
      <FIELD name="Идентификатор области" refname="System.AreaId" type="Integer" />
      <FIELD name="Авторизован как" refname="System.AuthorizedAs" type="String" syncnamechanges="true" />
      <FIELD name="Название" refname="System.Title" type="String" reportable="dimension">
        <HELPTEXT>Возможности, которые получит пользователь после реализации</HELPTEXT>
        <REQUIRED />
      </FIELD>
      <FIELD name="Состояние" refname="System.State" type="String" reportable="dimension">
        <HELPTEXT>Новый = работа, которая еще не начата; Активный= оставшиеся работы к выполнению; Разрешено = ожидающие приемочных тестов; Закрыто = прошедшие приемочные тесты</HELPTEXT>
      </FIELD>
      <FIELD name="Дата авторизации" refname="System.AuthorizedDate" type="DateTime" />
      <FIELD name="Филигрань" refname="System.Watermark" type="Integer" />
      <FIELD name="Вер" refname="System.Rev" type="Integer" reportable="dimension" />
      <FIELD name="Кем изменено" refname="System.ChangedBy" type="String" syncnamechanges="true" reportable="dimension">
        <ALLOWEXISTINGVALUE />
        <VALIDUSER />
      </FIELD>
      <FIELD name="Причина" refname="System.Reason" type="String" reportable="dimension">
        <HELPTEXT>Причина, по которой статья находится в текущем состоянии</HELPTEXT>
      </FIELD>
      <FIELD name="Кому назначено" refname="System.AssignedTo" type="String" syncnamechanges="true" reportable="dimension" />
      <FIELD name="Тип рабочего элемента" refname="System.WorkItemType" type="String" reportable="dimension" />
      <FIELD name="Дата создания" refname="System.CreatedDate" type="DateTime" reportable="dimension" />
      <FIELD name="Кем создано" refname="System.CreatedBy" type="String" syncnamechanges="true" reportable="dimension" />
      <FIELD name="Описание" refname="System.Description" type="HTML">
        <HELPTEXT>Описание или ссылка на описание, которое должно подтвердить завершенность работы</HELPTEXT>
      </FIELD>
      <FIELD name="Журнал" refname="System.History" type="History">
        <HELPTEXT>Поток дискуссии плюс автоматическая запись изменений</HELPTEXT>
      </FIELD>
      <FIELD name="Подсчет связанных ссылок" refname="System.RelatedLinkCount" type="Integer" />
      <FIELD name="Теги" refname="System.Tags" type="PlainText" />
      <FIELD name="Столбец доски" refname="System.BoardColumn" type="String" reportable="dimension" />
      <FIELD name="Готовый столбец доски" refname="System.BoardColumnDone" type="Boolean" reportable="dimension" />
      <FIELD name="Строка доски" refname="System.BoardLane" type="String" reportable="dimension" />
      <FIELD name="Баллы истории" refname="Microsoft.VSTS.Scheduling.StoryPoints" type="Double" reportable="measure" formula="sum">
        <HELPTEXT>Предполагаемый объем работ для реализации этой пользовательской истории</HELPTEXT>
      </FIELD>
      <FIELD name="Дата изменения состояния" refname="Microsoft.VSTS.Common.StateChangeDate" type="DateTime">
        <WHENNOTCHANGED field="System.State">
          <READONLY />
        </WHENNOTCHANGED>
        <WHENCHANGED field="System.State">
          <SERVERDEFAULT from="clock" />
        </WHENCHANGED>
      </FIELD>
      <FIELD name="Дата активации" refname="Microsoft.VSTS.Common.ActivatedDate" type="DateTime" reportable="dimension">
        <WHENNOTCHANGED field="System.State">
          <READONLY />
        </WHENNOTCHANGED>
      </FIELD>
      <FIELD name="Кем активировано" refname="Microsoft.VSTS.Common.ActivatedBy" type="String" syncnamechanges="true" reportable="dimension">
        <WHENNOTCHANGED field="System.State">
          <ALLOWEXISTINGVALUE />
          <READONLY />
        </WHENNOTCHANGED>
      </FIELD>
      <FIELD name="Дата разрешения" refname="Microsoft.VSTS.Common.ResolvedDate" type="DateTime" reportable="dimension">
        <WHENNOTCHANGED field="System.State">
          <READONLY />
        </WHENNOTCHANGED>
      </FIELD>
      <FIELD name="Кем разрешено" refname="Microsoft.VSTS.Common.ResolvedBy" type="String" syncnamechanges="true" reportable="dimension">
        <WHENNOTCHANGED field="System.State">
          <ALLOWEXISTINGVALUE />
          <READONLY />
        </WHENNOTCHANGED>
      </FIELD>
      <FIELD name="Разрешенная причина" refname="Microsoft.VSTS.Common.ResolvedReason" type="String" reportable="dimension" />
      <FIELD name="Дата закрытия" refname="Microsoft.VSTS.Common.ClosedDate" type="DateTime" reportable="dimension">
        <WHENNOTCHANGED field="System.State">
          <READONLY />
        </WHENNOTCHANGED>
      </FIELD>
      <FIELD name="Кем закрыто" refname="Microsoft.VSTS.Common.ClosedBy" type="String" syncnamechanges="true" reportable="dimension">
        <WHENNOTCHANGED field="System.State">
          <ALLOWEXISTINGVALUE />
          <READONLY />
        </WHENNOTCHANGED>
      </FIELD>
      <FIELD name="Приоритет" refname="Microsoft.VSTS.Common.Priority" type="Integer" reportable="dimension">
        <HELPTEXT>Производственная важность. 1 = необходимо исправить, 4 = не имеет значения.</HELPTEXT>
        <ALLOWEDVALUES expanditems="true">
          <LISTITEM value="1" />
          <LISTITEM value="2" />
          <LISTITEM value="3" />
          <LISTITEM value="4" />
        </ALLOWEDVALUES>
        <DEFAULT from="value" value="2" />
      </FIELD>
      <FIELD name="Ранг стека" refname="Microsoft.VSTS.Common.StackRank" type="Double" reportable="dimension">
        <HELPTEXT>Сначала обработайте элементы с меньшим значением ранга стека. Установить в рассмотрении.</HELPTEXT>
      </FIELD>
      <FIELD name="Область значений" refname="Microsoft.VSTS.Common.ValueArea" type="String">
        <HELPTEXT>Бизнес = предоставляет ценности пользователю или системе; Архитектурный = работает для поддержки других историй или компонентов</HELPTEXT>
        <ALLOWEDVALUES expanditems="true">
          <LISTITEM value="Архитектурный" />
          <LISTITEM value="Бизнес" />
        </ALLOWEDVALUES>
        <REQUIRED />
        <DEFAULT from="value" value="Бизнес" />
      </FIELD>
      <FIELD name="Сборка интеграции" refname="Microsoft.VSTS.Build.IntegrationBuild" type="String" reportable="dimension">
        <HELPTEXT>Сборка, в которой ошибка была исправлена</HELPTEXT>
        <SUGGESTEDVALUES expanditems="true">
          <LISTITEM value="<Нет>" />
        </SUGGESTEDVALUES>
      </FIELD>
      <FIELD name="Риск" refname="Microsoft.VSTS.Common.Risk" type="String" reportable="dimension">
        <HELPTEXT>Неопределенность в требованиях или структуре</HELPTEXT>
        <ALLOWEDVALUES expanditems="true">
          <LISTITEM value="1 - высокий" />
          <LISTITEM value="2 - средний" />
          <LISTITEM value="3 - низкий" />
        </ALLOWEDVALUES>
      </FIELD>
      <FIELD name="Дата начала" refname="Microsoft.VSTS.Scheduling.StartDate" type="DateTime" reportable="dimension">
        <HELPTEXT>Дата начала реализации данной статьи</HELPTEXT>
      </FIELD>
      <FIELD name="Дата завершения" refname="Microsoft.VSTS.Scheduling.FinishDate" type="DateTime" reportable="dimension">
        <HELPTEXT>Дата выполнения для всех задач, реализующих эту историю</HELPTEXT>
      </FIELD>
      <FIELD name="Критерии принятия" refname="Microsoft.VSTS.Common.AcceptanceCriteria" type="HTML" />
    </FIELDS>
    <WORKFLOW>
      <STATES>
        <STATE value="Done" />
        <STATE value="In progress">
          <FIELDS>
            <FIELD refname="Microsoft.VSTS.Common.ClosedDate">
              <EMPTY />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ClosedBy">
              <ALLOWEXISTINGVALUE />
              <EMPTY />
            </FIELD>
          </FIELDS>
        </STATE>
        <STATE value="New">
          <FIELDS>
            <FIELD refname="Microsoft.VSTS.Common.ResolvedDate">
              <EMPTY />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ResolvedBy">
              <ALLOWEXISTINGVALUE />
              <EMPTY />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ClosedDate">
              <EMPTY />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ClosedBy">
              <ALLOWEXISTINGVALUE />
              <EMPTY />
            </FIELD>
          </FIELDS>
        </STATE>
        <STATE value="Removed" />
      </STATES>
      <TRANSITIONS>
        <TRANSITION from="New" to="Removed">
          <REASONS>
            <DEFAULTREASON value="..." />
          </REASONS>
        </TRANSITION>
        <TRANSITION from="In progress" to="Removed">
          <REASONS>
            <DEFAULTREASON value="..." />
          </REASONS>
        </TRANSITION>
        <TRANSITION from="In progress" to="Done">
          <REASONS>
            <DEFAULTREASON value="..." />
          </REASONS>
          <FIELDS>
            <FIELD refname="Microsoft.VSTS.Common.ClosedBy">
              <ALLOWEXISTINGVALUE />
              <COPY from="currentuser" />
              <VALIDUSER />
              <REQUIRED />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ActivatedDate">
              <READONLY />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ActivatedBy">
              <ALLOWEXISTINGVALUE />
              <READONLY />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ClosedDate">
              <SERVERDEFAULT from="clock" />
            </FIELD>
          </FIELDS>
        </TRANSITION>
        <TRANSITION from="Removed" to="New">
          <REASONS>
            <DEFAULTREASON value="..." />
          </REASONS>
        </TRANSITION>
        <TRANSITION from="" to="New">
          <REASONS>
            <DEFAULTREASON value="Новый" />
          </REASONS>
        </TRANSITION>
        <TRANSITION from="Done" to="In progress">
          <REASONS>
            <DEFAULTREASON value="..." />
          </REASONS>
          <FIELDS>
            <FIELD refname="Microsoft.VSTS.Common.ActivatedBy">
              <ALLOWEXISTINGVALUE />
              <COPY from="currentuser" />
              <VALIDUSER />
              <REQUIRED />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ActivatedDate">
              <SERVERDEFAULT from="clock" />
            </FIELD>
          </FIELDS>
        </TRANSITION>
        <TRANSITION from="New" to="In progress">
          <REASONS>
            <DEFAULTREASON value="..." />
          </REASONS>
          <FIELDS>
            <FIELD refname="Microsoft.VSTS.Common.ActivatedBy">
              <COPY from="currentuser" />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ActivatedDate">
              <SERVERDEFAULT from="clock" />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ResolvedDate">
              <SERVERDEFAULT from="clock" />
            </FIELD>
          </FIELDS>
        </TRANSITION>
      </TRANSITIONS>
    </WORKFLOW>
    <FORM>
      <Layout HideControlBorders="true" HideReadOnlyEmptyFields="true">
        <Group Margin="(0,0,0,5)">
          <Column PercentWidth="90">
            <Control FieldName="System.Title" Type="FieldControl" LabelPosition="Top" ControlFontSize="large" EmptyText="<Введите здесь заголовок>" />
          </Column>
          <Column PercentWidth="10">
            <Control FieldName="System.ID" Type="FieldControl" LabelPosition="Top" ControlFontSize="large" />
          </Column>
        </Group>
        <Group Margin="(5,0,0,0)">
          <Column PercentWidth="100">
            <Control FieldName="System.IterationPath" Type="WorkItemClassificationControl" Label="Ите&рация" LabelPosition="Left" />
            <Control FieldName="System.AreaPath" Type="WorkItemClassificationControl" Label="&Область" LabelPosition="Left" />
            <Control FieldName="System.State" Type="FieldControl" Label="&Состояние" LabelPosition="Left" />
          </Column>
        </Group>
        <Group>
          <Column PercentWidth="100">
            <TabGroup>
              <Tab Label="Подробно">
                <Control FieldName="System.Description" Type="HtmlFieldControl" LabelPosition="Top" Dock="Fill" />
              </Tab>
              <Tab Label="Все ссылки">
                <Control Type="LinksControl" LabelPosition="Top" Name="GeneralLinks">
                  <LinksControlOptions>
                    <LinkColumns>
                      <LinkColumn RefName="System.ID" />
                      <LinkColumn RefName="System.WorkItemType" />
                      <LinkColumn RefName="System.Title" />
                      <LinkColumn RefName="System.State" />
                      <LinkColumn LinkAttribute="System.Links.Comment" />
                    </LinkColumns>
                    <WorkItemLinkFilters FilterType="includeAll" />
                    <ExternalLinkFilters FilterType="includeAll" />
                    <WorkItemTypeFilters FilterType="includeAll" />
                  </LinksControlOptions>
                </Control>
              </Tab>
              <Tab Label="Вложения">
                <Control Type="AttachmentsControl" LabelPosition="Top" />
              </Tab>
              <Tab Label="Журнал">
                <Control FieldName="System.History" Type="WorkItemLogControl" LabelPosition="Top" Dock="Fill" />
              </Tab>
            </TabGroup>
          </Column>
        </Group>
      </Layout>
    </FORM>
  </WORKITEMTYPE>
</witd:WITD>

18. Скопируйте файл «Возможность.XML» в файл «Project.XML» (или на любое другое название, например «Крупная цель.XML») и замените содержимое на:

Project.XML

<?xml version="1.0" encoding="utf-8"?>
<witd:WITD application="Work item type editor" version="1.0" xmlns:witd="http://schemas.microsoft.com/VisualStudio/2008/workitemtracking/typedef">
  <WORKITEMTYPE name="Project">
    <DESCRIPTION>Отслеживание компонента, который будет выпущен с продуктом</DESCRIPTION>
    <FIELDS>
      <FIELD name="Путь итерации" refname="System.IterationPath" type="TreePath" reportable="dimension">
        <HELPTEXT>Итерация, в рамках которой этот компонент будет реализован</HELPTEXT>
      </FIELD>
      <FIELD name="Идентификатор итерации" refname="System.IterationId" type="Integer" />
      <FIELD name="Подсчет внешних ссылок" refname="System.ExternalLinkCount" type="Integer" />
      <FIELD name="Командный проект" refname="System.TeamProject" type="String" reportable="dimension" />
      <FIELD name="Подсчет гиперссылок" refname="System.HyperLinkCount" type="Integer" />
      <FIELD name="Подсчет вложенных файлов" refname="System.AttachedFileCount" type="Integer" />
      <FIELD name="Имя узла" refname="System.NodeName" type="String" />
      <FIELD name="Путь к области" refname="System.AreaPath" type="TreePath" reportable="dimension">
        <HELPTEXT>Область продукта, с которой связан этот компонент</HELPTEXT>
      </FIELD>
      <FIELD name="Дата последнего изменения" refname="System.RevisedDate" type="DateTime" reportable="detail" />
      <FIELD name="Дата изменения" refname="System.ChangedDate" type="DateTime" reportable="dimension" />
      <FIELD name="Идентификатор" refname="System.Id" type="Integer" reportable="dimension" />
      <FIELD name="Идентификатор области" refname="System.AreaId" type="Integer" />
      <FIELD name="Авторизован как" refname="System.AuthorizedAs" type="String" syncnamechanges="true" />
      <FIELD name="Название" refname="System.Title" type="String" reportable="dimension">
        <HELPTEXT>Возможности, которые получит пользователь после реализации</HELPTEXT>
        <REQUIRED />
      </FIELD>
      <FIELD name="Состояние" refname="System.State" type="String" reportable="dimension">
        <HELPTEXT>Новый = работа, которая еще не начата; Активный= оставшиеся работы к выполнению; Разрешено = ожидающие приемочных тестов; Закрыто = прошедшие приемочные тесты</HELPTEXT>
      </FIELD>
      <FIELD name="Дата авторизации" refname="System.AuthorizedDate" type="DateTime" />
      <FIELD name="Филигрань" refname="System.Watermark" type="Integer" />
      <FIELD name="Вер" refname="System.Rev" type="Integer" reportable="dimension" />
      <FIELD name="Кем изменено" refname="System.ChangedBy" type="String" syncnamechanges="true" reportable="dimension">
        <ALLOWEXISTINGVALUE />
        <VALIDUSER />
      </FIELD>
      <FIELD name="Причина" refname="System.Reason" type="String" reportable="dimension">
        <HELPTEXT>Причина, по которой компонент находится в текущем состоянии</HELPTEXT>
      </FIELD>
      <FIELD name="Кому назначено" refname="System.AssignedTo" type="String" syncnamechanges="true" reportable="dimension" />
      <FIELD name="Тип рабочего элемента" refname="System.WorkItemType" type="String" reportable="dimension" />
      <FIELD name="Дата создания" refname="System.CreatedDate" type="DateTime" reportable="dimension" />
      <FIELD name="Кем создано" refname="System.CreatedBy" type="String" syncnamechanges="true" reportable="dimension" />
      <FIELD name="Описание" refname="System.Description" type="HTML">
        <HELPTEXT>Описание или критерии принятия, в соответствии с которыми компонент рассматривается как выполненный</HELPTEXT>
      </FIELD>
      <FIELD name="Журнал" refname="System.History" type="History">
        <HELPTEXT>Поток дискуссии плюс автоматическая запись изменений</HELPTEXT>
      </FIELD>
      <FIELD name="Подсчет связанных ссылок" refname="System.RelatedLinkCount" type="Integer" />
      <FIELD name="Теги" refname="System.Tags" type="PlainText" />
      <FIELD name="Столбец доски" refname="System.BoardColumn" type="String" reportable="dimension" />
      <FIELD name="Готовый столбец доски" refname="System.BoardColumnDone" type="Boolean" reportable="dimension" />
      <FIELD name="Строка доски" refname="System.BoardLane" type="String" reportable="dimension" />
      <FIELD name="Дата изменения состояния" refname="Microsoft.VSTS.Common.StateChangeDate" type="DateTime">
        <WHENNOTCHANGED field="System.State">
          <READONLY />
        </WHENNOTCHANGED>
        <WHENCHANGED field="System.State">
          <SERVERDEFAULT from="clock" />
        </WHENCHANGED>
      </FIELD>
      <FIELD name="Дата активации" refname="Microsoft.VSTS.Common.ActivatedDate" type="DateTime" reportable="dimension">
        <WHENNOTCHANGED field="System.State">
          <READONLY />
        </WHENNOTCHANGED>
      </FIELD>
      <FIELD name="Кем активировано" refname="Microsoft.VSTS.Common.ActivatedBy" type="String" syncnamechanges="true" reportable="dimension">
        <WHENNOTCHANGED field="System.State">
          <ALLOWEXISTINGVALUE />
          <READONLY />
        </WHENNOTCHANGED>
      </FIELD>
      <FIELD name="Дата разрешения" refname="Microsoft.VSTS.Common.ResolvedDate" type="DateTime" reportable="dimension">
        <WHENNOTCHANGED field="System.State">
          <READONLY />
        </WHENNOTCHANGED>
      </FIELD>
      <FIELD name="Кем разрешено" refname="Microsoft.VSTS.Common.ResolvedBy" type="String" syncnamechanges="true" reportable="dimension">
        <WHENNOTCHANGED field="System.State">
          <ALLOWEXISTINGVALUE />
          <READONLY />
        </WHENNOTCHANGED>
      </FIELD>
      <FIELD name="Разрешенная причина" refname="Microsoft.VSTS.Common.ResolvedReason" type="String" reportable="dimension" />
      <FIELD name="Дата закрытия" refname="Microsoft.VSTS.Common.ClosedDate" type="DateTime" reportable="dimension">
        <WHENNOTCHANGED field="System.State">
          <READONLY />
        </WHENNOTCHANGED>
      </FIELD>
      <FIELD name="Кем закрыто" refname="Microsoft.VSTS.Common.ClosedBy" type="String" syncnamechanges="true" reportable="dimension">
        <WHENNOTCHANGED field="System.State">
          <ALLOWEXISTINGVALUE />
          <READONLY />
        </WHENNOTCHANGED>
      </FIELD>
      <FIELD name="Приоритет" refname="Microsoft.VSTS.Common.Priority" type="Integer" reportable="dimension">
        <HELPTEXT>Приоритет для выполнения компонента, с учетом целей бизнеса</HELPTEXT>
        <REQUIRED />
        <DEFAULT from="value" value="2" />
        <ALLOWEDVALUES expanditems="true">
          <LISTITEM value="1" />
          <LISTITEM value="2" />
          <LISTITEM value="3" />
          <LISTITEM value="4" />
        </ALLOWEDVALUES>
      </FIELD>
      <FIELD name="Ранг стека" refname="Microsoft.VSTS.Common.StackRank" type="Double" reportable="dimension">
        <HELPTEXT>Сначала обработайте элементы с меньшим значением ранга стека. Установить в рассмотрении.</HELPTEXT>
      </FIELD>
      <FIELD name="Область значений" refname="Microsoft.VSTS.Common.ValueArea" type="String">
        <HELPTEXT>Бизнес = службы, предоставляемые системой для выполнения требований заинтересованных лиц; Архитектурный = технические системные службы для реализации бизнес-функций, которые предоставляют ценность решения</HELPTEXT>
        <REQUIRED />
        <DEFAULT from="value" value="Бизнес" />
        <ALLOWEDVALUES expanditems="true">
          <LISTITEM value="Архитектурный" />
          <LISTITEM value="Бизнес" />
        </ALLOWEDVALUES>
      </FIELD>
      <FIELD name="Сборка интеграции" refname="Microsoft.VSTS.Build.IntegrationBuild" type="String" reportable="dimension">
        <HELPTEXT>Сборка, в которой компонент был исправлен</HELPTEXT>
        <SUGGESTEDVALUES expanditems="true">
          <LISTITEM value="<Нет>" />
        </SUGGESTEDVALUES>
      </FIELD>
      <FIELD name="Риск" refname="Microsoft.VSTS.Common.Risk" type="String" reportable="dimension">
        <HELPTEXT>Неопределенность в компоненте</HELPTEXT>
        <ALLOWEDVALUES expanditems="true">
          <LISTITEM value="1 - высокий" />
          <LISTITEM value="2 - средний" />
          <LISTITEM value="3 - низкий" />
        </ALLOWEDVALUES>
      </FIELD>
      <FIELD name="Целевая дата" refname="Microsoft.VSTS.Scheduling.TargetDate" type="DateTime" reportable="dimension">
        <HELPTEXT>Целевая дата выполнения компонента</HELPTEXT>
      </FIELD>
      <FIELD name="Ценность для бизнеса" refname="Microsoft.VSTS.Common.BusinessValue" type="Integer" reportable="measure" formula="sum">
        <HELPTEXT>Ценность для бизнеса клиента, создаваемая выпуском компонента</HELPTEXT>
      </FIELD>
      <FIELD name="Критичность по времени" refname="Microsoft.VSTS.Common.TimeCriticality" type="Double">
        <HELPTEXT>Как снижается бизнес-ценность со временем. Более высокие значения означают, что функция является более критичной по времени</HELPTEXT>
      </FIELD>
      <FIELD name="Трудозатраты" refname="Microsoft.VSTS.Scheduling.Effort" type="Double" reportable="measure" formula="sum">
        <HELPTEXT>Предварительные трудозатраты по реализации функции</HELPTEXT>
      </FIELD>
    </FIELDS>
    <WORKFLOW>
      <STATES>
        <STATE value="Done">
          <FIELDS>
            <FIELD refname="Microsoft.VSTS.Common.BusinessValue">
              <READONLY />
            </FIELD>
          </FIELDS>
        </STATE>
        <STATE value="In progress">
          <FIELDS>
            <FIELD refname="Microsoft.VSTS.Common.ClosedDate">
              <EMPTY />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ClosedBy">
              <ALLOWEXISTINGVALUE />
              <EMPTY />
            </FIELD>
          </FIELDS>
        </STATE>
        <STATE value="New">
          <FIELDS>
            <FIELD refname="Microsoft.VSTS.Common.ResolvedDate">
              <EMPTY />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ResolvedBy">
              <ALLOWEXISTINGVALUE />
              <EMPTY />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ClosedDate">
              <EMPTY />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ClosedBy">
              <ALLOWEXISTINGVALUE />
              <EMPTY />
            </FIELD>
          </FIELDS>
        </STATE>
        <STATE value="Removed" />
      </STATES>
      <TRANSITIONS>
        <TRANSITION from="In progress" to="Removed">
          <REASONS>
            <DEFAULTREASON value="..." />
          </REASONS>
        </TRANSITION>
        <TRANSITION from="New" to="Removed">
          <REASONS>
            <DEFAULTREASON value="..." />
          </REASONS>
        </TRANSITION>
        <TRANSITION from="In progress" to="Done">
          <REASONS>
            <DEFAULTREASON value="..." />
          </REASONS>
          <FIELDS>
            <FIELD refname="Microsoft.VSTS.Common.ClosedBy">
              <ALLOWEXISTINGVALUE />
              <COPY from="currentuser" />
              <VALIDUSER />
              <REQUIRED />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ActivatedDate">
              <READONLY />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ActivatedBy">
              <ALLOWEXISTINGVALUE />
              <READONLY />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ClosedDate">
              <SERVERDEFAULT from="clock" />
            </FIELD>
          </FIELDS>
        </TRANSITION>
        <TRANSITION from="Done" to="In progress">
          <REASONS>
            <DEFAULTREASON value="..." />
          </REASONS>
          <FIELDS>
            <FIELD refname="Microsoft.VSTS.Common.ActivatedBy">
              <ALLOWEXISTINGVALUE />
              <COPY from="currentuser" />
              <VALIDUSER />
              <REQUIRED />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ActivatedDate">
              <SERVERDEFAULT from="clock" />
            </FIELD>
          </FIELDS>
        </TRANSITION>
        <TRANSITION from="New" to="In progress">
          <REASONS>
            <DEFAULTREASON value="..." />
          </REASONS>
          <FIELDS>
            <FIELD refname="Microsoft.VSTS.Common.ActivatedBy">
              <COPY from="currentuser" />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ActivatedDate">
              <SERVERDEFAULT from="clock" />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ResolvedDate">
              <SERVERDEFAULT from="clock" />
            </FIELD>
          </FIELDS>
        </TRANSITION>
        <TRANSITION from="Removed" to="New">
          <REASONS>
            <DEFAULTREASON value="..." />
          </REASONS>
        </TRANSITION>
        <TRANSITION from="" to="New">
          <REASONS>
            <DEFAULTREASON value="Новый" />
          </REASONS>
        </TRANSITION>
      </TRANSITIONS>
    </WORKFLOW>
    <FORM>
      <Layout HideControlBorders="true" HideReadOnlyEmptyFields="true">
        <Group Margin="(0,0,0,5)">
          <Column PercentWidth="90">
            <Control FieldName="System.Title" Type="FieldControl" LabelPosition="Top" ControlFontSize="large" EmptyText="<Введите здесь заголовок>" />
          </Column>
          <Column PercentWidth="10">
            <Control FieldName="System.ID" Type="FieldControl" LabelPosition="Top" ControlFontSize="large" />
          </Column>
        </Group>
        <Group Margin="(5,0,0,0)">
          <Column PercentWidth="50">
            <Control FieldName="System.State" Type="FieldControl" Label="&Состояние" LabelPosition="Left" />
            <Control FieldName="System.Reason" Type="FieldControl" Label="Причина" LabelPosition="Left" />
          </Column>
          <Column PercentWidth="50">
            <Control FieldName="System.AreaPath" Type="WorkItemClassificationControl" Label="&Область" LabelPosition="Left" />
            <Control FieldName="System.IterationPath" Type="WorkItemClassificationControl" Label="Ите&рация" LabelPosition="Left" />
          </Column>
        </Group>
        <Group>
          <Column PercentWidth="70">
            <TabGroup>
              <Tab Label="Подробно">
                <Control FieldName="System.Description" Type="HtmlFieldControl" LabelPosition="Top" Dock="Fill" />
              </Tab>
              <Tab Label="Все ссылки">
                <Control Type="LinksControl" LabelPosition="Top" Name="GeneralLinks">
                  <LinksControlOptions>
                    <LinkColumns>
                      <LinkColumn RefName="System.ID" />
                      <LinkColumn RefName="System.WorkItemType" />
                      <LinkColumn RefName="System.Title" />
                      <LinkColumn RefName="System.State" />
                      <LinkColumn LinkAttribute="System.Links.Comment" />
                    </LinkColumns>
                    <WorkItemLinkFilters FilterType="includeAll" />
                    <ExternalLinkFilters FilterType="includeAll" />
                    <WorkItemTypeFilters FilterType="includeAll" />
                  </LinksControlOptions>
                </Control>
              </Tab>
              <Tab Label="Вложения">
                <Control Type="AttachmentsControl" LabelPosition="Top" />
              </Tab>
              <Tab Label="Журнал">
                <Control FieldName="System.History" Type="WorkItemLogControl" LabelPosition="Top" Dock="Fill" />
              </Tab>
            </TabGroup>
          </Column>
        </Group>
      </Layout>
    </FORM>
  </WORKITEMTYPE>
</witd:WITD>

Сохранение XML-ек

1. Тыкаем в Visual Studio пункт меню «Сервис / Process Editor / Work Item Types / Import WIT»
2. Далее выбираем файл «SQL task.XML».
3. Повторяем для файлов: C# task.XML, 1C task.XML, Story.XML, Project.XML.
4. Далее самое трудное.
5. Нужно сохранить файл ProcessConfig.XML. Набираем в консоли:

cd c:Program…Microsoft Visual Studio 14.0Common7IDE
witadmin importprocessconfig /f:"c:worktfs2015ProcessConfig.xml" /p:projectname /collection:"http://tfs2015:8080/tfs/CollectionName"

6. Необходимо убедиться, что появилась надпись «Операция завершена.». В противном случае – увы. Необходимо разбираться с ошибкой.
7. Далее необходимо сохранить файл Categories.XML. Набираем в консоли:

cd c:Program…Microsoft Visual Studio 14.0Common7IDE
witadmin importcategories /f:"c:worktfs2015Categories.xml" /p:projectname /collection:"http://tfs2015:8080/tfs/CollectionName"

Не забываем вставлять свои названия.
8. Здесь также необходимо убедиться, что появилась надпись «Операция завершена.». Если вы это увидели, то значит самое трудное позади.
9. Теперь можно перезагрузить страницу TFS и даже создать Project, Story и несколько задач.
Ещё одна версия настройки TFS под командную работу - 5

Настройка TFS через интерфейс

1. Далее заходим в «Управление командой»
Ещё одна версия настройки TFS под командную работу - 6
2. Добавляем членов команды, если это ещё не сделано.
3. Добавляем одну дочернюю итерацию «Одобрено заказчиком». Это для того, чтобы задачи на доске появлялись только тогда, когда они согласованы. Да, итерация используется не по назначению, но зато удобно. Помещать туда может как менеджер команды, так и представитель заказчика.
4. Добавляем по одной дочерней области под каждую команду. И в каждой такой области ещё одну подобласть – «От других команд». Это для того, чтобы передавая задачу другой команде, она знала, что это не собственная задача, а от «соседей». Например так:
Ещё одна версия настройки TFS под командную работу - 7

5. Проставьте видимость областей и области по умолчанию для каждой команды.
6. Настройте необходимые оповещения.
7. Возвращаемся в невыполненные работы и настраиваем колонки списков для Projects, Story и итерации «Одобрено поставщиком».
8. Переходим на доску итерации «Одобрено поставщиком».
9. Открываем настройки.
Ещё одна версия настройки TFS под командную работу - 8
10. Настраиваем внешний вид карточек задач – вкладка «Поля». Например так:
Ещё одна версия настройки TFS под командную работу - 9

11. Переходим на вкладку «Стили» и настраиваем подсветку задач, отправленных в другую команду:
Ещё одна версия настройки TFS под командную работу - 10

12. И подсветку задач, пришедших из другой команды:
Ещё одна версия настройки TFS под командную работу - 11

13. Переходим к доске «Stories». Сразу она не отобразится. Нужно перейти к настройкам и сначала подвязать новые статусы не меняя количество столбцов. Сохранить. Затем убрать лишние столбцы (или добавить недостающие). В рабочих столбиках нужно установить предел НЗР (например 99). Сохранить. Теперь можно посмотреть.
Ещё одна версия настройки TFS под командную работу - 12

14. Далее настраиваем на данной доске подстветку.
15. Делаем то же самое для доски «Projects».
16. Делаем то же самое для других команд.
Всё. Если нужно расписать пример использования – пишите в комментариях.

Автор: 1div0

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js