Программное создание таблицы формы

23.05.2018

Теги: 1С:ПредприятиеЗначениеВРеквизитФормыИзменитьРеквизитыРеквизитФормыВЗначениеТаблицаЗначенийУправляемаяФормаЭлементФормы

Задача в том, чтобы отображать на форме таблицу значений, структура которой может меняться. К примеру в результате запроса к первой таблице мы получаем пять колонок, а в результате запроса ко второй таблице семь колонок. Соответственно при выполнении каждого из запросов, старые колонки нужно убрать, а новые добавить.

Создаем реквизит формы ДанныеТаблицы, тип ТаблицаЗначений, на форму его не выносим. И саму таблицу формы и ее колонки будем создавать программно. Для удобства тестирования добавим еще команду формы СоздатьТаблицу.

&НаКлиенте
Процедура СоздатьТаблицу(Команда)
    СоздатьТаблицуНаСервере();
КонецПроцедуры

&НаСервере
Процедура СоздатьТаблицуНаСервере()

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

&НаСервере
Функция СоздатьСлучайнуюТаблицуЗначений()

    Если НомерТаблицы = 0 Тогда

        ТаблицаЗначений = Новый ТаблицаЗначений();
        ТаблицаЗначений.Колонки.Добавить("Код");
        ТаблицаЗначений.Колонки.Добавить("Наименование");
        ТаблицаЗначений.Колонки.Добавить("Количество");

        // делаем выборку
        Выборка = Справочники.Номенклатура.Выбрать();
        Пока Выборка.Следующий() Цикл
            // добавляем новуй строку в таблицу значений
            НоваяСтрока = ТаблицаЗначений.Добавить();
            НоваяСтрока.Код = Выборка.Код;
            НоваяСтрока.Наименование = Выборка.Наименование;
            НоваяСтрока.Количество = 1;
        КонецЦикла;
        
        НомерТаблицы = 1

    Иначе

        ТаблицаЗначений = Новый ТаблицаЗначений();
        ТаблицаЗначений.Колонки.Добавить("Код");
        ТаблицаЗначений.Колонки.Добавить("Фамилия");

        // делаем выборку
        Выборка = Справочники.Сотрудники.Выбрать();
        Пока Выборка.Следующий() Цикл
            // добавляем новуй строку в таблицу значений
            НоваяСтрока = ТаблицаЗначений.Добавить();
            НоваяСтрока.Код = Выборка.Код;
            НоваяСтрока.Фамилия = Выборка.Наименование;
        КонецЦикла;
        
        НомерТаблицы = 0

    КонецЕсли;
    
    Возврат ТаблицаЗначений;

КонецФункции

Реквизит НомерТаблицы поочередно принимает значение нуля или единицы и нужен лишь для того, чтобы каждый раз получать другую таблицу значений.

Справка

УправляемаяФорма.ИзменитьРеквизиты()

УправляемаяФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты, УдаляемыеРеквизиты)

Параметры:

  • ДобавляемыеРеквизиты (необязательный, тип Массив). Массив, содержащий объекты типа РеквизитФормы. Добавлять можно реквизиты верхнего уровня и вложенные реквизиты, являющиеся колонками. К добавленным реквизитам верхнего уровня из модуля можно обращаться только с помощью конструкции ЭтотОбъект.
  • УдаляемыеРеквизиты (необязательный, тип Массив). Массив, содержащий строки, описывающие пути к удаляемым реквизитам. Удалять можно только ранее программно добавленные реквизиты.

Описание:

  • Изменяет структуру реквизитов формы. Сначала выполняется удаление реквизитов. Таким образом массивы добавляемых и удаляемых реквизитов могут содержать реквизиты с одинаковым путём.
  • Внимание! Действия добавления и удаления выполняются за один вызов. Следует учитывать, что операция изменения состава реквизитов является ресуркоемкой, поэтому операции изменения состава реквизитов формы выполняются пакетным образом.

Доступность:

  • Сервер, мобильное приложение (сервер).

ВсеЭлементыФормы.Добавить()

ВсеЭлементыФормы.Добавить(Имя, ТипЭлемента, Родитель) 

Параметры:

  • Имя (обязательный, тип Строка). Уникальное имя добавляемого элемента.
  • ТипЭлемента (обязательный, тип Тип). Тип добавляемого элемента.
  • Родитель (необязательный, тип: ГруппаФормы; ТаблицаФормы; УправляемаяФорма). Родитель для добавляемого элемента. Если не указан, то добавляется на верхний уровень.

Возвращаемое значение:

  • Тип: ДекорацияФормы; ГруппаФормы; КнопкаФормы; ТаблицаФормы; ПолеФормы.

Описание:

  • Добавляет элемент в коллекцию.

Доступность:

  • Сервер, мобильное приложение (сервер).

Поиск: 1С:Предприятие • Значение в реквизит формы • Изменить реквизиты • Реквизит формы в значение • Таблица значений • Управляемая форма • Элемент формы

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.