Имя: Пароль:
1C
1С v8
Переформатирование ТЗ на форме
,
0 trialex3
 
13.07.22
16:20
Добрый день. Прошу помощи. Есть на управляемой форме таблица значений типа:

Наименование Характеристика Количество
Яблоко       Красное        1
Яблоко       Зеленое        1

Как самый простой способ получить ТЗ но уже в виде:

Наименование Красное Зеленое
Яблоко       1       1
1 Михаил Козлов
 
13.07.22
16:22
Я если будет еще:
Груша Большая 1
Груша Маленькая 1
как Вы видите таблицу?
2 6awkup_true
 
13.07.22
16:36
Что то типо того. (МММ, Извращения)

тз = новый ТаблицаЗначений;
тз.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("Справочник.Номенклатура"), "Номенклатура");

КолонкиХарактеристик = ТвояТаблица.Выгрузить().ВыгрузитьКолонку("Характеристика");
КолонкиХарактеристик.Свернуть("Характеристика");

Для каждого Колонка из КолонкиХарактеристик цикл
    ТЗ.Колонки.Добавить(Колонка.Наименование, Новый ОписаниеТипов("Справочник.Характеристики"), Колонка.Наименование);
КонецЦикла;

МассивОбработаннойНоменклатуры = Новый массив;

Для Каждого Номенклатура из ТвояТаблица Цикл

    Если МассивОбработаннойНоменклатуры.Найти(Номенклатура.Номенклатура) = Неопределено тогда
        НовСтр = Тз.Добавить();
        НовСтр.Номенклатура = Номенклатура.Номенклатура;
        Строки = ТвояТаблица.НайтиСтроки("Номенклатура", Номенклатура.Номенклатура);
        Для каждого Строка из Строки цикл
            НовСтр[Строка.Номенклатура.Наименование]     = Строка.Количество;        
        КонецЦикла;
        МассивОбработаннойНоменклатуры.Добавить(Номенклатура.Номенклатура);
    КонецЕсли;    
        
КонецЦикла;
3 trialex3
 
13.07.22
16:37
(1) Характеристика будет только 1.
4 6awkup_true
 
13.07.22
16:38
(2) ошибка. тип колонки будет не Справочник.Характеристики, а строка(или число)
5 Kassern
 
13.07.22
16:41
(0) Создаете макет со схемой компоновки данных. Передаете в него таблицу с данными, и через структуру выводите так как вам надо, можно сразу на форму в виде таб дока, можно хоть в ТЗ.
6 trialex3
 
13.07.22
16:46
(4) Спасибо буду пробовать...
7 vicof
 
13.07.22
16:53
А я бы деревом сделал
8 trialex3
 
13.07.22
16:57
(7) А я бы сам деревом сделался - код ошибки выдает, а с СКД программно впервые сталкиваюсь. Пошел курить программное создание СКД...
9 Kassern
 
13.07.22
17:05
(8) там ничего сложного, вместо набора-запрос, выбираете набор-объект. Указываете Имя таблицы и создаете какие поля будут. Программно лишь передаете в параметр с именем таблицы саму ТЗ.
10 trialex3
 
13.07.22
17:16
(9) https://softonit.ru/articles/1c/skd-i-tablitsy-znacheniy/ ну я вроде нашел инструкцию - буду пробовать
11 trialex3
 
27.07.22
11:45
да блин чо ж так сложно то. Кто может помочь накидать алгоритм для переделки левой таблицы в правую?
Даже названия колонок не могу сделать - оказывается нельзя в названия пихать текст с цифрами.
https://yadi.sk/d/u-CFGyn790V1aw
12 trialex3
 
27.07.22
11:46
Выручите плиз. С меня пиво(
13 trialex3
 
27.07.22
11:47
колонки нагрузка Л, нагрузка П, с ошибками, без ошибок вообще в финальной тз не нужны.
14 RomanYS
 
27.07.22
11:48
(11) Тебе ТЗ нужно или ТабДок на форме?
15 trialex3
 
27.07.22
11:49
(14) У меня на форме лежит ТЗ (ну коллекция данных формы) и есть на форме другая тз - финал
16 Кура-Цеце
 
27.07.22
11:53
(12) > С меня пиво
От пива тупеют.
17 trialex3
 
27.07.22
12:01
(16) В разумных количествах все хорошо
18 Ёпрст
 
27.07.22
12:08
(11) новые колонки создавай обезличенно, просто колонка1, колонка2,...колонкаN. А вот заголовок им давай из своих значений - красное, зеленое, $%#еще какое неподтребство, которое нельзя пихать в идентификатор колонки№;;
19 RomanYS
 
27.07.22
12:11
(15) Цель лежания на форме? Если просто показать, замени на ТД и используй СКД или построитель.
20 trialex3
 
27.07.22
12:30
(19) Показать и потом рассылкой всем разослать
21 RomanYS
 
27.07.22
12:34
(20) тем более ТД, не нужна тебе ТЗ с колонками
22 trialex3
 
27.07.22
13:45
Я хоть в верном направлении иду?

&НаКлиенте
Процедура ВывестиВТабДок()
    НовыйСКД = Новый СхемаКомпоновкиДанных();
    
    Источник = НовыйСКД.ИсточникиДанных.Добавить();
    Источник.Имя = "ИсточникДанных1";
    Источник.СтрокаСоединения = "";
    Источник.ТипИсточникаДанных = "Local";
    
    НаборДанных2 = НовыйСКД.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
    НаборДанных2.Имя = "НаборДанных2";
    НаборДанных2.ИмяОбъекта = "ВнешняяТЗ";
    НаборДанных2.ИсточникДанных = "ИсточникДанных1";
    
    ДобавленноеПоле = НаборДанных2.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
    ДобавленноеПоле.Заголовок = "Характеристика";
    ДобавленноеПоле.ПутьКДанным = "Характеристика";
    ДобавленноеПоле.Поле = "Характеристика";
    ДобавленноеПоле.ТипЗначения = Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(20));
    
    ДобавленноеПоле = НаборДанных2.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
    ДобавленноеПоле.Заголовок = "Нагрузка";
    ДобавленноеПоле.ПутьКДанным = "Нагрузка";
    ДобавленноеПоле.Поле = "Нагрузка";
    ДобавленноеПоле.ТипЗначения = Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(20));

    ДобавленноеПоле = НаборДанных2.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
    ДобавленноеПоле.Заголовок = "Количество";
    ДобавленноеПоле.ПутьКДанным = "Количество";
    ДобавленноеПоле.Поле = "Количество";
    ДобавленноеПоле.ТипЗначения = Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(10,0));
    
    ВыбранноеПоле = НовыйСКД.ВариантыНастроек[0].Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
    ВыбранноеПоле.Использование = Истина;
    ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Характеристика");
    
    ВыбранноеПоле = НовыйСКД.ВариантыНастроек[0].Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
    ВыбранноеПоле.Использование = Истина;
    ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Нагрузка");
    
    ВыбранноеПоле = НовыйСКД.ВариантыНастроек[0].Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
    ВыбранноеПоле.Использование = Истина;
    ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Количество");
    
    Структура = НовыйСКД.ВариантыНастроек[0].Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
    Структура.Использование = Истина;
    Структура.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
    Структура.Порядок.Элементы.Добавить(Тип("АвтоЭлементПорядкаКомпоновкиДанных"));
    
    СтруктураСТЗ = Новый Структура;
    СтруктураСТЗ.Вставить("ВнешняяТЗ",ТестированиеПодробно);
    
    Настройки = НовыйСКД.НастройкиПоУмолчанию;
    ДанныеРасшифровкиСКД = Новый ДанныеРасшифровкиКомпоновкиДанных;
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(НовыйСКД,Настройки, ДанныеРасшифровкиСКД);
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, СтруктураСТЗ ,ДанныеРасшифровкиСКД);
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ТабДок);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
    
КонецПроцедуры
23 trialex3
 
27.07.22
13:51
Еще не на клиента а на сервере сделал и коллекцию в ТЗ выгрузил.
СтруктураСТЗ = Новый Структура;
СтруктураСТЗ.Вставить("ВнешняяТЗ",ДанныеФормыВЗначение(ТестированиеПодробно,Тип("ТаблицаЗначений")));

ругается

Ошибка при вызове метода контекста (Инициализировать)
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, СтруктураСТЗ ,ДанныеРасшифровкиСКД);
по причине:
Ошибка компоновки данных
по причине:
Ошибка инициализации
по причине:
Не найдено поле замены "Нагрузка"
24 trialex3
 
10.08.22
13:16
Нашел вариант через сводные таблицы решить, делаю по примеру из ИТС, но ругается что ИсточникДанных принимает неверное значение, хотя в справке ИТС ясно написано что РезультатЗапроса подходит.
Ошибка:

{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(34)}: Ошибка при установке значения атрибута контекста (ИсточникДанных)
    СводТаб.ИсточникДанных = РезультатЗапроса;
по причине:
Недопустимое значение

Код:

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

    СводТаб.ИсточникДанных = РезультатЗапроса;
    СводТаб.ОтображатьПоля = Истина;
    
    СводТаб.Обновление = Ложь;
    СводТаб.Строки.Добавить(СводТаб.Поля.Характеристика);
    СводТаб.Строки.Добавить(СводТаб.Поля.Номенклатура);
    СводТаб.Колонки.Добавить(СводТаб.Поля.Показатель);
    СводТаб.Данные.Добавить(СводТаб.Поля.Количество);
    СводТаб.Обновление = Истина;
25 trialex3
 
10.08.22
13:18
Тип реквизита РезультатЗапроса - РезультатЗапроса
26 trialex3
 
10.08.22
13:28
Пример из справки

РезультатЗапроса = Запрос.Выполнить();

ТабДок = ЭлементыФормы.ПолеТабличногоДокумента1;
СводТаб = ТабДок.ВстроенныеТаблицы.СводнаяТаблица1;
СводТаб.ИсточникДанных = РезультатЗапроса; //самое важное!
СводТаб.ОтображатьПоля = Истина;

Что не так то?)
27 trialex3
 
10.08.22
13:59
А если ТЗ сначала передать в посртоитель и потом уже  в сводную таблицу то все ОК. Странно...

Код:

    Ист=Новый ОписаниеИсточникаДанных;
    Ист.ИсточникДанных=ТабличнаяЧасть1;
    Ист.Колонки.Характеристика.Измерение=Истина;
    Ист.Колонки.Номенклатура.Измерение=Истина;
    Ист.Колонки.Показатель.Измерение=Истина;
    Ист.Колонки.Количество.Итог="Сумма(Количество)";
    
    Постр=Новый ПостроительОтчета;
    Постр.ИсточникДанных=Ист;
    Постр.Выполнить();
    
    ТабДок = ЭлементыФормы.ПолеТабличногоДокумента1;
    ТабДок.ВстроенныеТаблицы.Добавить(Тип("СводнаяТаблица"));
    СводТаб = ТабДок.ВстроенныеТаблицы.СводнаяТаблица1;

    СводТаб.ИсточникДанных = Постр;
    СводТаб.ОтображатьПоля = Истина;
    
    СводТаб.Обновление = Ложь;
    СводТаб.Строки.Добавить(СводТаб.Поля.Характеристика);
    СводТаб.Строки.Добавить(СводТаб.Поля.Номенклатура);
    СводТаб.Колонки.Добавить(СводТаб.Поля.Показатель);
    СводТаб.Данные.Добавить(СводТаб.Поля.Количество);
    СводТаб.Обновление = Истина;
28 trialex3
 
10.08.22
14:20
Кстати знает кто как отключить итоги в сводной таблице? И те которые отдельной колонкой идут и те которые снизу?
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой