[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 не будет опубликован. Обязательные поля помечены *