1С программно добавить таблицу на форму

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

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

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

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

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

Справка

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

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

Параметры:

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

Описание:

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

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

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

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

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

Параметры:

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

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

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

Описание:

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

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

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

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

Табличные части существуют у многих объектов в 1С:

  • Справочники
  • Документы
  • Отчеты и обработки
  • Планы счетов
  • Планы видов характеристик
  • Планы видов расчета
  • Бизнес-процессы и задачи

Табличные части позволяют хранить неограниченное количество структурированной информации, принадлежащей одному объекту.

Рассмотрим некоторые приемы работы с табличными частями.

Как обойти табличную часть

Для обхода табличной части можно использовать цикл Для каждого

Для каждого Строка из ТабличнаяЧасть Цикл
Сообщить(Строка.РеквизитТабличнойЧасти);
КонецЦикла;

На каждой итерации в переменную Строка передается очередная строка табличной части. Значения реквизитов строки можно получить выражением Строка.ИмяРеквизита.

Как получить и обойти выделенные строки табличной части

Для вывода информации из табличной части объекта служит элемент формы Табличное поле. Для включения возможности выделения нескольких строк на табличном поле нужно установить значение Множественный у его свойства Режим выделения.

Для получения перечня выделенных строк используется следующий код:

ВыделенныеСтроки=ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки;

Для того чтобы обойти выделенные строки используется цикл Для каждого:

ВыделенныеСтроки=ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки;
Для каждого Строка из ВыделенныеСтроки Цикл
//содержимое цикла
КонецЦикла;

Как программно выделить строки табличной части (табличного поля) и снять выделение

Чтобы программно снять выделение строк табличного поля:

ЭлементыФормы.ИмяТабличногоПоля.ВыделенныйСтроки.Очистить();

Чтобы программно выделить все строки табличного поля:

Для каждого ТекущаяСтрока Из ТабличнаяЧасть Цикл
ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки.Добавить(ТекущаяСтрока);
КонецЦикла;

Как очистить табличную часть

ТабличнаяЧасть.Очистить();

Как получить текущую строку табличной части

Текущая строка — это срока, в которой у пользователя в данный момент находится курсор. Чтобы ее получить, нужно обратиться к элементу управления на форме, который связан с табличной частью.

Для обычных форм код будет выглядеть так:

ЭлементыФормы.ИмяТабличногоПоля.ТекущиеДанные;

Для управляемых форм:

Элементы.ИмяТабличногоПоля.ТекущиеДанные;

Как добавить новую строку в табличную часть

Добавление новой строки в конец табличной части:

НоваяСтрока=ТабличнаяЧасть.Добавить();
НоваяСтрока.Реквизит1=»Значение»;

Добавление новой строки в любое место табличной части (последующие строки будут сдвинуты):

НоваяСтрока=ТабличнаяЧасть.Вставить(Индекс)
//Индекс — номер добавляемой строки. Нумерация строк начинается с нуля.
НоваяСтрока.Реквизит1=»Значение»;

Как программно заполнить реквизиты строки табличной части

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

Создаваемая обработчиком процедура имеет три параметра:

  • Элемент — содержит элемент управления ТабличноеПоле.
  • НоваяСтрока — булево. Содержит значение Истина, если добавляется новая строка табличной части, и Ложь, если пользователь начал редактировать уже существующую строку.
  • Копирование — булево. Содержит значение Истина, если пользователь копирует строку, и Ложь в остальных случаях.

Рассмотрим пример. Допустим, нам нужно заполнить реквизит табличной части СчетУчета, в случае, когда добавляется новая строка. При редактировании существующей строки изменять счет учета не нужно.

Процедура ТабличнаяЧастьПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
//Если пользователь редактирует существующую строку, то ничего не делаем
Если НЕ НоваяСтрока Тогда
Возврат;
КонецЕсли;
//Если же строка новая, устанавливаем счет учета
ТекСтрока = Элемент.ТекущиеДанные; //Получили текущую строку табличной части
ТекСтрока.СчетУчета = ПланыСчетов.Хозрасчетый.НужныйСчетУчета;
КонецПроцедуры