Pull to refresh

Comments 22

Смесь русского и английского режет глаза.
 _this.Вставить("__type", "ПИ2.Б")
да, вы правы. Не понятно, что с этим делать. Если заменить на
_это.Вставить("__тип", "ПИ2.Б")

то не очень подходит для англоязычных конфигураций
Не ясно почему русский, 8.х отлично везде английский поддерживает, даже при именовании справочников и прочей шелухи :)
Предлагаю как вариант, подключиться через GoogleTranslate API и переводить слова. Можно еще самому словарь набивать. Через год слов станет столько, что можно будет уже и не париться =)
Странно все это, и не понятно зачем нужно такое.

В 1С уже все прикладные абстрактные классы есть, другое дело, что 90% программистов 1С не понимают как их использовать правильно =)

Да, с множественным наследованием тут не поиграться, но и задач, в которых оно было бы нужно — единицы, и почти все связаны с описанием схем сериализации, а как раз там (XDTO) множественное наследование можно и нужно использовать.

Что есть класс в 1С? Это объект метаданных, будь то Справочник, план обмена, документ, обработка или регистр расчета, всех их объединяет одно: У них есть реквизиты и табличные части — суть свойства класса, есть модуль объекта — суть методы класса, и модуль менеджера — суть статические методы класса.

Хочешь красиво и правильно это использовать? Ну так пожалуйста: Делаешь обработку, в реквизитах описываешь все свойства и их типы, в модуле объекта все методы и паблик методы помечаешь как экспортные. В таком виде уже можно использовать обработку как класс — я надеюсь все умеют программно создавать экземпляр обработки? =)
Мне был интересен ООП-подход в контексте модульности 1С. Можно ли разделить большое монолитное приложение 1С на малосвязанные модули. Что мне для этого не хватает из C#/Java: классы, наследование классов от какого-нибудь класса Module (может, интерфейсы IModule), атрибуты вида [Module], получение метаданных класса через GetType(), события, проверка типов «o is Module».

Как оказалось, у подхода компилирования C# в код 1С могут быть еще достоинства. Разработка 1С из конфигуратора в теории может быть перемещена в Visual Studio со всеми преимуществами: intellisense, быстрый рефакторинг, контроль типов, встроенный контроль ошибок при компилировнии. Плюс контроль версий сторонними средствами (проект C# в виде файлов в папке). Возможно, юнит-тестирование. Еще код на C# более выразительный. Сложный проект можно разделить на модули-сборки проектов C#.
Разрабатывать свои интерфейсы — это очень интересно, конечно, но даже если мы возьмем тот же .NET, все базовые интерфейсы уже реализованы, достаточно их выучить и научиться имплементировать правильно, так же и в 1С, уже есть все базывые интерфейсы, необходимости разработки чего-то своего нет. Множественность наследования — по сути, так же не нужна. (Приведите пример, когда в 1С она нужна?) События есть, как события объектов, так и события форм, события статических метаданных, так же как и гобальные подписки на события. Проверка типов есть ТипЗнч(Источник) говорит какой именно тим имеет объект Источник, сравнить его можно с типом полученным по конструктору Тип(«ПеречислениеСсылка.ВидыШтрихкодов») или Тип(«ДокументОбъект.РасходнаяНакладная») используется всегда в глобальных подписках на события в не типовых доработках, не снимающих с поддержки типовую конфигурацию.

Компилирование в C# аналогично компилированию в 1С, так же как C# производит конвертацию в MSIL 1С производит компиляцию в свой промежуточный язык исполнения, который далее исполняется либо в CLR для C# либо в Платформе для 1С. Intellisense в 1С 8.3 есть, подсказки глобальных функций, подсказки реквизитов определенных типов, подсказки по объектам метаданных, так же все функции имеющие стандарт комментировая так же подсказываются с пояснениями что за аргумент и какого он типа при наборе. Надо просто научиться всем этим пользоваться =)




Для контроля версий есть Хранилище конфигурации, афигенно удобный инстурмент, в котором можно захватывать и помещать объекты общей конфигурации, чтобы не было коллизий между группой разработчиков. Но можно так же и обычный Git использовать, достаточно выгрузить конфигурацию в промежуточные файды (txt, xml, mxl, epf, ert), но именно для 1С это менее удобно, чем использовать хранилище. В 8.3 есть unit тестирование, ровно как и нагрузочное тестирование, как и оценка производительности в «особых» условиях. Любой код можно разделить на смысловые блоки, абстрагирование — это основная задача программиста. Всегда можно вынести общие модули без контекста, и стандартизировать их.
Теперь давайте разберем все ваши высказывания без фанатизма и без маркетинговых картинок. Тем более, что я бы постеснялся показывать комментарии перед определениями функций – весь мир давно уже перешел на XmlDoc. Хотелось бы и у 1С видеть что-то на ее манер в виде ///<описание></описание> <параметр></параметр>

Разрабатывать свои интерфейсы — это очень интересно, конечно, но даже если мы возьмем тот же .NET, все базовые интерфейсы уже реализованы, достаточно их выучить и научиться имплементировать правильно, так же и в 1С, уже есть все базывые интерфейсы, необходимости разработки чего-то своего нет. Множественность наследования — по сути, так же не нужна. (Приведите пример, когда в 1С она нужна?) События есть, как события объектов, так и события форм, события статических метаданных, так же как и гобальные подписки на события. Проверка типов есть ТипЗнч(Источник) говорит какой именно тим имеет объект Источник, сравнить его можно с типом полученным по конструктору Тип(«ПеречислениеСсылка.ВидыШтрихкодов») или Тип(«ДокументОбъект.РасходнаяНакладная») используется всегда в глобальных подписках на события в не типовых доработках, не снимающих с поддержки типовую конфигурацию.


Все базовые классы и интерфейсы в .Net конечно разработаны, но, тем не менее, .Net предполагает определять классы. А если бы наследования не было в .Net, использовать в статье класс Walker было бы невозможно, и решение задачи заняло бы раза в 3 больше времени (организация рекурсии, приведение типов). С чего вы взяли, что множественность наследования не нужна? Странно мыслите. В близких аналогах 1С: SAP и Axapta нужна, а в 1С – оказывается не нужна. Если ее нет в 1С, то это не значит, что она не нужна. Это значит, что 1С в меру своей ограниченности не может предоставить такую возможность. Соответственно и ТипЗнч, Тип – совершенно бесполезны, потому что они работают только с предопределенными классами.
Представьте, что Справочники — это интерфейс, а Контрагенты, Номенклатура, ВидыКонтактнойИнформации — это Классы.
Документы — это интерфейс, а РасходнаяНакладная, КассовыйОрдер — это классы.
Регистры бухгалтерии — это интерфейс — а Хозрассчетный — это класс.
Обработки — это интерфейс — а ЗагрузкаНоменклатурыИзExcel — класс
и т.д.

Я же говорю — все нужные интерфейсы уже есть, только клепай свои классы и все.

Сможете назвать интерфейс, которого из всех предложенных 1С`ом не хватает Вам?
Вы мне предлагаете воображением компенсировать ограниченность языка 1С?
Нет я предлагаю, всего лишь научиться использовать язык до того, как его осуждать =)
Прежде, чем советовать «научиться», вам стоило бы знать, что определение перечисленных вами основных объектов выполняется не через язык 1С, а настройками конфигуратора с возможностью определения некоторых методов в коде 1С. Соответственно «использовать язык» для определения не получится, так как в языке 1С не предусмотрено таких конструкций определения.

Мне не хватает определения класса модулей из задачи «Модульное приложение на 1С» (http://infostart.ru/public/192074/). Мешают в БСП через один модули с пометкой Переопределяемый или процедуры, например, ПриДобавленииСлужебныхСобытий, что эквивалентно override-методам. Не хватает явного указания через поддерживаемый Интерфейс, что часть справочников/документов поддерживают особую работу с групповой обработкой (БСП обошла этот момент вызовом в попытка-исключение функций РеквизитыРедактируемыеВГрупповойОбработке, РеквизитыНеРедактируемыеВГрупповойОбработке для каждого справочника/документа).
Компилирование в C# аналогично компилированию в 1С, так же как C# производит конвертацию в MSIL 1С производит компиляцию в свой промежуточный язык исполнения, который далее исполняется либо в CLR для C# либо в Платформе для 1С.

Чудесным образом Ассемблер тоже выполняет компилирование в машинный код, но им редко пользуются, предпочитая C++ и C# из-за более выразительных средств языка. CIL с оп-кодом 1С я бы не сравнивал из-за огромной убогости последнего, где из 128 кодов коды с 51 по 122 посвящены вызовам функций вида Min, Max, BeginOfDay, BeginOfMonth, BeginOfYear и т.д. (странно, что вызова BeginOf100Years нет :)).

ОП-коды 1С
        Nop = 0,
        LineNo = 1,
        PushStatic = 2,
        PushLocal = 3,
        PushConst = 4,
        PushReturn = 5,
        PushFalse = 6,
        PushTrue = 7,
        PushUndefined = 8,
        PushNull = 9,
        PushEmpty = 10,//???
        Pop = 11,
        GetObjectProperty = 12,
        GetIndexed = 13,
        SelEnum = 14,
        NextEnum = 15,
        Assign = 16, //Pop = Pop

        AssignReturnValue = 17, //Pop = Pop
        SetParamsCount = 18, //Parameter number
        Call = 19,
        CallObjectProcedure = 20,
        CallObjectFunction = 21,
        Ret = 22,

        Neg = 23,
        Add = 24,
        Sub = 25,
        Mul = 26,
        Div = 27,
        Mod = 28,

        Not = 29,
        AndJmp = 30,
        OrJmp = 31,
        LogVal = 32, //???
        EQ = 33,
        NE = 34,
        GT = 35,
        LT = 36,
        GE = 37,
        LE = 38,

        Jmp = 39,
        JZ = 40, //Else go to op1
        JNZ = 41,
        JmpLbl = 42,

        Inc = 43,

        PushTry = 44,
        PopTry = 45,
        EndTry = 46,
        Raise = 47,

        PushFor = 48,
        PushForVar = 49,
        PopFor = 50,

        New = 51, //Constants[op1]

        Execute = 52,
        StrLen = 53,
        TrimL = 54,
        TrimR = 55,
        TrimAll = 56,
        Left = 57,
        Right = 58,
        Mid = 59,
        Find = 60,
        Upper = 61,
        Lower = 62,
        Char = 63,
        CharCode = 64,
        IsBlankStr = 65,
        Int = 66,
        RoundDefault = 67,
        Round = 68,

        Boolean = 69,
        Numeric = 70,
        String = 71,

        Date = 72,
        Date3 = 73,
        Date6 = 74,
        AddMonth = 75,
        BegOfMonth = 76,
        EndOfMonth = 77,
        BegOfQuart = 78,
        EndOfQuart = 79,
        BegOfYear = 80,
        EndOfYear = 81,
        Year = 82,
        Month = 83,
        Day = 84,
        Hour = 85,
        Minute = 86,
        Second = 87,
        DayOfYear = 88,
        WeekOfYear = 89,
        WeekDay = 90,
        BegOfWeek = 91,
        EndOfWeek = 92,
        BegOfDay = 93,
        EndOfDay = 94,
        BegOfHour = 95,
        EndOfHour = 96,
        BegOfMinute = 97,
        EndOfMinute = 98,
        CurDate = 99,

        StrReplace = 100,
        LinesCount = 101,
        LineGet = 102,

        Min = 103,
        Max = 104,
        StrCountOccur = 105,
        ErrorDescr = 106,
        TypeOf = 107,
        Type = 108,
        Eval = 109,
        Format = 110,
        NewObject = 111,

        ACos = 112,
        ASin = 113,
        ATan = 114,
        Cos = 115,
        Exp = 116,
        Log = 117,
        Log10 = 118,
        Pow = 119,
        Sin = 120,
        Sqrt = 121,
        Tan = 122,

        AddHndlr = 123,
        AddObjHndlr = 124,
        RmvHndlr = 125,
        RmvObjHndlr = 126,
        Title = 127,
        ErrorInfo = 128



Сравните с CIL: en.wikipedia.org/wiki/List_of_CIL_instructions

Intellisense в 1С 8.3 есть, подсказки глобальных функций, подсказки реквизитов определенных типов, подсказки по объектам метаданных, так же все функции имеющие стандарт комментировая так же подсказываются с пояснениями что за аргумент и какого он типа при наборе. Надо просто научиться всем этим пользоваться =)

«Стандарт комментирования» уже упоминал. XmlDoc – это стандарт, а то, что у вас показано в тексте – это бардак. За Intellisens в 8.3 спасибо – долго его ждали. Наверное, Снегопат повлиял на компанию 1С в сторону внимания программистам. В C# достаточно указать тип входных параметров и студия подключит для них Intellisens, что согласитесь намного проще, чем писать простыню комментариев перед функцией. Я упоминал еще рефакторинг. 1С умеет автоматически переименовывать по коду переменные или снова я пользоваться не умею?
Для контроля версий есть Хранилище конфигурации, афигенно удобный инстурмент, в котором можно захватывать и помещать объекты общей конфигурации, чтобы не было коллизий между группой разработчиков.

Можете подсказать, как через «афигенно» удобный инструмент сделать ветвления? А если он не позволяет делать ветвления, что было бы удобно для поддержки разных однотипных конфигураций, какой же он «афигенно» удобный? Недавно тема была про муки внесения изменений после очередного обновления от 1С. С ветвлением проблем возникало бы меньше. Хранилище – это пародия на Visual SourceSafe, который давно вымер, не выдержав конкуренции с SVN, GIT.

Но можно так же и обычный Git использовать, достаточно выгрузить конфигурацию в промежуточные файды (txt, xml, mxl, epf, ert), но именно для 1С это менее удобно, чем использовать хранилище.


Наверное, снова разочарую вас, но практически использовать в GIT выгрузку конфигурации XML у вас вряд ли получится. Попробуйте поработать с миллионом скинутых в один каталог файлов, где не работает функция сравнения для mxl, epf, erf форматов. Почему компании 1С нельзя было их разложить сразу по папкам Объект/Назвние/<Файлы объекта>? Кстати, внешние отчеты/обработки до сих пор не выгружаются в XML.

В 8.3 есть unit тестирование, ровно как и нагрузочное тестирование, как и оценка производительности в «особых» условиях.

Рад, что хоть в чем-то 1С преуспела. Мало знаком с этими технологиями, поэтому остается только надеяться, что с ними все хорошо, а не как в остальных случаях.
Наверное, снова разочарую вас, но практически использовать в GIT выгрузку конфигурации XML у вас вряд ли получится. Попробуйте поработать с миллионом скинутых в один каталог файлов, где не работает функция сравнения для mxl, epf, erf форматов. Почему компании 1С нельзя было их разложить сразу по папкам Объект/Назвние/<Файлы объекта>? Кстати, внешние отчеты/обработки до сих пор не выгружаются в XML.


1С этого не сделала, но средства к этому все-таки есть.

github.com/xDrivenDevelopment/v83unpack — Человечная работа 1С с git. В частности, раскладывание кучи файлов 1С в нормальные папки, там есть.
sourceforge.net/projects/v8reader/ — сравнение epf/erf находящихся в репозитории (автор — я, так что немного ПИАРа)
infostart.ru/public/106310/ — аналогично, но для всех объектов конфигурации. Цепляете как external diff и вперед.

В сообществе вообще много инструментов для правильной разработки на 1С. Те же юнит-тесты, например, у нас во внутренней разработке применяются очень активно и приносят должный эффект.

Если 1С чего-то не сделала, то это не значит, что этого нет.
Возник вопрос со строкой
var Model = Compilation.GetSemanticModel(tree);

она не работает, т.к. GetSemanticModel является нестатическим методом, с конструктор типа Compilation — internal
Имелся ввиду объект compilation — с прописной буквой «C» — изменил в статье. Теперь выглядит так:
var compilation = CSharpCompilation.Create("1ccode").WithOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)).AddReferences(new MetadataFileReference(typeof(object).Assembly.Location)).AddSyntaxTrees(tree);
var Model = compilation.GetSemanticModel(tree);
Помимо чисто исследовательского интереса — какая, на ваш взгляд, может быть практическая польза от этого? Если может, конечно.
Выше написал комментарий
Как оказалось, у подхода компилирования C# в код 1С могут быть еще достоинства. Разработка 1С из конфигуратора в теории может быть перемещена в Visual Studio со всеми преимуществами: intellisense, быстрый рефакторинг, контроль типов, встроенный контроль ошибок при компилировнии. Плюс контроль версий сторонними средствами (проект C# в виде файлов в папке). Возможно, юнит-тестирование. Еще код на C# более выразительный. Сложный проект можно разделить на модули-сборки проектов C#.

Вероятность того, что будет польза минимальная, потому что для успешного результата требуется: проработать трансляцию конструкций C# на 1C (встроенные типы, события, классы, generic-типы, лямбда выражения), сделать классы/методы-заглушки для всех объектов 1С (их очень много), собрать сообщество, поддерживать в актуальном состоянии с вновь выходящими фичами 1С.

Я интересовался вашим opensource-проектом, вы можете тоже проработать такой подход для других языков. Но в случае с VisualStudio/C# и сборками, в которые можно помещать все, что угодно, организовать трансляцию проще и удобнее.
Вы очень верно меня раскусили) Я спрашиваю не просто так, а с прицелом на то, чтобы как-то применить это в своем проекте и, возможно, привлечь к нему вас ;) 1Script, кстати, из эксперимента вырос в прикладной инструмент и уже используется в боевых задачах.
Идею здесь, думаю, можно выразить так: используя современные IDE (Eclipse, Visual Studio) и языки программирования компилировать исходный код в низкоуровневый код 1С (или опкод 1С) и набор XML-файлов для загрузки в конфигуратор. Сделать это нужно, чтобы компании 1С стало стыдно за невыразительность языка :)
А можно ли применить к вашему проекту, вам, думаю будет видней.
Как могло бы выглядеть определение Перечисления в коде C#, которое теоретически можно было бы транслировать в аналогичное определение 1С
    [Uuid("e25d7fed-761e-4247-923e-01b2a1df479b")]
    [GeneratedType(GeneratedTypeCategory.Ref, "39091fcf-4739-4c06-ad24-085f96fff7f2", "4ebf46c2-ce91-44f8-96d5-ac7dc143095f")]
    [GeneratedType(GeneratedTypeCategory.Manager, "7fb5c2f6-6579-4734-9dce-4e3db33c0100", "26e51616-0d45-4ee1-b90a-4a9aa2682ec7")]
    [GeneratedType(GeneratedTypeCategory.List, "32f4ed6d-cd34-4a19-8cf1-ad290cbad5f2", "e2039c40-5bdd-4a07-9a94-4693575d8c08")]
    public class СтатусыИзвлеченияТекстаФайлов : Enumeration
    {
        [Synonym("ru", "Не извлечен")]
        public static readonly EnumRef<СтатусыИзвлеченияТекстаФайлов> НеИзвлечен = new EnumRef<СтатусыИзвлеченияТекстаФайлов>(new Guid("e9bab7c9-2560-41bb-a4e2-d3c05bc622ef"));
        [Synonym("ru", "Извлечен")]
        public static readonly EnumRef<СтатусыИзвлеченияТекстаФайлов> Извлечен = new EnumRef<СтатусыИзвлеченияТекстаФайлов>(new Guid("bf28a953-23ae-4308-891f-c51f47f95e6c"));
        [Synonym("ru", "Извлечь не удалось")]
        public static readonly EnumRef<СтатусыИзвлеченияТекстаФайлов> ИзвлечьНеУдалось = new EnumRef<СтатусыИзвлеченияТекстаФайлов>(new Guid("543b7113-448a-4e17-bb7c-8fef149aa8ed"));

        public override void ChoiceDataGetProcessing(object ChoiceData, object Parameters, ref bool StandardProcessing)
        {
            //код для ОбработкаПолученияДанныхВыбора
        }
    }
Only those users with full accounts are able to leave comments. Log in, please.