Приветствую уважаемых читателей.

Как и обещал в первой статье Быстрая разработка CRUD на Java: дауншифтинг с «1С: Предприятие», продолжаю описание своих OpenSource проектов, реализующих аналогичную 1С: Предприятию функциональность.

На сей раз, это СКД — система компоновки данных, и моя разработка FlexReporting (ссылка на GitHub).
В чем суть этого механизма? Это некий realtime — ROLAP инструмент, который на лету трансформирует «плоские» данные в иерархические отчеты.

На самом деле, есть много любителей поспорить, что СКД это не «тру» OLAP, но я бы напомнил, что такая вещь как агрегаты, заранее рассчитывающие и хранящие многомерные данные по всем (или по заданным) сочетаниям измерений оборотных регистров накопления — а это весомый аргумент для использования этой аббревиатуры. Впрочем, от споров по терминологии очень хотелось бы уклониться.

Вот так это выглядит в 1С ERP 2.0:



Функции СКД (и моей разработки) — дать пользователю источник данных, а уж он пусть как хочет играется с настройками отчета:

1. Задает, в какой последовательности будут выводиться данные, какие группировки будут по вертикали, какие по горизонтали.
Например: склад, товар, менеджер и т.д.
2. Задает набор показателей, и агрегатные функции (сумма, среднее, количество, минимум, максимум и проч.), которые будут к ним применяться.
Например: сумма(стоимость), среднее(количество_товара), максимум(дата_отгрузки).

В общем-то, этого можно добиться и в Excel, используя функционал сводных таблиц, но в базовом варианте неплохо бы иметь это в собственной системе, если предполагается формировать из нее гибко настраиваемые отчеты. Что я и сделал, изобретя на фрилансе очередной велосипед — как обычно не нашел с ходу простого и функционального решения для этой задачи, а время поджимало.

Расскажу про алгоритмы.

Для начала, определимся с данными. Они могут быть любыми — приехать из JDBC, ORM, через JSON или SOAP, главное, чтобы их можно быть преобразовать в ArrayList. В демке в функции getData() простая заглушка из нескольких записей.

Пользователь устанавливает набор настроечных группировок, которые будут выводиться в отчете. Потом по ним строятся 2 дерева (горизонтальных и вертикальных группировок).
groupsFeildsList.add(«a»);
groupsFeildsList.add(«b,bb»);
groupsFeildsList.add(«url»);
columnFeildsList .add(«c»);

Проблема заключается в том, что пользователь может захотеть на одном группировочном уровне видеть сочетание полей (в примере b и bb). Это несколько усложнило алгоритм, раньше он был более читабелен.

Далее, мы устанавливаем перечень показателей, и агрегатную функцию, которая по ним работает (в демке один показатель):
computeFeildsList.add(newHashMap(«field,function»,«d»,«max»));

Рекурсивные функции generate(vert, t, groupsFeildsList, 0) по нашим данным формируют деревья, описываемые простейшим классом Node:
public class Node implements Cloneable {
public ArrayList /Node/ nodes;
public LinkedHashMap fields;
public HashMap additional;
public Node parent;

};

Далее происходит расчет показателей по уровням деревьев, разумеется тоже рекурсивный — функция public HashMap compute(Node x, Node y, ArrayList t,ArrayList computeFeildsList) и одновременный вывод результата в html.

Работает все это чудо под Spring и вставляется в jsp шаблон. С ним была пара скользких моментов.
Отчет должен был быть интерактивным. В интернете я нашел пример — jsfiddle.net/NZaw4/10.
Так как я решил использовать стили для сворачивания и разворачивания строк а-ля Excel, их надо было как-то грузить. С этим были проблемы, и в итоге я воткнул текст прямо в jsp шаблон ( style type=«text/css» ).

Еще момент: оказалось, что разные браузеры по-разному работают с чекбоксами, в результате вы можете заметить в коде такую вещь:
if(((ua.indexOf('MSIE') != -1)||(ua.indexOf('Firefox') != -1)||(ua.indexOf('Mozilla') != -1))&&(ua.indexOf('Chrome') == -1)) {
row.querySelector('td input').checked = !row.querySelector('td input').checked;
newch = !row.querySelector('td input').checked;
}

Собственно, вот что получилось в итоге у меня:


Что хотелось бы добавить. По первой статье я получил несколько дельных советов, и ссылок на ресурсы, которые стоит изучить. За это большое спасибо.

Но получил и чуток негатива, с акцентом на то, что, дескать 1С этим разработкам на коленке никогда не догнать (и не вытеснить из ниши регл. отчетности), и вообще все это лишь томленье духа и тщета. Естественно не догнать! Потому и открыт исходный код, что несколько другие цели стояли.

Тем не менее, сообщу один интересный факт. На той неделе довелось мне выступить на конференции INFOSTART EVENT 2015 CONNECTION в «Колизее», в городе Санкт-Петербург.

И что же я там увидел?

2 доклада по открытым проектам схожей направленности:
1script
Этот проект является альтернативной реализацией виртуальной машины, исполняющей скрипты на языке 1С: Предприятие.
При этом проект является полностью независимым от библиотек 1С и не требует наличия системы 1С: Предприятие на целевой машине.

Metadata.js
это альтернативный лёгкий javascript клиент 1С, позволяющий читать и редактировать данные, расположенные на сервере 1С с большим числом подключений (дилеры или интернет-витрина с сотнями анонимных либо авторизованных внешних пользователей).


Так что не один я имею специфические вкусы, нас таких много.



Всем удачной рабочей недели!

Комментарии (7)


  1. igor_suhorukov
    26.10.2015 10:54
    +5

    Для отчетов отлично зарекомендовали себя Open Source решения JasperReport/JasperServer. Выгрузка отчетов в PDF, XLS и т.п.
    Есть редактор отчетов iReport. Если требуется, чтобы пользователи могли редактировать шаблоны отчетов, то я прикручивал noVNC к iReport


  1. igor_suhorukov
    26.10.2015 10:56

    За праздники сделал я демонстрационную часть управления «толстым клиентом» для редактирования отчетов iReport, используя только браузер с javascript, canvas и websocket без использования java/flash плагинов браузера.


    1. Nikita001
      26.10.2015 23:38

      Сочувствую вашей неприятности, Игорь.
      Время такое, проходимцев-посредников полно, и они перекредитовываются, к сожалению, за счет нас с вами.
      Год назад попал в подобную ситуацию.
      Правда, было немного по-другому.
      При просрочке зп на 2 недели я занял довольно жесткую переговорную позицию, потребовал увеличить мне зп на 25% в качестве штрафа за просрочку.
      Хотя какие-то деньги платили, наращивания долга более 1,5-2 зп я ждать не стал, написал заявление.
      Гражданин директор не хотел отдавать оочень долго, но все-таки расчитался до копейки, включая +25%.
      Однако не понятно, то ли по доброй воле, то ли из-за появления свободных денег, а то ли из-за нарастающего давления с моей стороны.
      Во всяком случае, оно не помешало.

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


      1. igor_suhorukov
        27.10.2015 00:29

        Спасибо за совет! Это уже очень старая история, почти три года как. Зато стал лучше разбираться не только в профессиональных вопросах)
        Сейчас бы, наверное, иначе поступил бы в той ситуации.

        Но собственно ссылку и коммент опубликовал, чтобы поделиться опытом, как можно отчеты в браузере редактировать. Может кому пригодится noVnc + iReport!


  1. Neuronix
    26.10.2015 14:30

    Это не дауншифтинг, это скорее апгрейд :)


  1. akamuza
    26.10.2015 22:47

    Очень любопытная тема. У меня в перспективе похожая задача стоит. Как раз присматривался к JasperReport, о котором тут говорили.
    А вы производительность своего решения не замеряли? Как себя ведет на объемах по 100тыс строк и больше?


    1. Nikita001
      26.10.2015 23:26

      Вот чего не замерял, того не замерял.
      Думаю, может лечь браузер с js, а сервлет — чего ему будет, он же железный. =)