Сводная таблица C#. По следам jcrosstab

Сводная таблица C#. По следам jcrosstab

Кто пользовался встроенной сводной таблицей в 1С8, тот сталкивался с проблемой сортировки значений типа дата в области строк/колонок. Я думаю, что 1С в скором времени это исправит. А вот 1С 7.7 и намека не содержит на сводную таблицу. Приходится пользоваться добрым ODBC+Excel. Это вселяет надежду в наши сердца.

Экспериментальная разработка…
ВНМАНИЕ!!! Компоненту нужно зарегистрировать след. образом (cmd -> выполняем в папке со 2-м фреймворком): regasm /codebase C:путьгдеcrosstab.dll

Дальше для энтузиастов:
Роясь в дебрях интернета, я очень много почерпнул сведений, что такое ОЛАП. Да как его импользовать в Excel. Но увы по таким сведениям я не смог толком разобраться как мне самому написать ОЛАП-подобную кросстаблицу. Пришлось обратить свои взоры на горизонты OpenSource. К моей величайшей радости, мне удалось найти желанное, но… Как всегда OpenSource он и есть такой. Нашел я хорошее решение jcrosstab (http://www.jcrosstab.org). Смело скачал разработку и ринулся в дебри сего творения. Пришлось упасть в пропасть open-java. Теперь виден свет в конце туннеля… 🙂 Свершилось чудо и в конце 3-го дня я получил первый отчет на C#->OLE->1C8.

P.S. Планирую сюда прикрутить всяческие супер-математико-вероятностно-статистические анализы с выводом в 1С или html.
Может быть, получится еще и к 1С 7.7 культурно прицепить. Или WEB-сервис замутить на порте 777…
Ну, это уже как пойдет…

Как обычно желаю своему творению легкого пути в дебрях интернета.
Молю о пощаде со стороны разработчиков jcrosstab (http://www.jcrosstab.org). Да будет крепкая у них рука, да трезвый ум и получил я в награду не ихние тумаки, а надежду на завтра!!!
Да будет щедра рука и тугой кошелек спонсоров, которым придется по душе сие творение!!!

Пользуемся в 1С 8.0 [Скоро сделаю отчет и в 1С 7.7]:

  • Новый отчет -> Добавить форму -> Вставить ПолеHTML1
  • И в модуль формы вставить код ниже:
Процедура КнопкаВыполнитьНажатие(Кнопка)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|  НАЧАЛОПЕРИОДА(ХозрасчетныйОбороты.Период, МЕСЯЦ) КАК Период,
|  ХозрасчетныйОбороты.Организация КАК Организация,
|  ХозрасчетныйОбороты.Субконто1 КАК Субконто1,
|  ХозрасчетныйОбороты.Субконто2 КАК Субконто2,
|  ХозрасчетныйОбороты.Субконто3 КАК Субконто3,
|  ХозрасчетныйОбороты.КоличествоОборот КАК КоличествоОборот,
|  ХозрасчетныйОбороты.Регистратор.Контрагент КАК Контрагент,
|  ХозрасчетныйОбороты.Регистратор.ТипЦен КАК ТипЦен
|ИЗ
|  РегистрБухгалтерии.Хозрасчетный.Обороты(
|    ,
|    ,
|    Запись,
|    Счет В ИЕРАРХИИ
|      (ВЫБРАТЬ
|         Хозрасчетный.Ссылка КАК Ссылка
|       ИЗ
|         ПланСчетов.Хозрасчетный КАК Хозрасчетный
|       ГДЕ
|         Хозрасчетный.Код = ""281""),
|    ,
|    ,
|    ,
|    ) КАК ХозрасчетныйОбороты";
Выборка = Запрос.Выполнить().Выгрузить();

тбДанных = New COMОбъект("Crosstab.CrossDataTable");
Для ннн = 0 По Выборка.Колонки.Количество() - 1 Цикл
нКол = Выборка.Колонки[ннн];
тбДанных.NewColumn(нКол.Имя);
КонецЦикла;

Для Каждого нСтр из Выборка Цикл
Ряд = Новый Массив;
Для нКол = 0 По Выборка.Колонки.Количество() - 1 Цикл
Если (нСтр[нКол] = Null) или
(ТипЗнч(нСтр[нКол]) = Неопределено) или
(ТипЗнч(нСтр[нКол]) = Тип("Число")) или
(ТипЗнч(нСтр[нКол]) = Тип("Дата")) или
(ТипЗнч(нСтр[нКол]) = Тип("Строка")) или
(ТипЗнч(нСтр[нКол]) = Тип("Булево"))
Тогда
Ряд.Добавить(нСтр[нКол]);
Иначе
Ряд.Добавить(Строка(нСтр[нКол]));
КонецЕсли;
КонецЦикла;
тбДанных.NewRow(Ряд);
КонецЦикла;
Кросстаб = New COMОбъект("Crym69.Crosstab");
Кроссбокс = New COMОбъект("Crosstab.Crosstable");
Кроссбокс.addVerticalSliceByTableColumnName("Организация");
Кроссбокс.setVerticalAxisTypeByName("Организация","string");
Кроссбокс.addVerticalSliceByTableColumnName("Субконто1");
Кроссбокс.setVerticalAxisTypeByName("Субконто1","string");
Кроссбокс.addVerticalSliceByTableColumnName("ТипЦен");
Кроссбокс.setVerticalAxisTypeByName("ТипЦен","string");

Кроссбокс.addHorizontalSliceByTableColumnName("Период");
Кроссбокс.setHorizontalAxisTypeByName("Период","DateTime");
Кроссбокс.addHorizontalSliceByTableColumnName("Контрагент");
Кроссбокс.setHorizontalAxisTypeByName("Контрагент","string");

Кроссбокс.setDataRowsColumnByName("КоличествоОборот");
//Кроссбокс.setVerticalAxisByTableColumnName("Период");
//Кроссбокс.setHorizontalAxisByTableColumnName("Контрагент");
Рез = Кроссбокс.getCrosstabResultSet(тбДанных);
Вывод = New COMОбъект("Crosstab.DisplayConverter");
Стр = Вывод.getHtmlTable(Рез);
ХТМЛ = "<html><head><title>Test</title>"+
"<style type=""text/css"">"+
"body {
|font-family : verdana, arial, helvetica, sans-serif;
|font-size             : 8pt;
|margin                : 0px;
|background-repeat     : no-repeat;
|background-position   : bottom left;
|background-attachment : fixed;}
|table {
|cellspacing: 0px;
|cellpadding: 0px;
|background-color: silver;
|font-size             : 8pt;
|}
|td {
//|border-right:   black 1px solid;
//|border-top:     black 1px solid;
//|border-left:    black 1px solid;
//|border-bottom:  black 1px solid;
//|table-layout: auto;
//|border: 1px solid gray;
|background-color: white;
|}
|"+
"</style>"+
"</head>"+
"<body>"+
Стр
+"</body></html>";

ЭлементыФормы.ПолеHTMLДокумента1.УстановитьТекст(ХТМЛ);
КонецПроцедуры

С уважением Crym69

3 Comments

  1. Crym69

    ICQ автора: 225612000

    Reply
  2. CheBurator

    может тут что полезное будет

    http://infostart.ru/projects/1112/

    или тут…?

    http://infostart.ru/search/result/?cx=013045212460068984860%3Aw87zffhct48&cof=FORID%3A11&q=OLAP­&sa=%ED%E0%E9%F2%E8

    Reply
  3. JohnyDeath

    А не мог бы готовую обработку показать? Для какой-нибудь типовой конфигурации. А то из твоего описания программы я понял только что ты очень долго и мучительно копался в интернете, и что http://www.jcrosstab.org — это круто. 😉

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *