Кастомизация
13
Фев
0

Изменение типа владения объектом

Ситуация: Вы создали объект с типом владения «Организация», настроили для него кучу полей, связей, форм и т.д. Но поняли, что ошиблись и Вам нужно изменить тип владения на «Пользователь». Стандартными средствами этого сделать нельзя – придется удалять объект и делать все заново. Но CRM не была бы CRM если бы на каждое правило не существовало хитрожопого воркэраунда 🙂

Прежде чем начать, определитесь с одной важной деталью: хотите ли Вы сохранить прежнее системное название объекта или его можно чуточку изменить. Если хотите сохранить, то предварительно выгрузите из системы все данные для этого объекта (сами записи, Примечания, Действия и связи), потому что в последующем его придется удалить. А после пересоздания объекта все данные нужно будет импортнуть обратно.

З.Ы. При таком маневре Вы все равно потеряете информацию, хранящуюся в атрибутах created/modified (by/on).

З.Ы.2. Не забудьте сделать копию всего и вся, что связано с этим объектом (БД, кастомизации).

Банзай:

  • Создайте Решение и включите в него все настройки, связанные с объектом (БП, Роли безопасности и т.д.), и выгрузите его.
  • Создайте Решение с изменяемым объектом + связанные с ним БП, выгрузите его и откройте на редактирование.
  • Удалите из системы объект (если хотите после пересоздания сохранить его прежнее системное название.
  • В файле customizations.xml внесите следующие изменения:
    • Поменяйте тип владения:
      <OwnershipTypeMask>OrgOwned</OwnershipTypeMask>

      на:

      <OwnershipTypeMask>UserOwned</OwnershipTypeMask>
    • Замените атрибуты организации на атрибуты пользователя (здесь и далее: поменяйте английский текст и код языка на используемый в Вашей системе):
      <attribute PhysicalName="OrganizationId">
        <Type>lookup</Type>
        <Name>organizationid</Name>
        <LogicalName>organizationid</LogicalName>
        <RequiredLevel>none</RequiredLevel>
        <ImeMode>auto</ImeMode>
        <ValidForReadApi>1</ValidForReadApi>
        <IsCustomField>0</IsCustomField>
        <IsAuditEnabled>1</IsAuditEnabled>
        <IsSecured>0</IsSecured>
        <IntroducedVersion>1.0</IntroducedVersion>
        <IsCustomizable>1</IsCustomizable>
        <IsRenameable>1</IsRenameable>
        <CanModifySearchSettings>1</CanModifySearchSettings>
        <CanModifyRequirementLevelSettings>1</CanModifyRequirementLevelSettings>
        <CanModifyAdditionalSettings>1</CanModifyAdditionalSettings>
        <ReferencedEntityObjectTypeCode>1019</ReferencedEntityObjectTypeCode>
        <LookupTypes />
        <displaynames>
          <displayname description="Organization Id" languagecode="1033" />
        </displaynames>
        <Descriptions>
          <Description description="Unique identifier for the organization" languagecode="1033" />
        </Descriptions>
      </attribute>
      

      на:

      <attribute PhysicalName="OwnerId">
        <Type>owner</Type>
        <Name>ownerid</Name>
        <LogicalName>ownerid</LogicalName>
        <RequiredLevel>systemrequired</RequiredLevel>
        <DisplayMask>ValidForAdvancedFind|ValidForForm|ValidForGrid|RequiredForForm</DisplayMask>
        <ImeMode>auto</ImeMode>
        <ValidForReadApi>1</ValidForReadApi>
        <ValidForCreateApi>1</ValidForCreateApi>
        <IsCustomField>0</IsCustomField>
        <IsAuditEnabled>1</IsAuditEnabled>
        <IsSecured>0</IsSecured>
        <IntroducedVersion>1.0.0.0</IntroducedVersion>
        <IsCustomizable>1</IsCustomizable>
        <IsRenameable>1</IsRenameable>
        <CanModifySearchSettings>1</CanModifySearchSettings>
        <CanModifyRequirementLevelSettings>1</CanModifyRequirementLevelSettings>
        <CanModifyAdditionalSettings>1</CanModifyAdditionalSettings>
        <LookupStyle>single</LookupStyle>
        <LookupTypes>
          <LookupType id="00000000-0000-0000-0000-000000000000">8</LookupType>
          <LookupType id="00000000-0000-0000-0000-000000000000">9</LookupType>
        </LookupTypes>
        <displaynames>
          <displayname description="Owner" languagecode="1033" />
        </displaynames>
        <Descriptions>
          <Description description="Owner Id" languagecode="1033" />
        </Descriptions>
      </attribute>
      <attribute PhysicalName="OwnerIdName">
        <Type>nvarchar</Type>
        <Name>owneridname</Name>
        <LogicalName>owneridname</LogicalName>
        <RequiredLevel>systemrequired</RequiredLevel>
        <ImeMode>auto</ImeMode>
        <ValidForReadApi>1</ValidForReadApi>
        <IsCustomField>0</IsCustomField>
        <IsAuditEnabled>0</IsAuditEnabled>
        <IsLogical>1</IsLogical>
        <IsSecured>0</IsSecured>
        <IntroducedVersion>1.0.0.0</IntroducedVersion>
        <IsCustomizable>1</IsCustomizable>
        <IsRenameable>1</IsRenameable>
        <CanModifySearchSettings>1</CanModifySearchSettings>
        <CanModifyRequirementLevelSettings>1</CanModifyRequirementLevelSettings>
        <CanModifyAdditionalSettings>1</CanModifyAdditionalSettings>
        <Format>text</Format>
        <MaxLength>100</MaxLength>
        <Length>320</Length>
        <Descriptions>
          <Description description="Name of the owner" languagecode="1033" />
        </Descriptions>
      </attribute>
      <attribute PhysicalName="OwnerIdType">
        <Type>int</Type>
        <Name>owneridtype</Name>
        <LogicalName>owneridtype</LogicalName>
        <RequiredLevel>systemrequired</RequiredLevel>
        <DisplayMask>ObjectTypeCode</DisplayMask>
        <ImeMode>disabled</ImeMode>
        <ValidForReadApi>1</ValidForReadApi>
        <ValidForCreateApi>1</ValidForCreateApi>
        <IsCustomField>0</IsCustomField>
        <IsAuditEnabled>1</IsAuditEnabled>
        <IsSecured>0</IsSecured>
        <IntroducedVersion>1.0.0.0</IntroducedVersion>
        <IsCustomizable>1</IsCustomizable>
        <IsRenameable>1</IsRenameable>
        <CanModifySearchSettings>1</CanModifySearchSettings>
        <CanModifyRequirementLevelSettings>1</CanModifyRequirementLevelSettings>
        <CanModifyAdditionalSettings>1</CanModifyAdditionalSettings>
        <Format></Format>
        <MinValue>-2147483648</MinValue>
        <MaxValue>2147483647</MaxValue>
        <Descriptions>
          <Description description="Owner Id Type" languagecode="1033" />
        </Descriptions>
      </attribute>
      <attribute PhysicalName="OwnerIdYomiName">
        <Type>nvarchar</Type>
        <Name>owneridyominame</Name>
        <LogicalName>owneridyominame</LogicalName>
        <RequiredLevel>systemrequired</RequiredLevel>
        <ImeMode>auto</ImeMode>
        <ValidForReadApi>1</ValidForReadApi>
        <IsCustomField>0</IsCustomField>
        <IsAuditEnabled>0</IsAuditEnabled>
        <IsLogical>1</IsLogical>
        <IsSecured>0</IsSecured>
        <IntroducedVersion>1.0.0.0</IntroducedVersion>
        <IsCustomizable>1</IsCustomizable>
        <IsRenameable>1</IsRenameable>
        <CanModifySearchSettings>1</CanModifySearchSettings>
        <CanModifyRequirementLevelSettings>1</CanModifyRequirementLevelSettings>
        <CanModifyAdditionalSettings>1</CanModifyAdditionalSettings>
        <Format>text</Format>
        <MaxLength>100</MaxLength>
        <Length>320</Length>
        <YomiOf>OwnerIdName</YomiOf>
        <Descriptions>
          <Description description="Yomi name of the owner" languagecode="1033" />
        </Descriptions>
      </attribute>
      <attribute PhysicalName="OwningBusinessUnit">
        <Type>lookup</Type>
        <Name>owningbusinessunit</Name>
        <LogicalName>owningbusinessunit</LogicalName>
        <RequiredLevel>none</RequiredLevel>
        <ImeMode>auto</ImeMode>
        <ValidForReadApi>1</ValidForReadApi>
        <IsCustomField>0</IsCustomField>
        <IsAuditEnabled>0</IsAuditEnabled>
        <IsSecured>0</IsSecured>
        <IntroducedVersion>1.0.0.0</IntroducedVersion>
        <IsCustomizable>1</IsCustomizable>
        <IsRenameable>1</IsRenameable>
        <CanModifySearchSettings>1</CanModifySearchSettings>
        <CanModifyRequirementLevelSettings>1</CanModifyRequirementLevelSettings>
        <CanModifyAdditionalSettings>1</CanModifyAdditionalSettings>
        <ReferencedEntityObjectTypeCode>10</ReferencedEntityObjectTypeCode>
        <LookupStyle>single</LookupStyle>
        <LookupTypes />
        <displaynames>
          <displayname description="Owning Business Unit" languagecode="1033" />
        </displaynames>
        <Descriptions>
          <Description description="Unique identifier for the business unit that owns the record" languagecode="1033" />
        </Descriptions>
      </attribute>
      
    • Замените связи организации на связи пользователя (здесь Вам нужно заменить «your_entity» на название Вашего объекта):
      <EntityRelationship Name="organization_your_entity">
        <EntityRelationshipType>OneToMany</EntityRelationshipType>
        <IsCustomizable>1</IsCustomizable>
        <IntroducedVersion>1.0</IntroducedVersion>
        <ReferencingEntityName>your_entity</ReferencingEntityName>
        <ReferencedEntityName>Organization</ReferencedEntityName>
        <CascadeAssign>NoCascade</CascadeAssign>
        <CascadeDelete>NoCascade</CascadeDelete>
        <CascadeReparent>NoCascade</CascadeReparent>
        <CascadeShare>NoCascade</CascadeShare>
        <CascadeUnshare>NoCascade</CascadeUnshare>
        <ReferencingAttributeName>OrganizationId</ReferencingAttributeName>
        <RelationshipDescription>
          <Descriptions>
            <Description description="Unique identifier for the organization" languagecode="1033" />
          </Descriptions>
        </RelationshipDescription>
        <field name="organizationid" requiredlevel="none" imemode="auto">
          <IsCustomizable>1</IsCustomizable>
          <IsRenameable>1</IsRenameable>
          <CanModifySearchSettings>1</CanModifySearchSettings>
          <CanModifyRequirementLevelSettings>1</CanModifyRequirementLevelSettings>
          <IsSecured>0</IsSecured>
          <IsAuditEnabled>1</IsAuditEnabled>
          <displaynames>
            <displayname description="Organization Id" languagecode="1033" />
          </displaynames>
        </field>
      </EntityRelationship>
      

      на:

      <EntityRelationship Name="owner_your_entity">
        <EntityRelationshipType>OneToMany</EntityRelationshipType>
        <IsCustomizable>1</IsCustomizable>
        <IntroducedVersion>1.0.0.0</IntroducedVersion>
        <ReferencingEntityName>your_entity</ReferencingEntityName>
        <ReferencedEntityName>Owner</ReferencedEntityName>
        <CascadeAssign>NoCascade</CascadeAssign>
        <CascadeDelete>NoCascade</CascadeDelete>
        <CascadeReparent>NoCascade</CascadeReparent>
        <CascadeShare>NoCascade</CascadeShare>
        <CascadeUnshare>NoCascade</CascadeUnshare>
        <ReferencingAttributeName>OwnerId</ReferencingAttributeName>
        <RelationshipDescription>
          <Descriptions>
            <Description description="Owner Id" languagecode="1033" />
          </Descriptions>
        </RelationshipDescription>
        <field name="ownerid" requiredlevel="systemrequired" imemode="auto" lookupstyle="single" lookupbrowse="0" lookuptypes="8, 9">
          <IsCustomizable>1</IsCustomizable>
          <IsRenameable>1</IsRenameable>
          <CanModifySearchSettings>1</CanModifySearchSettings>
          <CanModifyRequirementLevelSettings>1</CanModifyRequirementLevelSettings>
          <IsSecured>0</IsSecured>
          <DisplayMask>ValidForAdvancedFind|ValidForForm|ValidForGrid|RequiredForForm</DisplayMask>
          <IsAuditEnabled>1</IsAuditEnabled>
          <displaynames>
            <displayname description="Owner" languagecode="1033" />
          </displaynames>
        </field>
      </EntityRelationship>
      <EntityRelationship Name="team_your_entity">
        <EntityRelationshipType>OneToMany</EntityRelationshipType>
        <IsCustomizable>1</IsCustomizable>
        <IntroducedVersion>1.0.0.0</IntroducedVersion>
        <ReferencingEntityName>your_entity</ReferencingEntityName>
        <ReferencedEntityName>Team</ReferencedEntityName>
        <CascadeAssign>NoCascade</CascadeAssign>
        <CascadeDelete>NoCascade</CascadeDelete>
        <CascadeReparent>NoCascade</CascadeReparent>
        <CascadeShare>NoCascade</CascadeShare>
        <CascadeUnshare>NoCascade</CascadeUnshare>
        <ReferencingAttributeName>OwningTeam</ReferencingAttributeName>
        <RelationshipDescription>
          <Descriptions>
            <Description description="Unique identifier for the team that owns the record." languagecode="1033" />
          </Descriptions>
        </RelationshipDescription>
        <field name="owningteam" requiredlevel="none" imemode="auto" lookupstyle="single" lookupbrowse="0">
          <IsCustomizable>1</IsCustomizable>
          <IsRenameable>1</IsRenameable>
          <CanModifySearchSettings>1</CanModifySearchSettings>
          <CanModifyRequirementLevelSettings>1</CanModifyRequirementLevelSettings>
          <IsSecured>0</IsSecured>
          <IsAuditEnabled>0</IsAuditEnabled>
          <displaynames>
            <displayname description="Owning Team" languagecode="1033" />
          </displaynames>
        </field>
      </EntityRelationship>
      <EntityRelationship Name="user_your_entity">
        <EntityRelationshipType>OneToMany</EntityRelationshipType>
        <IsCustomizable>1</IsCustomizable>
        <IntroducedVersion>1.0.0.0</IntroducedVersion>
        <ReferencingEntityName>your_entity</ReferencingEntityName>
        <ReferencedEntityName>SystemUser</ReferencedEntityName>
        <CascadeAssign>NoCascade</CascadeAssign>
        <CascadeDelete>NoCascade</CascadeDelete>
        <CascadeReparent>NoCascade</CascadeReparent>
        <CascadeShare>NoCascade</CascadeShare>
        <CascadeUnshare>NoCascade</CascadeUnshare>
        <ReferencingAttributeName>OwningUser</ReferencingAttributeName>
        <RelationshipDescription>
          <Descriptions>
            <Description description="Unique identifier for the user that owns the record." languagecode="1033" />
          </Descriptions>
        </RelationshipDescription>
        <field name="owninguser" requiredlevel="none" imemode="auto" lookupstyle="single" lookupbrowse="0">
          <IsCustomizable>1</IsCustomizable>
          <IsRenameable>1</IsRenameable>
          <CanModifySearchSettings>1</CanModifySearchSettings>
          <CanModifyRequirementLevelSettings>1</CanModifyRequirementLevelSettings>
          <IsSecured>0</IsSecured>
          <IsAuditEnabled>0</IsAuditEnabled>
          <displaynames>
            <displayname description="Owning User" languagecode="1033" />
          </displaynames>
        </field>
      </EntityRelationship>
      
    • Если хотите создать новый объект (а не заменить существующий), массово замените во всем файле старое название объекта на новое (your_entity –> your_entity2).
  • Сохраните Customization.xml и импортируйте обратно.

Примечание: если во время импорта Вы получите ошибку о кривой ссылке, то удалите имеющие ссылки, связанные с объектом (сабгрид ссылающийся на объект, ссылки на веб-ресурсы и т.д.), а после пересоздания добавьте их ручками.


После пересоздания проверьте и ручками подправьте следующие компоненты:

  • Формы (добавьте недостающие ссылки).
  • Роли безопасности.
  • Бизнес-процессы.
Комментарии (0)

*

code