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.
Хм… а сами 1С вопреки ожиданиям в качестве среды для нового конфигуратора выбрали Eclipse…. Но вообще зачет. Доделать бы сообществом адекватный конфигуратор 🙂
было бы круто писать 1с в студии 🙂 помечтаю немного: идет 2059 год в ИТ департаменте сидит сотрудник и мучает linq в 1С10.3.5 в map reduce mongo db снабжая лямбдами, делегатами override-ами и все бы ничего, но заскучал он по старенькому желтенькому конфигуратору… «-эээх было время!» -и слеза скатилась по женской щеке бухгалтера
(1) Действительно, ходят слухи про Эклипс. Меня Эклипс напрягает по сравнению с Visual Studio. Предполагаю, что Эклипс кроссплатформенный, а 1С нужна поддержка Linux.
(2) Не все восприняли идею — большинство не понимает целесообразность
http://www.forum.mista.ru/topic.php?id=731088
1с же Eclipse собралась использовать. Если бы не эти слухи, было бы актуально. Конкурировать с нативным инструментом, думаю, не получится.
Сугубо имхо, все это игрушки по большому счету пока 1С не создаст нормального АРI. А этого боюсь что не произойдет никогда.
Забавная идея, кстати можно и на vb.net писать, имхо он более удобен. А что по вопросу отладки? Так-то можно работать и в блокноте 🙂
(7) С отладкой не понятно. Возможны варианты:
1. Трансляция в 1С-код, а не в ОП-код сделает возможным отладку в 1С-конфигураторе, и позволит сориентироваться в Visual Studio
2. Так как код C#, он может компилироваться в сборку. Сборка подключается как внешний компонент, а Visual Studio подключается динамически к процессу 1С
3. Если, как говорят, 1С переведут на Эклипс, 1С вынуждена будет решить проблему отладки на Эклипс. Воспользоваться этим же механизмом.
(2) eugeniezheludkov,
Это круто ровно до той поры, пока microsoft предоставляет бесплатно её экспресс-версию. Если microsoft по каким-либо причинам решит прикрыть эту лавочку (да хоть просто запретят в лиц.соглашении использование MSVS в РФ в качестве продолжения «санкций»), то вся крутость моментально испарится (ну если конечно не считать «крутостью» разработку в MSVS, купленную за полную цену).
(3)
Кроссплатформенность — это лишь один из плюсов эклипса. Но далеко не самый главный. Конфигуратор (штатный, 1с-вский) сейчас тоже кроссплатформенный.
Уверен, что 1С сознательно выбирала из числа открытых и свободных (aka FLOSS) IDE чтобы не иметь проблем с лицензионными ограничениями и не зависеть от конкретного вендора. А Эклипс выбрала просто как самую раскрученную и одну из самых навороченных. Плюс перспективы, а именно то обстоятельство, что за Эклипс стоят такие монстры как IBM, Oracle, SAP и Google, а значит есть все шансы, что IDE продолжит развиваться и поддерживаться.
конфигуратор на эклипсе это хорошая идея, но как альтернатива привычному конфигуратору.. ИМХО
ПС: вот другое дело открытое API под разработку расширений под конфигуратор и объекты платформы! вот это было бы круто
(9) q_i,
Сейчас Microsoft стала бесплатно предоставлятьVisual Studio Community , которая по функционалу соотносится с Professional.
Странным будет выглядеть выборочный запрет использования MSVS в России без запрета на Windows ))). Если запрещать, то все подряд. Но, подход в статье привязан к проекту C# и в этом случае может быть перенесен на открытые C# IDE. Т.е. на вход подается проект C#, не важно, где он был разработан.
Нет подтверждения, что 1С выбрала что-то — все пока на уровне слухов. Видел скриншоты более новой, чем 8.3.5 версии — обычный конфигуратор 1С.
И, даже если 1С выберет Eclipse, язык 1С от этого не поменяется на Java. А подход в статье оперирует языком C# — более выразительным языком.
Разве это не подтверждение?
(11)
И они поклялись на крови, что и впредь будут «бесплатно предоставлять Visual Studio Community, которая по функционалу соотносится с Professional»?
Сегодня в силу конъюнктурных обстоятельств они вынуждены были пойти на такой шаг, а завтра скажут «всем спасибо, все свободны».
Фантастика? Ну почти. Разве только что-то вроде этого:http://www.finanso.net/finance/12057-microsoft-takzhe-vvodit-sankcii-protiv-rf.html
Да собственно ни к статье, ни к подходу, в ней изложенном, никаких претензий нет! Всё замечательно и удачи Вам!
А сомнения у меня возникли только по поводу некоторых вопросов, поднятых в комментариях к статье. По ним и отписался.
(12) fishca, спасип за ссылку, похоже не слухи (
вот чего нам в 1С не хватает! оказывается Java-технологий
(11) 1с выбрала eclipse.
У меня вопрос к знатокам: назовите то, что сделала 1С и это сразу взлетело?
(16) DoctorRoza, ошибку?
(16) DoctorRoza,
Назовите то что сделали другие вендоры и это «сразу» взлетело?
(4) целесообразность еще доказать надо.
И доказать грамотно, а не вскользь упомянуть.
(16) DoctorRoza, не нужны были бы ни git’ы, ни багтрекеры если бы сразу у всех все взелато, это утопия.. другое дело что тестированию в 1с уделяют мало внимания
(19) trdm,
И доказать грамотно, а не вскользь упомянуть.
Доказывается целесообразность только на практике. Для меня с проектом тоже не совсем все ясно — много неизведанного. Сейчас, после перерыва, в код снова посмотрел, заметил еще 2 новых момента: а) с одного проекта C# можно получить сразу несколько конфигураций (например общий проект Комплексная автоматизация, но из него сразу отдельно КА, ТУ и Бухгалтерия получаются — в жизни нужно вести 3 отдельных проекта), б) Проект по всей видимости сможет помочь в построении хелпа-помощи, так как студия лучше работает с html. Возможно, как раз на помощь нужно делать упор, так как всей 1С за раз не охватить.
(18) TODD22, может подойдет Windows XP! Это я к тому, что у 1С взлетает только после n-ного обновления. Может стоит исправить ошибки и только потом и новшества вводить?
(22) DoctorRoza, мимо, вспомните миллион заплаток для винды, сервиспаки и тд
(12) fishca,
http://v8.1c.ru/o7/201410ext/index.htm
Наконец нашел скриншоты от 1С, о которых упоминал:
Там показан стандартный конфигуратор для нового функционала «расширения» 8.3.6. Может 1С что-то планирует на Eclipse, но не в скором будущем.
Еще интересный скриншот про 8.4.1 и Eclipse
http://pro1c.org.ua/index.php?s=634176f95536e3b2e5294f286f02f107&showtopic=18781&pid=92048 &mode=threaded&start=#entry92048
Linkedin
выложили в обсуждении
(23) AllexSoft,
DoctorRoza похоже агент госдепа сраной америки.
Таких на мисте через одного теперь, вечно посты и ответы пишут из серии «1С плохо, работать на российских программах плохо, а вот америка (сраная) это хорошо».
DoctorRoza:
…назовите то, что сделала 1С и это сразу взлетело? …
…может подойдет Windows XP!…
Тьфу, я бы на месте администрации принимал меры к таким писакам.
(30) Steelvan,
Что за приступ паранойи? Без конструктивной критики (обратной связи в том числе от разработчиков) невозможно адекватное развитие продукта.
(30) Steelvan, не согласен, DoctorRoza вполне уважаемый специалист.. просто у нас разное видение на качество конфигураций от 1С, но это нормально )
Вот я вчера сделал скриншоты на стойке партнерского форума 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
(33) artbear,
Эклипс почему-то в такое уныние вгоняет по сравнению с Visual Studio. Ради кроссплатформенности придется с ним мириться.
(33) artbear, класс! но все таки надеюсь обычный привычный конфигуратор не отправят в корзину (
(31)(32)
А, ну да, если там логотип американской конторы, то это по умолчанию типа «образец качества» хе-хе.
А то, что индусами написано это как-то игнорируется.
(36) Steelvan,
ну есть тот же SAP — вообще не для людей, хотя к нему индусы никакого отношения не имеют) так что кем написан думаю на второй план, все таки качество кода от страны не сильно зависит ИМХО. Все упирается в конкретных проектировщиков и программистов.
(33) artbear, уж год жду эклипса, с нормальным гитом (без костылей!) ой как не хватает после командных проектов в гите на шарпе и на джаве. настолько привык к хорошему, что хранилище конфигурации, отсутствие юнит тестов и многое другое очень сильно угнетает, хотя раньше жил с этим и считал хранилище классным (все познается в сравнении)
https://github.com/xDrivenDevelopment не так прост и без бубна установить не получится .. я пока настроил лишь командную доработку внешних обработок, на всю конфу там танцевать надо долго.
ПС: костыльный вариант с гитом и юнит тестами от
(38) Очень интересно.
http://infostart.ru/public/326820/
Предлагаю продолжить по тестам в моей публикации
Пожалуйста, расскажи там, что ты сделал по нашим работам с гитом и юнит-тестами?
жду в той ветке!
(38) eugeniezheludkov,
В рамках данной разработки «Миниконфигуратор 1С на Visual Studio» при разделении сложных проектов на модули доступно написание тестов в отдельных модулях. Конфигурация для разработчиков готовится с включением этих модулей, а конечный продукт готовится без отладочных модулей.