Вывод и перенумерация отчета с заранее неизвестным количеством группировок.




1C v.7.7 Пример вывода отчета с заранее неизвестным количеством группировок, с возможностью изменять уровень вложенности группировок из списка значений на форме, с нумерацией конечного отчета, с выводом структуры вложенности группировок (с помощью внешней компоненты Йоксель — http://yoksel.net.ru/Hotfixes). В приложенном файле показан пример вывода отчета из сформированной таблицы значений. Код я старался закомментировать как можно подробней. Хоть семерка и вымирающая платформа, думаю еще есть люди, которые только начинают ей заниматься, и им это может пригодиться.

Написание отчета происходит в два этапа. Сбор данных, и вывод их на экран. И реализация именно вывода группировок отчета из таблицы значений на экран в платформе 7.7 оставляет желать лучшего. Когда я только начинал заниматься программированием в среде 1С 7.7, такая задача чуть ли не ставила в тупик. Потому что своей головы у меня хватало на вывод трех группировок (со вспомогательнгыми ТЗ), и очередность вывода была жестко привязана к коду. Потом однажды я нашел обработку [NotaBene] Универсальный отчет по таблице значений.  Она здорово выручала иногда, но отсутствие нумерации строк отчета, которую очень часто просили, и привязка к оформлению (которое по ряду причин мне на душу не легло) привело к идее написать что-то свое. Кроме всего прочего сама идея использовать внешнюю обработку для таких целей мне тоже не нравилась.

Таким образом, я поставил перед собой задачу придумать алгоритм для вывода отчета, который сможет реализовать следующий функционал:

  • — Возможность пользователя управлять вложенностями и видимостью группировок отчета из формы.
  • — Перенумерация строк конечного отчета
  • — Возможность легко в обработке изменить оформление отчета

Буду рад, если кому пригодиться 🙂

Добавлено 13.06.2012:

+ Отображение структуры группировок с помощью внешней компоненты Йоксель (качать отсюда: http://yoksel.net.ru/Hotfixes)

+Немного изменил алгоритм перенумерации.

Не очень красиво смотрятся цифры 1.1.1.1.2, я нумерую всегда с количеством уровней нумерации равным 3 (т.е. 1, 1.1, 1.1.1), а если в отчете много группировок — просто не нумерую первую, и пропускаю нумерацию для нижних уровней. Основываюсь только на своем опыте, меня еще ни разу не просили, чтобы в отчете было больше пяти группировок, а с таким условием такая нумерация очень приятно выглядит.

Добавлено 06.06.2013:

+ Вывод секций отчета рекурсивно, с использованием индексированной таблицы (ВК 1С++)

Т.к. уже давно и активно пользуюсь объектом «ИндексированнаяТаблица», решил маленько доработать эту публикацию. Просто при выводе тз с 10000 строк, с использованием ИТЗ уходит всего 3 сек., а с штатным методом этой обработки — 85 сек.

p.s. За веселые названия фирм спасибо сайту www.brendogenerator.ru

11 Comments

  1. smitti911

    А можно прямую ссылку на Вашу обработку .

    P.S. на счету 0.10$m

    Reply
  2. unichkin

    Да, скиньте мыло в личку я отправлю.

    Reply
  3. TrinitronOTV

    что-то я не понял разницу в двух сформированных отчетах (цвета естественно мною не учитываются), если можно разъясните пожалуйста мне

    Reply
  4. unichkin

    Если вы посмотрите на скриншоты, и комментарии к ним, увидите — в главном окне: Оформлять конечный отчет — градиентом, или подготовленной таблицей. Разница в том, что на скриншоте, где все такое серенькое для вывода группировок используется одна и та же секция таблицы, просто программно оформляется, в цикле делаю переход от темно-серого к белому. Это, например если много суммовых колонок там для 5 группировок, и неохота каждую разукрашивать, или просто надо быстро сделать. А на втором скриншоте показана заранеее подготовленная таблица (т.е. все секции заранее разукрашены, и оформлены).

    Reply
  5. unichkin

    + у меня правда такого не было никогда (в смысле отчета, где одновременно надо было бы сформировать более пяти группировок), но если вдруг начальство попросило добавить пару группировок… СРОЧНО) То вывод одной секцией тоже довольно удобен. Останется доб

    Reply
  6. TrinitronOTV

    (5) большое спасибо за понятные мне разъяснения (разжовано досконально), что-то сам не смог осилить разницу в двух скриншотах

    Reply
  7. GenTay

    Очень интересная обработка. Скачаю, облизательно изучю.

    Reply
  8. nuclon

    А есть ли пример с группами номенклатуры, например, с итогами по каждой из вложенных групп?

    Reply
  9. unichkin

    (8) Вы что-то путаете. Это не пример формирования данных, а пример ВЫВОДА данных на экран. Если вам нужно вывести группировки по групам номенклатуры, создайте тз, типа:

    тз = СоздатьОбъект(«ТаблицаЗначений»);
    тз.НоваяКолонка(«Номенклатура»);
    тз.НоваяКолонка(«Родитель»);
    тз.НоваяКолонка(«Сумма»);

    В ПриОткрытии() пропишите

    спГруппировок.ДобавитьЗначение(«Номенклатура»);

    спГруппировок.ДобавитьЗначение(«Родитель»);

    И дальше по аналогии с этим отчетом выводите данные на экран.

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

    Reply
  10. nkure

    Спасибо автору, действительно хорошая обработка. Для себя забрал только кусок с выводом через Йоксель. Как вариант доработки, чем сам воспользовался, можно в процедуру «ВывестиСтруктуруГруппировок» добавить еще один параметр «КоличествоСтрок» и заменить им все «ВремДокумент.ВысотаТаблицы()». Добавил чтобы можно было после сгруппированных строк выводить всякие итоги и подвал.

    Reply
  11. CheBurator

    Сюда бы еще вкрутить, как в NotaBene — вывод какой-то из группировок (задавать такую группировку) в колонках. Тогда получались бы шахматки. И чтобы колонки с числовыми значениями (если таких колонок больше одной) тоже можно было сворачивать. Было бы очень хорошо…

    Reply

Leave a Comment

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