gifts2017

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

Опубликовал Роман Уничкин (unichkin) в раздел Программирование - Практика программирования

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

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

Наименование Файл Версия Размер
Пример.ert 18
.ert 215,50Kb
06.06.13
18
.ert 215,50Kb Скачать

См. также

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

Комментарии

1. Александр Гнитка (smitti911) 21.03.12 13:26
А можно прямую ссылку на Вашу обработку .
P.S. на счету 0.10$m
2. zhuravlik (unichkin) 21.03.12 13:31
Да, скиньте мыло в личку я отправлю.
3. Александр Лыткин (TrinitronOTV) 21.03.12 15:34
что-то я не понял разницу в двух сформированных отчетах (цвета естественно мною не учитываются), если можно разъясните пожалуйста мне
4. zhuravlik (unichkin) 21.03.12 16:23
Если вы посмотрите на скриншоты, и комментарии к ним, увидите - в главном окне: Оформлять конечный отчет - градиентом, или подготовленной таблицей. Разница в том, что на скриншоте, где все такое серенькое для вывода группировок используется одна и та же секция таблицы, просто программно оформляется, в цикле делаю переход от темно-серого к белому. Это, например если много суммовых колонок там для 5 группировок, и неохота каждую разукрашивать, или просто надо быстро сделать. А на втором скриншоте показана заранеее подготовленная таблица (т.е. все секции заранее разукрашены, и оформлены).
5. zhuravlik (unichkin) 21.03.12 16:48
+ у меня правда такого не было никогда (в смысле отчета, где одновременно надо было бы сформировать более пяти группировок), но если вдруг начальство попросило добавить пару группировок... СРОЧНО) То вывод одной секцией тоже довольно удобен. Останется добавить данные в ТЗ, и в список на форме. Не надо морочится с добавлением секций, и думать каким цветом, и каким шрифтом здесь и здесь ее выделить. Нужно просто с самого начала под себя подпилить немножко оформление, и все)
Но с градиентом есть небольшие проблемы. Видимо 1С7 не все цвета поддерживает, а только те 56, которые можно выбрать из диалога настройки формы в конфигураторе. На скриншоте заметно, что у второй и третьей группировок цвет одинаковый, хотя у первого обл.ЦветФона(75, 75, 75), а у второй - обл.ЦветФона(121, 121, 121) Как это обойти, я не знаю.
Делал такой пример, просто для себя -

Таб = СоздатьОбъект("Таблица");	

Для сч=1 По  255 Цикл
	
	Таб.ВывестиСекцию("Строка");
	Обл = Таб.Область(Таб.ВысотаТаблицы(), 2);
	Обл.ЦветФона(сч*65536 + сч*256 + сч);
	
КонецЦикла;

Таб.Показать();
...Показать Скрыть


И увидел вот такую картину: http://www.imagepost.ru/?v=vyvod_gradienta_v_1s.png
Было бы интересно узнать, как это обороть.
6. Александр Лыткин (TrinitronOTV) 22.03.12 06:50
(5) zhuravlik, большое спасибо за понятные мне разъяснения (разжовано досконально), что-то сам не смог осилить разницу в двух скриншотах
7. Gen Tay (GenTay) 02.07.12 20:07
Очень интересная обработка. Скачаю, облизательно изучю.
8. Nuclon (nuclon) 06.07.12 10:51
А есть ли пример с группами номенклатуры, например, с итогами по каждой из вложенных групп?
9. zhuravlik (unichkin) 06.07.12 11:56
(8) Вы что-то путаете. Это не пример формирования данных, а пример ВЫВОДА данных на экран. Если вам нужно вывести группировки по групам номенклатуры, создайте тз, типа:

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


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

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

И дальше по аналогии с этим отчетом выводите данные на экран.
Хотя выводить отчеты с итогами по родителю порой проще другим алгоритмом, например прямо из выборки запроса.
10. nic kure (nkure) 07.08.12 13:08
Спасибо автору, действительно хорошая обработка. Для себя забрал только кусок с выводом через Йоксель. Как вариант доработки, чем сам воспользовался, можно в процедуру "ВывестиСтруктуруГруппировок" добавить еще один параметр "КоличествоСтрок" и заменить им все "ВремДокумент.ВысотаТаблицы()". Добавил чтобы можно было после сгруппированных строк выводить всякие итоги и подвал.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа