Программное создание табличного поля в обычном приложении

1. Илья Кутузов (Kutuzov) 153 20.04.13 12:10 Сейчас в теме
Как в обычной (неуправляемой) форме программно добавить на форму табличное поле, в котором вывести список документов "Реализация товаров и услуг"?
Чтобы данное поле было полностью идентично тому, которое можно создать обычным способом через конструктор, указав источник данных "ДокументСписок.РеализациТоваровУслуг".
Вознаграждение за ответ
Показать полностью
Найденные решения
2. Александр Плюшкин (php5) 9 20.04.13 12:42 Сейчас в теме
Как-то так, проверил работает:

ТабличноеПоле = ЭлементыФормы.Добавить(Тип("ТабличноеПоле"),"НовоеТП", Истина); // , ЭлементыФормы.ОсновнаяПанель

ТабличноеПоле.ТипЗначения = Новый ОписаниеТипов("ДокументСписок.РеализацияТоваровУслуг");
ТабличноеПоле.Верх = 24;
ТабличноеПоле.Лево = 6;
ТабличноеПоле.Ширина = Ширина-40;
ТабличноеПоле.Высота = Высота-50;

ТабличноеПоле.СоздатьКолонки();
Остальные ответы
2. Александр Плюшкин (php5) 9 20.04.13 12:42 Сейчас в теме
Как-то так, проверил работает:

ТабличноеПоле = ЭлементыФормы.Добавить(Тип("ТабличноеПоле"),"НовоеТП", Истина); // , ЭлементыФормы.ОсновнаяПанель

ТабличноеПоле.ТипЗначения = Новый ОписаниеТипов("ДокументСписок.РеализацияТоваровУслуг");
ТабличноеПоле.Верх = 24;
ТабличноеПоле.Лево = 6;
ТабличноеПоле.Ширина = Ширина-40;
ТабличноеПоле.Высота = Высота-50;

ТабличноеПоле.СоздатьКолонки();
3. Илья Кутузов (Kutuzov) 153 20.04.13 14:13 Сейчас в теме
(2) php5, спасибо, работает!)
4. Илья Кутузов (Kutuzov) 153 21.04.13 12:46 Сейчас в теме
Работает, но не до конца... Как выяснилось, реквизит "Данные" у созданного элемента формы не заполнен. Поэтому, например, нельзя отборы настроить. Далее, после некоторых поисков в интернете выяснилось, что программно создать реквизит формы, чтобы привязать его к элементу управления, НЕЛЬЗЯ. Очень печально.. Хотя на управляемых формах это сделать возможно.
5. Артем Ватан (v.a.ryag) 32 16.08.13 13:44 Сейчас в теме
использовать отборы можно кстати
6. Татьяна Михайлова (tmixsam) 52 07.02.14 09:05 Сейчас в теме
В форме элемента справочника Номенклатура

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)

.......

Если Лев(Наименование,7) = "Барабан" Тогда
СКК_ДобавитьСтраницуДляБарабанов();
КонецЕсли;
КонецПроцедуры // ПередОткрытием()


Процедура СКК_ДобавитьСтраницуДляБарабанов()
ЭлФ = ЭтаФорма.ЭлементыФормы;
ЭлФПанель = ЭлФ.ОсновнаяПанель;
Страницы = ЭлФПанель.Страницы;
Страницы.Добавить( "ДляБарабанов", "Для Барабанов");

СтараяСтраница = ЭлФПанель.ТекущаяСтраница;
ЭлФПанель.ТекущаяСтраница = Страницы.ДляБарабанов;

ТабПоле = ЭлФ.Добавить(Тип("ТабличноеПоле"),"ТЧ_РасходПиломатериалов", Истина, ЭлФПанель );
ТабПоле.ТипЗначения = Новый ОписаниеТипов("РегистрСведенийСписок.СКК_РасходПиломатериалов");
ТабПоле.ИзменяетДанные = Истина;
ТабПоле.Доступность = Истина;
ТабПоле.ИзменятьСоставСтрок = Истина;
ТабПоле.ТолькоПросмотр = Ложь;
ТабПоле.Верх = 36;
ТабПоле.Лево = 6;
ТабПоле.Ширина = 586;
ТабПоле.Высота = 139;
ТабПоле.Подсказка = "(СКК) Расход пиломатериалов на крепление барабанов";
ТабПоле.УстановитьПривязку(ГраницаЭлементаУправления.Низ,ЭлФПанель,ГраницаЭлементаУправления.Низ);
ТабПоле.УстановитьПривязку(ГраницаЭлементаУправления.Лево,ЭлФПанель,ГраницаЭлементаУправления.Лево);
ТабПоле.УстановитьПривязку(ГраницаЭлементаУправления.Право,ЭлФПанель,ГраницаЭлементаУправления.Право);
ТабПоле.СоздатьКолонки();

Колонка = ТабПоле.Колонки.Найти("Номенклатура");
Колонка.Видимость = Ложь;

ТабПоле.Значение.Отбор.Номенклатура.Использование = Истина;
ТабПоле.Значение.Отбор.Номенклатура.Значение = Ссылка;
ТабПоле.Значение.Отбор.Номенклатура.ВидСравнения = ВидСравнения.Равно;

КомПанель = ЭлФ.Добавить(Тип("КоманднаяПанель"),"КоманднаяПанельТЧ_РасходПиломатериалов", Истина, ЭлФПанель );
КомПанель.Вспомогательная = Истина;
КомПанель.Автозаполнение = Истина;
КомПанель.ИсточникДействий = ТабПоле;
КомПанель.Верх = 6;
КомПанель.Лево = 6;
КомПанель.Ширина = 586;
КомПанель.Высота = 25;

ЭлФПанель.ТекущаяСтраница = СтараяСтраница;
КонецПроцедуры
7. Татьяна Михайлова (tmixsam) 52 07.02.14 09:43 Сейчас в теме
Или в форме списка справочника Номенклатура

выбираем мышкой нужный элемент, например "Барабан 18В"

вверху в форме списка нажимаем кнопочку "Перейти"

из выпадающего списка выбираем "(СКК) Расход пиломатериалов на крепление барабанов"

Попадаем в список регистра сведений, в котором уже задан отбор Номенклатура = "Барабан 18В".
8. Михаил Петухов (oldfornit) 07.02.14 16:59 Сейчас в теме
(4) Kutuzov, немного не понял. Привязать к элементу управления? Вам необходимо назначить какие-то обработчики табличному полю?

Если да -
НовыйЭлемент.УстановитьДействие("ПриПолученииДанных", Новый Действие("ПриПолученииДанных"));

Процедура ПриПолученииДанных(Элемент, ОформленияСтрок)
	
	КрасныйЦвет = Новый Цвет(255, 0, 0);
	ОбычныйЦвет = Новый Цвет();
	
	Для Каждого элементОформленияСтрок из ОформленияСтрок Цикл
		элементОформленияСтрок.Ячейки.Колонка1.Текст = элементОформленияСтрок.ДанныеСтроки.Номенклатура.Артикул;
		элементОформленияСтрок.Ячейки.Колонка1.ОтображатьТекст = Истина;
		элементОформленияСтрок.Ячейки.Колонка1.Выравнивание = ГоризонтальноеПоложение.Право;
		
		//цветовая маркировка незаполненного количества
		Если Не элементОформленияСтрок.ДанныеСтроки.Обработан Тогда
			элементОформленияСтрок.Ячейки.Количество.ЦветФона = КрасныйЦвет;
		Иначе 
			элементОформленияСтрок.Ячейки.Количество.ЦветФона = ОбычныйЦвет;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры
...Показать Скрыть
9. Александр Жигурт (jigourt) 23 07.02.14 17:09 Сейчас в теме
НовоеПолеВвода = ЭтаФорма.ЭлементыФормы.Добавить(Тип("ПолеВвода"),ИмяРеквизитаФормы);
НовоеПолеВвода.Данные = ИмяРеквизитаФормы;
НовоеПолеВвода.Значение = Константы[ИмяРеквизитаФормы].Получить();
НовоеПолеВвода.Верх = 33
НовоеПолеВвода.Лево = 140;
НовоеПолеВвода.Ширина = 252; 
НовоеПолеВвода.Высота = 19;
НовоеПолеВвода.КнопкаВыбора = Истина;
НовоеПолеВвода.КнопкаОчистки = Истина;
			
ДействиеОбработкаВыбора = Новый Действие("ОсновнаяОрганизацияПриИзменении");    
НовоеПолеВвода.УстановитьДействие("ПриИзменении",ДействиеОбработкаВыбора);
...Показать Скрыть

это пример создания поля ввода с заполнением данные и значение
вот только жаль 12 см уже улетели
10. Михаил Петухов (oldfornit) 07.02.14 18:04 Сейчас в теме
(9) jigourt, хм, да я как бы за ними и не рвался. Вынесли бы вы лучше имена реквизитов из констант...
11. Александр Жигурт (jigourt) 23 07.02.14 18:24 Сейчас в теме
(10) oldfornit, да я тоже, но лишними бы не были ))) а по поводу имен, так это не имена реквизитов в константах, это кусок кода, который строит форму констант сам ))
12. Илья Кутузов (Kutuzov) 153 07.02.14 22:52 Сейчас в теме
(6) tmixsam, спасибо, работает.
(9) jigourt, боюсь, 12 см вам не светят :). Из вашего примера видно, что вы используете реквизиты формы (если я правильно понял). А их можно только "ручками" в конфигураторе добавлять, а программно нельзя.
13. Александр Жигурт (jigourt) 23 07.02.14 23:37 Сейчас в теме
(12) Kutuzov, и как вы к такому выводу пришли?? переменная ИмяРеквизитаФормы просто строка, полученная из имени константы

Процедура ПриОткрытии()
	ЭтаФорма.ЭлементыФормы.Очистить();
	КолвоПолей = 0;
	Для каждого Конст Из Метаданные.Константы Цикл
		Если Конст.Подсказка = "МояКонстанта" Тогда
			НовоеПолеВвода = ЭтаФорма.ЭлементыФормы.Добавить(Тип("ПолеВвода"),Конст.Имя);
			НовоеПолеВвода.Данные = Конст.Имя;
			НовоеПолеВвода.Значение = Константы[Конст.Имя].Получить();
			НовоеПолеВвода.Верх = 33 + КолвоПолей * 20;
			НовоеПолеВвода.Лево = 140;
			НовоеПолеВвода.Ширина = 252; 
			НовоеПолеВвода.Высота = 19;
			НовоеПолеВвода.КнопкаВыбора = Истина;
			НовоеПолеВвода.КнопкаОчистки = Истина;
			
			ДействиеОбработкаВыбора = Новый Действие("ОсновнаяОрганизацияПриИзменении");    
			НовоеПолеВвода.УстановитьДействие("ПриИзменении",ДействиеОбработкаВыбора);

			НоваяНадпись = ЭтаФорма.ЭлементыФормы.Добавить(Тип("Надпись"),"Надпись"+Конст.Имя);
			НоваяНадпись.Заголовок = Конст.Синоним;
			НоваяНадпись.Верх = 33 + КолвоПолей * 20;
			НоваяНадпись.Лево = 8;
			НоваяНадпись.Ширина = 122; 
			НоваяНадпись.Высота = 19;
			КолвоПолей = КолвоПолей + 1;
		КонецЕсли; 
	КонецЦикла; 
КонецПроцедуры
...Показать Скрыть


вот прицепил код целиком
14. Илья Кутузов (Kutuzov) 153 08.02.14 06:09 Сейчас в теме
(13) jigourt, ясно, спасибо. Но этот вариант не совсем подходит по программное создание табличных полей списков справочников и документов. Решение - см. выше.
15. Анатолий Д (АнатолийАндреевич) 1 26.12.16 15:08 Сейчас в теме
(5) Подскажите как использовать отборы в колонке табличного поля, которая была создана программно?

Создаю колонку таким кодом:

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

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

Отбор по "ПроектНовый" не работает.
16. Виктория Дорохина (vikad) 26.12.16 15:39 Сейчас в теме
ЭтаФорма.ЭлементыФормы.ЖурналДокументовСписок.НастройкаОтбора.ПроектНовый.Доступность = Истина
17. Анатолий Д (АнатолийАндреевич) 1 27.12.16 06:07 Сейчас в теме
(16)

{ЖурналДокументов.ДокументыКонтрагентов.Форма.ФормаСписка.Форма(73)}: Поле объекта не обнаружено (ПроектНовый)
	ЭтаФорма.ЭлементыФормы.ЖурналДокументовСписок.НастройкаОтбора.ПроектНовый.Доступность = Истина

В элементах отбора нет моей колонки.
18. Виктория Дорохина (vikad) 27.12.16 10:10 Сейчас в теме
ЖурналДокументовСписок - это какой тип значения? В объекте метаданных, соответствующему этому типу значения должен быть реквизит ПроектНовый. Вы же все равно конфигурацию дорабатываете, так что выход только такой.
19. Анатолий Д (АнатолийАндреевич) 1 28.12.16 10:27 Сейчас в теме
(18)
ЖурналДокументовСписок - это какой тип значения?

Это табличное поле.
Уточню задачу, возможно поможет: необходмо в журнал документов добавить колонку "Проект" (решено), заполнить ее данными (решено) и добавить возможность отбора по значению в этой колонке.
20. Виктория Дорохина (vikad) 28.12.16 10:59 Сейчас в теме
ЖурналДокументовСписок - это какой тип значения?

Это табличное поле.


его данные имеют какой тип значения? У табличного поля есть свойство Данные - как я понимаю, это ЖурналДокументовСписок. У этого же табличного поля есть свойство ТипЗначения. Вот туда загляните, пожалуйста, и в объекте метаданных, соответствующему этому типу значения добавьте реквизит ПроектНовый.
И да, отбор в табличном поле возможен только по значению, которое хранится в базе данных. Если данные в колонке ПроектНовый берутся не из реквизитов документов, отбор сделать не получится
21. Slava Kron (SlavaKron) 28.12.16 16:40 Сейчас в теме
(20)
Всегда можно сделать отбор по ссылкам с имитацией отбора по полю, не имеющему привязку к данным.
22. Анатолий Д (АнатолийАндреевич) 1 30.12.16 11:34 Сейчас в теме
(20)
его данные имеют какой тип значения? У табличного поля есть свойство Данные - как я понимаю, это ЖурналДокументовСписок. У этого же табличного поля есть свойство ТипЗначения.


Да, тип значения "ЖурналДокументовСписок.ДокументыКонтрагентов"


(20)
Вот туда загляните, пожалуйста, и в объекте метаданных, соответствующему этому типу значения добавьте реквизит ПроектНовый


В журнал документов я могу добавить новую графу. В графе указать необходимые реквизиты документов. Но в некоторых документах проект указан в табличной части и я не могу указать реквизит ТЧ как источник данных для этой строки. Хочу заполнить программно эту графу, но в оформлении ячейки могу поменять только текст, данные изменить нельзя (следовательно отбор нормально не работает). Пытаюсь создать столбец табличного поля программно, но тогда отбор не работает совсем. Это тупик и никак нереализуемо?
23. Виктория Дорохина (vikad) 30.12.16 12:29 Сейчас в теме
Если Вы спрашивали про стандартный отбор списка - то он работает только так. Но Вам ничего не мешает над табличной частью журнала документов добавить поле фильтрации по проекту и в этом поле указывать нужный Вам проект. А отбор по журналу документов устанавливать программно, передавая в него массив ссылок, документы которых относятся к выбранному проекту (этот массив Вы можете получить запросом в тексте модуля)
Оставьте свое сообщение