linq2db и Убивец 1С
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 24.06.20 20:03
Оценка: 6 (1)
Навеяно
Killer 1s Application

Если посмотреть на 1С то из преимуществ это единая иерархия классов (справочники, документы, регистры остатков, регистры движений, периодические регистры)

В свое время делал отбражение 1С Базы на EF
Code First и Linq to EF на примере 1С версии 7.7 и 8.3 часть I
Code First и Linq to EF на примере 1С версии 8.3 часть II
Linq to EF. Практика использования. Часть III

Обработки можно скачать здесь
https://ru.stackoverflow.com/questions/527763/Как-вызвать-метод-из-c-в-1С/527802#527802
http://files.rsdn.org/19608/CodeFirstTo1C.zip
http://files.rsdn.org/19608/CodeFirstTo83.zip

Я к тому, что нужна система учета, которую можно быстро прикрутить под себя.
Например для вэб магазина следить за остатками итд напрямую.
Там же и прикрутить TVFs для ускорения выбора остатков, запись движений с перерасчетом остатков итд
и солнце б утром не вставало, когда бы не было меня
Отредактировано 03.07.2020 11:02 Serginio1 . Предыдущая версия . Еще …
Отредактировано 02.07.2020 7:54 Serginio1 . Предыдущая версия .
Отредактировано 27.06.2020 11:27 Serginio1 . Предыдущая версия .
Отредактировано 27.06.2020 11:25 Serginio1 . Предыдущая версия .
Отредактировано 27.06.2020 10:23 Serginio1 . Предыдущая версия .
Отредактировано 27.06.2020 8:15 Serginio1 . Предыдущая версия .
Отредактировано 27.06.2020 7:20 Serginio1 . Предыдущая версия .
Отредактировано 26.06.2020 7:09 Serginio1 . Предыдущая версия .
Отредактировано 25.06.2020 12:40 Serginio1 . Предыдущая версия .
Отредактировано 25.06.2020 7:19 Serginio1 . Предыдущая версия .
Re: linq2db и Убивец 1С
От: Mystic Artifact  
Дата: 24.06.20 20:11
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Для большинства нужен именно учет. Для бухгалтерии всегда можно сделать выгрузку.

Мир немного изменился за 20 лет и сейчас часто предпочитают централизированный учет. В частности, филиалы банков, часто более не являются самостоятельными единицами или являются только точками учета/отсчета в центральной системе, но на поле являются исключительно точками обслуживания клиентов. В этом контексте слово "выгрузка" просто не допустимо ни под каким из предлогов, даже, если приложение будет делать именно ее.

Ну это так, рандомные мысли.
Re[2]: linq2db и Убивец 1С
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 24.06.20 20:15
Оценка:
Здравствуйте, Mystic Artifact, Вы писали:

MA>Здравствуйте, Serginio1, Вы писали:


S>>Для большинства нужен именно учет. Для бухгалтерии всегда можно сделать выгрузку.

MA> Мир немного изменился за 20 лет и сейчас часто предпочитают централизированный учет. В частности, филиалы банков, часто более не являются самостоятельными единицами или являются только точками учета/отсчета в центральной системе, но на поле являются исключительно точками обслуживания клиентов. В этом контексте слово "выгрузка" просто не допустимо ни под каким из предлогов, даже, если приложение будет делать именно ее.

MA> Ну это так, рандомные мысли.


Ну пока разговор о том, что бы начать! И linq2db продвигать проще ибо есть средства для создания баз, реструктуризации и инструменты работы с ней
и солнце б утром не вставало, когда бы не было меня
Re[3]: linq2db и Убивец 1С
От: Mystic Artifact  
Дата: 24.06.20 20:34
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Ну пока разговор о том, что бы начать! И linq2db продвигать проще ибо есть средства для создания баз, реструктуризации и инструменты работы с ней


Это иллюзия. Их нет. linq2db из коробки без напильника не может ничего, что требовали промышленные проекты. Но в нем это возможно и возможно успешно. В EF — этого в принципе нет. Обыкновенный камень преткновения с MSSQL это иметь и результат процедуры и ошибки сгенерированные ими. Это не очень соответствует нормальной логике, но так работает SQL.
Кроме того, структура БД — если генерируется на лету, то бенефитов будет не так много. А "костяное" ADT? (или как оно там еазывается) — на генерации отчетов заморитесь ждать результатов. Хотя именно подобный подход у нас успешно работал и сейчас, на сколько я знаю — работает. Т.е. часть данных представлена ч/з аттрибутивно-расширяющие таблицы. Более того — они хранятся в типизированном виде (т.е. колонка под свой тип). Руками работать с таким SQL — обычно и не надо было, звались процедуры. А массированно работать с ними — гемор на пустом месте, потому что расширения — клиенто-зависимы.
И даже много лет после, я делал специализированные "кубы" на SQL и они отлично работают. Для генерации запросов кстати использовал linq2db, но потом пришлось портировать на EF, и при полной схожести — вылезли архитектурные нюансы (более-менее легко разрешимые).

Это я все к тому, что это технический вопрос. libq2db — инструмент отличный, и я его всем бы рекомендовал, в отличии от EF. Да и с EF проблем особых нет, если привык работать локтями, а не руками. Но, при стратегическом планировании — это вообще не важно. А социальные аспекты и подавно заморитесь бороть.

Да и вообще, стоит оглянуться и поискать уже готовые решения. Уверен, есть альтернативы в своих областях.
Re[4]: linq2db и Убивец 1С
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 24.06.20 21:44
Оценка:
Здравствуйте, Mystic Artifact, Вы писали:

MA> Да и вообще, стоит оглянуться и поискать уже готовые решения. Уверен, есть альтернативы в своих областях.

Ну пока альтернативы 1С и не видно. Но для большинства задач их структуры БД хватает для большинства задач.
Так например для неопределенных справочников формируется запрос по доступным справочникам. Кстати в C#9 предлагается юнионы (ограничения на типы)

var crazyCollectionFP = new List<int|double|string>{1, 2.3, "bassam"};


В 1С существуют поля неопределенного типа. Это например план счетов и прочее. В таких полях может содержаться тип,ВидСправочника, Ид
https://infostart.ru/public/402038/

public  static  object ПолучитьЗначениеНеопределенногоСсылочного(НеопределенныйТип ВладелецId)
        {
            var НТС=ВладелецId as НеопределенныйТипСсылочный;
            Func<byte[], object> значение;
            if (ОбъектыПоТипу.TryGetValue(НТС.НомерТаблицы.byteArrayToInt(), out значение))
                return значение(НТС.Ссылка);
 
                    return null;
        }
        public  static  object ПолучитьЗначениеНеопределенногоТипа(НеопределенныйТип ВладелецId)
        {
            var тип = ВладелецId.Тип.ВБайт();
 
            switch(тип)
            {
                case 1: return  null;
                case 2: return (ВладелецId as НеопределенныйТипБулево).Булево;
                case 3: return (ВладелецId as НеопределенныйТипЧисло).Число;
                case 4: return (ВладелецId as НеопределенныйТипДата).Дата;
                case 5: return (ВладелецId as НеопределенныйТипСтрока).Строка;
                case 8: return ПолучитьЗначениеНеопределенногоСсылочного(ВладелецId);
            }
            return  null;
        }



ОбъектыПоТипу это хэш таблица, которая заполняется так

public  partial  class  КонстантыБД
    {
         static КонстантыБД()
        {
            ОбъектыПоТипу = new  Dictionary<int, Func<byte[], object>>();
 
 
ОбъектыПоТипу.Add(Справочник.Тестовый.НомТаблицы,
      (ключ) => { return БД.ПолучитьСсылочныйЭлемент<Справочник.Тестовый>(ключ); }
      );

бъектыПоТипу.Add(Справочник.Номенклатура.НомТаблицы,
      (ключ) => { return БД.ПолучитьСсылочныйЭлемент<Справочник.Номенклатура>(ключ); }
      );



Можно создать по такому типу запросы. С ограничением по типу, с выборкой всех типов итд.
Ну и учтиывая патерн матчинг можно и по другому запросы писать и генерировать!
и солнце б утром не вставало, когда бы не было меня
Re[5]: linq2db и Убивец 1С
От: Mystic Artifact  
Дата: 24.06.20 23:13
Оценка:
Здравствуйте, Serginio1, Вы писали:

MA>> Да и вообще, стоит оглянуться и поискать уже готовые решения. Уверен, есть альтернативы в своих областях.

S>Ну пока альтернативы 1С и не видно. Но для большинства задач их структуры БД хватает для большинства задач.
S> Так например для неопределенных справочников формируется запрос по доступным справочникам. Кстати в C#9 предлагается юнионы (ограничения на типы)
S>
S>var crazyCollectionFP = new List<int|double|string>{1, 2.3, "bassam"};
S>

Название расходится с примером. Это не ограничение на типы — это бред сумасшедшего. Оно просто не нужно. Более того, кому нужно — у тех уже 20 лет как все карты на руках (object, не?). И это довольно широко применяется в .NET все время его существование, но всегда маскируется за типизированными библиотеками. Да, люди экономят байты, там где есть профит. Лучше бы починили Dictionary<TStruct, TKey> где TStruct — 64-битная структура, при этом проседает по скорости раз в 5 по отношению к long.
Я знаю, есть языки где такое возможно/реализуемо — но без поддержки рантайма — это будет ерунда. Это не языковая конструкция. Да, кстати, если ты слышал о жирных указателях, то многие рантаймы "мощных" по типовой номенклатуре языков их используют. Готов платить 128 бит на указатель? Я лично нет. Я вот готов кодировать биты в некоторых ссылочных типах, к сожалению в дотнете это невозможно. Тем не менее таким битоводством занимаются довольно много кто (тут вопрос целесообразности и возможности). Ну, из примеров — clang — кодирует наиболее распространенные квалификаторы типов там. А если из managed мира — то какой-нибудь XContainer внутри себя хранит один член object который либо null, либо ссылка на ребенка либо это массив детей. (Ну или что-то вроде этого.) Это та же самая чистая экономия на битах.
Теперь нам дадут в руки кувалду, а как экономить не расскажут. Если серьезно — имхо, фича спорная. Если такое делать, то нужна структурная типизация по идее, но ее ж не будет?

S>В 1С существуют поля неопределенного типа. Это например план счетов и прочее. В таких полях может содержаться тип,ВидСправочника, Ид

S>https://infostart.ru/public/402038/
Именно с полями неопределенного типа невозможно нормально ничего сделать. Давай их проссумируем — а тут по середине — строка? Это значит, "неверное" значение нужно пропустить или выдать ошибку? Для того, что бы эффективно работать с любыми данными — нужно разобраться с ними, а не скидывать всё в одно болото. Да, это бывает дается не сразу, но в учетке то... не знаю. Ну, ладно. У нас был ещё последний тип по моему вариант, который никогда фактически не использовался. По сути то, нет проблем и динамически структуру БД менять — просто многие преимущества LINQ пропадут. Хотя linq2db останется полезным, т.к. имеет кучу вкусняшек всё равно.

S> Можно создать по такому типу запросы. С ограничением по типу, с выборкой всех типов итд.

S>Ну и учтиывая патерн матчинг можно и по другому запросы писать и генерировать!
Ничего это не даёт ровным счетом. Есть логическая схема данных. Есть физическая (в БД). Задача — превратить один сформулированный запрос в другой (на SQL). Это вообще задача почти прямого маппинга, тут ни фичи языка, ни LINQ как таковой особой роли не роялят, и решается она достаточно просто. Иногда выглядит кошмарно. Иногда красиво. Последний раз когда я встречал подобную задачу — это было что-то около 150Кб кода на VB.NET. И все только вокруг него ходили и охали и ахали, но ничего кардинального с этим построителем запросов сделать нельзя, а LINQ вообще туда не лезет, потому что запрос полностью динамический, от таблиц, фич клиентов до кол-ва результирующих колонок. На самом деле сделать можно, но тогда разломать прийдется решительно всё. Но при этом LINQ ни в каком виде всё равно не применим. Такова специфика.
Основная сила LINQ открывается в комбинировании уже готовых запросов или подзапросов, особенно построенных динамически. И одного этого на самом деле достаточно. Комбинирование банальных фильтров — это уже хорошо. А он позволяет гораздо больше. Но, оно даже без этого всего — оно хорошо, когда у тебя есть четкая (единая) структура БД. Есть и ситуации когда параметризированные запросы не подходят, — и linq2db тоже имеет ответ на это. Но, этот самый "маппинг" (смысловой) — он же статический. LINQ открывает очень много возможностей, и linq2db — ну, весьма хороший инструмент.
Но, я может не правильно выразился изначально — сам по себе — этот инструмент, каким бы он не был — просто не может быть определяющим.

А в такой универсальной системе — если идти с фиксированной схемой — это имеет одни границы. Они подходят? А если не фиксированной — то применение LINQ вообще ограничится набором фиксированных служебных таблиц, где применение любого linq-провайдера в относительной доли окажется смешным.

PS: Это мое лично мнение, я не навязываю и не претендую на правоту и единство. Просто всему своё место.
Re[6]: linq2db и Убивец 1С
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 25.06.20 06:53
Оценка:
Здравствуйте, Mystic Artifact, Вы писали:


S>> Так например для неопределенных справочников формируется запрос по доступным справочникам. Кстати в C#9 предлагается юнионы (ограничения на типы)

S>>
S>>var crazyCollectionFP = new List<int|double|string>{1, 2.3, "bassam"};
S>>

MA> Название расходится с примером. Это не ограничение на типы — это бред сумасшедшего. Оно просто не нужно. Более того, кому нужно — у тех уже 20 лет как все карты на руках (object, не?). И это довольно широко применяется в .NET все время его существование, но всегда маскируется за типизированными библиотеками. Да, люди экономят байты, там где есть профит. Лучше бы починили Dictionary<TStruct, TKey> где TStruct — 64-битная структура, при этом проседает по скорости раз в 5 по отношению к long.
В TypeScript прекрасно работают и для БД это ограничение на типы без атрибутов можно вводить



S>>В 1С существуют поля неопределенного типа. Это например план счетов и прочее. В таких полях может содержаться тип,ВидСправочника, Ид

S>>https://infostart.ru/public/402038/
MA> Именно с полями неопределенного типа невозможно нормально ничего сделать. Давай их проссумируем — а тут по середине — строка? Это значит, "неверное" значение нужно пропустить или выдать ошибку? Для того, что бы эффективно работать с любыми данными — нужно разобраться с ними, а не скидывать всё в одно болото. Да, это бывает дается не сразу, но в учетке то... не знаю. Ну, ладно. У нас был ещё последний тип по моему вариант, который никогда фактически не использовался. По сути то, нет проблем и динамически структуру БД менять — просто многие преимущества LINQ пропадут. Хотя linq2db останется полезным, т.к. имеет кучу вкусняшек всё равно.

Просто есть тип, по типу и отфильтруем. Это не проблема. А вот linq2db можно под такие задачи и подпелить.
Кстати тот же case https://stackoverflow.com/questions/4244023/select-case-in-linq
from u in users
let range = (u.Age >= 0  && u.Age < 10 ? "0-25" :
             u.Age >= 10 && u.Age < 15 ? "26-40" :
             u.Age >= 15 && u.Age < 50 ? "60-100" :
            "50+")
group u by range into g
select new { g.Key, Count=g.Count() };


Но можно и по человеческо обработать через switch case https://docs.microsoft.com/ru-ru/dotnet/api/system.linq.expressions.switchcase?view=netcore-3.1
S>> Можно создать по такому типу запросы. С ограничением по типу, с выборкой всех типов итд.
S>>Ну и учтиывая патерн матчинг можно и по другому запросы писать и генерировать!
MA> Ничего это не даёт ровным счетом. Есть логическая схема данных. Есть физическая (в БД). Задача — превратить один сформулированный запрос в другой (на SQL). Это вообще задача почти прямого маппинга, тут ни фичи языка, ни LINQ как таковой особой роли не роялят, и решается она достаточно просто. Иногда выглядит кошмарно. Иногда красиво. Последний раз когда я встречал подобную задачу — это было что-то около 150Кб кода на VB.NET. И все только вокруг него ходили и охали и ахали, но ничего кардинального с этим построителем запросов сделать нельзя, а LINQ вообще туда не лезет, потому что запрос полностью динамический, от таблиц, фич клиентов до кол-ва результирующих колонок. На самом деле сделать можно, но тогда разломать прийдется решительно всё. Но при этом LINQ ни в каком виде всё равно не применим. Такова специфика.
MA> Основная сила LINQ открывается в комбинировании уже готовых запросов или подзапросов, особенно построенных динамически. И одного этого на самом деле достаточно. Комбинирование банальных фильтров — это уже хорошо. А он позволяет гораздо больше. Но, оно даже без этого всего — оно хорошо, когда у тебя есть четкая (единая) структура БД. Есть и ситуации когда параметризированные запросы не подходят, — и linq2db тоже имеет ответ на это. Но, этот самый "маппинг" (смысловой) — он же статический. LINQ открывает очень много возможностей, и linq2db — ну, весьма хороший инструмент.
MA> Но, я может не правильно выразился изначально — сам по себе — этот инструмент, каким бы он не был — просто не может быть определяющим.

MA> А в такой универсальной системе — если идти с фиксированной схемой — это имеет одни границы. Они подходят? А если не фиксированной — то применение LINQ вообще ограничится набором фиксированных служебных таблиц, где применение любого linq-провайдера в относительной доли окажется смешным.


MA> PS: Это мое лично мнение, я не навязываю и не претендую на правоту и единство. Просто всему своё место.



Ну я на 1С программировал лет 20. И знаю о чем говорю. Там и SQL даже не вессь стандарт SQL 92 поддерживает. У Linq даже больше возможностей.
Что касается диначмического характера запросов, то как раз Linq удобен для склейки запросов. В отличие от текста. Все типизированно.
и солнце б утром не вставало, когда бы не было меня
Отредактировано 25.06.2020 7:26 Serginio1 . Предыдущая версия .
Re: linq2db и Убивец 1С
От: wraithik Россия  
Дата: 25.06.20 08:09
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Наткнулся на очередную задумку Убивец 1С


S>И вот думаю, а почему бы его не сделать на linq2db.

S>Что для этого нужно

S>Так как C# мне ближе. То это

S>1. Разработать классы справочников, регистров накопления (остатки, обороты, расчет остатков на момент времени)
S>2. Плагин к VS для конфигуратора аля 1С для создания классов
S>3. Формы WPF. Можно свой конструктор сделать на XAML
S>4. Я в свое время делал Code First к Базе 1С
S>http://catalog.mista.ru/public/402038/
S>http://catalog.mista.ru/public/402433/

S>Для большинства нужен именно учет. Для бухгалтерии всегда можно сделать выгрузку.

S> Думаю, что как студенческий проект это интересно.

1C это экосистема накрывающая львиную часть учета. Между собой все конфы дружат. Осилишь написать хотя бы Розницу по функционалу? Вернее не так — сколько потратишь на это время.
В 1С свой язык. Он убогий. Но он простой и подходит для описания бизнес логики, с учетом встроенных библиотек. Сколько потратишь времени на написания слоя для работы с бизнес-объектами?
В 1С свой язык запросов, ориентированный на бизнес-логику. Виртуальные таблицы — это очень удобно. Я конечно могу их писать у руками, и иногда это надо, но 99.9% просто пишешь .СрезПоследних(), .Обороты() и т.д. и не думаешь как оно там внутри. Левые соединения через точку оно тоже самое делает, не заставляя трахаться с кучей связей. Аналогично с при работе с бизнес-объектами, но тут не думающих программистов поджидают грабли в виде тормозов. Написать код типа Сумма = Сумма + Док.СуммаДокумента и запихнуть его в большой цикл — это жесть. Ведь не доходит до некоторых, что Док.СуммаДокумента — это запрос в БД. Из-за этого у 1С есть проблема в виде тупых программистов.
Re[2]: linq2db и Убивец 1С
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 25.06.20 08:33
Оценка:
Здравствуйте, wraithik, Вы писали:


W>1C это экосистема накрывающая львиную часть учета. Между собой все конфы дружат. Осилишь написать хотя бы Розницу по функционалу? Вернее не так — сколько потратишь на это время.

W>В 1С свой язык. Он убогий. Но он простой и подходит для описания бизнес логики, с учетом встроенных библиотек. Сколько потратишь времени на написания слоя для работы с бизнес-объектами?
W>В 1С свой язык запросов, ориентированный на бизнес-логику. Виртуальные таблицы — это очень удобно. Я конечно могу их писать у руками, и иногда это надо, но 99.9% просто пишешь .СрезПоследних(), .Обороты() и т.д. и не думаешь как оно там внутри. Левые соединения через точку оно тоже самое делает, не заставляя трахаться с кучей связей. Аналогично с при работе с бизнес-объектами, но тут не думающих программистов поджидают грабли в виде тормозов. Написать код типа Сумма = Сумма + Док.СуммаДокумента и запихнуть его в большой цикл — это жесть. Ведь не доходит до некоторых, что Док.СуммаДокумента — это запрос в БД. Из-за этого у 1С есть проблема в виде тупых программистов.

Я это все прекрасно понимаю. Лет 20 на нем программировал. Но например для сайта или еще каких то учетных систем не нужен 1С.
Нужен встроенная система c БД и доступом через Linq. linq2db покрывает часть задач. Но удобно еще работать с конструктором, бизнес объектами (справочники, регистры остатков, оборотов)
Со своей иерархией. Будут какие то типовые решения. Взял, заточил под себя. Очень удобно.
Надо выгрузил консолидированные данные в ту же 1С. Не проблема. Та же 1С так и поступает для бухгалтерии. Ибо учётная система едина для всех, а вот законодательство для Бухучета везде разное.
И можно linq2db подпилить под определенные задачи
и солнце б утром не вставало, когда бы не было меня
Re[7]: linq2db и Убивец 1С
От: Danchik Украина  
Дата: 25.06.20 10:11
Оценка: 14 (1)
Здравствуйте, Serginio1, Вы писали:

S> Просто есть тип, по типу и отфильтруем. Это не проблема. А вот linq2db можно под такие задачи и подпелить.

S>Кстати тот же case https://stackoverflow.com/questions/4244023/select-case-in-linq
S>
S>from u in users
S>let range = (u.Age >= 0  && u.Age < 10 ? "0-25" :
S>             u.Age >= 10 && u.Age < 15 ? "26-40" :
S>             u.Age >= 15 && u.Age < 50 ? "60-100" :
S>            "50+")
S>group u by range into g
S>select new { g.Key, Count=g.Count() };
S>


Даже больше скажу, в linq2db можно написать специальную функцию для этого и использовать где надо.
[ExpressionMethod(nameof(AgeTostringImpl))]
public static string AgeTostring(int age)
  => throw new NotImplementedException();

static Expression<Func<int, string>> AgeTostringImpl()
  => age => (age >= 0  && age < 10 ? "0-25" :
             age >= 10 && age < 15 ? "26-40" :
             age >= 15 && age < 50 ? "60-100" :
             "50+");


Таким образом
from u in users
group u by AgeTostring(u.Age) into g
select new { g.Key, Count=g.Count() };



Только вот каким припеком он должен стать заменителем 1C мне не понять ))
Re[8]: linq2db и Убивец 1С
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 25.06.20 10:48
Оценка:
Здравствуйте, Danchik, Вы писали:

D>static Expression<Func<int, string>> AgeTostringImpl()

D> => age => (age >= 0 && age < 10 ? "0-25" :
D> age >= 10 && age < 15 ? "26-40" :
D> age >= 15 && age < 50 ? "60-100" :
D> "50+");
D>[/cs]

D>Таким образом

D>
D>from u in users
D>group u by AgeTostring(u.Age) into g
D>select new { g.Key, Count=g.Count() };
D>



D>Только вот каким припеком он должен стать заменителем 1C мне не понять ))


Интерес представляет соединение по типу для неопределенных типов.
Там ближе нынешний паттерн матчинг switch.
Ну я в топике написал каким. Если сделать конфигуратор в студии и конструктор форм. Определенную иерархию классов.
Не говорю, про убивца, но как аналог легко.
То есть написать несложную программу учета с возможностью самому допилить до своих нужд.
Проблема 1С в том, что там все жестко ограничено. Можно конечно и самому пришпандорить Linq, но это все сбоку.

Но на определенной системе типов проще строить запросы используя ограничения.
Проще конструировать выбирая из выпадающего списка типы. Реструктуризировать базу итд.
Кроме того начинающим проще разбираться, итд. Можно даже для обучения применять.

Просто за 20 лет нет такой системы с открытым кодом. Все пилят свои языки, что бы заработать. Тот же MS, 1C, SAP итд
и солнце б утром не вставало, когда бы не было меня
Re: linq2db и Убивец 1С
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 27.06.20 08:16
Оценка:
Интерес больше представляют остатки и обороты
Да вот еще в 1С ввели понятие виртуальная таблица остаткт и обороты
http://e-1c.ru/node/76

Эффективность обращения к виртуальным таблицам во многом зависит от того, как построено обращение к этой таблице. Стандарт Обращения к виртуальным таблицам описывает общие требования и рекомендации по работе с виртуальными таблицами. В этом стандарте изложены дополнительные рекомендации по повышению эффективности обращения к виртуальной таблице Остатки регистров накопления и бухгалтерии.
При обращении к любой виртуальной таблице платформа 1С:Предприятие генерирует запрос к СУБД, содержащий вложенный запрос. Самым эффективным вложенным запросом для чтения остатков будет чтение хранимой таблицы текущих остатков без применения группировки по измерениям. Платформа 1С:Предприятие сгенерирует такой запрос, если будут соблюдены все перечисленные ниже условия:
получение остатков ведется без указания даты;
не используется разделение итогов (необходимо учитывать при использовании такого режима может снижаться параллельность записи в регистр. См. также Режим разделения итогов для регистров накопления, Режим разделения итогов для регистров бухгалтерии);
внешний по отношению к виртуальной таблице запрос использует все измерения (в предложении ВЫБРАТЬ или в условиях соединения).
Пример.
Регистр накопления ОстаткиТовара содержит два измерения: Склад и Номенклатура, а также ресурс Количество. Необходимо запросом получить список всей номенклатуры, с указанием количества товаров на конкретном складе.
НЕПРАВИЛЬНО

ВЫБРАТЬ
 СпрНоменклатура.Ссылка КАК Товар, 
 ЕСТЬNULL(ОстаткиТоваров.Остаток, 0 ) КАК Остаток
ИЗ
Справочник.Номенклатура КАК СпрНоменклатура
 ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(&СегодняшняяДата, Склад = &Склад) КАК ОстаткиТоваров
ПО ОстаткиТоваров.Номенклатура = СпрНоменклатура.Ссылка

В этом запросе:
в условия виртуальной таблицы передана дата, поэтому будет использована не только хранимые таблицы остатков, но и таблица движений. Т.к. необходимо получить текущие остатки, то дату в запрос передавать не нужно;
измерение Склад не используется во внешнем по отношению к виртуальной таблице запросе, поэтому вложенный запрос остатков будет содержать группировку этому измерению.
ПРАВИЛЬНО


ВЫБРАТЬ
 СпрНоменклатура.Ссылка КАК Товар, 
 ЕСТЬNULL(ОстаткиТоваров.Остаток, 0 ) КАК Остаток
ИЗ
Справочник.Номенклатура КАК СпрНоменклатура
 ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(, Склад = &Склад) КАК ОстаткиТоваров
ПО ОстаткиТоваров.Номенклатура = СпрНоменклатура.Ссылка
 И ОстаткиТоваров.Склад = &Склад


Указав в выбрать определеннные поля измерений они же являются и группировкой.
Можно рассчитать остатки на любой момент времени


Если будет такая система классов и примитивный пример для ведения учета на складе, то интерес к linq2db возрастет.
и солнце б утром не вставало, когда бы не было меня
Re: linq2db и Убивец 1С
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 27.06.20 11:35
Оценка:
Навеяно https://devblogs.microsoft.com/dotnet/announcing-entity-framework-core-efcore-5-0-preview-6/

Так в 1С есть поля неопределенных типов, справочников.
Для неопределенного спаравочника Хотелось бы что типа такого

    switch TableNumber
            {
                1=> null,
                2=> бд.Спр_Поставщики.Where(поставщик=> поставщик.Id==SprId).DefaultIfEmpty()
select new
                     {
                        Наименование
                        
                     },
                3=> бд.Спр_Покупатели.Where(покупатель=> поставщик.Id==SprId).DefaultIfEmpty()
select new
                     {
                        Наименование
                        
                     },
                _=>null
            }





То есть такое генерилось, но вызывалось как
ПолеНеопределенногоСправочника.Наименование

Можно так

let spr= switch TableNumber
            {
                1=> null,
                2=> бд.Спр_Поставщики.Where(поставщик=> поставщик.Id==SprId).DefaultIfEmpty(),
                3=> бд.Спр_Покупатели.Where(покупатель=> поставщик.Id==SprId).DefaultIfEmpty(),
                _=>null
            }

spr?.Наименование


Кроме того можно применять утиную типизацию для классов с одинаковыми именами полей

Начнем с класса предка.

  public   class   СсылочныйТип
    {
 
        [Key]
        [Column("_IDRRef")]
        [MaxLength(16)]
        public  byte[] ID { get; set; }
 
        [NotMapped]
        public  virtual  int  НомерТаблицы { get { return 0; } }
    }


Номер таблицы нам понадобится для неопределенных типов.
Кроме того, мы сможем сделать дженерик метод


public TEntity ПолучитьСсылочныйЭлемент<TEntity>(byte[] ID) where TEntity : СсылочныйТип
        {
 
 
            var query = from спр in this.Set<TEntity>()
                         where спр.ID == ID
                         select спр;
            return query.SingleOrDefault<TEntity>();
 
        }


Тогда можно переписать так

let spr= switch TableNumber
            {
                1=> null,
                2=> ПолучитьСсылочныйЭлемент<Справочник.Поставщики>(SprId),
                3=> ПолучитьСсылочныйЭлемент<Справочник.Покупатели>.(SprId),
                _=>null
            }

spr?.Наименование


Ну а зная ограничение на поле то просто
ПолеСправочникеопределенногоТипа.Наименование
И автоматически генерировать CASE WHEN
и солнце б утром не вставало, когда бы не было меня
Отредактировано 27.06.2020 16:55 Serginio1 . Предыдущая версия .
Re[7]: linq2db и Убивец 1С
От: Mystic Artifact  
Дата: 29.06.20 17:34
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> В TypeScript прекрасно работают и для БД это ограничение на типы без атрибутов можно вводить

Только у него нет исполнительной машины. Есть какая-то доля других языков, где это реально работает в скомпилированном виде, но внутренняя архитектура может больно ударить и в отместку (на подобии жирных/толстых указателей вместо обычных). Собственно говоря и в TS, в силу его целевых особенностей — это всё больше эфемерные фичи для аннотаций и статической проверки типов, в моменты вызовов, нежели реальные возможности для реализации. Ну,в целом, вещь нужная, хорошая, интересная — но TS не может быть примером того, где это работает, просто потому, что он не является полноценным компилятором.

S>Что касается диначмического характера запросов, то как раз Linq удобен для склейки запросов. В отличие от текста. Все типизированно.

Исключительно там где типы определены заранее. Там где их нет — LINQ не сильно применим.

В остальном, тебе виднее.
Re[8]: linq2db и Убивец 1С
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 29.06.20 17:43
Оценка:
Здравствуйте, Mystic Artifact, Вы писали:

MA>Здравствуйте, Serginio1, Вы писали:


S>> В TypeScript прекрасно работают и для БД это ограничение на типы без атрибутов можно вводить

MA> Только у него нет исполнительной машины. Есть какая-то доля других языков, где это реально работает в скомпилированном виде, но внутренняя архитектура может больно ударить и в отместку (на подобии жирных/толстых указателей вместо обычных). Собственно говоря и в TS, в силу его целевых особенностей — это всё больше эфемерные фичи для аннотаций и статической проверки типов, в моменты вызовов, нежели реальные возможности для реализации. Ну,в целом, вещь нужная, хорошая, интересная — но TS не может быть примером того, где это работает, просто потому, что он не является полноценным компилятором.

юнионы ныжнв прежде всего для интеллисенсе и компилятора

то есть
var crazyCollectionFP = new List<int|double|string>{1, 2.3, "bassam", Dateime.Now};

При попытке вставить Dateime.Now ты получишь предупреждение в интеллисенсе и ошибку при компиляции
S>>Что касается диначмического характера запросов, то как раз Linq удобен для склейки запросов. В отличие от текста. Все типизированно.
MA> Исключительно там где типы определены заранее. Там где их нет — LINQ не сильно применим.

MA> В остальном, тебе виднее.


Ну так для этого и есть CodeFirst!
и солнце б утром не вставало, когда бы не было меня
Re[9]: linq2db и Убивец 1С
От: Mystic Artifact  
Дата: 29.06.20 17:46
Оценка:
Здравствуйте, Serginio1, Вы писали:

MA>> В остальном, тебе виднее.

S> Ну так для этого и есть CodeFirst!
Откровенно говоря предпочитаю "database-first", но что то,что другое никак не решает проблему с работой с заранее неизвестной структурой данных. Я говорил именно об этом. А если она определена заранее — то всего и так более чем достаточно.
Re[2]: linq2db и Убивец 1С
От: L.K. Марс  
Дата: 29.06.20 18:00
Оценка:
MA>В этом контексте слово "выгрузка" просто не допустимо ни под каким из предлогов

Даже под предлогом долговременных проблем со связью? Например, как будет работать банковская система в условиях войны? Ну, не ядерной, а, например, диверсионной?
Re[3]: linq2db и Убивец 1С
От: Mystic Artifact  
Дата: 29.06.20 18:07
Оценка:
Здравствуйте, L.K., Вы писали:

MA>>В этом контексте слово "выгрузка" просто не допустимо ни под каким из предлогов


LK>Даже под предлогом долговременных проблем со связью? Например, как будет работать банковская система в условиях войны? Ну, не ядерной, а, например, диверсионной?


Никак. Она и сейчас никак не будет работать. Большинство владельцев банков и так или иностранцы или еще какие выбрыки.

Если ставить такую цель как ты — то классические независимые отделения работают, но да, "выгрузка".
Re[10]: linq2db и Убивец 1С
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 29.06.20 19:16
Оценка:
Здравствуйте, Mystic Artifact, Вы писали:

MA>Здравствуйте, Serginio1, Вы писали:


MA>>> В остальном, тебе виднее.

S>> Ну так для этого и есть CodeFirst!
MA> Откровенно говоря предпочитаю "database-first", но что то,что другое никак не решает проблему с работой с заранее неизвестной структурой данных. Я говорил именно об этом. А если она определена заранее — то всего и так более чем достаточно.
Ну так откуда возьмется неизвестная структура? Если мы строим совою иерархию классов.
То есть в чем прелесть, так это унификация.
Например документ от справочника мало отличается. Есть шапка и табличные части. Но документ может изменять регистры накопления и движения.
И под это можно заточить Linq.
Просто почему то, этого до сих пор нет. Может и есть, но я об этом не знаю
и солнце б утром не вставало, когда бы не было меня
Re[11]: linq2db и Убивец 1С
От: Mystic Artifact  
Дата: 29.06.20 19:40
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Ну так откуда возьмется неизвестная структура? Если мы строим совою иерархию классов.

Софт-конструктор — разве не об этом? Но даже при заранее известной структуре — бывают запросы формируемые полностью динамически: от полей для группировки до результирующих полей. И это невозможно предсказать, т.к. запрос логический формирует пользователь в понятной для него форме.

S>То есть в чем прелесть, так это унификация.

S> Например документ от справочника мало отличается. Есть шапка и табличные части. Но документ может изменять регистры накопления и движения.
Не вижу сходства и унификации тут никакой, но это возможно лишь мое искривленное собственным опытом мнение.

В моем понимании документ — сам по себе имеет тип. Он может быть выполнен/проведен — и тогда выполняется учетная модель для него. Он может быть отменен и удален — тогда нужно вернуть средства. Тип документа — это от платежки за коммунальные услуги до онлайн платежа за услуги связи конкретного оператора или более простые или наоборот более сложные типы. Суть их типизации заключается в возможности нести доп информацию и иметь специфичную для них логику обработки. Логика всегда должна правильно отрабатывать любые моменты времени. Если сейчас произошла смена правил и мы выполняем удаление (если оно возможно) — то ессно удаление должно выполняться по правилам соотв. периоду (отсюда и большой привет DateTime.Now и двойной привет любителям мокать его).
Но это все специфика наверное.

S>И под это можно заточить Linq.

S> Просто почему то, этого до сих пор нет. Может и есть, но я об этом не знаю
Я понимаю эти прелести. При любой возможности не выходить за пределы возможностей linq — я стараюсь и не выходить.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.