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

10.11.11

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

18.03.2024    2670    0    John_d    8    

54

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

12.02.2024    4607    atdonya    22    

45

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

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

30.11.2023    3961    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

28.08.2023    8822    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2071    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16144    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7243    quazare    8    

109
Вознаграждение за ответ
Показать полностью
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Поручик 4670 10.11.11 14:53 Сейчас в теме
Несколько полезных для начинающего статей
Управляемая форма 1С 8.2 – работа с деревом значений и таблицей значений.
http://www.obrabotki.com/1s-tree-table-managedforms-1/
2. Поручик 4670 10.11.11 14:54 Сейчас в теме
3. lm-alex 146 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 146 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 15 16.11.11 09:50 Сейчас в теме
9. StepByStep 3667 21.11.11 23:29 Сейчас в теме
В случае, если некая таблица должна находиться на какой-то конкретной странице, то тогда:

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

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

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

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

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

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

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


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

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


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


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

//удаление Элемента
Элементы.Удалить(нЭлемент);
13. folo 223 04.06.15 15:16 Сейчас в теме
Лучшая статья по данной теме. 4 года как опубликовано и только что ее нашел.
Все заработало в 5 сек. Автору респект.
14. vovant 42 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 146 26.08.19 11:04 Сейчас в теме
(16) Да, это я не учет, но быстро получилось реализовать.

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

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


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

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