Групмейкер для таблицы значений.

20.11.12

Разработка - Инструментарий разработчика

Универсальная функция и обработка для свертки и группировки таблицы значений. Очень простой способ подвести итоги по призвольным группам в произвольном порядке любой таблицы значений для быстрого вывода на печать нужной пользователю последовательности и детализации группировок.

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

Наименование Файл Версия Размер
GroupmakerV1.ert
.ert 192,50Kb
59
.ert 192,50Kb 59 Скачать

 

 

Давно заметил, что ничего так не радует глаз пользователя и не заставляет его ценить твою профпригодность как наличие множества "галочек", "штучек", "пимпочек" и кнопочек на экранной форме. Ну, конечно, при условии, что все они работают и работают правильно. У меня обычно выходило так, что большинство написанных отчетов обрастали по меньшей мере еще третью от первоначального количества опций, а код угрожающе кренился в полную сумятицу от перегрузки условными операторами и дополнительными переменными.

 Примечательно, что в основном приходится по разному группировать либо фильтровать одни и те же данные. Традиционно это делается безжалостным вторжением через оператор Если в тело запроса и процедуру печати. Конечно сам код от этого не становился ни понятнее ни проще, а где-то, где получение данных запросом было невозможно все превращалось в дикие танцы вокруг таблицы значений.

 У каждого программиста есть свой способ выводить ТЗ на печать по нужным группировкам - кто то использует класс индексированных таблиц, а кто-то сам вводит в ТЗ индексы, а может есть и еще более или менее эффективные способы. Речь сейчас не о них.

 Столкнувшись недавно с проблемой наличия просто сумасшедшего количества необходимых пользователю вариантов группировки данных для вывода на печать да еще и слитых из двух разных конфигураций твердо решил засунуть построение итоговой таблицы значений в одну процедуру. Независимо от количества групп и нужного пользователю порядка их следования.

 Когда эту проблему удалось решить вслед за ней решилась и вторая проблема - создание печатных форм. Формат печаной формы также может быть универсальным - достаточно разработать макет вывода для каждого из уровней группировки, а в таблицу значений, получаемую для вывода на печать просто добавляем колонку с уровнем группировки и в зависимости от значения этого уровня применяем нужную секцию печатной таблицы. Весьма типичный пример того как правильное решение одной проблемы приводит к упрощению решения другой.

 В чистом остатке мы получили 1(одну) функцию получения предназначенной для печати таблицы значений для любых возможных вариантов  группировки  и очень простую печатную форму для опять же любого варианта отчета.

 Макет печаной формы приведен на картинке, а сама функция звучит так:

Функция ИтоговаяПоГруппировкамТЗ(исхТЗ,СтрГруппировок,СтрИтогов,ДобУровень = 0)

       Если (ПустоеЗначение(СтрГруппировок) = 1) Или (ПустоеЗначение(СтрИтогов) = 1) Тогда

             Предупреждение("Не отмечены поля группировок или поля итогов!!!");

             Возврат "";

       КонецЕсли;

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

       исхТЗ.Выгрузить(ТЗ,,,СтрГруппировок+","+СтрИтогов);

       ТЗ.Свернуть(СтрГруппировок,стрИтогов);

      

       ТЗИтогов = СоздатьОбъект("ТаблицаЗначений");

       ТЗ.Выгрузить(ТЗИтогов);

      

       спТаблиц = СоздатьОбъект("СписокЗначений");

       спСвертки = СоздатьОбъект("СписокЗначений");

       свернутьПо = "";

      

       сДляСписка = СтрЗаменить(стрГруппировок,",",РазделительСтрок);

       СчетчикЦикла = 0;

       Для ф = 1 По СтрКоличествоСтрок(сДляСписка) Цикл

             спСвертки.ДобавитьЗначение(СтрПолучитьСтроку(сДляСписка,ф));

       КонецЦикла;

      

       Для ф=1 По спСвертки.РазмерСписка()-1 Цикл

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

             ТЗ.Выгрузить(времТ);

             свернутьПо = свернутьПо + ?(ф=1,"",",") + спСвертки.ПолучитьЗначение(ф);

             времТ.Свернуть(свернутьПо,СтрИтогов);

             спТаблиц.ДобавитьЗначение(времТ,свернутьПо);

       КонецЦикла;

      

       Если ДобУровень = 1 Тогда

             ТЗ.НоваяКолонка("Уровень_Группировки","Число");

       КонецЕсли;

      

       Для ф=1 По спТаблиц.РазмерСписка() Цикл

             времТ = СпТаблиц.ПолучитьЗначение(ф);

             ВремТ.ВыбратьСтроки();

             Пока ВремТ.ПолучитьСтроку() = 1 Цикл

                    ТЗ.НоваяСтрока();

                    Для ы = 1 По ВремТ.КоличествоКолонок() Цикл

                           идКолонки = времТ.ПолучитьПараметрыКолонки(ы);

                           текЗнач = ВремТ.ПолучитьЗначение(времТ.НомерСтроки,идКолонки);

                           ТЗ.УстановитьЗначение(ТЗ.НомерСтроки,идКолонки,текЗнач);

                           Если ДобУровень = 1 Тогда

                                  ТЗ.УстановитьЗначение(ТЗ.НомерСтроки,"Уровень_Группировки",ф);

                           КонецЕсли;

                    КонецЦикла;

             КонецЦикла;

       КонецЦикла;

       ТЗ.Сортировать(стрГруппировок);

       Возврат ТЗ;

КонецФункции
 

ИсхТЗ - это обычная таблица значений, как на первом рисунке, а возвращаемая таблица значений показана на втором рисунке.

СтрГруппировок - это обычная строка с разделенными запятыми идентификаторами полей группировки.

А СтрИтогов - строковое выражение из идентификаторов суммируемых при группировке колонок.

 Когда родилась универсальная функция возникла идея сделать ее логичное продолжение - универсальную обработку. Универсальная группировка и универсальная печать любой переданной параметром таблицы значений должна, имхо, сильно пригодиться в том случае когда удается получить таблицу значений, а вот с группировками и печатью заморачиваться некогда или не хочется, да и заказчик сам толком не понимает в каком виде ему будет удобнее анализировать данные (а скорее всего в каких видах). Обработка имеет и демо режим запуска без переданной таблицы значений - в этом случае ТЗ будет сгенерирована автоматически и весь функционал обработки можно будет оценить без построения ненужной ТЗ передачи ее с вызовом из ненужной обработки.

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

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

 Последний из передаваемых аргументов функции сортировки - это флаг добавления в таблицу результата колонки с уровнем группировки. При ДобУровень  установленном на 1 таблица значений на выходе получает еще одну колонку  Уровень_Группировки, которая заполняется числами от 1 (самый главный уровень) по возрастающей. В соответствии с признаком группировки и используется секция печатной формы для вывода соответствующей строки сгруппированной таким образом таблицы значений. Так как количество секций для уровней в печатной форме в принципе не может быть бесконечным (в отличие от потенциального количества группируемых колонок), то в печатную форму введена секция для уровня 0, который используется для вывода всех уровней группировки корорых нет в подготовленной нами печатной форме. Я лично разместил пять секций для возможных уровней (дальше фантазия иссякла), а это значит что все уровне начиная с шестого буду выводиться на печать в дизайне секции "Уровень_0"

 Вот собственно и все. Быстрых и качественных всем разработок!:)

См. также

Консоль запросов

Инструментарий разработчика Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Консоль запросов к базе SQL, не требующая внешних компонент

10 стартмани

29.04.2015    21567    54    Gvozdod    8    

14

StartManager 1.4 - Развитие альтернативного стартера

Инструментарий разработчика Платформа 1С v7.7 Платформа 1С v8.3 Абонемент ($m)

Очередная редакция альтернативного стартера, являющегося продолжением StartManager 1.3. Спасибо всем, кто присылал свои замечания и пожелания, и тем, кто перечислял финансы на поддержку проекта. С учетом накопленного опыта, стартер был достаточно сильно переработан в плане архитектуры. В основном сделан упор на масштабируемость, для способности программы быстро адаптироваться к расширению предъявляемых требований (т.к. довольно часто просят добавить ту или иную хотелку). Было пересмотрено внешнее оформление, переработан существующий и добавлен новый функционал. В общем можно сказать, что стартер эволюционировал, по сравнению с предыдущей редакцией. Однако пока не всё реализовано, что планировалось, поэтому еще есть куда развиваться в плане функциональности.

1 стартмани

23.04.2014    165750    1864    Alexoniq    1596    

496

Tray Informer

Инструментарий разработчика Платформа 1С v7.7 Платформа 1С v8.3 Россия Абонемент ($m)

Согласитесь, что окно стандартное сообщений в 1С иногда приносит больше неудобств, чем пользы. И тем более разные "Предупредить"... Что с этим окном только не делают! Его отцепают от формы, делают маленьким, умудряются спрятать за границы экрана. А потом звонят программистам с претензией, что документ почему-то не проводится, отя ничего и не пишет. У вас такого не было? А вот у нас было и не раз )))

1 стартмани

04.09.2013    32890    61    O-Planet    78    

49

Изменение структуры баз 1С 7.7 без долгой реструктуризации. Часть 1. Справочники

Инструментарий разработчика Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

На днях встретил вопрос на форуме про возможность внесения изменений в конфигурацию без долгого сохранения в рабочей базе большого объема. Вот решил поделиться опытом, как это делал я. База у нас была объемом порядка 120 Гб. К базе обращался сайт в режиме 24/7, поэтому важно было быстро сохранять изменения и желательно без последующего монопольного запуска для восстановления индексов и процедур и без отключения пользователей от базы. Это первая часть статьи и посвящена она справочникам. С одной стороны - это самый простой объект, с другой стороны, именно про справочник спрашивалось на форуме. Если статья будет востребована, то я напишу аналогичные про документы, регистры и может еще что.

1 стартмани

13.08.2013    21203    Reptile    5    

35

v7.7 1CDialogControls: Инструмент в помощь разработчику на 7.7.

Инструментарий разработчика Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Давным давно, когда я еще плотно писал на 7.7 работа с формами была мучительной и неудобной. Приходилось каждый элемент выкладывать, выравнивать на форме ручками, прописывать код в модуле. Иногда при разработке очередной формы приходила в голову мысль: "а где-то я уже похожее делал..." и начинался мучительный поиск подходящего кода в своих запасах........

1 стартмани

21.02.2013    18037    35    MarSeN    14    

16

[Разработчику] Любая таблица значений в OLAP

Инструментарий разработчика Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Анализируем различные данные в 1С, используя OLAP-технологии со всеми прелестями. Т.е. наглядное отображение данных, быстрые расчеты, горизонтальные и вертикальные группировки любой вложенности, удобная фильтрация, Drag'n'Drop и ещё много приятных вещей от MS. Обработка на входе принимает практически любую таблицу значений (ТЗ в которой колонкам указаны типы значений, строка, число и т.п.), на выходе имеем на форме 1С сводную таблицу и график по этой ТЗ, с которой работаем, как и в Excel со сводной таблицей и диаграммой. Взял за основу разработку «OLAP Анализ счёта» ( http://infostart.ru/public/14964/ ) от JohnyDeath и переделал под любую ТЗ. Опционально используется «Прогресс бар для 1С 77» (http://infostart.ru/public/14061/ ) от Gmix.

1 стартмани

21.12.2012    36110    51    venger    7    

23

Библиотека кода 1С 7.7 (накопленная за 8 лет)

Инструментарий разработчика Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Весь код на 1С 7.7, собранный для повторного использования за 8 лет работы.

10 стартмани

25.11.2012    34967    248    adhocprog    51    

70
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. brr 182 20.11.12 12:28 Сейчас в теме
группировки в одной колонке, не?
2. dusha0020 1104 20.11.12 12:31 Сейчас в теме
Группировки во всех нужных колонках. Хоть в одной хоть в 101:)
3. kompas-dm 780 20.11.12 18:20 Сейчас в теме
(0) Это и многое другое - "ИндексированнаяТаблица" , 1CPP.
Прикрепленные файлы:
IndexedTable.html
4. dusha0020 1104 20.11.12 18:32 Сейчас в теме
(3) kompas-dm, Согласен на 100%. Однако, это работает везде где просто установлена клюшка. Я очень люблю писать штуки, которые работают всегда и везде. А еще это просто выпендреж и дань тщеславию
6. rimma_n 160 21.11.12 09:38 Сейчас в теме
(4) Полностью согласна. обработки должны работать всегда и везде, где есть только 1С. Ну и конечно, выпендриться тож приятно!
5. TrinitronOTV 14 20.11.12 18:47 Сейчас в теме
очень здорово это выглядит, спасибо
7. chemezov 47 22.11.12 09:41 Сейчас в теме
8. Yurus 27 26.11.12 10:42 Сейчас в теме
Очень полезная обработка. Спасибо.
9. berezdetsky 620 27.11.12 14:25 Сейчас в теме
Похоже, оно навернётся на сворачивании элементов с одинаковым представлением. :)
10. dusha0020 1104 27.11.12 14:54 Сейчас в теме
(9) berezdetsky, Метод Свернуть() ни разу не наворачивался при свертке элементов с одинаковым представлением пока я работаю в 1С. Ну а ТЗ с совпадающими идентификаторами колонок попробуйте создать:)
11. berezdetsky 620 29.11.12 10:25 Сейчас в теме
(10) 1. Берём двухуровневый справочник и такой код:
тз = СоздатьОбъект("ТаблицаЗначений");
тз.НоваяКолонка("Колонка1");
тз.НоваяКолонка("Колонка2");
тз.НоваяКолонка("Счетчик");
спр = СоздатьОбъект("Справочник.Номенклатура");
спр.ВыбратьЭлементы();
Пока спр.ПолучитьЭлемент() = 1 Цикл
	Если спр.Уровень() = 2 Тогда
		тз.НоваяСтрока();
		тз.Колонка1 = спр.Родитель;
		тз.Колонка2 = спр.ТекущийЭлемент();
		тз.Счетчик  = 1;
	КонецЕсли;
КонецЦикла;
тз = ИтоговаяПоГруппировкамТЗ(тз, "Колонка1,Колонка2", "Счетчик");
тз.ВыбратьСтроку();
Показать

Видим красивую картинку: (см. Снимок1).

2. Теперь делаем представление группы 2 таким же, как у группы 1 и видим: (см. Снимок2).

3. Добавляем сортировку по внутреннему значению. ;-)
Прикрепленные файлы:
12. dusha0020 1104 29.11.12 11:24 Сейчас в теме
(11) berezdetsky, Любопытно у Вас получилось. Но все еще не понятно.
Теперь делаем представление группы 2 таким же, как у группы 1
Это как делалось? Или код приведите, пожалуйста, а то если и дописывать, то нужно понимать почему такое происходит.
13. berezdetsky 620 29.11.12 13:43 Сейчас в теме
(12) Нет никакого кода. :-) Просто скопировал наименование в форме справочника. Получилось две группы с одинаковым наименованием.
14. dusha0020 1104 29.11.12 14:06 Сейчас в теме
(13) berezdetsky, Жестокий эксперимент:) Не буду ничего переписывать - занят новыми проблемами.
Оставьте свое сообщение