gifts2017

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

Опубликовал Vladimir (Crym69) в раздел Программирование - Внешние компоненты

Сводная таблица 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

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Компонента + отчет для 1С 8.0
.1188825781 12,93Kb
25.09.09
6
.1188825781 12,93Kb 6 Бесплатно

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Vladimir (Crym69) 03.09.07 04:34
3. Евгений Мартыненков (JohnyDeath) 03.09.07 10:45
А не мог бы готовую обработку показать? Для какой-нибудь типовой конфигурации. А то из твоего описания программы я понял только что ты очень долго и мучительно копался в интернете, и что www.jcrosstab.org - это круто. ;)
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа