"Развернуть" таблицу значений

1. ivnik 612 04.10.20 13:03 Сейчас в теме
Всем доброго дня!
Пытаюсь создать Отчет (не на СКД), но начал тупить, видимо мозгов не хватает, наставьте пожалуйста на путь истинный. Получаю из документов Таблицу значений, мне нужно ее "развернуть" из вертикальной в горизонтальную (образец прилагаю).
P.S. Шапку "развернуть" у меня получается, не соображу, как заполнить строки?
Заранее Спасибо!
Прикрепленные файлы:
ТабЗначений.xlsx
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
26. antz 06.10.20 12:00 Сейчас в теме +3 $m
(25)

Эхх, молодежь)

Ладно, дарю.
Прикрепленные файлы:
ВнешняяОбработка1.epf
marinelle; ivnik; Dnki; +3 Ответить
22. leosoft 167 04.10.20 22:19 Сейчас в теме +1 $m
Посмотрите в личке ссылку на новую версию!
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. ivnik 612 04.10.20 14:41 Сейчас в теме
(2) По первой ссылке - вариант не подходит, т.к. это не совсем то, что мне надо (мой образец в файле).
По второй ссылке - у меня нет заранее подготовленного макета (он формируется программно).
4. antz 04.10.20 15:25 Сейчас в теме
Массив уникальных значений начислений, массив уникальных сотрудников.
Сперва цикл по начислениям - формируем шапку.
Дальше - в цикл по сотрудникам вложен цикл по начислениям, формируем структуру "Сотрудник, Начисление", дальше - НайтиСтроки. Если строки есть - берем нулевую, получаем значение, присоединяем область. Если строк нет - очищаем ячейку и тоже присоединяем область. Вот, собственно, и все, строк пятнадцать.
marinelle; Dnki; +2 Ответить 1
6. ivnik 612 04.10.20 16:23 Сейчас в теме
(4) А "живым" кодом можно?
5. user856012 14 04.10.20 15:29 Сейчас в теме
(3)
у меня нет заранее подготовленного макета (он формируется программно)
А что выводится в ячейках с данными каждой строки (J4-R4,J5-R5 и т.д)? Предположим, что значения из массива. Тогда можно использовать такой алгоритм:
1. Запоминаем в переменной ТекущийСотр ФИО сотрудника из первой строки ТЗ, создаем МассивДанных по числу колонок в шапке, которую вы "развернули", и заполняем его нулями.
2. В цикле перебираем ТЗ.
3. Если текущее значение ФИО совпадает с запомненным в переменной ТекущийСотр, то помещаем значение в соответствующий элемент МассивДанных - как его определить, дело хозяйское, можно через список значений или соответствия, созданные при формировании шапки.
4. Если ФИО не совпадает с переменной ТекущийСотр (сменился сотрудник), то:
- выводим в макет строку с данными: ТекущийСотр и МассивДанных;
- заполняем МассивДанных нулями;
- запоминаем в переменной ТекущийСотр ФИО сотрудника;
5. После окончания цикла один раз выполняем п.4 - чтобы вывести данные по последнему сотруднику.
7. leosoft 167 04.10.20 16:52 Сейчас в теме
А чем СКД не устраивает?
8. ivnik 612 04.10.20 17:00 Сейчас в теме
(7) Вполне возможно, что СКД устроило бы, проблема в том, что у меня здесь "дырка" и я не умею этим пользоваться.
9. leosoft 167 04.10.20 17:04 Сейчас в теме
Исходную таблицу запросом получали и выгружали?
10. ivnik 612 04.10.20 17:06 Сейчас в теме
11. leosoft 167 04.10.20 17:07 Сейчас в теме
Текст запроса можете прислать?
12. ivnik 612 04.10.20 17:13 Сейчас в теме
(11)
    ТЗ = Новый ТаблицаЗначений;
    
    ТЗ.Колонки.Добавить("НомСтроки");
    ТЗ.Колонки.Добавить("Сотрудник");
    ТЗ.Колонки.Добавить("Начисление");
    ТЗ.Колонки.Добавить("Группа");
    ТЗ.Колонки.Добавить("Размер");
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    ТарификацияНСОТ.ТаблицаВР.(
        |        Начисление КАК Начисление,
        |        Размер КАК Размер,
        |        Сотрудник КАК Сотрудник,
        |        ИдентификаторСтрокиСотрудника КАК ИдентификаторСтрокиСотрудника
        |    ) КАК ТаблицаВР
        |ИЗ
        |    Документ.ТарификацияНСОТ КАК ТарификацияНСОТ
        |ГДЕ
        |    ТарификацияНСОТ.Организация = &Организация
        |    И ТарификацияНСОТ.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
        |    И ТарификацияНСОТ.Проведен = &Проведен
        |    И ТарификацияНСОТ.ТаблицаВР.НомерСтроки > 1
        |    И ТарификацияНСОТ.ТаблицаВР.Размер > 0";
    
    Запрос.УстановитьПараметр("ДатаНачала", Отчет.ДатаНачала);
    Запрос.УстановитьПараметр("ДатаОкончания", Отчет.ДатаОкончания);
    Запрос.УстановитьПараметр("Организация", Отчет.Организация);
    Запрос.УстановитьПараметр("Проведен", Истина);
    //Запрос.УстановитьПараметр("Ссылка", Документ);
    
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    Пока Выборка.Следующий() Цикл
        ВыборкаСтрок = Выборка.ТаблицаВР.Выбрать();
        Пока ВыборкаСтрок.Следующий() Цикл
            НС = ТЗ.Добавить();
            НС.НомСтроки = ВыборкаСтрок.ИдентификаторСтрокиСотрудника;
            НС.Сотрудник = ВыборкаСтрок.Сотрудник;
            НС.Начисление = ВыборкаСтрок.Начисление;
            НС.Группа = Справочники.СоответствиеВР.НайтиПоНаименованию(НС.Начисление).ВходитВГруппу;
            НС.Размер = ВыборкаСтрок.Размер;
        КонецЦикла;
    КонецЦикла;

    ТЗ.Свернуть("Начисление","Размер");

    ВТЗ = Новый ТаблицаЗначений;
    Для Инд = 1 По ТЗ.Количество() Цикл 
        Индекс = Инд-1;
        ВР = ТЗ[Индекс].Начисление;
        //Сообщить(""+Инд+"  "+ВР);
        ВТЗ.Колонки.Добавить(,Новый ОписаниеТипов("Число"),ВР.Наименование,10);
    КонецЦикла;

   // Далее "рисуем" макет

        Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная,1);
        ТолстаяЛиния = Линия;//Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 2);
        Таб=Новый ТабличныйДокумент;
        Таб.Область(1,1).Текст=Заголовок;
        Таб.Область(1,1).ШиринаКолонки = 4;
        Таб.Область(1,1).Обвести(ТолстаяЛиния,ТолстаяЛиния,ТолстаяЛиния,ТолстаяЛиния);
        Для Кол=1 По ВТЗ.Колонки.Количество() Цикл
            врЗаголовок = "";
            Если СокрЛП(Строка(ВТЗ.Колонки[Кол-1].Заголовок)) <> "" Тогда
                врЗаголовок = Строка(ВТЗ.Колонки[Кол-1].Заголовок);
            Иначе
                врЗаголовок = Строка(ВТЗ.Колонки[Кол-1].Имя)
            КонецЕсли;
            Таб.Область(2,Кол+1).Текст = врЗаголовок;
            //Таб.Область(2,Кол+1).Шрифт = Новый Шрифт(,,Истина);// жирный
            Таб.Область(2,Кол+1).Обвести(ТолстаяЛиния,ТолстаяЛиния,ТолстаяЛиния,ТолстаяЛиния);
            врШир = ВТЗ.Колонки[Кол-1].Ширина;
            Если врШир > 0 Тогда
                Таб.Область(2,Кол+1).ШиринаКолонки = врШир;
            КонецЕсли;
        КонецЦикла;
        i=0;
        
        Для Каждого Ном ИЗ ВТЗ Цикл
            i=i+1;
            Таб.Область(i+2,1).Текст=Строка(i);
            Таб.Область(i+2,1).Обвести(Линия, Линия, Линия, Линия);
            Для Кол=1 По ТЗ.Колонки.Количество() Цикл
                Таб.Область(i+2,Кол+1).Текст=Строка(ТЗ[i-1][кол-1]);
                Таб.Область(i+2,Кол+1).Обвести(Линия, Линия, Линия, Линия);
            КонецЦикла;
            Если i/10=Цел(i/10) Тогда 
                //Состояние(Заголовок+", печать: "+Строка(i));
            КонецЕсли;
        КонецЦикла; 

        Таб.Вывести(Таб);
Показать
13. FatPanzer 04.10.20 18:09 Сейчас в теме
(12) Нечитаемо. Можно попросить IT-специалиста применить тэг CODE?
14. XAKEP 04.10.20 18:13 Сейчас в теме
ТЗ = Новый ТаблицаЗначений;

ТЗ.Колонки.Добавить("НомСтроки");
ТЗ.Колонки.Добавить("Сотрудник");
ТЗ.Колонки.Добавить("Начисление");
ТЗ.Колонки.Добавить("Группа");
ТЗ.Колонки.Добавить("Размер");

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТарификацияНСОТ.ТаблицаВР.(
| Начисление КАК Начисление,
| Размер КАК Размер,
| Сотрудник КАК Сотрудник,
| ИдентификаторСтрокиСотрудника КАК ИдентификаторСтрокиСотрудника
| ) КАК ТаблицаВР
|ИЗ
| Документ.ТарификацияНСОТ КАК ТарификацияНСОТ
|ГДЕ
| ТарификацияНСОТ.Организация = &Организация
| И ТарификацияНСОТ.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
| И ТарификацияНСОТ.Проведен = &Проведен
| И ТарификацияНСОТ.ТаблицаВР.НомерСтроки > 1
| И ТарификацияНСОТ.ТаблицаВР.Размер > 0";

Запрос.УстановитьПараметр("ДатаНачала", Отчет.ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", Отчет.ДатаОкончания);
Запрос.УстановитьПараметр("Организация", Отчет.Организация);
Запрос.УстановитьПараметр("Проведен", Истина);
//Запрос.УстановитьПараметр("Ссылка", Документ);

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
ВыборкаСтрок = Выборка.ТаблицаВР.Выбрать();
Пока ВыборкаСтрок.Следующий() Цикл
НС = ТЗ.Добавить();
НС.НомСтроки = ВыборкаСтрок.ИдентификаторСтрокиСотрудника;
НС.Сотрудник = ВыборкаСтрок.Сотрудник;
НС.Начисление = ВыборкаСтрок.Начисление;
НС.Группа = Справочники.СоответствиеВР.НайтиПоНаименованию(НС.Начисление).ВходитВГруппу;
НС.Размер = ВыборкаСтрок.Размер;
КонецЦикла;
КонецЦикла;

ТЗ.Свернуть("Начисление","Размер");

ВТЗ = Новый ТаблицаЗначений;
Для Инд = 1 По ТЗ.Количество() Цикл
Индекс = Инд-1;
ВР = ТЗ[Индекс].Начисление;
//Сообщить(""+Инд+" "+ВР);
ВТЗ.Колонки.Добавить(,Новый ОписаниеТипов("Число"),ВР.Наименование,10);
КонецЦикла;

// Далее "рисуем" макет

Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная,1);
ТолстаяЛиния = Линия;//Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 2);
Таб=Новый ТабличныйДокумент;
Таб.Область(1,1).Текст=Заголовок;
Таб.Область(1,1).ШиринаКолонки = 4;
Таб.Область(1,1).Обвести(ТолстаяЛиния,ТолстаяЛиния,ТолстаяЛиния,ТолстаяЛиния);
Для Кол=1 По ВТЗ.Колонки.Количество() Цикл
врЗаголовок = "";
Если СокрЛП(Строка(ВТЗ.Колонки[Кол-1].Заголовок)) <> "" Тогда
врЗаголовок = Строка(ВТЗ.Колонки[Кол-1].Заголовок);
Иначе
врЗаголовок = Строка(ВТЗ.Колонки[Кол-1].Имя)
КонецЕсли;
Таб.Область(2,Кол+1).Текст = врЗаголовок;
//Таб.Область(2,Кол+1).Шрифт = Новый Шрифт(,,Истина);// жирный
Таб.Область(2,Кол+1).Обвести(ТолстаяЛиния,ТолстаяЛиния,ТолстаяЛиния,ТолстаяЛиния);
врШир = ВТЗ.Колонки[Кол-1].Ширина;
Если врШир > 0 Тогда
Таб.Область(2,Кол+1).ШиринаКолонки = врШир;
КонецЕсли;
КонецЦикла;
i=0;

Для Каждого Ном ИЗ ВТЗ Цикл
i=i+1;
Таб.Область(i+2,1).Текст=Строка(i);
Таб.Область(i+2,1).Обвести(Линия, Линия, Линия, Линия);
Для Кол=1 По ТЗ.Колонки.Количество() Цикл
Таб.Область(i+2,Кол+1).Текст=Строка(ТЗ[i-1][кол-1]);
Таб.Область(i+2,Кол+1).Обвести(Линия, Линия, Линия, Линия);
КонецЦикла;
Если i/10=Цел(i/10) Тогда
//Состояние(Заголовок+", печать: "+Строка(i));
КонецЕсли;
КонецЦикла;

Таб.Вывести(Таб);
Показать
15. XAKEP 04.10.20 18:15 Сейчас в теме
(14)
получилось :)

но я не IT-специалист
просто ПРОФ :)
16. ivnik 612 04.10.20 18:24 Сейчас в теме
(13) Извиняюсь, поторопился и выложил без тэга. (14)-му спасибо, исправил мой косяк.
17. XAKEP 04.10.20 18:27 Сейчас в теме
(16)
готовьте стартмани :)
думаю вам помогут.
18. ivnik 612 04.10.20 18:29 Сейчас в теме
19. leosoft 167 04.10.20 18:40 Сейчас в теме +2 $m
Написал в личку ссылку на внешний отчет!
Проверить не могу - у меня нет Ваших таблиц...
20. ivnik 612 04.10.20 18:44 Сейчас в теме +1 $m
(19) Большое Вам СПАСИБО!!!! Попробую, отпишусь.
21. ivnik 612 04.10.20 22:07 Сейчас в теме
(19) Сбросьте сюда что-нибудь.
22. leosoft 167 04.10.20 22:19 Сейчас в теме +1 $m
Посмотрите в личке ссылку на новую версию!
23. muskul 05.10.20 02:29 Сейчас в теме
Помню в самом начале работы в 2007 году решал такое на 7.7. надо было развернуть контрагентов по талоном в столбики. Ох долго искал все те символы с которыми нельзя создать колонку
24. Dnki 4 05.10.20 18:48 Сейчас в теме
Несколько желтых сообщений смутили: так есть решение или нет?
Если "нет" - напишу, как у меня в ведомости выводится.
Правильно написал (4) antz. Распишу:
Шаг 1 Составить массивы (у меня это ТЗ):
В_Поля = Новый Массив;
В_Сотры = Новый Массив;
Для каждого Строка Из ТЗ Цикл
    Если НЕ В_Поля.Найти(Строка.Начисление)
        В_Поля.Добавить(Строка.Начисление);
    КонецЕсли;
    Если НЕ В_Сотры.Найти(Строка.Сотрудник)
        В_Сотры.Добавить(Строка.Сотрудник);
    КонецЕсли;
КонецЦикла;

Показать


Наверное, оба массива сортировать.
Вывод:
Потом два внутренних цикла. А внутри проход по ТЗ.
Для каждого ТекСотр Из В_Сотры Цикл
    Таб.ВывестиОбласть("Строка|ФИО");
    Для каждого ТекПоле Из В_Поля Цикл
        Для каждого Строка Из ТЗ Цикл
        Если Строка.Сотрудник <> ТекСотр ИЛИ Строка.Начисление <> ТекПоле Тогда
            Продолжить;
        КонецЕсли;
        Таб.ПрисоединитьОюласть("Строка|Колонка");
        КонецЦикла; // ТЗ
    КонецЦикла; // Начи
КонецЦикла; // Сотр

Показать

Текст набросан грубо. Пропущена фаза вывода шапки.
Еще, могут покритиковать за тупой перебор. Иногда можно, все дело в объеме.
25. ivnik 612 05.10.20 20:37 Сейчас в теме
(24) Откровенно говоря, конкретного решения пока нет, меня "сбил" leosoft. Он сделал рабочий вариант, но на СКД, проблема в том, что СКД я не знаю, а эта задача является "скелетом" Отчета и здесь будет еще шапка и куча условий/вариантов. "Тупой перебор" - потому что в Отчет попадает максимум 30-60 документов и в каждом ТЧ максимум по 20 строк. В итоге в печатной форме должно быть максимум 20 колонок и максимум 60 строк.
А ваш вариант очень интересный и мне понравился, я попробую использовать его! Правда здесь используется готовый макет, а у меня макет формировался программно (но с готовым макетом наверняка мне будет проще и понятней). Пока Спасибо за ваш вариант. Отработаю его и напишу, буду рад, если еще что-нибудь "подкинете". А я постараюсь из своего остатка пару Sm подкинуть.
26. antz 06.10.20 12:00 Сейчас в теме +3 $m
(25)

Эхх, молодежь)

Ладно, дарю.
Прикрепленные файлы:
ВнешняяОбработка1.epf
marinelle; ivnik; Dnki; +3 Ответить
27. ivnik 612 06.10.20 12:37 Сейчас в теме
(26) Большое СПАСИБО!!!!
Не молодежь, а пенсионер-самоучка, (который не учился ни на каких курсах). :)
28. Dnki 4 06.10.20 21:04 Сейчас в теме
(26) Посмотрел. Вот это энтузиазм! Восхищаюсь.
29. ivnik 612 06.10.20 22:12 Сейчас в теме
(26) Вот это то, что надо! Супер! + кое-что для меня новое и возьму на "вооружение". Огромное СПАСИБО!!!
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот