Недавно передо мной стояла задача отобразить произвольную таблицу значений, структуры которой я не знал, на управляемой форме.
Хочу поделиться кодом функции, которая отрисовывает на управляемой форме таблицу значений.
При использовании нужно учесть, что код писался под платформу 8.3, а в конфигурацию была внедрена «Библиотека стандартных подсистем» (если у вас не внедрена БСП, отключите вызов функции общего модуля «СтроковыеФункцииКлиентСервер»).
Также исключите из таблицы значений типы, которые не могут быть отображены на управляемой форме.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
// Отображает на управляемой форме произвольную таблицу значений // Аргументы: // ТаблицаЗначений - ТаблицаЗначений - таблица для отображения, // Форма - УправляемаяФорма // РеквизитТаблицаИмя - Строка - Имя таблицы - реквизита формы. Если не указано, будет создан новый реквизит // ТаблицаФормы - ТаблицаФормы - элемент формы, связанный с реквизитом таблицы формы. Если не указано, будет создан новый элемент формы // ЭлементРодитель - ГруппаФормы; ТаблицаФормы; УправляемаяФорма - элемент-родитель для создаваемой таблицы формы. // Функция ОтобразитьТаблицуЗначенийНаФорме(ТаблицаЗначений, Форма, РеквизитТаблицаИмя=Неопределено, ТаблицаФормы=Неопределено, ЭлементРодитель=Неопределено) Экспорт СтруктураРезультат = Новый Структура("РеквизитТаблица, ТаблицаФормы"); ИмяРеквизитаТаблицыПоУмолчанию = "НоваяТаблица"; ВсеРеквизитыТаблицы = Неопределено; МассивРеквизитов = Новый Массив; Если РеквизитТаблицаИмя=Неопределено Тогда // создадим реквизит формы - таблицу МассивРеквизитов.Добавить(Новый РеквизитФормы(ИмяРеквизитаТаблицыПоУмолчанию, Новый ОписаниеТипов("ТаблицаФормы"))); Форма.ИзменитьРеквизиты(МассивРеквизитов); РеквизитТаблица = Форма[ИмяРеквизитаТаблицыПоУмолчанию]; РеквизитТаблицаИмя = ИмяРеквизитаТаблицыПоУмолчанию; Иначе РеквизитТаблица = Форма[РеквизитТаблицаИмя]; ВсеРеквизитыТаблицы = Форма.ПолучитьРеквизиты(РеквизитТаблицаИмя); КонецЕсли; Если ТаблицаФормы=Неопределено Тогда // создадим таблицу формы - отображение реквизита таблицы ТаблицаФормы = Форма.Элементы.Добавить(РеквизитТаблицаИмя, Тип("ТаблицаФормы"), Форма.Элементы.ПараметрыРасчетаЦены, ЭлементРодитель); КонецЕсли; // создадим реквизиты-колонки МассивРеквизитов.Очистить(); Для каждого ТекКолонка Из ТаблицаЗначений.Колонки Цикл ИмяСоздаваемойКолонкиРеквизита = ТекКолонка.Имя; Если НЕ ВсеРеквизитыТаблицы=Неопределено Тогда // выполним проверку существания реквизита Для каждого СуществущийРеквизит Из ВсеРеквизитыТаблицы Цикл Если СуществущийРеквизит.Имя = ИмяСоздаваемойКолонкиРеквизита Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru='В таблице %1 уже присутствует колонка %2!'"), РеквизитТаблицаИмя, ИмяСоздаваемойКолонкиРеквизита); КонецЕсли; КонецЦикла; МассивРеквизитов.Добавить(Новый РеквизитФормы(ИмяСоздаваемойКолонкиРеквизита, ТекКолонка.ТипЗначения, РеквизитТаблицаИмя)); КонецЕсли; КонецЦикла; // создаём реквизиты-колонки таблицы Форма.ИзменитьРеквизиты(МассивРеквизитов); // теперь создаём элементы формы - колонки таблицы формы Для каждого ТекКолонка Из ТаблицаЗначений.Колонки Цикл ИмяКолонкиРеквизита = ТекКолонка.Имя; ИмяСоздаваемогоПоляФормы = РеквизитТаблицаИмя+ИмяКолонкиРеквизита; // проверим существование такого элемента формы ПоискЭлемента = Форма.Элементы.Найти(ИмяСоздаваемойКолонкиРеквизита); Если НЕ ПоискЭлемента=Неопределено Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru='Не удалось создать колонку %1 таблицы %2!'"), ИмяСоздаваемогоПоляФормы, РеквизитТаблицаИмя); КонецЕсли; НоваяКолонка = Форма.Элементы.Добавить(ИмяСоздаваемогоПоляФормы, Тип("ПолеФормы"), ТаблицаФормы); НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода; НоваяКолонка.ПутьКДанным = ТаблицаФормы.Имя+"."+ИмяКолонкиРеквизита; НоваяКолонка.Заголовок = ТекКолонка.Заголовок; НоваяКолонка.Видимость = Истина; КонецЦикла; СтруктураРезультат.РеквизитТаблица = РеквизитТаблица; СтруктураРезультат.ТаблицаФормы = ТаблицаФормы; Возврат СтруктураРезультат; КонецФункции |
Поделиться