Имя: Пароль:
1C
1С v8
Таблица в управляемой форме
0 ArPlus
 
28.06.12
22:34
В обычной мы использовали СоздатьКолонки(), а как это проделать в управляемой?
При изменении Вида номенклатуры, должна выводится таблица с различными колонками, в зависимости от самого вида.
Первая таблица получается. При выборе второй ошибка на
ЗначениеВРеквизитФормы(ТЗначение,"ТаблицаРеквизитов");


&НаСервере
Процедура ЗаполнитьТаблицуНаСервере(ВидНоменклатуры)
ИдКоллекции="ТаблицаРеквизитов";
   ИдТаблицы="ТаблицаРеквизитовПред";
   
   КоллФормы = РеквизитФормыВЗначение("ТаблицаРеквизитов");
   Запрос = Новый Запрос;
   Запрос.Текст =
       "ВЫБРАТЬ
       |    НоменклатураДополнительныеРеквизиты.Ссылка.Ссылка КАК Номенклатура,
       |    НоменклатураДополнительныеРеквизиты.Ссылка.Артикул,
       |    НоменклатураДополнительныеРеквизиты.Свойство,
       |    НоменклатураДополнительныеРеквизиты.Значение
       |ИЗ
       |    Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
       |ГДЕ
       |    НоменклатураДополнительныеРеквизиты.Ссылка.ВидНоменклатуры = &ВидНоменклатуры
       |
       |СГРУППИРОВАТЬ ПО
       |    НоменклатураДополнительныеРеквизиты.Ссылка.Ссылка,
       |    НоменклатураДополнительныеРеквизиты.Свойство,
       |    НоменклатураДополнительныеРеквизиты.Значение,
       |    НоменклатураДополнительныеРеквизиты.Ссылка.Артикул";

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

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

   ИзменитьРеквизиты(МассивДобавляемыхРеквизитов,МассивУдаляемыхРеквизитов);

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

   ЭтаФорма.ТаблицаРеквизитов.Загрузить(СодержимоеТаблицы);

КонецПроцедуры
1 Anton_2011
 
28.06.12
22:40
Ошибка на! И кто это мы???
2 ArPlus
 
28.06.12
22:41
&НаСервере
Процедура ЗаполнитьТаблицуНаСервере(ВидНоменклатуры)
   //"ТаблицаРеквизитов" - Объект ТаблицаЗначений (Пустая);
   //"ТаблицаРеквизитовНаФорме" - Элемент на самой форме Таблица
   
   //Чтоб найти колонки, которые есть в таблице до этого
   КоллФормы = РеквизитФормыВЗначение("ТаблицаРеквизитов");

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

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

   ИзменитьРеквизиты(МассивДобавляемыхРеквизитов,МассивУдаляемыхРеквизитов);

   ЭлТаб=Элементы.Найти("ТаблицаРеквизитовНаФорме");

   Для Каждого Колонка Из СодержимоеТаблицы.Колонки Цикл
         Элемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"), ЭлТаб);
         Элемент.Заголовок = Колонка.Заголовок;
         Элемент.Вид = ВидПоляФормы.ПолеВвода;
         Элемент.ПутьКДанным = "ТаблицаРеквизитов." + Колонка.Имя;
   КонецЦикла;

   ЭтаФорма.ТаблицаРеквизитов.Загрузить(СодержимоеТаблицы);

КонецПроцедуры
3 ArPlus
 
28.06.12
22:42
В Обычной форме все одной строкой:
ЭлементыФормы.ТабличноеПоле.СоздатьКолонки();
4 Anton_2011
 
28.06.12
22:43
УФ - не нужны!
5 ArPlus
 
28.06.12
22:45
Они есть... Это данность, данная нам в ощущение... :)
6 Anton_2011
 
28.06.12
22:48
Да, оно есть, но сия данность вам навязана. Что же теперь делать если всё запущено - ждите, мож спец по УФ нарисуется и ответит по существу.
ЗЫ
Сори.
7 oleg_prg
 
29.06.12
00:41
Вот накидал для УП примеры с таблицей, и программное создание колонок и раскраска и заполнение чтохочешь.... Лови
http://files.mail.ru/H552I7

Вот код из обработки

//ivansoft

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

&НаСервере
Функция ВключитьРаскраску()
   
   ЭтаФорма.УсловноеОформление.Элементы.Очистить();    
   ЭлементУсловногоОформления        = УсловноеОформление.Элементы.Добавить();
   ОформляемоеПоле                = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
   ОформляемоеПоле.Поле            = Новый ПолеКомпоновкиДанных("ДанныеТЗПоле2");
   ЭлементОтбора                    = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
   ЭлементОтбора.ЛевоеЗначение    = Новый ПолеКомпоновкиДанных("ДанныеТЗ.Поле2");
   ЭлементОтбора.ВидСравнения        = ВидСравненияКомпоновкиДанных.Содержит;
   ЭлементОтбора.ПравоеЗначение    = "5";
   ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Бирюзовый);
   
   ЭлементУсловногоОформления        = УсловноеОформление.Элементы.Добавить();
   ОформляемоеПоле                = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
   ОформляемоеПоле.Поле            = Новый ПолеКомпоновкиДанных("ДанныеТЗПоле2");
   ЭлементОтбора                    = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
   ЭлементОтбора.ЛевоеЗначение    = Новый ПолеКомпоновкиДанных("ДанныеТЗ.Поле2");
   ЭлементОтбора.ВидСравнения        = ВидСравненияКомпоновкиДанных.Содержит;
   ЭлементОтбора.ПравоеЗначение    = "1";
   ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Желтый);
   
КонецФункции

&НаКлиенте
Процедура ПриОткрытии(Отказ)
   
   СоздатьЭлементы();
   
   //А вто еще фишка - как максимизировать окно на весь экран :)
   Попытка
       WSHShell  =   новый COMОбъект("WScript.Shell");
       WSHShell.SendKeys("%");
       WSHShell.SendKeys("{LEFT}{LEFT}{ENTER}");
   Исключение
   КонецПопытки;
   
   ВключитьРаскраску();
   
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьТекст(Команда)
   
   Кол = 1;
   
   Для Каждого Эл Из ДанныеТЗ Цикл
       
       Эл.ПолучитьИдентификатор();
       Эл.Поле2 = СокрЛП(Кол)+" это новая строка :)";
       Кол = Кол + 1;
       
   КонецЦикла;
   
КонецПроцедуры

&НаКлиенте
Процедура Добавить(Команда)
   
   НовыйЭлемент = ДанныеТЗ.Добавить();
   НовыйЭлемент.Поле1 = "Добавлено поле1 !!!";
   НовыйЭлемент.Поле2 = "Добавлено поле2 !!!";
   
КонецПроцедуры

&НаКлиенте
Процедура ЦветВключить(Команда)
   
   ВключитьРаскраску();
   
КонецПроцедуры

&НаКлиенте
Процедура ЦветВыключить(Команда)
   
   ВыключитьЦветНаСервере();
       
КонецПроцедуры

&НаСервере
Процедура ВыключитьЦветНаСервере()
   
   ЭтаФорма.УсловноеОформление.Элементы.Очистить();

КонецПроцедуры
8 ArPlus
 
29.06.12
18:42
Спасибо. Таблица создалась. Но!!! При выполнении некой команды мне надо так же программно изменить колонки этой таблицы. Если запускаю твою обработку, то говорит, что Неуникальное имя реквизита    ЭтаФорма.ИзменитьРеквизиты(мКолонки); Мне надо удалить все старые и создать новые.
AdBlock убивает бесплатный контент. 1Сергей