Настраиваемая распечатка таблицы значений в 1С:7.7



Предлагаемая обработка играет роль внешнего процессора вывода для любой таблицы значений. Может быть полезна при необходимости быстро настроить вывод в печатном/просматриваемом виде таблиц значений.

Прикладываются 2 файла: собственно обработка по выводу ТЗ и шаблон-заготовка отчета, которая использует эту обработку. Шаблон отчета приводится исключительно для рекомендации и копипасты, т.к. он содержит в себе неудачные решения, появившиеся от неопытности разработчика, но так и оставшиеся )).

Группировки могут быть только горизонтальные.

Логика работы — итоги рассчитываются путем последовательного свертывания  по измерениям с использованием промежуточных таблиц значений итогов всех уровней. Минус такого подхода – на больших таблицах значений может отнимать значительное время. Например, при большом отчете на практике возникали исходные таблицы по 200 тысяч строк (когда нельзя было уменьшить детализацию, т.к. для промежуточных расчетов нужно требовались детальные данные, которые потом все равно сворачивались) и весь процесс (выборка из DBF, расчет итогов, вывод в таблицу) мог занимать до 20 минут.

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

В начале текста приведен модуля подробный комментарий с описанием принимаемых параметров.

Если применять обработку для вывода результатов  отчетов, получается такая:

1. Получить данные (в нужной детализации) – в шаблоне за это отвечает ошметок от функции ПолучитьДанные, в котором должна быть генерация запроса с нужными условиями исходя из выбранных группировок и фильтров и т.п.

2. Обработать данные, например наложить дополнительные фильтры (которые по какой-то причине не удалось наложить в запросе – например из-за ограниченных возможностей родных запросов 77). – предлагается просто помечать в специальной колонке строку как «удаленную» (это быстрее чем удалять из ТЗ). Тут же можно применить такую функцию как глЗаполнитьКатегорииПоРодителямСпр – создадутся отдельные колонки по уровням иерархии нужных справочников для иерархического вывода. Можно выводить только иерархию и произвольное сочетание уровней иерархии. (например только родителей верхнего и третьего уровней). Иногда такая специфика нужна (например когда в иерархической структуре предприятия сквозным уровням придается какой-то дополнительный смысл). Или просто не нужно лезть на всю глубину иерархии и вывести только первые 2-3.

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

Есть и другие возможности но думаю в настоящее время они уже мало актуальны-  едва ли кто захочет вникать именно в мои особенности построения отчетов на 77 (DBF без 1с++) – главное что если есть потребность быстренько вывести ТЗ в отчет с группировками, итогами, подписями-надписями, вычисляемыми колонками и нумерациями, то надеюсь моя обработка Вам поможет.

Ну и собственно вкратце как вызвать-то )

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

 СЗПараметров.ДобавитьЗначение(ТЗДанных);
СЗПараметров.ДобавитьЗначение(СписКолИзм);
СЗПараметров.ДобавитьЗначение(СписКолСумм);
СЗПараметров.ДобавитьЗначение(СписКолРекв);
СЗПараметров.ДобавитьЗначение(СписНадписей);
СЗПараметров.ДобавитьЗначение(Табл);
СЗПараметров.ДобавитьЗначение(ТЗДопПар);
СЗПараметров.ДобавитьЗначение(СЗВычКол);
ОткрытьФорму("Обработка.ВывестиНаПечатьТЗ", СЗПараметров);
 

Где все списки – это строки с разделенными запятыми именами полей.

Например

СписКолСумм = "Оборот";
СписКолИзм  = "Агент, Клиент";
СписКолРекв = "НомНаценка";
СписНадписей= "Агент/Клиент, Наценка, Оборот";

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

Почти все параметры необязательны (кроме конечно таблицы данных). Впрочем это все подробно расписано в тексте модуля обработки – 2х страничный комментарий ) – в том числе и что запихивать в первую строку ТЗДопПар (не очень изящный способ передать еще неопределенное заранее количество параметров, но из соображений совместимости так и застрявший). Там указываются такие вещи как ширины колонок, на каких уровнях группировок выводить ресурсы а на каких нет, выводить ли пустые значения группировок, форматы полей (в частности как отображать справочники ), описание нумераторов и имя колонки, которая играет роль пометки на удаление.

3 Comments

  1. CheBurator

    мутное описание какое-то

    я пользуюсь http://infostart.ru/public/14794/

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

    Показать

    Reply
  2. Vodoley

    ну чебуратор кажется крутой чувак ) думаю у него хорошая обработка (интересно насколько производительно делает шахматку и вообще вертикальные группировки). Моя обработка шахматку не выведет, но зато умеет нумеровать и вычисляемые поля (типа ресурс3 = ресурс2/(ресурс1-ресурс0) ) что вычисляется и для детальных записей и для всех уровней итогов. Описание попробую подправить, чтоб стало менее мутным, впрочем не думаю что в наше время кто-то станет ее использоваться как я в своей конфе — как единый процессор вывода всех табличных данных, а вот как простой инструмент вывода ТЗ может кому-то и пригодится. Тем более что в самом просто виде вызов это 3-4 строчки текста

    СЗПараметров.ДобавитьЗначение(ТЗДанных);
    СЗПараметров.ДобавитьЗначение(«Клиент, Товар»);
    СЗПараметров.ДобавитьЗначение(«Сумма, Количество»);
    ОткрытьФорму(«Обработка.ВывестиНаПечатьТЗ», СЗПараметров);  
    Reply
  3. Vodoley

    упс ) это Вы мне и написали )) а я в третьем лице — не сочтите за шизофрению ))

    Reply

Leave a Comment

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