Имя: Пароль:
1C
 
СКД. Как убрать столбцы ресурсов с пустыми значениями?
0 chigsrOck
 
17.06.10
10:09
Есть отчет в СКД. Выводятся куча ресурсов, причем некоторые из ресурсов могут быть пустыми (т.е. все значения в столбце и итог=0).Можно как-нить средствами скд скрывать(не выводить в отчет) такие ресурсы? спасибо
1 IronDemon
 
17.06.10
10:27
Средствами СКД - нет
2 chigsrOck
 
17.06.10
10:28
(1) а как тогда?
3 IronDemon
 
17.06.10
10:31
Выгрузить результат в ТЗ, проанализировать, программно убрать ненужные ресурсы в схеме, вывести.
4 Xrg
 
17.06.10
11:18
(3)
Можно и без выгрузки в ТЗ.

По каждому из ресурсов которые необходимо скрывать/показывать в условном оформлении создать по паре исключающих условий (в данном случае на равенство/неравенство нулю) и задать параметры оформления "Минимальная ширина" и "Максимальная ширина".

Только для условия в котором надо скрывать колонку указывать значение этих параметров надо =0,1
5 chigsrOck
 
17.06.10
11:23
(3) угу. смысл понятен. можете подсказать тогда как заставить скд передать результат запроса в ТЗ? Можно конечно в модуле ввести упрощенный запрос, и передать туда значения параметров, но это будет долго...
(4) не совсем понятно. нужно как-то получить общий ИТОГ по каждому ресурсу и если он = 0 - менять ширину его колонки. Как это намутить?
6 luns
 
17.06.10
11:28
(5) ну вон же в (3) ответ верный. и сделать просто.
7 Xrg
 
17.06.10
11:28
(5)
Итог имеет обыкновение идти последней строкой. По нему и сработает условие.
Разумеется, должны быть либо включены автоитоги или сформированы самостоятельно.
8 luns
 
17.06.10
11:35
(7) вот пример работы в компоновке с тз.


Процедура ВыполнитьОтчет() Экспорт
   
   ЭлементыФормы.ТабДок.Очистить();
   ЗаголовокОтчета = "Сводный отчет по начисленным премиям ";
   ДопЧасть = "контрагентам";
   
   //////////////////////////////////////////
   //  ЭТАП 1. ПОЛУЧЕНИЕ ТАБЛИЦЫ ЗНАЧЕНИЙ  //
   //////////////////////////////////////////
   
   СхемаКомпоновкиДанных = ПолучитьМакет("НачальнаяСхемаКомпоновкиДанных");
   ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных);
   
   Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
   КомпоновщикНастроекПервый = Новый КомпоновщикНастроекКомпоновкиДанных;
   КомпоновщикНастроекПервый.Инициализировать(ИсточникДоступныхНастроек);
   КомпоновщикНастроекПервый.ЗагрузитьНастройки(Настройки);
   
   // установка периода
   ПараметрКомпоновкиДанных = КомпоновщикНастроекПервый.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("НачалоПериода"));
   Если ПараметрКомпоновкиДанных <> Неопределено Тогда
       ПараметрКомпоновкиДанных.Значение = ДатаНач;
       ПараметрКомпоновкиДанных.Использование = Истина;
   КонецЕсли;
   
   ПараметрКомпоновкиДанных = КомпоновщикНастроекПервый.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("КонецПериода"));
   Если ПараметрКомпоновкиДанных <> Неопределено Тогда
       ПараметрКомпоновкиДанных.Значение = ?(ДатаКон = '00010101', ДатаКон, КонецДня(ДатаКон));
       ПараметрКомпоновкиДанных.Использование = Истина;
   КонецЕсли;
   
   // установка отборов из основных настроек
   Отбор = КомпоновщикНастроекПервый.Настройки.Отбор;
   
   ПолеВидБонуса = Новый ПолеКомпоновкиДанных("ВидБонуса");
   Для Каждого Элемент Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
       НовыйЭлемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
       НовыйЭлемент.Использование  = Элемент.Использование;
       НовыйЭлемент.ЛевоеЗначение  = Элемент.ЛевоеЗначение;
       НовыйЭлемент.ВидСравнения   = Элемент.ВидСравнения;
       НовыйЭлемент.ПравоеЗначение = Элемент.ПравоеЗначение;
       Если НовыйЭлемент.ЛевоеЗначение = ПолеВидБонуса И Элемент.Использование Тогда
           ВидБонуса = НовыйЭлемент.ПравоеЗначение;
           Если ВидБонуса = Справочники.д_ВидыБонусов.ПремияЗаВыполнениеЕжемесячногоПланаПоОбъемамЗакупок Тогда
               ДопЧасть = "за выполнение ежемесячного плана по объему закупок";
           ИначеЕсли ВидБонуса = Справочники.д_ВидыБонусов.КвартальнаяПремия Тогда
               ДопЧасть = "за выполнение квартального плана по объему закупок";
           ИначеЕсли ВидБонуса = Справочники.д_ВидыБонусов.ПремияЗаВыполнениеЕжемесячныхПлановПоПриоритетнымЗаданиям Тогда
               ДопЧасть = "за выполнение плана по приоритетным заданиям";
           ИначеЕсли ВидБонуса = Справочники.д_ВидыБонусов.ПремияЗаАссортимент Тогда
               ДопЧасть = "за ассортимент";
           КонецЕсли;
       КонецЕсли;
   КонецЦикла;
   
   // Удалим лишние поля
   ПолеНомерИзвещения = Новый ПолеКомпоновкиДанных("НомерИзвещения");
   ПолеСтавка         = Новый ПолеКомпоновкиДанных("Ставка");
   ПолеИзвещение      = Новый ПолеКомпоновкиДанных("Извещение");
   Если Не ВыводитьИзвещения Тогда
       ВыбранныеПоля = КомпоновщикНастроекПервый.Настройки.Выбор.Элементы;
       Количество = ВыбранныеПоля.Количество();
       Для Счетчик = 1 По Количество Цикл
           Если ВыбранныеПоля[Количество-Счетчик].Поле = ПолеНомерИзвещения
            Или ВыбранныеПоля[Количество-Счетчик].Поле = ПолеИзвещение Тогда
           
               ВыбранныеПоля.Удалить(ВыбранныеПоля[Количество-Счетчик]);
           КонецЕсли;
       КонецЦикла;
   КонецЕсли;
   
   // Выполнение компоновки
   ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
   
   КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
   МакетКомпоновки = КомпоновщикМакета.Выполнить(
       СхемаКомпоновкиДанных,
       КомпоновщикНастроекПервый.Настройки,
       ДанныеРасшифровки,
       , // МакетОформления
       Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")
   );
   
   ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
   ПроцессорКомпоновки.Инициализировать(
       МакетКомпоновки,
       , // ВнешниеНаборыДанных
       ДанныеРасшифровки
   );
   
   ТаблицаДанных = Новый ТаблицаЗначений;
   ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений();
   ПроцессорВывода.УстановитьОбъект(ТаблицаДанных);
   ТаблицаДанных = ПроцессорВывода.Вывести(
       ПроцессорКомпоновки,
       Истина // Воможность прерывания пользователем
   );
   
   // Преобразование периода и номеров извещений (то, ради чего создается ТЗ)
   ТаблицаДанных.Колонки.Добавить("Период", ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(20));
   
   Если Не ВыводитьИзвещения Тогда
       ТаблицаДанных.Колонки.Добавить("НомерИзвещения", ОбщегоНазначения.ПолучитьОписаниеТиповЧисла(1));
   КонецЕсли;
   
   Для Каждого ТекСтрока Из ТаблицаДанных Цикл
       
       ТекСтрока.Период = ПолучитьПериод(ТекСтрока.ПериодРасчета, ТекСтрока.Периодичность);
       
       Если ВыводитьИзвещения Тогда
           ТекСтрока.НомерИзвещения = д_Общий.ПолучитьЧислоИзКодаНомера(ТекСтрока.НомерИзвещения);
       КонецЕсли;
       
   КонецЦикла;
   
   ///////////////////////////////////////////////////////////////
   //  ЭТАП 2. ПЕРЕДАЧА ТАБЛИЦЫ ЗНАЧЕНИЙ В ОСНОВНУЮ КОМПОНОВКУ  //
   ///////////////////////////////////////////////////////////////
   
   НаборДанных = Новый Структура("ТаблицаДанных", ТаблицаДанных);
   
   СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
   ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
   Настройки = КомпоновщикНастроек.Настройки;
   
   // Переключение поля "№ извещения"
   ВыбранныеПоля = Настройки.Выбор.Элементы;
   Для Счетчик = 0 По ВыбранныеПоля.Количество()-1 Цикл
       Если ВыбранныеПоля[Счетчик].Поле = ПолеНомерИзвещения
        Или ВыбранныеПоля[Счетчик].Поле = ПолеСтавка Тогда
           
           ВыбранныеПоля[Счетчик].Использование = ВыводитьИзвещения;   // Выключаем поле
           
       КонецЕсли;
   КонецЦикла;
   
   
   // Отключаем общие итоги, если номера извещений
   НастройкаИтогов = Настройки.ПараметрыВывода.Элементы.Найти("ГоризонтальноеРасположениеОбщихИтогов");
   Если Не НастройкаИтогов = Неопределено Тогда
       НастройкаИтогов.Использование = Истина;
       НастройкаИтогов.Значение = ?(ВыводитьИзвещения, РасположениеИтоговКомпоновкиДанных.Нет,
                                                       РасположениеИтоговКомпоновкиДанных.Авто);
   КонецЕсли;
   
   НастройкаЗаголовка = Настройки.ПараметрыВывода.Элементы.Найти("Заголовок");
   Если Не НастройкаЗаголовка = Неопределено Тогда
       НастройкаЗаголовка.Значение = ЗаголовокОтчета + ДопЧасть;
   КонецЕсли;
   
   // Выполнение компоновки
   КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
   МакетОформления = ПолучитьМакет("МакетОформления");
   МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки, МакетОформления);
   
   ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
   ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, НаборДанных, ДанныеРасшифровки);
   
   ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
   ПроцессорВывода.УстановитьДокумент(ЭлементыФормы.ТабДок);
   ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
   
КонецПроцедуры
9 chigsrOck
 
17.06.10
12:16
Спасибо, будем разбираться:)
10 Eugeneer
 
17.06.10
12:19
ТЗ фигня- расшифровки сразу уходят в аут.
11 Eugeneer
 
17.06.10
12:20
Думаю что с ТЗ еще вылезет точно что нибудь урезающее функционал.
12 sergeante
 
17.06.10
12:45
(0) А если проанализировать уже готовый табличный документ с результатом. Пройтись по нужным колонкам, посмотреть наличие нулевого итога, и скрыть колонку долой?
13 Eugeneer
 
17.06.10
12:49
(12) а если структура будет сложной? например 3 отчеты разных.
14 sergeante
 
17.06.10
12:57
(13) ну это как вариант просто.
15 chigsrOck
 
17.06.10
13:16
(12) это будет геморрой, у самой таблицы довольно сложная стр-ра + в поле выводятся 2 таблицы...
16 Eugeneer
 
17.06.10
14:17
Может попробовать в СКД на первой закладке у нужных ресурсов поставить игнорировать NULL, но тогда нужно будет везде в запросе ставить Выбор когда иначе NULL
17 Eugeneer
 
17.06.10
14:17
это отлично работает в случае пустых измерений
18 Eugeneer
 
17.06.10
14:18
тоесть надо будет ставить условие если > 0 тогда Иначе NULL. По идее тогда если у ресурса будет NULL эта колонка выводится не будет.
19 chigsrOck
 
17.06.10
15:07
(16) интересно. а где в настройках ставится "игнорировать null"?
20 luns
 
17.06.10
15:10
(10) нормально все. пяток таких отчетов сделал - пока ни жалились.
21 chigsrOck
 
17.06.10
15:17
(16) кстати не может быть траблов с null если ресурс этот используется в формулах?
22 ABCD
 
17.06.10
17:33
(19) В колонке "Роль"  поля компоновки данных флажок "Игнорировать значения NULL"
(21) Если имеются ввиду траблы с формулами для ресурсов, то траблов с NULL не наблюдал
23 Eugeneer
 
17.06.10
21:35
(21) так есть же не запрос а страница СКД где по любому уже конечные ресурсы определяется. там можно выбор и ставить.
24 Eugeneer
 
17.06.10
21:36
Только одна проблема. Я еще днем протестировал - не заработало. Уже ставил чо угодно. Для измерений с типом справочник работает без проблем.
25 chigsrOck
 
17.06.10
22:50
(24) спасибо. да, я тоже проверил - фокус не удался:))
Закон Брукера: Даже маленькая практика стоит большой теории.