Кто пользовался встроенной сводной таблицей в 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