Создание правила
Задача
Необходимо экспортировать справочник Должности из Directum RX в 1С: Бухгалтерия 2.0.
Решение
В стандартной поставке нет правил синхронизации для данного справочника, поэтому создайте новое правило на основе базового правила ExportRule. Для этого:
1.Создайте правило экспорта наследованием от Sync1C.ExportRule. Убедитесь, что указан атрибут класса, который необходим для загрузки и вызова правила утилитой DrxUtul.
[Export(typeof(Rule))]
public class JobTitleExport : ExportRule {}
2.Заполните конструктор. Укажите имя правила, конфигурацию 1С, для которой предназначено правило, и реквизиты, которые будут синхронизироваться.
public JobTitleExport()
{
this.Name = "JobTitleExport";
// Исходные типы Directum RX.
this.SourceTypesRX = new List<Type>()
{ EntityTypesRXMetadata.GetAppliedType("Sungero.Company.IJobTitle")};
// Название справочника 1С, в который будет производится загрузка.
this.TargetType1C = "Должности";
// Типы конфигураций поддерживаемые правилом.
// Например: БухгалтерияПредприятияПРОФ, БухгалтерияПредприятияКОРП или
// БухгалтерияПредприятия.
this.ConfigurationTypes = new List<string>() {"Бухгалтерия предприятия"};
// Список наименований реквизтов 1C, которые нужно загрузить в 1С.
this.RequisitesNames1C = new List<string>() {"Наименование"};
}
3.Переопределите метод Filter(), чтобы при экспорте не учитывались закрытые записи должностей:
// Функция используется для предфильтрации списка сущностей Directum RX.
// Например чтобы удалить из списка сущности не подходящие по какому-либо
// условию, и таким образом, они не попадут в экспорт в 1С.
public override IEnumerable<IEntity> Filter(IEnumerable<IEntity> entities)
{
return entities.Where(x => (IJobTitle)x != null &&
((IJobTitle)x).Status == Sungero.CoreEntities.DatabookEntry.Status.Active);
}
4.Переопределите метод GetEntityLogDisplayValue() и задайте, как будет выглядеть информация об экспорте записи в лог-файле:
public override string GetEntityLogDisplayValue(IEntity entity)
{
var jobTitle = (IJobTitle)entity;
if (jobTitle == null)
return entity.DisplayValue;
return jobTitle.Name;
}
5.Переопределите метод FindDuplicates() чтобы при экспорте не создавались записи в справочнике 1C, если в нем уже есть должности с соответствующим наименованием. Метод служит для поиска записей справочника 1С, которые соответствуют записям справочника Directum RX.
public override List<Record1C> FindDuplicates(IEntity entity)
{
var result = new List<Record1C>();
var jobTitle = entity as IJobTitle;
if (jobTitle == null)
return result;
// Запрос к 1С для поиска дублей.
using (var query = new Query1C())
{
var queryText = string.Format(@"ВЫБРАТЬ
Должность.Ссылка КАК Ссылка,
Должность.ПометкаУдаления КАК
ПометкаУдаления
ИЗ Справочник.Должности КАК Должность
ГДЕ Должность.Наименование = ""{0}""",
jobTitle.Name);
using (var selection = query.Execute(queryText))
{
// Обход результата запроса в цикле.
while (selection.Object1C.Next())
{
var record = new Record1C();
record.Uuid =
Connector1C.Instance.GetXmlString(selection.Object1C.Ссылка);
record.SetRequisite(Metadata1CService.DeleteMarkFieldName,
selection.Object1C.ПометкаУдаления as bool?);
result.Add(record);
}
}
return result;
}
}
6.Переопределите метод Export(). В методе описывается заполнение реквизитов объекта 1С на основании сущности Directum RX. В данном случае заполните только реквизит «Наименование».
public override bool Export(RecordEntityBundle bundle)
{
// Контейнер, из которого строится объект 1С.
// В правиле экспорта является приемником.
var record = bundle.Record1C;
// Элемент справочника "Должности" Directum RX.
// В правиле экспорта является источником.
var entity = bundle.Entity as IJobTitle;
if (record == null || entity == null)
return false;
record.SetRequisite("Наименование", entity.Name);
return true;
}
Изменение стандартного правила из комплекта поставки Фильтрация записей для загрузки с сервера приложений Создание правила для другой конфигурации 1С |
© Компания Directum, 2024 |