[NotaBene] Универсальный отчет по таблице значений




1C v.7.7 Готовое решение. Не требует настройки. Не требует допрограммирования. Данная обработка решает часто встречающуюся задачу вывода в «красивом» виде таблицы значений (полученной, например, из запроса). Поддерживается произвольное группирование данных, отключение/включение группировок, в т.ч и создание «шахматок» (типа «продажи понедельно»). Обработка может использоваться как и в отладочных целях (для нормального просмотра ТЗ), так и в составе вполне рабочих отчетов. По крайней мере, я неоднократно клиентам данную обработку ставил вместо того, чтобы каждый раз писать замороченные выводы данных. И клиенты довольны, и мне — проще…

Подробный пример использования данной обработки в составе отчета по оплатам приведен здесь: //infostart.ru/projects/522/?&desc=1&ref=174
Обработка, которая приведена здесь, по сравнению с упомянутой выше ссылкой, расширена: стало лень каждый раз обозначать требуемую раскладку колонок для вывода РАЗНЫХ отчетов — вот и прикрутил сохранение/восстановление раскладки колонок для вывода отчетов. Причем, обработка сама распознает, какой набор/раскладка колонок подходит для полученного на вывода отчета.

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

Мое мнение — удобнейший инструментарий! В копилку программистаааааа!!

Оригинал обработки расположен здесь: http://1c.proclub.ru/modules/mydownloads/personal.php?cid=5&lid=3454 Разрешение от автора на выкладывание доработанной обработки — получено.

Пример использования данной обработки.

//здесь работает внешний отчет, формирующий какие-либо данные
//…
//если ошибка в запросе, то выход из процедуры

Если Запрос.Выполнить(ТекстЗапроса) = 0
Тогда Возврат;
КонецЕсли;

ТЗ = СоздатьОбъект("ТаблицаЗначений");
Запрос.Выгрузить(ТЗ,1,0);

Если ФлагГруппа = 0 Тогда ТЗ.УдалитьКолонку("ГруппаТовара"); КонецЕсли;
ТЗ.УдалитьКолонку("Количество"); //удаляем ненужные колонки
ТЗ.УдалитьКолонку("ПродСт");
ТЗ.УдалитьКолонку("ТекДок");

 

//здесь имеем ПЛОСКУЮ ТЗ с нужными для вывода данными
//ТЗ должна содержать нужные числовые данные и, по возможности, не содержать лишних колонок
//…

//сформируем параметры для передачи в обработку
/
//Параметр "ТаблицаЗначений"
//собственно, сама таблица значений для вывода, подготовленная ранее, плоская.

//Параметр "СписокПоказателей"
//положим в список значений "счетные" колонки ТЗ (числовые)
//(суммы, количества, себестоимости и прочее всякое что можно складывать…)
//все остальные неуказанные колонки будут считаться "измерениями" (группировками)
//формат элемента списка значений:
//значение элемента = идентификатор колонки ТЗ,
//представление элемента = заголовок колонки в отчете
//
 СЗПоказателей = СоздатьОбъект("СписокЗначений");
 СЗПоказателей.ДобавитьЗначение("СуммаПродСт","Сумма");         //"СуммаПродСТ" — идентификатор колонки ТЗ, "Сумма" — будет выводиться заголовком колонки
 СЗПоказателей.ДобавитьЗначение("СуммаКоличество","Кол-во");    //"СуммаКоличество" — идентификатор колонки ТЗ, "Кол-во" — будет выводиться заголовком колонки
 
//Параметр "СписокВыводаГруппировок", может отсутствовать
//положим в список значений формат вывода группировок (этот параметр может быть опущен/не задан)
//0 -группировку по измерению не выводить (свертывать, с последующей расшифровкой)
//1 -группировать измерение по строкам (группировок может быть несколько)
//2 -группировать измерение по столбцам (группировку по столбцам можно не более одной!)
//
//формат элемента списка значений:
// значение элемента = число (0,1,2)
// представление элемента = идентификатор колонки ТЗ
//
    СЗгруппировок = СоздатьОбъект("СписокЗначений");
        СЗгруппировок.ДобавитьЗначение(2,"ТипЯчейки"); //неуказаннные группировки имеют значение 1 — по строкам
        СЗгруппировок.ДобавитьЗначение(0,"АдресЯчейки");
 
//Параметр "Заголовок", может отсутствовать        
//текст, выводится как заголовок отчета
        
//…
//вызовем универсальный отчет по ТЗ
//в списке значений передадим параметры
// — саму таблицу значений для вывода, параметр "ТаблицаЗначений"
// — список "счетных" колонок, параметр "СписокПоказателей"
// — список группировок, параметр "СписокВыводаГруппировок" (может отсутствовать)
// — заголовок для отчета, параметр "Заголовок" (может отсутствовать)

КонтекстВызова = СоздатьОбъект("СписокЗначений");
КонтекстВызова.ДобавитьЗначение(ТЗ,"ТаблицаЗначений");
КонтекстВызова.ДобавитьЗначение(МойЗаголовокОтчета,"Заголовок");
КонтекстВызова.ДобавитьЗначение(СЗПоказателей,"СписокПоказателей");
КонтекстВызова.ДобавитьЗначение(СЗПоказателей,"СписокВыводаГруппировок"); //если не указывать параметр — все группировки = по строкам
//…
ПутьОбработки = ""; ИмяОбработки = "";
РасположениеФайла(ПутьОбработки, ИмяОбработки);
ОткрытьФорму("Отчет", КонтекстВызова, ПутьОбработки+"ОтчетПоТЗ.ert");

КонецПроцедуры //Сформировать()

Обновление 30.11.19
Модифицировано: выполняется автонастройка ширины колонок таблицы расшифровки числовых показателей

Обновление 29.11.19
Добавлена возможность манипулировать настройками вывода группировок программно при вызове отчета.

ВНИМАНИЕ: СПЕЦИАЛЬНО ДЛЯ ТЕХ, КТО НЕ УМЕЕТ ЧИТАТЬ, ПИШУ БОЛЬШИМИ ЖИРНЫМИ КРАСНЫМИ БУКВАМИ: ОБРАБОТКУ СЛЕДУЕТ ВЫЗЫВАТЬ КАК ОПИСАНО ВЫШЕ, ИСПОЛЬЗУЯ ПРОГРАММНЫЙ ОПЕРАТОР  ОткрытьФорму("Отчет",….) — НИКАКИМИ ДРУГИМИ СПОСОБаМИ ДАННУЮ ОБРАБОТКУ ОТКРЫВАТЬ НЕ СЛЕДУЕТ!

60 Comments

  1. CheBurator

    Все — бяки!

    100 раз качнули — хоть один бы коммент оставил…

    Reply
  2. DobroProd

    в комплексной при открытии

    Для сч = 1 По ТЗПолнаяОригинал.КоличествоКолонок() Цикл

    {C:DOCUMENTS AND SETTINGSALEX.DOBRO_PRODРАБОЧИЙ СТОЛBVK_OTCHETPOTZ.ERT(325)}: Значение не представляет агрегатный объект (КоличествоКолонок)

    Reply
  3. CheBurator

    ок. проверю вечером.

    Reply
  4. CheBurator

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

    на досуге придется вставить проверку на прием параметров…

    Reply
  5. soba

    Очень понравилась 🙂 куча отчетов было таких, что вывод только из таблиц, а тут группировки по ним готовенькие. спасибо 🙂

    Reply
  6. CheBurator

    Всегда пожалуйста.

    Приходите еще.

    Заказывайте и спрашивайте про прочие нужные вам «полезности»

    Reply
  7. Just

    круто

    Reply
  8. Fox86

    Спасибо что выложил эту прогу. но боюсь это не совсем то, что мне надо

    Reply
  9. Шёпот теней

    Господин, Che Burashka… Вы и так впереди планеты всей… и вызываете уважение… УРА!

    Reply
  10. Fixator

    Хоть и не модератор FIDO, но плюс Вам поставлю…

    Reply
  11. CheBurator

    Спасибо. Начинаю офигевать от собственной офигенности… Качают много всяких моих разработок, но вопросов задают мало… или написал так что все понятно/большинстов устраивает или посмотрели и бросили.. даже ругать не стали… ВАШИ МНЕНИЯ ПО ЭТОМУ ПОВОДУ?

    Reply
  12. astonvilla

    Я скачал, нет времени посмотреть. Гляну, обязательно отпишусь и оценю :))

    Reply
  13. CheBurator

    вот здесь есть достойное продолжение для классоманов http://infostart.ru/projects/1658/

    Reply
  14. oskar

    Спасибо.Супер

    Reply
  15. CheBurator

    (14) А то! То что лежит у мну в профайле — испытано и одобрено лично мною и используется в моей повседневной работе, так что крупных косяков — нет…

    Reply
  16. бубух

    гранаты ваши не моёй системы. моя ругается и ничго делать не хочет. жаль.

    Reply
  17. CheBurator

    (16) не надо ля-ля.. все работает!

    как конкретно ругается?

    покажите код, который готовит и передает параметры на вход этой обработки…?

    Reply
  18. бубух

    (17) выдает:

    ТЗраб.Сортировать(«ИмяГруппировки»);

    {D:BASESБАЗЫ ГЛАВБУХАКОПИЯ БД БУХ ТЕКУЩАЯEXTFORMSУНИВЕРСАЛЬНЫЙ ОТЧЕТ ПО ТАБЛИЦЕ ЗНАЧЕНИЙ.ERT(994)}: Неверный идентификатор колонки!

    Если ТЗНастроекКолонокТекущая.КоличествоСтрок() = 0 Тогда

    {D:BASESБАЗЫ ГЛАВБУХАКОПИЯ БД БУХ ТЕКУЩАЯEXTFORMSУНИВЕРСАЛЬНЫЙ ОТЧЕТ ПО ТАБЛИЦЕ ЗНАЧЕНИЙ.ERT(1035)}: Значение не представляет агрегатный объект (КоличествоСтрок)

    ТЗПолная.НоваяКолонка(ИмяВертГруппировки,ТипВертГруппировки);

    {D:BASESБАЗЫ ГЛАВБУХАКОПИЯ БД БУХ ТЕКУЩАЯEXTFORMSУНИВЕРСАЛЬНЫЙ ОТЧЕТ ПО ТАБЛИЦЕ ЗНАЧЕНИЙ.ERT(753)}: Значение не представляет агрегатный объект (НоваяКолонка)

    По поводу кода ничё сказать не могу — я просто булгахтер любопытный.

    Reply
  19. CheBurator

    отвечено в личку:

    — обработка самостоятельно ручками не вызывается! вызывается программным способом с передачей параметров!

    Reply
  20. Avrora

    такое выдает

    ТЗИдВерт.УстановитьЗначение(ТЗИдВерт.НомерСтроки, ИмяПоказателя, ТЗВремКопия.ПолучитьЗначение(ТЗВремКопия.НомерСтроки, ИмяПоказателя));

    {D:…BVK_OTCHETPOTZ.ERT(701)}: Неверный идентификатор колонки!

    Reply
  21. CheBurator

    (20)

    1.Отчет вызывается ТОЛЬКО ПРОГРАММНО!

    2. Проверьте чтобы при передаче параметров было

    СЗПоказателей.ДобавитьЗначение(«ЗдесьИмяКолонкиТЗ»,»ЗдесьКакэТоНазыватВотчете»);

    Reply
  22. KneZ

    Спасибо все работает супер! Поначалу правда не запускалось. Достаточно было понять, что в ТЗ должны быть не только группировки, но и их значения

    Reply
  23. rmv

    Великий СЕНКС. Весьма облегчило жисть

    Reply
  24. levran

    отлично! спасибо 🙂

    Reply
  25. KpeaTuFF

    Помогла не только разработка, но и автор! Спасибо!

    Reply
  26. bearcat

    Поместила файл в подкаталог ExtForms в каталоге информационной базы.

    Через меню «Сервис» выбрала пункт «Дополнительные возможности».

    Добавила этот файл.

    Попыталась открыть отчет, пишет — НЕВЕРНЫЕ ПАРАМЕТРЫ ВЫЗОВА, но при этом при нажатии на «ОК» отчет открылся.

    при попытке сформировать выдает :

    ТЗПолная.НоваяКолонка(ИмяВертГруппировки,ТипВертГруппировки);

    {D:1С — ОПТИМАБАЗЫ ДАННЫХ (ЛОКАЛЬНЫЕ)СТEXTFORMSBVK_OTCHETPOTZ.ERT(753)}: Значение не представляет агрегатный объект (НоваяКолонка)

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

    Если сможете подсказать, буду благодарна.

    Reply
  27. truba

    bearcat, не делайте так.

    не надо все в рот тянуть, прям как дети малые

    Reply
  28. CheBurator

    (27) спокойно! инструкции были даны в личку…

    Reply
  29. comrad

    CheBurator вышлите мне пожалуйста инструкцию как для (26)

    Reply
  30. CheBurator

    (29) в описании обработки где-нибудь сказано что обработку следует открывать через файл-открыть? сказано открывать каким либо другим способом кроме как вызовом оператора ОткрытьФорму(«Отчет», КонтекстВызова, ПутьОбработки+»БВК_ОтчетПоТЗ.ert»); ….????????

    — что именно непонятно?

    Reply
  31. comrad

    (30) разобралься спасибо.

    я пока что нуб так что извиняйте.

    Reply
  32. Dahlia

    😥 Наверно, я чего-то не понимаю, но у меня неправильно работает

    Во вложенном файле исходная ТЗ и картинка, чего получается. Самое яркое что в глаза бросается — столбцы по первой номенклатуре — итоги по торговым

    Reply
  33. CheBurator

    (32) архив битый!

    Reply
  34. Dahlia

    (33) Отправил архив на мыло

    Reply
  35. waol

    глФРМ неплохо бы вставить в модуль 🙂

    Reply
  36. CheBurator

    (35) Разрешаю, вставляйте!

    Reply
  37. waol

    не имею такой возможности; да мне то собственно…

    Reply
  38. DrZombi

    Бывают клиенты «Кнопочники», такие нелюбят много кнопок, а нооборот мечтают об одной кнопке 🙂

    Reply
  39. CheBurator

    (38) вставь «заглушку» — для такого-то набора колонок применить такую-ту раскладку 😉 — т.е. пррограммно прописать то что делается по кнопке восстановить… а еще лепотее — через глРасшифровку закинуть нужный набор параметров

    Reply
  40. unichkin

    А глФРМ — это из типовой конфы? У меня база 10 раз переписана, ругается.

    глФРМ<<?>>(ЗначениеПоказателя)

    Функция не обнаружена (глФРМ)

    Может скинете на почту модуль функции?

    Reply
  41. unichkin

    Кстати, было бы еще неплохо иметь возможность убирать группировку из вывода таблицы.

    Reply
  42. unichkin

    (40) уже разобрался) Крутая штука, очень помогло)

    Reply
  43. CheBurator

    (41) ну.. это простая глПечатьТЗ() — есть такая широко распространенная…

    Reply
  44. unichkin

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

    Reply
  45. konfed

    Классно работает, но до тех пор пока не нужно выводить посортированное, т.к. обработка производит свою сортировку при выводе.

    напр.: группировка 1 = контрагент, группировка 2 = товар, ресурсы — количество и сумма . нужно вывести все посортированное по количеству в

    порядке убывания. ТЗ, которая передается Вашей обработке уже так и посортирована, но внутри Вашей обработке сортировка ломается. однозначный плюс автору и

    CheBurator за то, что представил (доработки CheBurator не проверял). буду пробовать исправить что-то с сортировкой

    Reply
  46. CheBurator

    (45) Обработка — универсальная, хотите специфики — перетачивайте самостоятельно 😉

    В общем случае сортировка по измерению (товар, клиент) — всегда имеет смысл, сортировка по количеству в общем случае — смысла лишена: отсортируйте литры с килограммами и сантиметрами…

    Reply
  47. konfed

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

    Reply
  48. CheBurator

    (47) потому что не надо «подгонять данные». Я выше написал: реализован общий случай, в общем случае — товары не имеют одну единицу измерения. А вот «если.. имеют…», «если… весь товар — одна номенклатура но разных серий с разными сроками изготовления» и т.д. — это частные случаи. никто не запрещает подогнать универсальную обработку для общих случаев под свое частное решение…

    Reply
  49. Гость
    Если Запрос.Выполнить(ТекстЗапроса) = 0
    Тогда Возврат;
    КонецЕсли;
    
    ТЗ = СоздатьОбъект(«ТаблицаЗначений»);
    Запрос.Выгрузить(ТЗ,1,0);
    
    Если ФлагГруппа = 0
    Тогда ТЗ.УдалитьКолонку(«ГруппаТовара»);
    КонецЕсли;
    ТЗ.УдалитьКолонку(«Количество»);
    ТЗ.УдалитьКолонку(«ПродСт»);
    ТЗ.УдалитьКолонку(«ТекДок»);
    
    //здесь имеем ТЗ с нужными для вывода данными
    //…
    //положим в список значений «счетные» колонки ТЗ
    //(суммы, количества, себестоимости и прочее всякое что можно складывать…)
    СЗПоказателей = СоздатьОбъект(«СписокЗначений»);
    СЗПоказателей.ДобавитьЗначение(«СуммаПродСт»,»Сумма»);
    СЗПоказателей.ДобавитьЗначение(«СуммаКоличество»,»Кол-во»);
    //…
    //вызовем универсальный отчет по ТЗ
    //в списке значений передадим 2 параметра
    // — список «счетных» колонок
    // — саму таблицу значений для вывода
    КонтекстВызова = СоздатьОбъект(«СписокЗначений»);
    КонтекстВызова.ДобавитьЗначение(ТЗ,»ТаблицаЗначений»);
    КонтекстВызова.ДобавитьЗначение(СЗПоказателей,»СписокПоказателей»);
    //…
    ПутьОбработки = «»;
    ИмяОбработки = «»;
    РасположениеФайла(ПутьОбработки, ИмяОбработки);
    ОткрытьФорму(«Отчет», КонтекстВызова, ПутьОбработки+»БВК_ОтчетПоТЗ.ert»);
    
    КонецПроцедуры //Сформировать()
    

    Показать

    Reply
  50. ARTEM123456

    очень помогло

    Reply
  51. mihenius

    Не нашел как добавить обычных колонок для доп. информации.

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

    Reply
  52. mihenius

    Не нашел как зафиксировать порядок сортировки строк/колонок.

    Так же необходимо немного доработать )

    Reply
  53. CheBurator

    (51) этот отчет — в первую очередь группировочный. поэтому вывод дополнительной информаци для уровня группировки — не предусмотрен. Выйти из положения нможно так: если надо вывести в группировке, например номенклатуру с дополнительнйо инфорацией (акртику) — то в ТЗ ДЛЯ ВЫВОДА вместо колонки «номенклатьура», формируем колонку «артикул+номенклатура»

    Reply
  54. CheBurator

    (52) внизу под таблицей группирвоко — есть кнопка «сохранить» и «восстановить». Первая кнопка запоминает под именем (вводится пользователем) текущую настройку вывода колонок/группирвоок, «восстановить2 — позволяет восстановить ее.

    Reply
  55. mihenius

    (53,54) Уже переделал под себя )

    Пришел к клиентам, а там твоя обработка используется.

    Reply
  56. Скользящий

    Очень хорошая обработка, спасибо, очень помогла. Возникла правда, проблема. Отчет чисто группировочный, а иногда надо выводить дополнительную строку с информацией «в т.ч.» Привожу пример.

    В ТЗ есть колонки Контрагент, Товар, РасходнаяНакладная, Количество, ГруппаКонтрагентов, Группа Товаров. Счетная колонка «Количество»

    Этим отчетом удается вывести ГруппаКонтрагентов в столбцах, Группа Товар и Товар в строках, выглядит так

    http://gyazo.com/7338e1dfc1ed8c30de7e64212fb6f799

    Или можно вывести вот так

    http://gyazo.com/12f731587eb4c5fdf114c2decae889bc т.е. без вывода товаров.

    А хотелось бы выводить например только группу товаров, и «в т.ч.» товар. Вот так

    http://gyazo.com/5b3b77d726cd758afd062b4707e86494

    Иными словами, чтобы итоги по группе считал, но выводил под названием группы и количеством только определенные товары с количеством по конкретным товарам. Как можно извратиться в рамках существующего отчета? Или только допиливать отчет?

    Reply
  57. Скользящий

    Впрочем, вышел из положения, тупил. Просто добавил колонку еще одну группировочную. ) Проблема решена.

    Reply
  58. CheBurator

    (57) Ну и отлично

    Reply
  59. CheBurator

    Обновил обработку.

    Добавлена возможность манипулировать настроками вывода группировок программно при вызове отчета.

    В плане (когда-то.. если руки дойдут…):

    1.переписать на йоксель и ИТЗ для увеличения производительности.

    2. сделать возможность запуска обработки интерактивно — с загрузкой сторонних данных для вывода из экселя, csv, dbf + вывод данных из базы, получаемых через универсальный подбор обьектов.

    Reply
  60. CheBurator

    Обновил обработку.

    Модифицировано: выполняется автонастройка ширины колонок таблицы расшифровки числовых показателей

    Reply

Leave a Comment

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