Механизм предусматривает работу как с реквизитом объекта, так и с реквизитом формы.
И по сути является аналогом метода обычных форм:
СоздатьКолонки()
Также реализована возможность быстрого добавления колонки «Отметка» и настройки доступности кнопок полей. Процедура должна быть размещена в модуле формы.
Пример вызова:
ПрограммныйВыводТаблицыЗначенийВТаблицуНаФорму(МодульОбъкта.ТЗИзExcel, "ТЗИзExcel", Истина, Истина);
// Процедура - Программный вывод таблицы значений в таблицу на форму
//
// Параметры:
// ТаблицаЗначенийДляВывода - ТаблицаЗначений - ТаблицаЗначений для вывода на форму
// ИмяРеквизитаФормы - Строка - Наименование реквизита формы ДанныеФормыКоллекция
// ИспользованиеКолонкиОтметка - Булево - Вывод колокни отметка
// ТолькоКнопкаОткрытия - Булево - Отображение кнопок
//
&НаСервере
Процедура ПрограммныйВыводТаблицыЗначенийВТаблицуНаФорму(ТаблицаЗначенийДляВывода, ИмяРеквизитаФормы, ИспользованиеКолонкиОтметка = Ложь, ТолькоКнопкаОткрытия = Истина)
Попытка
Если ТипЗнч(ТаблицаЗначенийДляВывода) = Тип("ТаблицаЗначений") Тогда
Если ТипЗнч(ИмяРеквизитаФормы) = Тип("Строка") Тогда
// Опрелеляем является заполняемый реквизит, реквизитом объекта или реквизитом формы
Если Объект.Свойство(ИмяРеквизитаФормы) И ТипЗнч(Объект[ИмяРеквизитаФормы]) = Тип("ДанныеФормыКоллекция") Тогда
ПутьКДаннымФормыКоллекция = "Объект." + ИмяРеквизитаФормы;
ОбъектДляОтображенияНаФорме = РеквизитФормыВЗначение("Объект." + ИмяРеквизитаФормы);
ЭтоРеквизитОбъекта = Истина;
ИначеЕсли ТипЗнч(ЭтаФорма[ИмяРеквизитаФормы]) = Тип("ДанныеФормыКоллекция") Тогда
ПутьКДаннымФормыКоллекция = ИмяРеквизитаФормы;
ОбъектДляОтображенияНаФорме = РеквизитФормыВЗначение(ИмяРеквизитаФормы ,Тип("ТаблицаЗначений"));
ЭтоРеквизитОбъекта = Ложь;
КонецЕсли;
КонецЕсли;
МассивУдаляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов = Новый Массив;
МассивИсключаемыхРеквизитов = Новый Массив;
// Формируем массив колонок для удаления
Для каждого Колонка Из ОбъектДляОтображенияНаФорме.Колонки Цикл
МассивУдаляемыхРеквизитов.Добавить(ПутьКДаннымФормыКоллекция + "." + Колонка.Имя);
КонецЦикла;
// Удаляем колонки с формы
Для каждого Колонка Из ОбъектДляОтображенияНаФорме.Колонки Цикл
ЭлементКолонки = Элементы.Найти(ИмяРеквизитаФормы + Колонка.Имя);
Если НЕ ЭлементКолонки = Неопределено Тогда
Элементы.Удалить(ЭлементКолонки);
КонецЕсли;
КонецЦикла;
// Добавляем колонку "Отметка"
Если ИспользованиеКолонкиОтметка Тогда
НоваяКолонка = Новый РеквизитФормы("Отметка", Новый ОписаниеТипов("Булево"), ПутьКДаннымФормыКоллекция);
МассивДобавляемыхРеквизитов.Добавить(НоваяКолонка);
КонецЕсли;
// Формируем массив колонок из таблицы значений
Для каждого Колонка Из ТаблицаЗначенийДляВывода.Колонки Цикл
Если Колонка.ТипЗначения.Типы().Найти(Тип("Тип")) = Неопределено Тогда
НоваяКолонка = Новый РеквизитФормы(Колонка.Имя, Новый ОписаниеТипов(Колонка.ТипЗначения.Типы()), ПутьКДаннымФормыКоллекция);
МассивДобавляемыхРеквизитов.Добавить(НоваяКолонка);
Иначе
Сообщить("Колонка " + Строка(Колонка.Имя) + " с типом: <ТИП> не может быть выгружена");
МассивИсключаемыхРеквизитов.Добавить(Колонка);
КонецЕсли;
КонецЦикла;
// Обновляем реквизиты формы
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов, МассивУдаляемыхРеквизитов);
//Создаем элементы на форме для отображения колонок
ЭлементТЗ = Элементы[ИмяРеквизитаФормы];
// Добавляем колонку "Отметка"
Если ИспользованиеКолонкиОтметка Тогда
НовыйЭлементФормы = Элементы.Добавить(ИмяРеквизитаФормы + "Отметка", Тип("ПолеФормы"), ЭлементТЗ);
НовыйЭлементФормы.Вид = ВидПоляФормы.ПолеФлажка;
НовыйЭлементФормы.ПутьКДанным = ПутьКДаннымФормыКоллекция + "." + "Отметка";
НовыйЭлементФормы.РежимРедактирования = РежимРедактированияКолонки.ВходПриВводе;
КонецЕсли;
// Добавляем колонки из таблицы
Для Каждого Колонка ИЗ ТаблицаЗначенийДляВывода.Колонки Цикл
Если МассивИсключаемыхРеквизитов.Найти(Колонка) = Неопределено Тогда
НовыйЭлементФормы = Элементы.Добавить(ИмяРеквизитаФормы + Колонка.Имя, Тип("ПолеФормы"), ЭлементТЗ);
НовыйЭлементФормы.Вид = ВидПоляФормы.ПолеВвода;
// Устанавливаем доступность кнопок
Если ТолькоКнопкаОткрытия Тогда
НовыйЭлементФормы.РедактированиеТекста = Ложь;
НовыйЭлементФормы.ВыбиратьТип = Ложь;
НовыйЭлементФормы.КнопкаВыбора = Ложь;
НовыйЭлементФормы.КнопкаВыпадающегоСписка = Ложь;
НовыйЭлементФормы.КнопкаОткрытия = Истина;
НовыйЭлементФормы.КнопкаОчистки = Ложь;
Иначе
НовыйЭлементФормы.РедактированиеТекста = Истина;
НовыйЭлементФормы.ВыбиратьТип = Истина;
НовыйЭлементФормы.КнопкаВыбора = Истина;
НовыйЭлементФормы.КнопкаВыпадающегоСписка = Истина;
НовыйЭлементФормы.КнопкаОткрытия = Истина;
НовыйЭлементФормы.КнопкаОчистки = Истина;
КонецЕсли;
НовыйЭлементФормы.КнопкаРегулирования = Ложь;
НовыйЭлементФормы.КнопкаСоздания = Ложь;
НовыйЭлементФормы.КнопкаСпискаВыбора = Ложь;
НовыйЭлементФормы.ИсторияВыбораПриВводе = ИсторияВыбораПриВводе.НеИспользовать;
НовыйЭлементФормы.БыстрыйВыбор = Ложь;
НовыйЭлементФормы.ПутьКДанным = ПутьКДаннымФормыКоллекция + "." + Колонка.Имя;
КонецЕсли;
КонецЦикла;
// Загружаем таблицу значений в данные формы коллекцию
Если ЭтоРеквизитОбъекта Тогда
Объект[ИмяРеквизитаФормы].Загрузить(ТаблицаЗначенийДляВывода);
Иначе
ЭтаФорма[ИмяРеквизитаФормы].Загрузить(ТаблицаЗначенийДляВывода);
КонецЕсли;
Иначе
Сообщить("Выводить можно только таблицу значений");
КонецЕсли;
Исключение
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры