Одна из самых лучших систем отчетов Новейший Отчет 7.7 не имеет возможности выгрузки в Йоксель, в результате этого, после сохранения отчета в Excel группировки теряются. Приведенная процедура исправляет это досадное упущение.
Работает и с Демо-версией и с Коммерческой версией Новейшего отчета (если у Вас полная версия Новейшего отчета процедуру можно добавить непосредственно в NR_Navigator.ert).
Для работы требует Внешниюю компоненту: Йоксель. (домашняя страница автора: http://yoksel.net.ru).
Порядок внедрения: процедуру добавляем в Глобальный модуль 1С, во внешнюю обработку Новейшего отчета NR_Navigator.ert добавляем кнопку Йоксель с формулой глВыгрузитьНовейшийОтчетВЙоксель(Таб)
Обновление от 19/12/08: не определялись группировки в кросс-таблицах.
Процедура глВыгрузитьНовейшийОтчетВЙоксель(Таб) Экспорт
Перем Документ;
Перем ТЗ;
Перем Область;
Попытка
Документ = СоздатьОбъект ("ТабличныйДокумент");
Исключение
Если ЗагрузитьВнешнююКомпоненту("SpreadSheet.dll")=0 Тогда
Сообщить("Не удалось загрузить ВК Йоксель! Выгрузка невозможна.");
Возврат;
Иначе
Документ = СоздатьОбъект ("ТабличныйДокумент");
КонецЕсли;
КонецПопытки;
Документ.ЗагрузитьИзТаблицы(Таб);
ТЗ=СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Уровень");
ТЗ.НоваяКолонка("Начало");
ТЗ.НоваяКолонка("Конец");
НачалоТаблицы=1;
ВысотаТаблицы=Документ.ВысотаТаблицы();
// Определяем начало группировок
Для СтрИнд=НачалоТаблицы По ВысотаТаблицы Цикл
Область=Документ.Область(СтрИнд,1);
Если Область.Текст="1" Тогда
НачалоТаблицы=СтрИнд;
Прервать;
КонецЕсли;
КонецЦикла;
Если НачалоТаблицы>1 Тогда
// Загоняем все начала группировок в ТЗ
Для СтрИнд=НачалоТаблицы По ВысотаТаблицы Цикл
Для КолИнд=2 По 8 Цикл
Область=Документ.Область(СтрИнд,КолИнд);
Если (Область.Текст="-") Тогда
ТЗ.НоваяСтрока();
ТЗ.Уровень = КолИнд-1;
ТЗ.Начало = СтрИнд;
ТЗ.Конец = 0;
Прервать;
ИначеЕсли ПустоеЗначение(Документ.Область(СтрИнд,КолИнд).Текст)=0 Тогда
Если ПустоеЗначение(Документ.Область(СтрИнд-1,КолИнд).Текст)=1 Тогда
Если ПустоеЗначение(Документ.Область(СтрИнд-1,КолИнд+1).Текст)=0 Тогда
ТЗ.Конец = СтрИнд-1;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если ПустоеЗначение(Документ.Область(СтрИнд,1).Текст)=1 Тогда
ТЗ.НоваяСтрока();
ТЗ.Уровень = 1;
ТЗ.Начало = СтрИнд;
ТЗ.Конец = 0;
Прервать;
КонецЕсли;
КонецЦикла;
// Определяем окончания группировок
КолВоСтрок=ТЗ.КоличествоСтрок();
Для инд1=1 По КолВоСтрок-1 Цикл
Уровень=ТЗ.ПолучитьЗначение(инд1,"Уровень");
Если ТЗ.ПолучитьЗначение(инд1,"Конец")=0 Тогда
Для инд2=(инд1+1) По КолВоСтрок Цикл
Если Уровень>=ТЗ.ПолучитьЗначение(инд2,"Уровень") Тогда
ТЗ.УстановитьЗначение(инд1,"Конец",ТЗ.ПолучитьЗначение(инд2,"Начало")-1);
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
ТЗ.УдалитьСтроку(КолВоСтрок);
// Устанавливаем группировки строк в Йокселе
ТЗ.ВыбратьСтроки ();
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
Документ.ДобавитьГруппуСтрок(ТЗ.Начало+1,ТЗ.Конец);
КонецЦикла;
// Свертка всех группировок Йоксель
Для инд = -Документ.КоличествоУровнейГруппировкиСтрок() По -1 Цикл
Документ.ПоказатьУровеньГруппировокСтрок (-инд);
КонецЦикла;
КонецЕсли;
// Без СокрЛП Йоксель не распознает цифры
Для инд1=1 По Документ.ВысотаТаблицы() Цикл
Для инд2=1 По Документ.ШиринаТаблицы() Цикл
Область=Документ.Область(инд1,инд2);
Область.Текст=СокрЛП(Область.Текст);
КонецЦикла;
КонецЦикла;
Документ.Область().Расшифровка(,2);
Фрейм=Документ.Показать(Документ.Область(1,2).Текст);
Фрейм.ОтображатьСтруктуру(1);
Фрейм.ОтображатьКнопкиУровней(1);
КонецПроцедуры
Круто!
Вот это новость, неожиданно!
Прикольно!
(1,2) Даёшь полные версии Новейшего отчета Ужасту и Djelf!
офигеть!
Djelf полная версия есть?
Есть, спасибо. Я про «Таб» иначе наверное не догадался бы 😉
Полезная вещица.
Только просьба быть более толерантным к пользователям, которые ищут выгрузку в Excel, а не «Йоксель». Ну это так, вредничаю))
Да нет, все логично, Йоксель действительно пока еще не настолько популярен, чтоб его каждый знал. Добавил в заголовок «(Excel)» 😉
Спасибо…
Ждем внедрения в основную поставку.
спасибо большое
спасибо большое
Очень выручил