Миниконфигуратор 1С на Visual Studio

Roslyn позволяет C# проект преобразовать в открытый XML-формат конфигурации 1С: Предприятие. C#-проект при поддержке Visual Studio автоматически снабжается Intellisense, интерактивной проверкой синтаксиса и типов, рефакторингом, расширенным поиском по проекту, поддержкой XmlDoc. Настраиваемое расположение документов проекта на диске и более выразительный и экономный формат делает C#-проект на Visual Studio лучшим выбором в системах версионирования.

 

XML-выгрузка конфигурации 1С

Начиная с версии 8.3 1С научилась выгружать/загружать конфигурацию в/из открытый формат XML. Делает она это в своей самобытной манере. Выгрузка, например, УТ 11.0.7 займет примерно 6 минут. При этом все файлы конфигурации будут свалены в единый каталог. Файлов будет около 10K (десяти тысяч) размером примерно 430 Мбайт. Такая выгрузка считается огромным достижением в области открытости, потому что ранее конфигурация запаковывалась в закрытый cf-формат, распознать который можно было только специализированными средствами: через .Net-совместимый cfProject или v8unpack.

Так выглядит один из файлов XML Language.Русский.xml


<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Language uuid="7a630662-cf14-44d7-a01c-08006bb5bffa">
<Properties>
<Name>Русский</Name>
<Synonym/>
<Comment/>
<LanguageCode>ru</LanguageCode>
</Properties>
</Language>
</MetaDataObject>

Замена XML-конструкций на определения C#

В проекте C# за каждый объект 1С отвечает класс. Если это справочник, то класс наследуется от класса Catalog, перечисление наследуется от класса Enum. Свойства объектов и атрибутов обозначаются через C#-атрибуты.

В результате XML-определение язык Русский примет такой вид Русский.cs


using System;
using Elisy.Configuration.DataAnnotations;
using Elisy.Configuration;
namespace Test.Languages
{
[Uuid("7a630662-cf14-44d7-a01c-08006bb5bffa")]
[LanguageCode("ru")]
public class Русский : Language
{
}
}

Ссылки на объекты определяются через типы вида CatalogRef<>. Например, так


[Uuid("e140b824-c8f9-4155-87e6-d408e73ccc69")]
[Synonym("ru", "Рубрика")]
public CatalogRef<рубрики> Рубрика;

Табличная часть определяется как TabularSection<строкатабличнойчасти>


[Uuid("bb2c088e-8fb3-4469-abd7-ba6b4104ae88")]
[GeneratedTypeAttribute(GeneratedTypeCategory.TabularSection, "8ef1c35e-8b55-488f-8e24-61f73d287458", "b300dc36-fe12-41d5-a462-792716a1e508")]
[GeneratedTypeAttribute(GeneratedTypeCategory.TabularSectionRow, "92e3cead-a61b-474c-8515-56e4911339c7", "dfa007ab-4185-443f-8d11-f7468a7c195e")]
[Synonym("ru", "Рубрики")]
public TabularSection<РубрикаИзображения> Рубрики;

События модуля объекта и модуля менеджера реализуются как override-методы. Могут выглядеть так:


public override void BeforeWrite(ref bool cancel)
{
var ДубликатПоНаименованию = Catalog.FindByDescription<Изображения>(Description, true);
if (!IsFolder && IsNew() && G.ValueIsFilled(ДубликатПоНаименованию))
{
G.Message("Найден дубликат изображения с наименованием: " + Description + ". Запись не производится");
cancel = true;
return;
}
if (!IsFolder)
Рубрики.GroupBy("Рубрика");

//Убрать ненужные рубрики, обработанные групповой обработкой
var НайденнаяСтрока = Рубрики.Find(Catalogs.Рубрики.УдалитьРубрику, "Рубрика");
if (G.ValueIsFilled(НайденнаяСтрока))
Рубрики.Delete(НайденнаяСтрока);
}

Следует отметить, что методы сейчас никак не транслируются в код 1С. Не понятным остается, что делать с директивами препроцессора 1С и нужно ли множественное наследование основных объектов 1С. G-обозначает глобальный контекст, так как вызов функций в C# может выполняться только в привязке к классу.

Компилирование проекта CSPROJ

В прошлой статье //infostart.ru/public/321282/ была описана возможность компилирования одного файла CS. Чаще требуется скомпилировать целый проект — несколько файлов. В Roslyn есть встроенные классы, отвечающие за обработку sln-решений и csproj-проектов Visual Studio. Проблема состоит в том, что они ссылаются на отдельные сборки, поставляемые в составе MSBuild Tools. Последняя версия Roslyn ссылается на сборки MSBuild Tools 2014, которые отдельно скачать не получится. Инсталляция сейчас входит в состав дистрибутива Visual Studio 14 CTP. Оказалось, что в состав .Net framework входит сборка Microsoft.Build.dll v.4. В ней есть реализация чтения файла проекта C#. Можно самостоятельно реализовать состыковку этой сборки с логикой Roslyn и получить изоляцию от MSBuild Tools. Реализация будет примерно такой:



var project = new Project(projectFilePath);
List<string> references = new List<string>();
List<SyntaxTree> trees = new List<SyntaxTree>();
foreach(var item in project.Items)
{
if (item.ItemType == "Reference")
{
references.Add(item.EvaluatedInclude);
}
else if (item.ItemType == "Compile")
{
string filePathToCompile = System.IO.Path.Combine(project.DirectoryPath, item.EvaluatedInclude);
var text = System.IO.File.ReadAllText(filePathToCompile);
trees.Add(CSharpSyntaxTree.ParseText(text));
}
}
var assemblyName = project.GetProperty("AssemblyName").EvaluatedValue;
var compilation = CSharpCompilation.Create(assemblyName)
.WithOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary))
.AddReferences(new MetadataFileReference(typeof(Elisy.Configuration.Configuration).Assembly.Location))
.AddReferences(new MetadataFileReference(typeof(object).Assembly.Location))
.AddSyntaxTrees(trees.ToArray());    

Если потребуется реализовать больше свойств проекта, то их можно подсмотреть в проекте Roslyn

Получение XML-файлов совместимых с 1С: Предприятие

При генерации XML-файлов работа большей частью ведется с типами, их членами и атрибутами. Оказалось, что объекты Roslyn CSharpCompilation очень ограничены в средствах. Через них нельзя выйти на типы System.Type, нельзя получить список атрибутов с учетом наследования. Поэтому для полноценного анализа лучше создать сборку средствами Roslyn и загрузить ее для Reflection-анализа:



MemoryStream ms = new MemoryStream();
compilation.Emit(ms);
var assembly = Assembly.Load(ms.ToArray());

Странно, что не удалось загрузить сборку как ReflectionOnlyLoad из-за ошибки «missing api-ms-win-core-l1-2-0.dll». Ошибка возникала при попытке прочитать входящие в состав сборки типы. Тем не менее, сборка нормально загружается и работает через обычный вызов Load.

Генерация XML-файлов сводится к перебору всех типов, наследованных от Configuration и основных объектов, к перебору свойств объектов и атрибутов.

XML строится средствами XML LINQ, например, так:



XElement configurationElement = new XElement(Compiler.MdClasses + "Language",
language.GetUuidXml(),
new XElement(Compiler.MdClasses + "Properties",
new XElement(Compiler.MdClasses + "Name", language.Name),
language.GetSynonimXml(),
language.GetCommentXml(),
new XElement(Compiler.MdClasses + "LanguageCode", language.GetAttribute().Value)
)
);
var document = CreateMetadataObjectDocument(configurationElement);
document.Save(Path.Combine(outFolder, String.Format("Language.{0}.xml", language.Name)));

Удалось выяснить, что 1С лояльно относится к отсутствию многих тегов, заменяя их значениями по умолчанию. Поэтому пустые значения в XML-файлах можно пропустить, тем самым сократив занимаемый размер на диске. Размер экономии может быть весьма значительным – до 40 процентов. Использование же cs-файлов вместо XML дает еще большую экономию места – до 60%.

Выводы

Средствами Visual Studio теоретически возможно создать альтернативный конфигуратор 1С. Для дальнейшего продвижения идеи нужно принять соглашения относительно всех основных объектов, хранения форм, трансляции языка C# в 1С, директив препроцессора 1С, обычных макетов и макетов СКД;

Текущая XML-выгрузка от 1С неудобна для анализа, потому что все файлы собраны в единый каталог;

Текущая XML-выгрузка 1С избыточна, и ее размер может быть уменьшен без потери данных до 40%, а хранение исходных кодов в виде C# позволит экономить до 60 процентов дискового пространства;

Чтение csproj-проектов и sln-решений Visual Studio встроенными средствами Roslyn непросто реализуемо из-за сложной доступности MSBuild Tools 2014. Компенсировать сейчас можно классами .Net Framework 4 и собственной инициализацией Roslyn.

36 Comments

  1. comol

    Хм… а сами 1С вопреки ожиданиям в качестве среды для нового конфигуратора выбрали Eclipse…. Но вообще зачет. Доделать бы сообществом адекватный конфигуратор 🙂

    Reply
  2. eugeniezheludkov

    было бы круто писать 1с в студии 🙂 помечтаю немного: идет 2059 год в ИТ департаменте сидит сотрудник и мучает linq в 1С10.3.5 в map reduce mongo db снабжая лямбдами, делегатами override-ами и все бы ничего, но заскучал он по старенькому желтенькому конфигуратору… «-эээх было время!» -и слеза скатилась по женской щеке бухгалтера

    Reply
  3. Elisy

    (1) Действительно, ходят слухи про Эклипс. Меня Эклипс напрягает по сравнению с Visual Studio. Предполагаю, что Эклипс кроссплатформенный, а 1С нужна поддержка Linux.

    Reply
  4. Elisy

    (2) Не все восприняли идею — большинство не понимает целесообразность

    http://www.forum.mista.ru/topic.php?id=731088

    Reply
  5. Alien_job

    1с же Eclipse собралась использовать. Если бы не эти слухи, было бы актуально. Конкурировать с нативным инструментом, думаю, не получится.

    Reply
  6. fishca

    Сугубо имхо, все это игрушки по большому счету пока 1С не создаст нормального АРI. А этого боюсь что не произойдет никогда.

    Reply
  7. ivanov660

    Забавная идея, кстати можно и на vb.net писать, имхо он более удобен. А что по вопросу отладки? Так-то можно работать и в блокноте 🙂

    Reply
  8. Elisy

    (7) С отладкой не понятно. Возможны варианты:

    1. Трансляция в 1С-код, а не в ОП-код сделает возможным отладку в 1С-конфигураторе, и позволит сориентироваться в Visual Studio

    2. Так как код C#, он может компилироваться в сборку. Сборка подключается как внешний компонент, а Visual Studio подключается динамически к процессу 1С

    3. Если, как говорят, 1С переведут на Эклипс, 1С вынуждена будет решить проблему отладки на Эклипс. Воспользоваться этим же механизмом.

    Reply
  9. q_i

    (2) eugeniezheludkov,

    было бы круто писать 1с в студии 🙂

    Это круто ровно до той поры, пока microsoft предоставляет бесплатно её экспресс-версию. Если microsoft по каким-либо причинам решит прикрыть эту лавочку (да хоть просто запретят в лиц.соглашении использование MSVS в РФ в качестве продолжения «санкций»), то вся крутость моментально испарится (ну если конечно не считать «крутостью» разработку в MSVS, купленную за полную цену).

    (3)

    Действительно, ходят слухи про Эклипс. Меня Эклипс напрягает по сравнению с Visual Studio. Предполагаю, что Эклипс кроссплатформенный, а 1С нужна поддержка Linux

    Кроссплатформенность — это лишь один из плюсов эклипса. Но далеко не самый главный. Конфигуратор (штатный, 1с-вский) сейчас тоже кроссплатформенный.

    Уверен, что 1С сознательно выбирала из числа открытых и свободных (aka FLOSS) IDE чтобы не иметь проблем с лицензионными ограничениями и не зависеть от конкретного вендора. А Эклипс выбрала просто как самую раскрученную и одну из самых навороченных. Плюс перспективы, а именно то обстоятельство, что за Эклипс стоят такие монстры как IBM, Oracle, SAP и Google, а значит есть все шансы, что IDE продолжит развиваться и поддерживаться.

    Reply
  10. AllexSoft

    конфигуратор на эклипсе это хорошая идея, но как альтернатива привычному конфигуратору.. ИМХО

    ПС: вот другое дело открытое API под разработку расширений под конфигуратор и объекты платформы! вот это было бы круто

    Reply
  11. Elisy

    (9) q_i,

    Это круто ровно до той поры, пока microsoft предоставляет бесплатно её экспресс-версию. Если microsoft по каким-либо причинам решит прикрыть эту лавочку (да хоть просто запретят в лиц.соглашении использование MSVS в РФ в качестве продолжения «санкций»), то вся крутость моментально испарится (ну если конечно не считать «крутостью» разработку в MSVS, купленную за полную цену).

    Сейчас Microsoft стала бесплатно предоставлять Visual Studio Community, которая по функционалу соотносится с Professional.

    Странным будет выглядеть выборочный запрет использования MSVS в России без запрета на Windows ))). Если запрещать, то все подряд. Но, подход в статье привязан к проекту C# и в этом случае может быть перенесен на открытые C# IDE. Т.е. на вход подается проект C#, не важно, где он был разработан.

    Уверен, что 1С сознательно выбирала из числа открытых и свободных (aka FLOSS) IDE чтобы не иметь проблем с лицензионными ограничениями и не зависеть от конкретного вендора. А Эклипс выбрала просто как самую раскрученную и одну из самых навороченных. Плюс перспективы, а именно то обстоятельство, что за Эклипс стоят такие монстры как IBM, Oracle, SAP и Google, а значит есть все шансы, что IDE продолжит развиваться и поддерживаться.

    Нет подтверждения, что 1С выбрала что-то — все пока на уровне слухов. Видел скриншоты более новой, чем 8.3.5 версии — обычный конфигуратор 1С.

    И, даже если 1С выберет Eclipse, язык 1С от этого не поменяется на Java. А подход в статье оперирует языком C# — более выразительным языком.

    Reply
  12. fishca
    Нет подтверждения, что 1С выбрала что-то — все пока на уровне слухов

    http://www.pcweek.ru/business/article/detail.php?ID=164640

    Как сообщил руководитель отделения разработки ПО фирмы «1С» Сергей Нуралиев, начата работа по созданию качественно новой версии средств разработки на базе открытой платформы Eclipse с возможностью использования Java-технологий.

    Разве это не подтверждение?

    Reply
  13. q_i

    (11)

    Сейчас Microsoft стала бесплатно предоставлять Visual Studio Community, которая по функционалу соотносится с Professional.

    И они поклялись на крови, что и впредь будут «бесплатно предоставлять Visual Studio Community, которая по функционалу соотносится с Professional»?

    Сегодня в силу конъюнктурных обстоятельств они вынуждены были пойти на такой шаг, а завтра скажут «всем спасибо, все свободны».

    Странным будет выглядеть выборочный запрет использования MSVS в России без запрета на Windows

    Фантастика? Ну почти. Разве только что-то вроде этого: http://www.finanso.net/finance/12057-microsoft-takzhe-vvodit-sankcii-protiv-rf.html

    Но, подход в статье привязан к проекту C# и в этом случае может быть перенесен на открытые C# IDE. Т.е. на вход подается проект C#, не важно, где он был разработан.

    Да собственно ни к статье, ни к подходу, в ней изложенном, никаких претензий нет! Всё замечательно и удачи Вам!

    А сомнения у меня возникли только по поводу некоторых вопросов, поднятых в комментариях к статье. По ним и отписался.

    Reply
  14. AllexSoft

    (12) fishca, спасип за ссылку, похоже не слухи (

    Java-технологий

    вот чего нам в 1С не хватает! оказывается Java-технологий

    Reply
  15. pumbaE

    (11) 1с выбрала eclipse.

    Reply
  16. DoctorRoza

    У меня вопрос к знатокам: назовите то, что сделала 1С и это сразу взлетело?

    Reply
  17. pumbaE

    (16) DoctorRoza, ошибку?

    Reply
  18. TODD22

    (16) DoctorRoza,

    У меня вопрос к знатокам: назовите то, что сделала 1С и это сразу взлетело?

    Назовите то что сделали другие вендоры и это «сразу» взлетело?

    Reply
  19. trdm

    (4) целесообразность еще доказать надо.

    И доказать грамотно, а не вскользь упомянуть.

    Reply
  20. AllexSoft

    (16) DoctorRoza, не нужны были бы ни git’ы, ни багтрекеры если бы сразу у всех все взелато, это утопия.. другое дело что тестированию в 1с уделяют мало внимания

    Reply
  21. Elisy

    (19) trdm,

    Elisy, целесообразность еще доказать надо.

    И доказать грамотно, а не вскользь упомянуть.

    Доказывается целесообразность только на практике. Для меня с проектом тоже не совсем все ясно — много неизведанного. Сейчас, после перерыва, в код снова посмотрел, заметил еще 2 новых момента: а) с одного проекта C# можно получить сразу несколько конфигураций (например общий проект Комплексная автоматизация, но из него сразу отдельно КА, ТУ и Бухгалтерия получаются — в жизни нужно вести 3 отдельных проекта), б) Проект по всей видимости сможет помочь в построении хелпа-помощи, так как студия лучше работает с html. Возможно, как раз на помощь нужно делать упор, так как всей 1С за раз не охватить.

    Reply
  22. DoctorRoza

    (18) TODD22, может подойдет Windows XP! Это я к тому, что у 1С взлетает только после n-ного обновления. Может стоит исправить ошибки и только потом и новшества вводить?

    Reply
  23. AllexSoft

    (22) DoctorRoza, мимо, вспомните миллион заплаток для винды, сервиспаки и тд

    Reply
  24. Elisy

    (12) fishca,

    Наконец нашел скриншоты от 1С, о которых упоминал:

    http://v8.1c.ru/o7/201410ext/index.htm

    Там показан стандартный конфигуратор для нового функционала «расширения» 8.3.6. Может 1С что-то планирует на Eclipse, но не в скором будущем.

    Reply
  25. Elisy

    Еще интересный скриншот про 8.4.1 и Eclipse

    http://pro1c.org.ua/index.php?s=634176f95536e3b2e5294f286f02f107&showtopic=18781&pid=92048­&mode=threaded&start=#entry92048

    выложили в обсуждении

    Linkedin

    Reply
  26. Steelvan

    (23) AllexSoft,

    DoctorRoza похоже агент госдепа сраной америки.

    Таких на мисте через одного теперь, вечно посты и ответы пишут из серии «1С плохо, работать на российских программах плохо, а вот америка (сраная) это хорошо».

    DoctorRoza:

    …назовите то, что сделала 1С и это сразу взлетело? …

    …может подойдет Windows XP!…

    Тьфу, я бы на месте администрации принимал меры к таким писакам.

    Reply
  27. Elisy

    (30) Steelvan,

    Что за приступ паранойи? Без конструктивной критики (обратной связи в том числе от разработчиков) невозможно адекватное развитие продукта.

    Reply
  28. AllexSoft

    (30) Steelvan, не согласен, DoctorRoza вполне уважаемый специалист.. просто у нас разное видение на качество конфигураций от 1С, но это нормально )

    Reply
  29. artbear

    Вот я вчера сделал скриншоты на стойке партнерского форума 1С — продукт 1С:Development tools

    https://plus.google.com/u/0/+%D0%90%D1%80%D1%82%D1%83%D1%80%D0%90%D1%8E%D1%85%D0­%B0%D0%BD%D0%BE%D0%B2/posts/bvih9KaW5ds

    Reply
  30. Elisy

    (33) artbear,

    Эклипс почему-то в такое уныние вгоняет по сравнению с Visual Studio. Ради кроссплатформенности придется с ним мириться.

    Reply
  31. AllexSoft

    (33) artbear, класс! но все таки надеюсь обычный привычный конфигуратор не отправят в корзину (

    Reply
  32. Steelvan

    (31)(32)

    А, ну да, если там логотип американской конторы, то это по умолчанию типа «образец качества» хе-хе.

    А то, что индусами написано это как-то игнорируется.

    Reply
  33. AllexSoft

    (36) Steelvan,

    А, ну да, если там логотип американской конторы, то это по умолчанию типа «образец качества» хе-хе.

    ну есть тот же SAP — вообще не для людей, хотя к нему индусы никакого отношения не имеют) так что кем написан думаю на второй план, все таки качество кода от страны не сильно зависит ИМХО. Все упирается в конкретных проектировщиков и программистов.

    Reply
  34. eugeniezheludkov

    (33) artbear, уж год жду эклипса, с нормальным гитом (без костылей!) ой как не хватает после командных проектов в гите на шарпе и на джаве. настолько привык к хорошему, что хранилище конфигурации, отсутствие юнит тестов и многое другое очень сильно угнетает, хотя раньше жил с этим и считал хранилище классным (все познается в сравнении)

    ПС: костыльный вариант с гитом и юнит тестами от https://github.com/xDrivenDevelopment не так прост и без бубна установить не получится .. я пока настроил лишь командную доработку внешних обработок, на всю конфу там танцевать надо долго.

    Reply
  35. artbear

    (38) Очень интересно.

    Предлагаю продолжить по тестам в моей публикации http://infostart.ru/public/326820/

    Пожалуйста, расскажи там, что ты сделал по нашим работам с гитом и юнит-тестами?

    жду в той ветке!

    Reply
  36. Elisy

    (38) eugeniezheludkov,

    В рамках данной разработки «Миниконфигуратор 1С на Visual Studio» при разделении сложных проектов на модули доступно написание тестов в отдельных модулях. Конфигурация для разработчиков готовится с включением этих модулей, а конечный продукт готовится без отладочных модулей.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *