gifts2017

Описание пары важных функций для управляемого интерфейса: СоздатьКолонки() в 1C 8.2, ИзменитьРеквизиты()

Опубликовал L M (lm-alex) в раздел Программирование - Практика программирования

Столкнулся с проблемой отсутствия такой функции, как СоздатьКолоноки() в 1С8.2. и нормального описание функции ИзменитьРеквизиты()
Задача такая:
Есть динамически заполняемая таблица значений, надо ее отображать на форме.

В поисках решения пришлось покопаться сети, но тоже нормального решения не нашел, или плохо искал, все как то узко, и трудно, решил сам реализовать.

Решение это Процедура, которую надо создать у себя в модуле формы и передавать параметры, и будет вам счастье)

Вот собственно сама процедура:

//*********************************

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

   
КонецПроцедуры

//*********************************

Описание передаваемых параметров:

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

2) ИмяРеквизитаДанныеФормыКоллекция - Имя реквизита формы, его надо создать, пример настройки на картинке (имя должно отличаться от имени элемента формы, желательно) (Пример как у меня "Таблица")

3) ТаблицаЗначений - Собственно сама таблица с данными из-за которой все это и делалось.)

Ну вот и все. На 1С8.1 это выгляделобы так:

ИмяРеквизитаДанныеФормыКоллекция = ТаблицаЗначени;

ЭлементыФормы.ИмяПоляТаблицыФормы.СоздатьКолонки();

 

См. также

Вознаграждение за ответ
Сумма: 0 $m
Добавили:
Андрей Фоломкин (folo) (1.00 $m)
Подписаться Добавить вознаграждение

Комментарии

1. Сергей Ожерельев (Поручик) 10.11.11 14:53
Несколько полезных для начинающего статей
Управляемая форма 1С 8.2 – работа с деревом значений и таблицей значений.
http://www.obrabotki.com/1s-tree-table-managedforms-1/
2. Сергей Ожерельев (Поручик) 10.11.11 14:54
3. L M (lm-alex) 10.11.11 15:02
Поручик пишет:

Несколько полезных для начинающего статей

Управляемая форма 1С 8.2 – работа с деревом значений и таблицей значений.

http://www.obrabotki.com/1s-tree-table-managedforms-1/


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

На счет раскраски, спасибо, как нибудь попробую... Это хорошо бы к разработчикам сайта, чтоб добавили функцию при редактировании: "вставить элемент кода", что б проще было публикации писать.
4. red 80 (red80) 10.11.11 16:29
Столкнулся с проблемой отсутствия такой функции, как СоздатьКолоноки() в 1С8.2...

.Колонки.Добавить() - не то?

... и нормального описание функции ИзменитьРеквизиты()

Разработка управляемого интерфейса (В. А. Ажеронок, А. В. Островерх, М. Г. Радченко, Е. Ю. Хрусталева)
5. L M (lm-alex) 10.11.11 16:36
.Колонки.Добавить() - не то? - Причем здесь это? Ты не понял похоже проблемы.

В 8.1 у табличного поля была функция СоздатьКолонки():
"ТабличноеПоле (TableBox)
СоздатьКолонки (CreateColumns)
Синтаксис:
СоздатьКолонки()
Описание:
Удаляет старые колонки и загружает новые колонки из источника данных." Вот ее нету в 8.2, тоесть приходится самому создавать реквизиты и элементы. Процедура моя в помощь.


Про существование книги "Разработка управляемого интерфейса (В. А. Ажеронок, А. В. Островерх, М. Г. Радченко, Е. Ю. Хрусталева)" я знаю, но думаю что у процента 90% ее нету, как и у меня.
6. Евгений Левченко (MYRZILKA123) 14.11.11 12:00
7. ninch Иванов (ninch) 16.11.11 06:57
Молодец, что не поленился и выложил статью. Недавно похожие проблемы были. Так же где-то нашел такое же описание
http://forum.mista.ru/topic.php?id=543734
И очень был этому рад:)
И кстати всплыла одна проблема с которой так и не смог справиться. После команды ИзменитьРеквизиты() (при условии добавления реквизитов) волшебным образом изменяется форма - едут размеры объектов на форме. наверное это не доработка 1С
8. Владимир Чаклин (vec435) 16.11.11 09:50
9. Андрей М. (StepByStep) 21.11.11 23:29
В случае, если некая таблица должна находиться на какой-то конкретной странице, то тогда:

ЭлементРеквизита = Элементы.Добавить(ИмяПоляТаблицыФормы, Тип("ТаблицаФормы"), Родитель);
и т д.

в той обработке, что сейчас пишу именно так. Много страниц, много вкладок ...
10. invalid (нормальный такой) 29.04.13 14:34
10й раз перечитываю...
все равно непонятно как удалять

создать не проблема, и назначить обработчик события не проблема. как удалить - проблема.
11. L M (lm-alex) 29.04.13 15:19
12. invalid (нормальный такой) 27.05.13 11:09
(11) lm-alex, в целом разобрался сам.
по синтаксис.помощнику внимательно - удаляться могут только программно добавленные элементы/реквизиты формы

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

//Обязательное обновление формы
		
ЭтаФорма.ИзменитьРеквизиты(МассивРеквизитов);

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


и после можно удалять такие элементы
внимание! используется таже процедура формы, просто будем передавать второй параметр с массивом ПУТЕЙ удаляемых реквизитов.

ЭтаФорма.ИзменитьРеквизиты(<Реквизиты добавления>,<Реквизиты удаления>);


собственно у меня и была загвостка с этими ПУТЯМИ
обратите внимание, что при добавление в качестве ПУТИ (3й параметр) я передаю пустую строку
МассивРеквизитов.Добавить(Новый РеквизитФормы(Имя, Новый ОписаниеТипов(МассивТипов),""));


в итоге я в массив удаляемых реквизитов передаю ИМЕНА ранее программно добавленых реквизитов
МассивРеквизитов = Новый Массив;
МассивРеквизитов.Добавить(Имя);
ИзменитьРеквизиты(,МассивРеквизитов);

//удаление Элемента
Элементы.Удалить(нЭлемент);
...Показать Скрыть
13. Андрей Фоломкин (folo) 04.06.15 15:16
Лучшая статья по данной теме. 4 года как опубликовано и только что ее нашел.
Все заработало в 5 сек. Автору респект.
14. Владимир Антонов (vovant) 22.12.15 12:36
Давно не занимался по стечению обстоятельств управляемыми формами. Вот столкнулся с такой же проблемой. Привык использовать процедуру "СоздатьКолонки()". Спасибо за процедуру "СоздатьТаблицуФормы".
Я делаю так:
1. создаю таблицу "ТЗ";
2. создаю процедуру
&НаСервере
Процедура Заполнить() 
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ...";
	ТаблицаЗапроса = Запрос.Выполнить().Выгрузить();
	СоздатьТаблицуФормы("ТЗ","ТЗ",ТаблицаЗапроса);
КонецПроцедуры
...Показать Скрыть
15. Сергей Племянников (Serge_ASB) 06.06.16 15:05
Переписал свою обработку с использованием данной процедуры: выводит форму списка выбранного спраочника и позволяет изменить буквы в наименовании и полном наименовании.
При повторном открытии (формировании таблицы) ругается... При выборе другого справочника тоже ругается...
Не все колонки может удалить и не все колонки может пересоздать.
Как написать, чтобы при необходимости повторно вывести очищался весь реквизит Таблица?
Файл прилагаю.
Прикрепленные файлы:
Поиск и замена букв.epf
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа