Имя: Пароль:
1C
1С v8
Прошу помощи: вывод таблицы значений через СКД
0 Eugene_life
 
18.02.15
15:01
Прочитал множество ссылок, сделал простой пример - ТЗ из одной колонки, типизированной, нужно вывести в отчет на СКД. С помощью описаний, я смог это сделать, но, увы, не работают отборы в полученном отчете.
Для совсем горячих голов, повторюсь - отчет выводит мою ТЗ, но отборы, установленные через настройки СКД не работают в принципе.
Сам я подозреваю, что это связано с тем, что в процедуре «ПриКомпоновкеРезультата» установлено «СтандартнаяОбработка = ЛОЖЬ;»
Кто сталкивался с этим и знает решение, прошу оказать помощь.
1 Timon1405
 
18.02.15
15:09
(0) а в ролях полей измерения прописаны?
2 Eugene_life
 
18.02.15
15:12
(1) Нет, не прописаны
А там что можно прописать? У меня тип поля - строка
3 Teresa
 
18.02.15
15:14
(0) так отчет программно выводится?
4 Eugene_life
 
18.02.15
15:15
(3) Отчет выводится. Но через настройки СКД делаю отбор - он не применяется.
5 Timon1405
 
18.02.15
15:16
(4) код вывода-то покажете?
6 Teresa
 
18.02.15
15:16
(4) я имею ввиду отчет выводится _программно_?
7 Eugene_life
 
18.02.15
15:17
(5)
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = ЛОЖЬ;
    
    ВнешниеНаборыДанных = Новый Структура;
    ВнешниеНаборыДанных.Вставить("ТЗ",ТЗ);
    
    СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
    
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,  Настройки);
    
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных);  
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
    
КонецПроцедуры
8 Eugene_life
 
18.02.15
15:19
(6) Да, отчет выводится программно. При открытии формы отчета заполняется ТЗ (реквизит отчета), по кнопке "Сформировать" выводится моя ТЗ в поле результата. Но отборы мне не победить
9 Timon1405
 
18.02.15
15:20
(7) >>Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
не настораживает??
попробуйте
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, );
10 Alexaha
 
18.02.15
15:20
(7) МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,  Настройки);
проверь в отладчие что у тебя с отбором в Настройки
11 Eugene_life
 
18.02.15
15:24
(10) в Настройки в отборе такое:
ДоступныеПоляОтбора - Элементы
вообще пусто
12 Teresa
 
18.02.15
15:47
имеет смысл покопать в сторону программного отбора
v8: Как в СКД программно установить отбор?
13 Timon1405
 
18.02.15
15:50
автор, куда пропал, ответь на (9)
14 Eugene_life
 
18.02.15
15:52
(12), (13) По ходу, дело в том, что настройки отбора надо формировать также программно. Сейчас подсказали умные люди, как это в принципе можно реализовать. Пока пробую через программный отбор.
15 Teresa
 
18.02.15
15:52
(13) если стандартная обработка отключена, не будет его отбор работать по умолчанию
16 Eugene_life
 
18.02.15
15:55
(15) + 1, согласен. Хотя.. возможно ведь, что мой код перезаписывает отбор принудительно. Сейчас проверю.
17 Alexaha
 
18.02.15
16:01
(11) его отбор находится в КомпоновщикНастроек.ПользовательскиеНастройки
18 Eugene_life
 
18.02.15
16:06
(17) Действительно.. А их можно просто "загрузить" в настройки отчета?
19 Teresa
 
18.02.15
16:06
(17) в любом случае, придется отбор программно делать.
20 Alexaha
 
18.02.15
16:11
(18) как то я это делал, пытаюсь вспомнить...
21 Teresa
 
18.02.15
16:21
КомпоновщикНастроек.ЗагрузитьНастройки(ТвоиПользовательскиеНастройки);
22 Eugene_life
 
18.02.15
16:22
На данный момент у меня вот так:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = ЛОЖЬ;
    
    ВнешниеНаборыДанных = Новый Структура;
    ВнешниеНаборыДанных.Вставить("ТЗ",ТЗ);
    
    СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    
    Настройки = КомпоновщикНастроек.Настройки;
    Если Настройки.Отбор.Элементы.Количество()=0 Тогда
        Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
    Иначе
        ЭлементОтбора = Настройки.Отбор.Элементы.Получить(0);
        ЭлементОтбора.ПравоеЗначение = "6";
        ЭлементОтбора.Использование = Истина;
        ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;
    КонецЕсли;
    
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,  Настройки);
    
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных);  
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
    
КонецПроцедуры
23 Eugene_life
 
18.02.15
16:23
(22) + В принципе, работает, но буду пытаться установить то, что прописал пользователь, я не я в коде. Попробую (21)
24 Alexaha
 
18.02.15
16:23
(21) ошибку даст - несовпадение типов
25 Eugene_life
 
18.02.15
16:27
(24) Да, дает такую ошибку. Может, удастся обойти коллекцию пользовательских настроек и как-то их протащить..
26 Alexaha
 
18.02.15
16:30
(25) в пользовательский настройках все в куче и параметры данных и элементы отбора, но я без переборов это делал, блин давно это было очень и один раз, вылетело из головы напрочь, считай с нуля разбираюсь
27 Teresa
 
18.02.15
16:32
(26) я тоже очень давно это делала, не помню уже, как. По-моему программно.
28 Eugene_life
 
18.02.15
16:34
Всем спасибо, проблема решена наилучшим образом )))
СКД просто не надо мешать делать свою работу.
Код:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = ЛОЖЬ;
    
    ВнешниеНаборыДанных = Новый Структура;
    ВнешниеНаборыДанных.Вставить("ТЗ",ТЗ);
    
    СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    
    Настройки = КомпоновщикНастроек.Настройки;
    Если Настройки.Отбор.Элементы.Количество()=0 Тогда
        Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
    КонецЕсли;
    
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,  Настройки);
    
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных);  
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
    
КонецПроцедуры
29 Eugene_life
 
18.02.15
16:34
(28) + При первом открытии - без настроек, а при выборе настроек пользователем, они сами применяются.
Спасибо за моральную поддержку и хорошие советы.
30 Teresa
 
18.02.15
16:35
(28) Зачетно) ларчик просто открывался значит)
31 Eugene_life
 
18.02.15
16:37
(30) Да... не потребовалось его ломать. Хотя я уже готовился копировать выбор пользователя в Массив и его программно прописывать.
32 Alexaha
 
18.02.15
16:46
(29) а ты проверил, точно работает?
33 Eugene_life
 
18.02.15
16:48
(32) Проверил. У меня работает )
34 Alexaha
 
18.02.15
17:07
(33) так еще проще, проверь

    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,  Настройки);
35 Eugene_life
 
18.02.15
17:11
(34) Проверил - работает :)
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший