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

10.11.11

Разработка - Универсальные функции

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    5403    DeerCven    15    

57

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    46296    dimanich70    83    

164

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    6840    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    57349    atdonya    31    

68

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

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

30.11.2023    8605    ke.92@mail.ru    17    

68

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    22757    YA_418728146    8    

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

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

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

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


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

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

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

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

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

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


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

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

в той обработке, что сейчас пишу именно так. Много страниц, много вкладок ...
17. DikSer 19 16.08.19 06:38 Сейчас в теме
(9)
Тип("ТаблицаФормы"), Родитель);

(9)
10. нормальный такой 93 29.04.13 14:34 Сейчас в теме
10й раз перечитываю...
все равно непонятно как удалять

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

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

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

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


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

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


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


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

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

		Если Найти(ЭлементРеквизита.Имя,"ДанныеТаблицыОбязательныйАссортимент") > 0 Тогда
			ЭлементРеквизита.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
			ЭлементРеквизита.ОграничениеТипа = Новый ОписаниеТипов("Булево");
			ЭлементРеквизита.ГоризонтальноеПоложениеВГруппе = ГоризонтальноеПоложениеЭлемента.Лево;
			ЭлементРеквизита.ГоризонтальноеПоложениеВШапке = ГоризонтальноеПоложениеЭлемента.Лево;		
			ЭлементРеквизита.Вид = ВидПоляФормы.ПолеФлажка;
			ЭлементРеквизита.РежимРедактирования = РежимРедактированияКолонки.Вход;
			ЭлементРеквизита.КартинкаШапки = БиблиотекаКартинок.ОбязательныйАссортимент;		
			ЭлементРеквизита.ОтображениеПодсказки = ОтображениеПодсказки.Всплывающая;
			ЭлементРеквизита.Подсказка = "Товар входит в обязательный ассортимент";		
			ЭлементРеквизита.Подсказка = "Товар входит в товарную матрицу";
			ЭлементРеквизита.ШиринаЭлемента = 2;
		Иначе
			ЭлементРеквизита.Вид = ВидПоляФормы.ПолеВвода;
		КонецЕсли;
Показать


Но 1ска всё-равно реквизит в таблице отображает как ПолеВвода...
18. lm-alex 149 26.08.19 11:04 Сейчас в теме
(16) Да, это я не учет, но быстро получилось реализовать.

При создании таблицы значений, надо обязательно описать тип:

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


и в коде когда создаем уже сами элементы формы я сделал проверку на описание типа:

 
Массив = Новый Массив;
Массив.Добавить(Тип("Булево"));
ОТБулево = Новый ОписаниеТипов(Массив);
	
// Добавление элементов форму
Для каждого Колонка Из ТаблицаЗначений.Колонки Цикл
        ЭлементРеквизита = Элементы.Добавить(ИмяПоляТаблицыФормы + Колонка.Имя, Тип("ПолеФормы"), Элементы[ИмяПоляТаблицыФормы]);
        ЭлементРеквизита.ПутьКДанным = ИмяРеквизитаДанныеФормыКоллекция + "." + Колонка.Имя;
		
	Если Колонка.ТипЗначения = ОТБулево Тогда
		ЭлементРеквизита.Вид = ВидПоляФормы.ПолеФлажка;
		ЭлементРеквизита.РежимРедактирования = РежимРедактированияКолонки.ВходПриВводе;
	Иначе
        	ЭлементРеквизита.Вид = ВидПоляФормы.ПолеВвода;
	КонецЕсли;
		
КонецЦикла;
Показать
19. lm-alex 149 27.08.19 11:30 Сейчас в теме
Или так:
Если Колонка.ТипЗначения.СодержитТип(Тип("Булево")) Тогда
Для отправки сообщения требуется регистрация/авторизация