Как добавить таблицу на форму 1с

Обновлено: 06.07.2024

Каждый, кто программировал в обычном приложении, часто сталкивался с задачей получения произвольной таблицы значений на форме. Под произвольной таблицей значений понимается таблица, количество и тип колонок которой наперед не известно. То есть колонок может быть 3, а может 6, а может 8. В обычном приложении все просто: можно было на форме обработки разместить элемент «ТаблицаЗначений»,и затем передать в этот элемент созданную таблицу значений программным способом. Потом простой командой:

получить готовую таблицу значений на форме. Казалось бы, что может быть проще.

Это все было в обычном приложении. В управляемом приложении все изменилось. Так просто произвольную таблицу не создать. Теперь нужно либо жестко параметризировать таблицу значений на форме, либо создавать ее программным способом (описывать,ну, в этом, собственно, и суть самого управляемого приложения). Это мы и попробуем сделать: программными средствами создать произвольную таблицу значений на управляемой форме.

Решение задачи.

Первое, что мы должны сделать, это определить, как таблица появится на форме. Главное, что никакого элемента формы в обработке создавать не нужно. Мы его создадим программным способом, как и всю таблицу. То есть таблица будет описана, и создаваться в момент открытия формы или с помощью кнопки – это кому как нужно.



Создание таблицы на форме происходит через описание таблицы значений как реквизита:

Теперь мы должны создать программную таблицу значений, которая содержит данные. Если таблица значений будет получена из запроса, то все более - менее порядок. Если таблица создается вручную, то значение колонок, которые будут содержать числа или даты могут быть созданы через «ОписаниеТипов». Суть в том, что колонки в таблице значений обязательно должны иметь какой-то тип. Если, например,предполагается, что пользователь будет заполнять данные в этих колонках интерактивно, то нельзя добавлять колонку таблицы значений просто с именем, она должна иметь тип. Имейте ввиду – это очень важно т.к. эти типы мы передадим в таблицу на форме.

Создаем таблицу, которая содержит несколько колонок:

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

Вот такая нехитрая комбинация и наша таблица готова.

Далее укажем путь к данным и, например, можем установить ширину колонок:

Условное оформление, если нам нужно мы также пишем вручную,командное меню – вручную. Обработчики таблицы также пишутся руками. Например,что бы добавить обработчик события таблицы «Выбор»:

Для обработки данного события в форме процедуры прописывается отдельная процедура:

Обратите внимание, что обработчики таблицы срабатывают на клиенте и поэтому должны иметь команду указатель компилятора

Ну, и последнее что хотелось добавить, что после всех этих действий обязательно не забываем передать готовую таблицу в реквизит формы:

Вот что имеем в результате:


А вот обработка события "Выбор":



Послесловие.

Надеюсь, статья окажет помощь тем программистам 1С, которые начинают создавать таблицы на форме программным способом.

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

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

поехали!

Итак, унас есть форма и запрос, результат которого выгружен в таблицу. Например, так:

Выведем таблицу на управляемую форму

Наша основная задача номер РАЗ - вывести результат запроса на управляемую форму.

Для этого нам нужно:

  1. Создать реквизит типа "ТаблицаЗначений".
  2. Создать реквизиты с типом значения, соответствующим типу колонки таблицы, для каждой колонки, подчиненные таблице.
  3. Создать элемент формы типа "ТаблицаФормы" для таблицы.
  4. Создать элементы формы для колонок типа "ПолеФормы".

Таким образом код у нас будет такой:

Здесь мы создаем реквизиты, содержащие таблицу и колонки таблицы. Далее создаем элементы и прописываем для них путь к реквизитам формы. Т.е. у нас всегда создается и реквизит формы, который хранит значение, и элемент формы, который это значение отображает. В этом вся суть. При этом если Вы хотите создать группу формы, то реквизит формы вам не нужен - достаточно создать элемент формы типа "ГруппаФормы", после чего в поле "Вид" прописать соответствующтий вид элемента (Группа, Закладка, . ).

Данный код выводит на управляемую форму результат запроса. Но если вдруг в результате запроса у Вас будут элементы, типы которых не могут быть выведены на форму, то 1С будет ругаться. К таким элементам относятся хранилища значений, уникальные идентификаторы и, на сколько я знаю, другие таблицы значений (т.е. при выборке табличных частей у нас возникнут проблемы). Это нужно учитывать при создании реквизитов. При этом, если реквизит таблицы имеет тип "ТаблицаЗначений", то для его тоже нужно будет создать колонки. Также следует иметь ввиду, что имена элементов формы должны быть уникальными, при этом имена реквизитов должны быть уникальны внутри своих родителей (т.е. может существовать две разные таблицы с одинаковыми наименованиями колонок, но в пределах одной таблицы имена колонок должны отличаться).

Добавим колонку в таблицу документа

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

Допустим, мы хотим добавить колонку в таблицу выданных авансов авансового отчета как-нибудь так:


Для этого просто напишем в процедуре ПриСозданииНаСервере такой вот код:

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


1С 8.3 Программное создание таблицы значений на форме в управляемом приложении


Выводим на форму заполненную Таблицу значений в 1С 8.3:

&НаСервере
Процедура ПриОткрытииНаСервере ()

// Описание таблицы значений как реквизита
МассивТипа = Новый Массив ;
МассивТипа . Добавить ( Тип ( "ТаблицаЗначений" ));

// Добавление ТаблицыЗначений в массив реквизитов
ОписаниеТипа = Новый ОписаниеТипов ( МассивТипа );
МассивРеквизитовФормы = Новый Массив ;
МассивРеквизитовФормы . Добавить (Новый РеквизитФормы ( "ТаблицаСотрудников" , ОписаниеТипа , "" , "ТЗСотр" ));

// Создание ТаблицыЗначений с описанием колонок
КвалификаторыСтроки = Новый КвалификаторыСтроки ( 10 );
ОписаниеСтроки_10 = Новый ОписаниеТипов ( "Строка" , , КвалификаторыСтроки );

ОписаниеСотрудника = Новый ОписаниеТипов ( "СправочникСсылка.Сотрудники" );

ТЗ = Новый ТаблицаЗначений ;
ТЗ . Колонки . Добавить ( "Код" , ОписаниеСтроки_10 );
ТЗ . Колонки . Добавить ( "Сотрудник" , ОписаниеСотрудника );
// ТЗ.Колонки.Добавить - можно и в цикле

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

// Удаление - если таблица существует
ЭлементТаблица = Элементы . Найти ( "ТаблицаСотрудников" );
Если ЭлементТаблица <> Неопределено Тогда
Элементы . Удалить ( ЭлементТаблица );
Иначе
ИзменитьРеквизиты ( МассивРеквизитовФормы );
КонецЕсли;

// Добавление ТаблицыЗначений на форму
ТаблицаПолейВыбора = Элементы . Добавить ( "ТЗСотр" , Тип ( "ТаблицаФормы" ));
ТаблицаПолейВыбора . ПутьКДанным = "ТаблицаСотрудников" ;
ТаблицаПолейВыбора . Отображение = ОтображениеТаблицы . Список ;
ТаблицаПолейВыбора . ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы . Нет ; // Отключение командной панели

Для Каждого Колонка Из ТЗ . Колонки Цикл

НовыйЭлемент = Элементы . Добавить ( Колонка . Имя , Тип ( "ПолеФормы" ), ТаблицаПолейВыбора );
НовыйЭлемент . Вид = ВидПоляФормы . ПолеВвода ;
НовыйЭлемент . ПутьКДанным = "ТаблицаСотрудников." + Колонка . Имя ;
НовыйЭлемент . Ширина = 10 ;

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

РезультатЗапроса = Запрос . Выполнить ();

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

// Передача ТаблицыЗначений в реквизит формы
ЗначениеВРеквизитФормы ( ТЗ , "ТаблицаСотрудников" );


1С 8.3 Динамический вывод Таблицы значений на форму


Выводим на форму Таблицу значений и очищаем предыдущую (структуру и данные) в 1С 8.3:

Процедура Вывести_ТЗ_в_Таблицу_на_форме ( ТЗ , ТабРеквизитФормы , ТабЭлементФормы = Неопределено) Экспорт

// Процедура позволяет выводить любое количество таблиц значений в таблицу формы
// (с различным количеством и названиями полей). При изменении выводимых данных –
// таблица на форме программно очищается и заменяется на новую с новым составом
// полей и данных соответствующей таблицы значений.

Если ТабЭлементФормы = Неопределено Тогда // проверка передан ли элемент формы
ТабЭлементФормы = ТабРеквизитФормы ;
КонецЕсли;

Реквизиты_для_удаления = Новый Массив ;
Элементы_для_удаления = Новый Массив ;
Реквизиты_для_вывода = Новый Массив ;

// Получаем данные (на которые элементы формы ссылаются)
// по добавленным ранее реквизитам и элементам формы
Для Каждого Элемент Из Элементы [ ТабЭлементФормы ]. ПодчиненныеЭлементы Цикл
Реквизиты_для_удаления . Добавить ( Элемент . ПутьКДанным );
Элементы_для_удаления . Добавить ( Элемент );
КонецЦикла;
// Удаляем элементы
Для Каждого УдалитьЭлемент Из Элементы_для_удаления Цикл
Элементы . Удалить ( УдалитьЭлемент );
КонецЦикла;

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

// Удаляем старые реквизиты и выводим новые реквизиты
ИзменитьРеквизиты ( Реквизиты_для_вывода , Реквизиты_для_удаления );

// Добавляем колонки из Таблицы значений
// в элементы ТабЭлементФормы (со ссылкой на колонки в ТабРеквизитФормы)
Для Каждого КолонкаТЗ Из ТЗ . Колонки Цикл
ЭлементТЗ = Элементы . Добавить ( ТабРеквизитФормы + "_" + КолонкаТЗ . Имя , Тип ( "ПолеФормы" ), Элементы [ ТабЭлементФормы ]);
ЭлементТЗ . Вид = ВидПоляФормы . ПолеНадписи ; //Или ПолеВвода, или что-то другое;
ЭлементТЗ . ПутьКДанным = ТабРеквизитФормы + "." + КолонкаТЗ . Имя ;
КонецЦикла;

// В реквизит загружаем Таблицу значений
ЭтаФорма [ ТабРеквизитФормы ]. Загрузить ( ТЗ );

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


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

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

Справка

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

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

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

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

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

Итак, у нас есть справочник «Тест» с табличной частью «Тест», в табличной части присутствуют реквизиты «Тест1» и «Тест2», а нам нужно добавить еще один реквизит — «Тест3» и показать его на форме.

Выглядит это приблизительно так:

Не думаю, что приведенный код нуждается в комментариях, но на всякий случай скажу, что первые три строки создают новый реквизит типа «Строка» — тут важно указать путь к создаваемому реквизиту — третий параметр.

Точно также можно добавить колонку любой таблице значений (не табличной части) — в этом случае нужно убрать часть «Объект.» из кода.

Следующие три строки добавляют саму колонку на форму.

На этом все, надеюсь данная статья Вам помогла.

Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

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

Как создать на форме таблицу и сделать для неё подсветку содержимого колонки в строке по условию?

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


Похожие FAQ

Еще в этой же категории

Как активизировать, перевести фокус на необходимый элемент на форме? 6
//Текущему Элементу формы присваиваем элемент котровый необходимо активизировать ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ТабличноеПоле; Форма

Читайте также: