gifts2017

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

Опубликовал Сергей Карташев (Elisy) в раздел Программирование - Инструментарий

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


В прошлой статье http://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.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Проект для Visual Studio 2013
.zip 2,19Mb
20.01.15
3
.zip 2,19Mb 3 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Олег Филиппов (comol) 20.01.15 17:43
Хм... а сами 1С вопреки ожиданиям в качестве среды для нового конфигуратора выбрали Eclipse.... Но вообще зачет. Доделать бы сообществом адекватный конфигуратор :)
2. eugenie zheludkov (eugeniezheludkov) 21.01.15 02:22
было бы круто писать 1с в студии :) помечтаю немного: идет 2059 год в ИТ департаменте сидит сотрудник и мучает linq в 1С10.3.5 в map reduce mongo db снабжая лямбдами, делегатами override-ами и все бы ничего, но заскучал он по старенькому желтенькому конфигуратору... "-эээх было время!" -и слеза скатилась по женской щеке бухгалтера
delete; ya.Avoronov; Elisy; +3 Ответить 2
3. Сергей Карташев (Elisy) 21.01.15 06:56
(1) Действительно, ходят слухи про Эклипс. Меня Эклипс напрягает по сравнению с Visual Studio. Предполагаю, что Эклипс кроссплатформенный, а 1С нужна поддержка Linux.
4. Сергей Карташев (Elisy) 21.01.15 06:59
(2) Не все восприняли идею - большинство не понимает целесообразность
http://www.forum.mista.ru/topic.php?id=731088
5. Игорь Пашутин (Alien_job) 21.01.15 08:11
1с же Eclipse собралась использовать. Если бы не эти слухи, было бы актуально. Конкурировать с нативным инструментом, думаю, не получится.
6. Сергей Рудаков (fishca) 21.01.15 09:04
Сугубо имхо, все это игрушки по большому счету пока 1С не создаст нормального АРI. А этого боюсь что не произойдет никогда.
7. ivanov660 ivanov660 (ivanov660) 21.01.15 09:37
Забавная идея, кстати можно и на vb.net писать, имхо он более удобен. А что по вопросу отладки? Так-то можно работать и в блокноте :-)
8. Сергей Карташев (Elisy) 21.01.15 11:13
(7) С отладкой не понятно. Возможны варианты:
1. Трансляция в 1С-код, а не в ОП-код сделает возможным отладку в 1С-конфигураторе, и позволит сориентироваться в Visual Studio
2. Так как код C#, он может компилироваться в сборку. Сборка подключается как внешний компонент, а Visual Studio подключается динамически к процессу 1С
3. Если, как говорят, 1С переведут на Эклипс, 1С вынуждена будет решить проблему отладки на Эклипс. Воспользоваться этим же механизмом.
9. q_i 21.01.15 13:00
(2) eugeniezheludkov,
было бы круто писать 1с в студии :)

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

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

Кроссплатформенность - это лишь один из плюсов эклипса. Но далеко не самый главный. Конфигуратор (штатный, 1с-вский) сейчас тоже кроссплатформенный.
Уверен, что 1С сознательно выбирала из числа открытых и свободных (aka FLOSS) IDE чтобы не иметь проблем с лицензионными ограничениями и не зависеть от конкретного вендора. А Эклипс выбрала просто как самую раскрученную и одну из самых навороченных. Плюс перспективы, а именно то обстоятельство, что за Эклипс стоят такие монстры как IBM, Oracle, SAP и Google, а значит есть все шансы, что IDE продолжит развиваться и поддерживаться.
10. Алексей Белоусов (AllexSoft) 21.01.15 13:15
конфигуратор на эклипсе это хорошая идея, но как альтернатива привычному конфигуратору.. ИМХО
ПС: вот другое дело открытое API под разработку расширений под конфигуратор и объекты платформы! вот это было бы круто
11. Сергей Карташев (Elisy) 21.01.15 13:54
(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# - более выразительным языком.
12. Сергей Рудаков (fishca) 21.01.15 14:39
Нет подтверждения, что 1С выбрала что-то - все пока на уровне слухов

http://www.pcweek.ru/business/article/detail.php?ID=164640
Как сообщил руководитель отделения разработки ПО фирмы «1С» Сергей Нуралиев, начата работа по созданию качественно новой версии средств разработки на базе открытой платформы Eclipse с возможностью использования Java-технологий.


Разве это не подтверждение?
dkprim; iov; AllexSoft; Elisy; +4 Ответить 2
13. q_i 21.01.15 14:59
(11) Elisy,
Сейчас 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#, не важно, где он был разработан.

Да собственно ни к статье, ни к подходу, в ней изложенном, никаких претензий нет! Всё замечательно и удачи Вам!
А сомнения у меня возникли только по поводу некоторых вопросов, поднятых в комментариях к статье. По ним и отписался.
14. Алексей Белоусов (AllexSoft) 21.01.15 15:44
(12) fishca, спасип за ссылку, похоже не слухи (
Java-технологий

вот чего нам в 1С не хватает! оказывается Java-технологий
15. Евгений Сосна (pumbaE) 21.01.15 18:18
16. Алексей Роза (DoctorRoza) 21.01.15 18:41
У меня вопрос к знатокам: назовите то, что сделала 1С и это сразу взлетело?
17. Евгений Сосна (pumbaE) 21.01.15 18:58
18. борян петров (TODD22) 21.01.15 18:58
(16) DoctorRoza,
У меня вопрос к знатокам: назовите то, что сделала 1С и это сразу взлетело?

Назовите то что сделали другие вендоры и это "сразу" взлетело?
Steelvan; AllexSoft; +2 Ответить 1
19. Dmitry (trdm) 21.01.15 19:01
(4) Elisy, целесообразность еще доказать надо.
И доказать грамотно, а не вскользь упомянуть.
20. Алексей Белоусов (AllexSoft) 21.01.15 19:03
(16) DoctorRoza, не нужны были бы ни git'ы, ни багтрекеры если бы сразу у всех все взелато, это утопия.. другое дело что тестированию в 1с уделяют мало внимания
21. Сергей Карташев (Elisy) 22.01.15 06:20
(19) trdm,
Elisy, целесообразность еще доказать надо.
И доказать грамотно, а не вскользь упомянуть.

Доказывается целесообразность только на практике. Для меня с проектом тоже не совсем все ясно - много неизведанного. Сейчас, после перерыва, в код снова посмотрел, заметил еще 2 новых момента: а) с одного проекта C# можно получить сразу несколько конфигураций (например общий проект Комплексная автоматизация, но из него сразу отдельно КА, ТУ и Бухгалтерия получаются - в жизни нужно вести 3 отдельных проекта), б) Проект по всей видимости сможет помочь в построении хелпа-помощи, так как студия лучше работает с html. Возможно, как раз на помощь нужно делать упор, так как всей 1С за раз не охватить.
22. Алексей Роза (DoctorRoza) 22.01.15 20:41
(18) TODD22, может подойдет Windows XP! Это я к тому, что у 1С взлетает только после n-ного обновления. Может стоит исправить ошибки и только потом и новшества вводить?
23. Алексей Белоусов (AllexSoft) 23.01.15 01:07
(22) DoctorRoza, мимо, вспомните миллион заплаток для винды, сервиспаки и тд
24. Сергей Карташев (Elisy) 24.01.15 10:24
(12) fishca,
Наконец нашел скриншоты от 1С, о которых упоминал:
http://v8.1c.ru/o7/201410ext/index.htm

Там показан стандартный конфигуратор для нового функционала "расширения" 8.3.6. Может 1С что-то планирует на Eclipse, но не в скором будущем.
25. Сергей Карташев (Elisy) 26.01.15 13:15
30. Игорь Steelvan (Steelvan) 28.02.15 20:18
(23) AllexSoft,

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

DoctorRoza:
...назовите то, что сделала 1С и это сразу взлетело? ...
...может подойдет Windows XP!...

Тьфу, я бы на месте администрации принимал меры к таким писакам.
31. Сергей Карташев (Elisy) 02.03.15 12:47
(30) Steelvan,
Что за приступ паранойи? Без конструктивной критики (обратной связи в том числе от разработчиков) невозможно адекватное развитие продукта.
32. Алексей Белоусов (AllexSoft) 02.03.15 12:50
(30) Steelvan, не согласен, DoctorRoza вполне уважаемый специалист.. просто у нас разное видение на качество конфигураций от 1С, но это нормально )
33. Артур Аюханов (artbear) 02.03.15 16:16
Вот я вчера сделал скриншоты на стойке партнерского форума 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
eugeniezheludkov; Alien_job; AllexSoft; Elisy; +4 Ответить 3
34. Сергей Карташев (Elisy) 03.03.15 07:15
(33) artbear,
Эклипс почему-то в такое уныние вгоняет по сравнению с Visual Studio. Ради кроссплатформенности придется с ним мириться.
35. Алексей Белоусов (AllexSoft) 03.03.15 10:07
(33) artbear, класс! но все таки надеюсь обычный привычный конфигуратор не отправят в корзину (
36. Игорь Steelvan (Steelvan) 03.03.15 15:35
(31)(32)

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

А то, что индусами написано это как-то игнорируется.
37. Алексей Белоусов (AllexSoft) 04.03.15 10:04
(36) Steelvan,
А, ну да, если там логотип американской конторы, то это по умолчанию типа "образец качества" хе-хе.

ну есть тот же SAP - вообще не для людей, хотя к нему индусы никакого отношения не имеют) так что кем написан думаю на второй план, все таки качество кода от страны не сильно зависит ИМХО. Все упирается в конкретных проектировщиков и программистов.
38. eugenie zheludkov (eugeniezheludkov) 05.03.15 04:17
(33) artbear, уж год жду эклипса, с нормальным гитом (без костылей!) ой как не хватает после командных проектов в гите на шарпе и на джаве. настолько привык к хорошему, что хранилище конфигурации, отсутствие юнит тестов и многое другое очень сильно угнетает, хотя раньше жил с этим и считал хранилище классным (все познается в сравнении)
ПС: костыльный вариант с гитом и юнит тестами от https://github.com/xDrivenDevelopment не так прост и без бубна установить не получится .. я пока настроил лишь командную доработку внешних обработок, на всю конфу там танцевать надо долго.
39. Артур Аюханов (artbear) 05.03.15 10:29
(38) Очень интересно.
Предлагаю продолжить по тестам в моей публикации http://infostart.ru/public/326820/
Пожалуйста, расскажи там, что ты сделал по нашим работам с гитом и юнит-тестами?
жду в той ветке!
40. Сергей Карташев (Elisy) 05.03.15 12:04
(38) eugeniezheludkov,
В рамках данной разработки "Миниконфигуратор 1С на Visual Studio" при разделении сложных проектов на модули доступно написание тестов в отдельных модулях. Конфигурация для разработчиков готовится с включением этих модулей, а конечный продукт готовится без отладочных модулей.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа