Хочу сразу же выразить огромную благодарность разработчикам 1С++ и хочу поделиться своим видением работы с 1С через
Code First и Linq to EF
Данный проект является чисто исследовательским использования Code First и Linq to EF на примере 1С версии 7.7. Так как сам я программист 1С, то мне всегда было интересно как можно перенести модель объектов 1С на компилируемые языки, и использовать мощь Linq to EF.
С появлением Code First давно хотел прикрутить, но все как то руки не доходили и вот наконец ..
Для начала создадим базовый класс
public class СправочникПредок
{
public virtual string ID { get; set; }
public virtual string Наименование { get; set; }
public virtual bool ПометкаУдаления { get; set; }
public virtual byte ISFOLDER { get; set; }
public virtual object ПолучитьКод() { return""; }
public virtual string Вид() { return""; }
public virtual bool ЭтоГруппа() { return ISFOLDER == 1; }
}
Зачем это нужно поясню чуть позже.
На его основе можно создать описание справочника, наприме Номенклатуры
[Table("SC84")]
public partial class Номенклатура :СправочникПредок
{
public DateTime ДатаДляПериодическихРеквизитов = DateTime.Now;
[Key]
[Required]
[StringLength(9)]
override publicstring ID { get; set; }
[Column("CODE")]
[Required]
[StringLength(8)]
public string Код { get; set; }
[Column("DESCR")]
[Required]
[StringLength(99)]
override public string Наименование { get; set; }
[Column("PARENTID")]
[Required]
[StringLength(9)]
public string РодительId { get; set; }
override public byte ISFOLDER { get; set; }
[Column("ISMARK")]
override public bool ПометкаУдаления { get; set; }
..............................................................
[Column("SP94")]
[Required]
[StringLength(9)]
public string ОсновнаяЕдиницаId { get; set; }
[Column("SP8906")]
[Required]
[StringLength(9)]
public string МатериалId { get; set; }
..............................................................
public virtual object ПолучитьКод() { returnКод; }
virtual public Справочник.Номенклатура Родитель { get; set; }
virtual public Справочник.Номенклатура Материал { get; set; }
[InverseProperty("Материал")]
public ICollection<Справочник.Номенклатура> ПодчиненныеДляМатериал { get; set; }
[InverseProperty("Владелец")]
public ICollection<Справочник.Единицы> ПодчиненныеЕдиницы { get; set; }
override public string Вид() { returnВидыСправочников.Номенклатура; }
Чезер атрибуты мы помечаем поля так как нам нужно, при этом создаем свойства нужного нам типа.
Про соглашение имен подробно написано здесь
http://metanit.com/sharp/entityframework/2.6.php Дополнительно обращу ваше внимание на
virtual public Справочник.Номенклатура Материал { get; set; }
[InverseProperty("Материал")]
public ICollection<Справочник.Номенклатура> ПодчиненныеДляМатериал { get; set; }
Это требует Code First для разрешения ссылок когда один тип ссылается на сам себя и описания один ко многим. Также нужно описать коллекции на подчинённые справочники
public partial class Единицы :СправочникПредок
{
public DateTime ДатаДляПериодическихРеквизитов = DateTime.Now;
[Key]
[Required]
[StringLength(9)]
override public string ID { get; set; }
[NotMapped]
override public string Наименование { get { return""; } set { } }
[Column("PARENTEXT")]
[Required]
[StringLength(9)]
public string ВладелецId { get; set; }
[NotMapped]
override public byte ISFOLDER { get { return 2; } set { } }
[Column("ISMARK")]
override public bool ПометкаУдаления { get; set; }
[Column("SP79")]
[Required]
[StringLength(9)]
public string ОКЕИId { get; set; }
[Column("SP76", TypeName = "numeric")]
public decimal Вес { get; set; }
[Column("SP78", TypeName = "numeric")]
publicdecimal Коэффициент { get; set; }
[Column("SP80")]
[Required]
[StringLength(13)]
public string ШтрихКод { get; set; }
[Column("SP8752", TypeName = "numeric")]
public decimal Объем { get; set; }
[Column("SP9519")]
[Required]
[StringLength(36)]
public string Ref { get; set; }
virtual public Справочник.Номенклатура Владелец { get; set; }
virtual public Справочник.ОКЕИ ОКЕИ { get; set; }
override public string Вид() { returnВидыСправочников.Единицы; }
}
На этом описательная часть закончена перейдём к самому вкусному.
Используя предка можно написать обобщенную функцию.
public TEntity ПолучитьЭлементСправочника<TEntity>(string ID) where TEntity : СправочникПредок
{
var query2 = from спр in this.Set<TEntity>()
where спр.ID == ID
select спр;
return query2.SingleOrDefault<TEntity>();
}