Печать справочника

Автор SnakePlisskin, 23 мая 2025, 12:34

« назад - далее »

SnakePlisskin

Доброго дня, господа!
Подскажите как можно реализовать печать справочника (универсальность не нужна), нужен один конкретный справочник, без доп реквизитов, просто наименование, вот в таком виде как в "снеговике" https://s.mail.ru/Rzcb/1rQa2tqF2 - всю голову сломал, не получается ( Группы и элементы входящие в группы.

trad

У меня есть шаблон иерархического вывода с применением рекурсии

Перем мВсегоПозиций, мТекСтрока;

//*******************************************
Процедура ВывестиИерархию(Таб, ИТ, Отступ = "")
    ИТ.ВыбратьСтроки("индПорядок");
    Пока ИТ.ПолучитьСтроку("индПорядок") = 1 Цикл
        Если ИТ.__ЭтоГруппа__ = 1 Тогда
            ПечНаименование = Отступ + ИТ.Наименование;
            Если ИТ.__Уровень__ = 1 Тогда
                ИмяСекции = "Группа1уровня";
            Иначе
                ИмяСекции = "Группа";
            КонецЕсли;
            Таб.ВывестиСекцию(ИмяСекции);
            ВывестиИерархию(Таб, ИТ.тзПотомки, Отступ + " ");
        Иначе
            мТекСтрока = мТекСтрока + 1;
            Если мТекСтрока % 10 = 0 Тогда
                Состояние("Вывод... " + Цел(мТекСтрока / мВсегоПозиций * 100) + "%");
            КонецЕсли;
            ПечНаименование = ИТ.Наименование;
            Таб.ВывестиСекцию("Строка");
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры


//*******************************************
Процедура ОбработатьИерархию(ИТ)
    ИТ.ВыбратьСтроки();
    Пока ИТ.ПолучитьСтроку() = 1 Цикл
        Если ИТ.__ЭтоГруппа__ = 1 Тогда
            ИТ.Наименование = ИТ.Ссылка.Наименование;
            ОбработатьИерархию(ИТ.тзПотомки);
        КонецЕсли;
    КонецЦикла;
    ИТ.ДобавитьИндекс("индПорядок", "Наименование");
КонецПроцедуры


//*******************************************
Процедура Сформировать()
    РезИТ = СоздатьОбъект("ИндексированнаяТаблица");
    
    // тут получение данных в ИТ
    //в данных должны быть поля Ссылка,Наименование
    //желательно наличие поля Ссылка_Родитель
    
    мВсегоПозиций = РезИТ.КоличествоСтрок();
    Если мВсегоПозиций = 0 Тогда
        Возврат;
    КонецЕсли;
    
    РезИТ.Группировать("Ссылка:Ссылка*&", , 0);
    ОбработатьИерархию(РезИТ);
    
    Таб = СоздатьОбъект("Таблица");
    //Таб.ИсходнаяТаблица();
    Таб.ВывестиСекцию("Шапка");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0, "Печать", "Окно");
    Таб.ПовторятьПриПечатиСтроки(Таб.ВысотаТаблицы(), Таб.ВысотаТаблицы());
    
    мТекСтрока=0;
    ВывестиИерархию(Таб, РезИТ);
    
    Таб.ВывестиСекцию("Подвал");
    Таб.ТолькоПросмотр(1);
    //Таб.ПараметрыСтраницы();
    Таб.Показать();
КонецПроцедуры

1ex

Если отчет разовый, то можно выгрузится в csv (utf-8), Если меньше мегабайта - то можно воспользоваться демкой на странице https://www.webdatarocks.com/demos/js/pivot-table-demo/
Там "Connect to local csv".

Эта штука - универсальный куб отчетов.

Могу собрать локальную html страницу - с этим кубом, чтобы открывать его внутри формы 1С.

Я себе все "сложные" (с миллиардом бредовых странной простыней удобных и нужных фильтров) отчеты с этой штукой - вынес на внутренний портал. (и в моем конструкторе он тоже есть :))


Злоп

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

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

посмотри на ИС по слову NotaBene - может вывести по группировкам, только каждую групп надо будет в отдельном столбце выводить

или за 5 мин https://infostart.ru/1c/tools/18989/







https://infostart.ru/1c/tools/18380/


SnakePlisskin

А как по итогу то это дело выглядит ?

Цитата: trad от 23 мая 2025, 15:44У меня есть шаблон иерархического вывода с применением рекурсии

Перем мВсегоПозиций, мТекСтрока;

//*******************************************
Процедура ВывестиИерархию(Таб, ИТ, Отступ = "")
    ИТ.ВыбратьСтроки("индПорядок");
    Пока ИТ.ПолучитьСтроку("индПорядок") = 1 Цикл
        Если ИТ.__ЭтоГруппа__ = 1 Тогда
            ПечНаименование = Отступ + ИТ.Наименование;
            Если ИТ.__Уровень__ = 1 Тогда
                ИмяСекции = "Группа1уровня";
            Иначе
                ИмяСекции = "Группа";
            КонецЕсли;
            Таб.ВывестиСекцию(ИмяСекции);
            ВывестиИерархию(Таб, ИТ.тзПотомки, Отступ + " ");
        Иначе
            мТекСтрока = мТекСтрока + 1;
            Если мТекСтрока % 10 = 0 Тогда
                Состояние("Вывод... " + Цел(мТекСтрока / мВсегоПозиций * 100) + "%");
            КонецЕсли;
            ПечНаименование = ИТ.Наименование;
            Таб.ВывестиСекцию("Строка");
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры


//*******************************************
Процедура ОбработатьИерархию(ИТ)
    ИТ.ВыбратьСтроки();
    Пока ИТ.ПолучитьСтроку() = 1 Цикл
        Если ИТ.__ЭтоГруппа__ = 1 Тогда
            ИТ.Наименование = ИТ.Ссылка.Наименование;
            ОбработатьИерархию(ИТ.тзПотомки);
        КонецЕсли;
    КонецЦикла;
    ИТ.ДобавитьИндекс("индПорядок", "Наименование");
КонецПроцедуры


//*******************************************
Процедура Сформировать()
    РезИТ = СоздатьОбъект("ИндексированнаяТаблица");
    
    // тут получение данных в ИТ
    //в данных должны быть поля Ссылка,Наименование
    //желательно наличие поля Ссылка_Родитель
    
    мВсегоПозиций = РезИТ.КоличествоСтрок();
    Если мВсегоПозиций = 0 Тогда
        Возврат;
    КонецЕсли;
    
    РезИТ.Группировать("Ссылка:Ссылка*&", , 0);
    ОбработатьИерархию(РезИТ);
    
    Таб = СоздатьОбъект("Таблица");
    //Таб.ИсходнаяТаблица();
    Таб.ВывестиСекцию("Шапка");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0, "Печать", "Окно");
    Таб.ПовторятьПриПечатиСтроки(Таб.ВысотаТаблицы(), Таб.ВысотаТаблицы());
    
    мТекСтрока=0;
    ВывестиИерархию(Таб, РезИТ);
    
    Таб.ВывестиСекцию("Подвал");
    Таб.ТолькоПросмотр(1);
    //Таб.ПараметрыСтраницы();
    Таб.Показать();
КонецПроцедуры

Цитата: trad от 23 мая 2025, 15:44У меня есть шаблон иерархического вывода с применением рекурсии

Перем мВсегоПозиций, мТекСтрока;

//*******************************************
Процедура ВывестиИерархию(Таб, ИТ, Отступ = "")
    ИТ.ВыбратьСтроки("индПорядок");
    Пока ИТ.ПолучитьСтроку("индПорядок") = 1 Цикл
        Если ИТ.__ЭтоГруппа__ = 1 Тогда
            ПечНаименование = Отступ + ИТ.Наименование;
            Если ИТ.__Уровень__ = 1 Тогда
                ИмяСекции = "Группа1уровня";
            Иначе
                ИмяСекции = "Группа";
            КонецЕсли;
            Таб.ВывестиСекцию(ИмяСекции);
            ВывестиИерархию(Таб, ИТ.тзПотомки, Отступ + " ");
        Иначе
            мТекСтрока = мТекСтрока + 1;
            Если мТекСтрока % 10 = 0 Тогда
                Состояние("Вывод... " + Цел(мТекСтрока / мВсегоПозиций * 100) + "%");
            КонецЕсли;
            ПечНаименование = ИТ.Наименование;
            Таб.ВывестиСекцию("Строка");
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры


//*******************************************
Процедура ОбработатьИерархию(ИТ)
    ИТ.ВыбратьСтроки();
    Пока ИТ.ПолучитьСтроку() = 1 Цикл
        Если ИТ.__ЭтоГруппа__ = 1 Тогда
            ИТ.Наименование = ИТ.Ссылка.Наименование;
            ОбработатьИерархию(ИТ.тзПотомки);
        КонецЕсли;
    КонецЦикла;
    ИТ.ДобавитьИндекс("индПорядок", "Наименование");
КонецПроцедуры


//*******************************************
Процедура Сформировать()
    РезИТ = СоздатьОбъект("ИндексированнаяТаблица");
    
    // тут получение данных в ИТ
    //в данных должны быть поля Ссылка,Наименование
    //желательно наличие поля Ссылка_Родитель
    
    мВсегоПозиций = РезИТ.КоличествоСтрок();
    Если мВсегоПозиций = 0 Тогда
        Возврат;
    КонецЕсли;
    
    РезИТ.Группировать("Ссылка:Ссылка*&", , 0);
    ОбработатьИерархию(РезИТ);
    
    Таб = СоздатьОбъект("Таблица");
    //Таб.ИсходнаяТаблица();
    Таб.ВывестиСекцию("Шапка");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0, "Печать", "Окно");
    Таб.ПовторятьПриПечатиСтроки(Таб.ВысотаТаблицы(), Таб.ВысотаТаблицы());
    
    мТекСтрока=0;
    ВывестиИерархию(Таб, РезИТ);
    
    Таб.ВывестиСекцию("Подвал");
    Таб.ТолькоПросмотр(1);
    //Таб.ПараметрыСтраницы();
    Таб.Показать();
КонецПроцедуры


Злоп

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

Злоп

можно для всех уровней групп свою раскраску сделать
(у меня например группы раскрашиваются от светло-серого насыщается фон до черного (чем глубже тем темнее).
.
но универсальная группировка в этом случае будет нормально отрабатывать только если элементы во всех группах лежат на одинаковом уровне... - это в том случае если ты хочешь чтобы элементы выводились всегда одинаковым оформлением.

если ослабить ограинчения - что элемент быдет выводиться тем оформлением которое соответсвует уровню справочника - тогда унигруппировка будет отрабатывать правильно при любой иерархии 

Злоп


trad

Цитата: SnakePlisskin от 24 мая 2025, 17:47А как по итогу то это дело выглядит ?
Как макет нарисуешь - так и будет выглядеть

SnakePlisskin

Попробовал накидать по алгоритму trad, если номенклатура вообще без родителя выводится рандомно, может я конечно не правильно итз сформировал, делал через обычную выборку элементов справочника

trad

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

SnakePlisskin

Цитата: trad от 27 мая 2025, 15:05Если вывод по индексу, а индекс по наименованию и наименование заполнено, то не может быть рандомно, будет в порядке наименования

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

Злоп

Для начала сделай чтобы на одном уровне не было элементов и групп одновременно. Потом смотри что получается при выводе.
Потом смотри когда есть смешение.
Вполне возможно ты неправильно интерпретируешь виденное.
Для подстраховки сделай в начале выводимой строки колао отступов кратное уровню, только побольше отступов чтобы видно было
Отступ = Формат("", "С"+Значение.Уровень()*4)

Злоп

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