Имя: Пароль:
1C
1С v8
v8: УФ Программная работа с элементами формы и Динамическим списком
,
0 ProgerLink
 
19.01.12
10:20
Всем привет. Подскажите, у меня следующая задумка. В зависимости от отборов и настроек пользователя на форме, у меня формируется "произвольный запрос" для динамического списка. Основа запроса одна и та же, но добавляются некоторые поля и таблицы для запроса, чтобы без надобности не грузить систему. Так вот, когда запрос "тянет" дополнительные поля, необходимо их отображать на форме в таблице. В конфигураторе добавил новую колонку, но без привязки "Путь к данным", что не дает ей отображаться у клиента, как и на превьюве в самом конфигураторе, но и программно до нее не достучаться, чтобы в нужный момент установить ей "Путь к данным". Скажите, возможно ли вообще реализовать задачу таким образом, либо к колонке созданной на этапе конфигурирования, либо и колонку создать программно с установлением ей данных??? Как вариант вижу пока такой путь решения, на этапе конф-ия сразу прописать путь к данным, но в нужный момент запрос в это поле будет возвращать актуальные данные, а иначе просто колонка из запроса с не важно каким значением. Ну и разумеется управлять видимостью этой колонки.
P.S. Основная таблица для динамического списка: документ
Всем спасибо
1 vmv
 
19.01.12
10:22
можно, уже убсудали динамику колонок и реквизитов УФ, в том числе и я - мои вставки идеальны, хвастаюсь)

ищи)
2 RomaH
 
naïve
19.01.12
10:22
есть возможность добавлять поля формы програмно ... вроде
почему програмно не удается поле добавить?
3 Гот
 
19.01.12
10:23
//Опишем тип реквизита "Динамический список"
   ТипыРеквизитаДинамическийСписок = Новый Массив;
   ТипыРеквизитаДинамическийСписок.Добавить(Тип("ДинамическийСписок"));
   ОписаниеТиповДляРеквизита = Новый ОписаниеТипов(ТипыРеквизитаДинамическийСписок);

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

       //Создадим новый реквизит формы
       ТаблЗначений = Новый РеквизитФормы("_т" + ИмяРеквизита, ОписаниеТиповДляРеквизита);
       ДобавляемыеРеквизиты = Новый Массив;
       ДобавляемыеРеквизиты.Добавить(ТаблЗначений);
       
       //Изменим структуру реквизитов формы
       ИзменитьРеквизиты(ДобавляемыеРеквизиты);  
       
       //Теперь у формы есть реквизит, к которому можно обратиться по имени и изменить различные параметры
       //    укажем для него основную таблицу - Движения с субконто
       РеквизитТаблЗначений = ЭтаФорма["_т" + ИмяРеквизита];
       РеквизитТаблЗначений.ОсновнаяТаблица     = МетаданныеРегистра.ПолноеИмя() + ".ДвиженияССубконто";        

       //Теперь на форме создадим таблицу формы
       ТаблицаФормы = Элементы.Добавить("_ф" + ИмяРеквизита, Тип("ТаблицаФормы"),ГруппаРегистра);
       ТаблицаФормы.ПутьКДанным = "_т" + ИмяРеквизита;
       
       //Создадим колонки, используя доступные поля отбора СКД
       ДоступныеПоляОтбора = ЭтаФорма["_т" + ИмяРеквизита].Отбор.ДоступныеПоляОтбора;
       
       Для Каждого Реквизит Из ДоступныеПоляОтбора.Элементы Цикл
           
           Попытка
               НоваяКолонкаТаблицы = Элементы.Добавить("Колонка" + Реквизит.Поле, Тип("ПолеФормы"), ТаблицаФормы);    
               НоваяКолонкаТаблицы.ПутьКДанным = "_т" + ИмяРеквизита + "."+ Реквизит.Поле;
           Исключение
               //Сообщить(ОписаниеОшибки());
           КонецПопытки;
           
       КонецЦикла;    
       
   КонецЦикла;
4 1с-кин
 
19.01.12
10:26
(1) и ну и дал бы ссылки, у тебя ж отобор по темем есть, и сам лучше помнишь, в каких темах было :)
5 1с-кин
 
19.01.12
10:27
*отбор и "темам"
6 Гот
 
19.01.12
10:29
Вот этот код работает. (Не претендую на правильность, меня
"
ДоступныеПоляОтбора = ЭтаФорма["_т" + ИмяРеквизита].Отбор.ДоступныеПоляОтбора;
       
       Для Каждого Реквизит Из ДоступныеПоляОтбора.Элементы Цикл
"
смущает.

Но, принцип такой...

1. Объявляешь тип реквизита формы:

ТипыРеквизитаДинамическийСписок = Новый Массив;
   ТипыРеквизитаДинамическийСписок.Добавить(Тип("ДинамическийСписок"));
   ОписаниеТиповДляРеквизита = Новый ОписаниеТипов(ТипыРеквизитаДинамическийСписок);

2. Создаешь РЕКВИЗИТ формы:

ТаблЗначений = Новый РеквизитФормы("_т" + ИмяРеквизита, ОписаниеТиповДляРеквизита);
       ДобавляемыеРеквизиты = Новый Массив;
       ДобавляемыеРеквизиты.Добавить(ТаблЗначений);

3. Обновляешь реквизиты:
ИзменитьРеквизиты(ДобавляемыеРеквизиты);

4. Получаешь доступ к свойствам реквизита. Текст запроса тоже будет доступен
РеквизитТаблЗначений = ЭтаФорма["_т" + ИмяРеквизита];
       РеквизитТаблЗначений.ОсновнаяТаблица     = МетаданныеРегистра.ПолноеИмя() + ".ДвиженияССубконто";    

5. Ну, теперь создаешь элементы формы

ТаблицаФормы = Элементы.Добавить("_ф" + ИмяРеквизита, Тип("ТаблицаФормы"),ГруппаРегистра);
       ТаблицаФормы.ПутьКДанным = "_т" + ИмяРеквизита;
       
и колонки:


                НоваяКолонкаТаблицы = Элементы.Добавить("Колонка" + Реквизит.Поле, Тип("ПолеФормы"), ТаблицаФормы);    
               НоваяКолонкаТаблицы.ПутьКДанным = "_т" + ИмяРеквизита + "."+ Реквизит.Поле;
7 ProgerLink
 
19.01.12
10:39
Добавил 2 строчки кода, для добавления колонки с установлением "Путь к данным" :
   НоваяКолонкаТаблицы = Элементы.Добавить("Колонка_1", Тип("ПолеФормы"), Элементы.Список);    
   НоваяКолонкаТаблицы.ПутьКДанным = "Документ_СпецификацияККонтракту.Вложение";    

На этапе события, пишет:

{Документ._СпецификацияККонтракту.Форма.ФормаСпискаУправляемая.Форма(22)}: Ошибка при вызове метода контекста (Добавить)
   НоваяКолонкаТаблицы = Элементы.Добавить("Колонка_1", Тип("ПолеФормы"), Элементы.Список);    
по причине:
Изменение состава элементов недоступно
8 ProgerLink
 
19.01.12
10:42
Хотя вторая строка наверное должна быть такой:
НоваяКолонкаТаблицы.ПутьКДанным = "Список.Вложение";

Но суть ошибки не меняет, все так же не доступно изменение состава элементов
9 ProgerLink
 
19.01.12
10:46
Господа, это я обшибся, добавление должно происходить на сервере. Всем спасибо большое !!!!
10 Гот
 
19.01.12
10:53
0_0
11 ProgerLink
 
19.01.12
16:15
Подведу итог, может кому пригодится. Колонка программно создавалась без проблем, ей были установлены следующие свойства:

.Вид = ВидПоляФормы.ПолеКартинки;
и
.КартинкаЗначений = БиблиотекаКартинок.ТолькоСкрепка;

Но в форме списка картинок не появлялось, пока не добавил одну строчку. Вся процедура:

Процедура УправлениеКолонкой_Вложение(РежимДобавить)
   
   КолонкаТаблицы = Элементы.Найти("КолонкаВложение");
   Если КолонкаТаблицы = Неопределено Тогда
       КолонкаТаблицы = Элементы.Вставить("КолонкаВложение", Тип("ПолеФормы"), Элементы.Список, Элементы.Найти("Дата"));
       КолонкаТаблицы.ПутьКДанным = "Список.Вложение";
       КолонкаТаблицы.Вид = ВидПоляФормы.ПолеКартинки;
       КолонкаТаблицы.Заголовок = " ";
       КолонкаТаблицы.КартинкаЗначений = БиблиотекаКартинок.ТолькоСкрепка;
       Список.УстановитьОбязательноеИспользование("КолонкаВложение", Истина); // <- Та самая строчка
       //КолонкаТаблицы.Картинка.Вид = ВидКартинки.ИзБиблиотеки;
   Иначе
       Если РежимДобавить Тогда
           КолонкаТаблицы.Видимость = Истина;
       Иначе
           КолонкаТаблицы.Видимость = Ложь;
       КонецЕсли;
   КонецЕсли;
   
КонецПроцедуры
Программист всегда исправляет последнюю ошибку.