Имя: Пароль:
1C
 
СКД - Удалить колонки программно
0 Надмозг
 
14.04.21
17:42
Нужно не выводить в отчет колонки в зависимости от выбранных параметров
Обхожу коллекцию элементов
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
КоллекцияЭлементов = Настройки.Выбор.Элементы;

и удаляю из нее поле

Все работает до тех пор, пока поля настроены на корневом уровне (Закладка СКД Настройки, уровень - Отчет), и если на уровне группировок и детальных записей поля задаются автополем. Но если не автополем, а на уровне группировок и детальных записей поля настроены вручную, то удаляемая колонка остается в отчете, даже если удалить из КоллекцияЭлементов.

Понятно, что мешает присутствие этой колонки в одной из группировок или детальных записях. В связи с этим вопрос. Как удалить колонку на всех уровнях?
1 vicof
 
14.04.21
18:04
Сделать n вариантов отчета, и программно выводить нужный вариант в зависимости от выбранных параметров.
2 МихаилМ
 
14.04.21
18:07
мне в таких случаях помогает обработка convertskd. она  из схемы скд генерирует её программное создание.
3 toypaul
 
гуру
14.04.21
18:17
если научился обходить Выбор, то до обхода Структура не так много осталось
4 Classic
 
14.04.21
19:57
(3)
Разные по сложности задачи
5 Надмозг
 
15.04.21
09:59
(1) это плохо, т.к. возможны пользовательские варианты
(2) спасибо, посмотрю
(3) а я стал разбирать, что там в структуре, но не нашел нужного поля. Выглядит, будто там одни группировки, а мое поле - ресурс в детальных записях
6 toypaul
 
гуру
15.04.21
10:24
(5) в синтаксис помощник не пробовал смотреть?
7 SleepyHead
 
гуру
15.04.21
10:29
(0) Две процедуры, одна рекурсивная... Не так это и сложно

Пример:

ВыключитьВидимостьПолей(Настройки, "Сумма");

реализация:

-----------------

Процедура ВыключитьВидимостьПолейРекурсивно(Стр, МассивПолей)
Перем Поле,ПолеГруппы,ПодСтр,Коллекция;

    Если ТипЗнч(Стр)=Тип("НастройкиКомпоновкиДанных") Тогда
        Коллекция=Стр.Структура
    ИначеЕсли ТипЗнч(Стр)=Тип("КоллекцияЭлементовСтруктурыНастроекКомпоновкиДанных") ИЛИ ТипЗнч(Стр)=Тип("КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных") Тогда
        Коллекция=Стр
    Иначе
        Возврат;
    КонецЕсли;

    Для Каждого ПодСтр Из Коллекция Цикл
        Для Каждого Поле из ПодСтр.Выбор.Элементы Цикл
            Если ТипЗнч(Поле)=Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда
                Для Каждого ПолеГруппы из Поле.Элементы Цикл
                    Если МассивПолей.Найти(ПолеГруппы.Поле)<>Неопределено Тогда
                        ПолеГруппы.Использование=Ложь
                    КонецЕсли;
                КонецЦикла;
            ИначеЕсли ТипЗнч(Поле)=Тип("АвтоВыбранноеПолеКомпоновкиДанных") Тогда
                Продолжить
            ИначеЕсли МассивПолей.Найти(Поле.Поле)<>Неопределено Тогда
                Поле.Использование=Ложь
            КонецЕсли;
        КонецЦикла;
        Если ТипЗнч(ПодСтр)=Тип("ГруппировкаКомпоновкиДанных") ИЛИ ТипЗнч(ПодСтр)=Тип("ГруппировкаТаблицыКомпоновкиДанных") Тогда
            ВыключитьВидимостьПолейРекурсивно(ПодСтр.Структура, МассивПолей);
        ИначеЕсли ТипЗнч(ПодСтр)=Тип("ТаблицаКомпоновкиДанных") Тогда
            Для Каждого СтрТаблицы из ПодСтр.Строки Цикл
                ВыключитьВидимостьПолейРекурсивно(СтрТаблицы.Структура, МассивПолей);
            КонецЦикла;
            Для Каждого СтрТаблицы из ПодСтр.Колонки Цикл
                ВыключитьВидимостьПолейРекурсивно(СтрТаблицы.Структура, МассивПолей);
            КонецЦикла;
        Иначе
            А=1;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Процедура ВыключитьВидимостьПолей(Поля, НастройкиСКД)

    МассивПолей=Новый Массив;
    Если ТипЗнч(Поля)=Тип("Массив") Тогда
        МассивПолей=Поля
    ИначеЕсли ТипЗнч(Поля)=Тип("Строка") И ЗначениеЗаполнено(Поля) Тогда
        Для Каждого Имя Из СтрокаВМассив(Поля) Цикл
            МассивПолей.Добавить(Новый ПолеКомпоновкиДанных(Имя));
        КонецЦикла;
    КонецЕсли;

    Если МассивПолей.Количество()=0 Тогда
        Возврат
    КонецЕсли;

    Для Каждого Поле из НастройкиСКД.Выбор.Элементы Цикл
        Если ТипЗнч(Поле)=Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда
            Для Каждого ПолеГруппы из Поле.Элементы Цикл
                Если МассивПолей.Найти(ПолеГруппы.Поле)<>Неопределено Тогда
                    ПолеГруппы.Использование=Ложь
                КонецЕсли;
            КонецЦикла;
        Иначе
            Если МассивПолей.Найти(Поле.Поле)<>Неопределено Тогда
                Поле.Использование=Ложь
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;

    ВыключитьВидимостьПолейРекурсивно(НастройкиСКД, МассивПолей);
КонецПроцедуры
8 ЧессМастер
 
22.04.21
15:25
(3) >если научился обходить Выбор, то до обхода Структура не так много осталось

(6) >в синтаксис помощник не пробовал смотреть?


Эхх, а раньше как хорошо было. Пожно было задать нетривиальный вопрос и тебе ответили бы. А не послали бы читать ЖКК.

Отвечу на вопросы по СКД. Помогу решить проблему с СКД
9 acht
 
22.04.21
15:35
(8) Аксиома Коула
10 toypaul
 
гуру
22.04.21
15:38
(8) так это тривиальный вопрос
11 ЧессМастер
 
22.04.21
15:45
(10) >так это тривиальный вопрос

Для кого ? Для тебя ? Возможно.

А сколько ты лет прокачивал свой скилл по СКД что для тебя эти вопросы стали тривиальными ?

Ты понимаешь что любой вопрос становится тривиальным когда один раз через него пройдешь?

А до этого ты должен или где то этот пример найти (в книгах, в программе) или тебе это должны показать коллеги.


Открой ту же книгу Хрусталевой по СКД. Там ничего подобного нет. Одна вода в стиле "для того чтобы делать отчеты на СКД надо делать отчеты на СКД". А шаг вправо шаг влево от типовых вариантов и сидите разбирайтесь сами.
12 ЧессМастер
 
22.04.21
15:47
Тем более когда задают вопрос на Мисту делаю это в жесточайшем цейтноте. Когда тебе на работе никто не даст неделю сидеть читать и разбираться как это сделать.
13 acht
 
22.04.21
16:00
(12) > делаю это в жесточайшем цейтноте. Когда тебе на работе никто не даст

А миста тут причем?
14 ЧессМастер
 
22.04.21
17:43
(13) Миста это место где БЫСТРО можно получить квалифицированный ответ в условиях жесткого цейтнота на решение задачи.

Можно конечно получить ответ типа

(3) >если научился обходить Выбор, то до обхода Структура не так много осталось

(6) >в синтаксис помощник не пробовал смотреть?

но обычно если человек навел время на прочтение ветки то отвечает по существу.
15 ЧессМастер
 
22.04.21
17:48
(13) Я просто каждый раз удивляюсь - если у человека нет времени / желания отвечать на вопрос который поднял топикстартер зачем заходить в ветку и упражняться в остроумии ?

Такое впечатление что у тех кто так делает глубокая психологическая травма от того что они когда-то задали вопрос а их в ответ психологически унижали и насмехались. Вот они и отыгрываются сейчас.
16 hhhh
 
22.04.21
17:49
(0) делай после скд

ТабДок.УдалитьОбласть()
17 Chameleon1980
 
22.04.21
21:17
просто ответы очевидны, я думаю
18 acht
 
22.04.21
21:38
(14) У тебя реально сбиты приоритеты.

> Миста это место где БЫСТРО можно
Миста это место где быстро МОЖНО. А можно и не.

(15) > Вот они и отыгрываются сейчас.
И жалуются на это на форумах, да.
19 ЧессМастер
 
23.04.21
19:54
(18) >И жалуются на это на форумах

Я ни на кого не жалуюсь.
Я просто не понимаю зачем тратить свое рабочее время чтобы прийти в ветку и написать что то типа

>(3) >если научился обходить Выбор, то до обхода Структура не так много осталось

>(6) >в синтаксис помощник не пробовал смотреть?


Вот ты ходишь за мной по всем веткам и комментируешь мои комментарии. Ни одного комментария по делу не было. Одна хрень типа "расскажи лучше о истории с ноутбуком".
20 ДедМорроз
 
23.04.21
21:45
Программно все удаляется и собирается.
Вся СКД может быть построена программно от начала до конца.
Читаем документацию и не задаем вопросов.
21 acht
 
24.04.21
00:03
(19) > Одна хрень типа "расскажи лучше о истории с ноутбуком"
О, спасибо что напомнил. Чем там кончилось-то, какая твоя роль была? Ты так беспокоился, у тебя все нормально?
22 Chameleon1980
 
24.04.21
04:37
(0) как же вы не поймете
когда тебе говорят что-то типа "не так много осталось"
значит, что ты идёшь в верном направлении
радуйся
всем бля дай рабочий код
да так ничему не научитесь
речь не про данную ситуацию, а вообще
я считаю, что правильный наставник, который намекнет, а
не сделает за тебя
для готового кода спрашивайте гугла
разговора нет, что кто-то может поделиться
изящным решением в какой-то ситуации
но тут до решения осталось пару шагов и автор руки опускает
ооой, мне никто толком помочь не хочет
сказали же (да и додуматься же просто правда) - доберусь до полей
схемы и рули ими
мыслей много по подобным ситуациям, а нормально выразить (тб сутра)
толком не могу. но бесит, когда советы не считают за помощь
Программист всегда исправляет последнюю ошибку.