Имя: Пароль:
1C
1С v8
Программное добавление доступных полей выбора СКД
0 1stypen
 
09.08.11
17:22
нашел такую тему, но её так видимо и не решили
v8: Как добавить Вычисляемое поле СКД на Тонком Клиенте?
v8: Как добавить Вычисляемое поле СКД на Тонком Клиенте?

У меня подобная проблема.
Делаю отчет на СКД. В качестве набора данных есть внешний объект. Поля не описаны, т.к. формируются динамически.
ПриКомпоновкеРезультата в модуле отчета
формирую этот внешний   источник(обычная таблица) - добавляю его колонки как поля в СКД, в выбор настройкиКД тоже их добавляю - инициализирую отчет - выводится всё отлично
НО эти поля не попадают в доступные для выбора - в итоге пользователь не может их добавить никуда, т.к. не видит их при изменении варианта.
И так же не видно что этим колонкам сопаставлено поле СКД - красный крестик вводится. Хотя все данные выводятся правильные
Подскажите, пожалуйста, как добавить эти поля в доступные для выбора.
Програмно эта коллекция только на чтение, а при формировании таблицы консткрукции {} использовать бесполезно
1 1stypen
 
09.08.11
17:44
код такой
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
   
   СтандартнаяОбработка = Ложь;
   
   ПоляВнешнегоИсточника = СхемаКомпоновкиДанных.НаборыДанных.ВидыОпераций_Выбранные.Поля;
   ТабСвойствОЗ = ПолучитьТабСвойствОЗ();
   ТабСвойствОЗ.Колонки.Добавить("ПутьКДанным",Новый ОписаниеТипов("Строка",));
   н=0;
   Для Каждого стрСвОз Из ТабСвойствОЗ Цикл
       
       тПоле = "а"+Строка(н);
       
       стрСвОз.ПутьКДанным = тПоле;
       
       ньюПоле = ПоляВнешнегоИсточника.Найти(тПоле);
       Если ньюПоле = Неопределено Тогда
           
           ньюПоле = ПоляВнешнегоИсточника.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
           ньюПоле.Поле = тПоле;
           ньюПоле.ПутьКДанным = тПоле;
           
       КонецЕсли;

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

   ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
   ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);
   
   ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
   ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
   ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

КонецПроцедуры
2 Паучог
 
09.08.11
17:55
(0) А может быть нужно
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));

Перед тем как в него добавлять выбранные поля?
3 1stypen
 
09.08.11
18:38
При инициализации в компоновщик настроек в доступные полях добавляются эти поля. Но при изменении варианта пользователь их не видит всё равно. Я даже пытался делать свой компановщик настроек - не помогало. Может компоновать надо как то по хитрому

Наверное нужно было задавать вопрос "чтобы пользователь видел", а в настройке в доступных поля выбора они есть, если в отладчике смотреть.
4 1stypen
 
09.08.11
18:45
ВыбранноеПоле = КомпоновщикНастроек.Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
       ВыбранноеПоле.Заголовок = стрСвОз.СвойствоНаименование;
       ВыбранноеПоле.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Авто;
       ВыбранноеПоле.Использование = Истина;
       ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных(тПоле);

это делать не обязательно - это я чтоб хоть увидеть эти данные - главное чтоб юзер их смог выбрать потом в настройке варианта
5 GANR
 
09.08.11
18:50
Прямого ответа у меня нет. Даю подсказку, как отладить СКД:

   #Если ТолстыйКлиентУправляемоеПриложение Тогда
       Конструктор = Новый КонструкторСхемыКомпоновкиДанных;
       
       Конструктор.УстановитьСхему(ПолучитьСхемуКомпоновкиДанных(АдресСКД));
       Конструктор.Редактировать(ЭтаФорма);        
   #КонецЕсли

Потом открытую схему копируем в консоль и правим, в консоли можно посмотреть как схема исправленная "ручками" выглядит в окнах отладчика. Только так и можно отладить отчеты на СКД. Как по-другому - не представляю.
6 1stypen
 
09.08.11
18:58
у меня управляемое приложение - только тонкий клиент - нет толстого клиента(
7 GANR
 
10.08.11
10:21
(6) Так отлаживать, вроде, можно в разных режимах ??? Добейся чтоб был толстый ))). Эта штука (5) только под толстым и работает.
8 1stypen
 
10.08.11
10:35
Дык вить пользователи будут поля то выбирать, а у них тонкий)

будем искать(
9 GANR
 
10.08.11
11:58
(8)Толстый клиент нужен исключительно для отладки. Отладил - и работай себе под тонким когда всё налажено.
10 1stypen
 
10.08.11
13:21
Конструктор тоже результатов не дал - он тоже не показывает те поля, которые я добавил руками - он показывает только те поля, которые были обозначены в СКД изначально
11 GANR
 
10.08.11
14:37
(10) Вероятно, программа в коде затерла настройки, которые были внесены руками и переформировала всё заново. С свойстве "Структура", вроде отображаются настройки, добавленные руками.
12 GANR
 
10.08.11
14:48
ЛЮБОЕ действие с СКД, которое можно выполнить руками, можно выполнить и программно
13 1stypen
 
10.08.11
15:18
"ЛЮБОЕ действие с СКД, которое можно выполнить руками, можно выполнить и программно" - это бесспорно.
Но пользователь пока руками то ничего не делал)))

ПриКомпоновкеРезультата() програмно эти поля внесены как в СКД, потом после инициализации настроек эти поля попали так и в доступные поля для выбора. Я в отладчике их вижу везде.

После КомпоновщикМакета.Выполнить - они есть
После ПроцессорКомпоновкиДанных.Инициализировать - они есть
После ПроцессорВывода.Вывести - они тоже есть

А когда пользователь редактирует вариант - их нет. Где они перетерлись програмно?
14 GANR
 
15.08.11
17:02
(13) А вот так можно ещё и настройки сохранить

   #Если ТолстыйКлиентУправляемоеПриложение ИЛИ ТолстыйКлиентОбычноеПриложение Тогда
       Конструктор = Новый КонструкторСхемыКомпоновкиДанных;
       
       Конструктор.УстановитьСхему(ПолучитьСхемуКомпоновкиДанных(АдресСКД));
       Конструктор.Редактировать(ЭтаФорма);
       
       ПолноеИмяФайла = "C:\Documents and Settings\Руслан_Ганеев\Рабочий стол\NKD_Save.xml";
       Настройки  = Компоновщик.Настройки;
       НовыйСXDTO = Новый СериализаторXDTO(ФабрикаXDTO);
       
       Запись = Новый ЗаписьXML;
       
       Запись.ОткрытьФайл(ПолноеИмяФайла);
       Запись.ЗаписатьОбъявлениеXML();
       
       НовыйСXDTO.ЗаписатьXML(Запись, Настройки, НазначениеТипаXML.Явное, ФормаXML.Элемент);
       
       Запись.Закрыть();        
   #КонецЕсли