8.х Отчет для иерархического справочника

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Korolev, 5 авг 2010.

  1. TopicStarter Overlay
    Korolev
    Offline

    Korolev Опытный в 1С

    Регистрация:
    20 апр 2010
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    Переделал отчет ( http://www.1c-pro.ru/index.php?showtopic=25508 ), так как не мог передать в запрос скд данные в иерархии.

    В общем сейчас это реализовать удалось. Задача осталась в том, чтобы выводить данные в виде иерархии (4й уровень, хотя по идее ограничений быть не должно.

    Сейчас выводится так (как видно уровень группировки родитель и потомок):
    Посмотреть вложение 5000

    А надо что-то подобное (как видно, здесь родитель1, родитель2 и т.д):
    Посмотреть вложение 5001
    Справочник один и тот же, выглядит так:
    Посмотреть вложение 5002

    В общем как можно добавить побольше группировок?(

    Отчет прикрепил в архиве, если нужна конф: Трактиръ Фронт 3.0

    Вложения:

    • new.PNG
      new.PNG
      Размер файла:
      35,7 КБ
      Просмотров:
      736
    • old.PNG
      old.PNG
      Размер файла:
      31,8 КБ
      Просмотров:
      705
    • spr.PNG
      spr.PNG
      Размер файла:
      12,6 КБ
      Просмотров:
      442
    • ОтчетПоЗП.rar
      Размер файла:
      7,7 КБ
      Просмотров:
      82
  2. TopicStarter Overlay
    Korolev
    Offline

    Korolev Опытный в 1С

    Регистрация:
    20 апр 2010
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    Актуально.. В 7ке это реализуется через обход по выборке с помощью метода "Группировка", есть ли в 8ке что-то подобное?
  3. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.400
    Симпатии:
    40
    Баллы:
    54
    Здратсвуйте!
    1. В СКД вопрос решается быстро, в настройках указываете настройку группировки ИЕРАРХИЯ, он сам выведет всю иерархию справочника.
    2. Если хотите обойти результат запроса по группировка
    Код:
    Результат = Запрос.Выполнить.Выбрать("Номенклатура", ОбходРезультатаЗапроса.ПоГруппировкамСИерархией, "ВСЕ");
    
  4. TopicStarter Overlay
    Korolev
    Offline

    Korolev Опытный в 1С

    Регистрация:
    20 апр 2010
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    Доброго утра!
    в СКД не получилось передавать значения в иерархии для запроса, поэтому решил другим способом делать.
    благодарю за ответ, чуть позже попробую реализовать :)
  5. TopicStarter Overlay
    Korolev
    Offline

    Korolev Опытный в 1С

    Регистрация:
    20 апр 2010
    Сообщения:
    269
    Симпатии:
    0
    Баллы:
    26
    Сделал вот так
    Код:
    		Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, , "ВСЕ");
    
    Пока Выборка.Следующий() Цикл
    ТекГруппировка = Выборка.Товар;
    ТекУровень =  ТекГруппировка.Уровень();
    ОбластьСтрокаТаблицы = Макет.ПолучитьОбласть("Родитель"+ТекУровень);
    ОбластьСтрокаТаблицы.Параметры.Заполнить(Выборка);
    ОбластьСтрокаТаблицы.Параметры.Заполнить(Выборка.Товар);
    ТабДок.Вывести(ОбластьСтрокаТаблицы,ТекУровень)
    КонецЦикла;
    
    
    группировка появилась, но опять все "криво" :unsure:
    то ли условия какие-то надо наложить, то ли написать по другому.

    Вложения:

    • spr.PNG
      spr.PNG
      Размер файла:
      31,1 КБ
      Просмотров:
      287
  6. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.400
    Симпатии:
    40
    Баллы:
    54
    Либо задача очень тяжёлая и я её не понял, либо задача очень простая, но Вы не можете объяснить, выкладываю пример формирования иерархии в СКД без всяких там изворотов.
    Посмотреть вложение 5045
    ЗЫ: Это файл настроек СКД, просто в конструктор СКД загрузите.

    Вложения:

  7. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    Ну если готовые упорядочивалки/группировщики не помогают, может стоит взять, и реализовать свой алгоритм построения группировок
    с блэкджеком и девками (с)?

    Пример кода

    Код:
    Перем ТабДок;
    Перем Макет;
    Перем тзДанные;
    // Процедура получает на вход строку тзДанные, берет из нее контрагента, и выводит его.
    //    Если контрагент есть группа - открывается и закрывается группировка, и внутри группирвоки выводятся
    //    элементы и группы подчиненные текущему контрагенту 
    //        (да я с голой рекурсией на медведя ходил... 
    //        да я голый с рекурсией на медведя ходил...
    //        да я на голого медведя с рекурсией ходил)
    //
    // Параметры
    //  СтрокаТЗ   СтрокаТаблицыЗначений  Строкая таблицы значений содержащаяя ячейки:
    // Контрагент, Наименование, ЭтоГруппа, Родитель 
    //
    Процедура ВывестиКонтрагентаИВсехДетейЕго(СтрокаТЗ, Сч, ВсегоЗаписей)
    Сч = Сч+1;
    Состояние("В отчет выведенно "+Сч+" записей из "+ВсегоЗаписей);
    
    Если СтрокаТЗ.ЭтоГруппа Тогда
    //выводим сам эллемент/группу
    Область        = Макет.ПолучитьОбласть("Группа");
    Область.Параметры.Заполнить(СтрокаТЗ);
    ТабДок.Вывести(Область);
    
    ТабДок.НачатьГруппуСтрок(); //отрыли группировку под группу
    //подготовим выборку групп и эллементов принадлежащих данной группе
    Фильтр = Новый Структура;
    Фильтр.Вставить("Родитель", СтрокаТЗ.Контрагент);
    НаборСтрок    = тзДанные.НайтиСтроки(Фильтр);
    Для каждого СтрокаПодчиненных Из НаборСтрок Цикл
    //вызываем рекурсию, пока не посинеем, или пока обработка не закончит обходить записи.
    //ну или пока пользователь не нажмет Ctrl+Break
    ВывестиКонтрагентаИВсехДетейЕго(СтрокаПодчиненных, Сч, ВсегоЗаписей);
    
    ОбработкаПрерыванияПользователя();
    КонецЦикла; 
    
    ТабДок.ЗакончитьГруппуСтрок(); //закрыли группировку под группу
    Иначе
    //выводим сам эллемент/группу
    Область        = Макет.ПолучитьОбласть("Строка");        
    Область.Параметры.Заполнить(СтрокаТЗ);
    ТабДок.Вывести(Область);
    КонецЕсли;
    //выпиливаем текущую строку из таблицы данных (ибо она нам уже не нужна)
    тзДанные.Удалить(СтрокаТЗ);
    КонецПроцедуры // ВывестиКонтрагентаИВсехДетейЕго()
    
    
    Процедура КнопкаВыполнитьНажатие(Кнопка)
    ТабДок        = Новый ТабличныйДокумент;
    Макет        = ПолучитьМакет("Макет");
    Область        = Макет.ПолучитьОбласть("Заголовок");
    ТабДок.Вывести(Область);
    //-------------------------------------------------------------------------------------
    //получаем простой список контрагентов, включая группы и элементы
    Запрос1С = Новый Запрос;
    Запрос1С.Текст = 
    "ВЫБРАТЬ
    |    Контрагенты.Ссылка КАК Контрагент,
    |    Контрагенты.Наименование,
    |    Контрагенты.ЭтоГруппа,
    |    Контрагенты.Родитель
    |ИЗ
    |    Справочник.Контрагенты КАК Контрагенты";
    
    тзДанные = Запрос1С.Выполнить().Выгрузить();
    //-------------------------------------------------------------------------------------
    //подготавливаем таблицу к тому, чтобы можно было легко посортировать 
    тзДанные.Колонки.Добавить("Уровень");
    Сч = 0;
    Для каждого СтрокаТЗ Из тзДанные Цикл
    Сч = Сч+1;
    Состояние("Идет предварительная обработка дерева контрагентов. Обработанно "
    +Сч
    +" строк из "+тзДанные.Количество());
    
    СтрокаТЗ.Уровень = СтрокаТЗ.Контрагент.Уровень();
    ОбработкаПрерыванияПользователя();
    КонецЦикла; 
    тзДанные.Сортировать("Уровень Возр, ЭтоГруппа Убыв, Наименование Возр");
    //-------------------------------------------------------------------------------------
    Сч                = 0;
    ВсегоЗаписей    = тзДанные.Количество();
    Пока тзДанные.Количество() > 0 Цикл
    Сч = Сч+1;
    ВывестиКонтрагентаИВсехДетейЕго(тзДанные[0], Сч, ВсегоЗаписей);
    ОбработкаПрерыванияПользователя();
    КонецЦикла; 
    //-------------------------------------------------------------------------------------
    
    ТабДок.ПолеСверху            = 3;
    ТабДок.ПолеСнизу            = 3;
    ТабДок.ПолеСправа            = 3;
    ТабДок.ПолеСлева            = 3;
    ТабДок.ОтображатьСетку        = Ложь;//Истина;
    ТабДок.Защита                = Ложь;
    ТабДок.ТолькоПросмотр        = Истина;
    ТабДок.ОтображатьЗаголовки    = Истина;
    ТабДок.ОтображатьГруппировки= Истина;
    ТабДок.АвтоМасштаб            = Истина;
    ТабДок.ОриентацияСтраницы    = ОриентацияСтраницы.Портрет;
    ТабДок.Показать(); 
    КонецПроцедуры //КнопкаВыполнитьНажатие()
    
    
    
    

Поделиться этой страницей