Программное создание кнопок на форме

1. Varlant1n 15.01.21 14:42 Сейчас в теме +2 $m
Есть документ ЗаданиеВодителя. У этого документа есть табличная часть в которой хранятся ссылки на документ ЗаказКлиента. Мне надо в форме сделать программное создание кнопок того же количества, что и строк в табличной части.

П.С. заголовки кнопок тоже должны программно меняться и соответсвовать заказку клиента

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


Объясню всю ситуацию с самого начала. Есть обработка ОформлениеДвижения. На этой обработке при выборе водителя происходит проверка "Есть ли у водителя документ ЗаданиеВодителю", у которого есть табличная часть с заказами клиентов. Если такого документа нет, то просто выходит предупреждение. Если же документ есть, то должна открыться форма с кнопками. Кнопок должно быть столько же, сколько и документов в табличной части. При нажатии на определенную кнопку. Форма обработки ОформлениеДвижения заполняется данными из этого Заказа Клиента.
Но как мне поступать дальше идей нет. Может создать массив с этими ссылками или ещё как-то. Есть идеи как это можно сделать?
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. Varlant1n 15.01.21 14:44 Сейчас в теме
(1) При нажатии на одну из кнопок форма длжна будет заполнить данные из документа ЗаказКлиента
3. RocKeR_13 1314 15.01.21 14:51 Сейчас в теме
(1) А почему бы по нажатию на кнопку не заполнять по выделенной строке?
5. Varlant1n 15.01.21 14:59 Сейчас в теме
(3) Смотрите. Объясню всю ситуацию с самого начала. Есть обработка ОформлениеДвижения. На этой обработке при выборе водителя происходит проверка "Есть ли у водителя документ ЗаданиеВодителю", у которого есть табличная часть с заказами клиентов. Если такого документа нет, то просто выходит предупреждение. Если же документ есть, то должна открыться форма с кнопками. Кнопок должно быть столько же, сколько и документов в табличной части. При нажатии на определенную кнопку. Форма обработки ОформлениеДвижения заполняется данными из этого Заказа Клиента.

П.С. заголовки кнопок тоже должны программно меняться и соответсвовать заказку клиента
11. RocKeR_13 1314 15.01.21 15:25 Сейчас в теме
(5) А почему просто не вывести таблицу с заказами? Или это для мобильного приложения?
А так можете ознакомиться с моей публикацией https://infostart.ru/1c/articles/925455/ Там, в принципе, будет достаточно информации для реализации)
12. Varlant1n 15.01.21 15:27 Сейчас в теме
(11) Это для терминала. И там именно таким образом удобнее для сотрудников.
14. dandykry 9 15.01.21 15:40 Сейчас в теме
(1) Возьми 2 примера

Вопросник показывает как в таблице хранить данные. Заполни таблицу запросов и начни тест

Кнопки выбора - как подгружать данные. тут вся номенклатура отрисовывается на форме в виде кнопок. тебе интересен 1 вариант, потому что 2 без общих модулей не работает

Подключаемый_Номенклатура_ВыбратьЭлемент - тут реализуй логику загрузки из заказа
Прикрепленные файлы:
СозданиеКнопокВыбора (1).epf
ТестыВопросыДляТогоЧтобПоказать.epf
4. Климов Сергей 15.01.21 14:54 Сейчас в теме
Вам нужно будет создать команды (или команду) и кнопки.
Команда создаётся примерно так:

		Команда = Команды.Добавить(
		"ИмяМоейКоманды"); //Имя команды
		Команда.Заголовок = "Заголовок моей команды";
		Команда.Действие  = "ИмяПроцедурыОбработчикаКоманды"; //Имя связанной процедуры


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


Вопрос: а как вы будете определять, какую строку нужно обрабатывать при нажатии на какую-либо кнопку? Если анализировать текущую строку в ТЧ, то и нужды в N кнопках нет, достаточно одной.
6. Varlant1n 15.01.21 15:00 Сейчас в теме
(4) Думал как-то это связать с именем кнопки. То есть понятное дело, что заголовок будет меняться. А имя кнопки задать просто числом, то есть допустим от 1 до 10. При этом у самих документов в табличной части есть уникальные номера. Их мне надо будет как-то связать друг с другом
7. Климов Сергей 15.01.21 15:07 Сейчас в теме
(6) В имя кнопки добавляем порядковый номер (номер строки документа). Команду делать одну, указывать её во всех кнопках. В обработчике команды анализировать ЭтаФорма.ТекущийЭлемент().Заголовок. Из него определять имя кнопки - номер строки. Профит!
8. Varlant1n 15.01.21 15:09 Сейчас в теме
(7) Попробую так сделать. А как мне быть с запросом, который я написал. Верно ли я вооьще его написал. И как мне грамотнее оформить результат запроса?
9. Климов Сергей 15.01.21 15:15 Сейчас в теме
(8)
1) В запросе надо выбрать ссылки на заказы, поместить их в ТЗ.
2) ТЗ передать в параметре в открываемую форму.
3) В форме, ПриСозданииНаСервере пересчитать строки в этой ТЗ, создать кнопки. В имя кнопки добавить номер строки ТЗ.
4) При нажатии на кнопку определили её имя, получили номер строки. По номеру строки вытащили из ТЗ ссылку на документ.
5) По ссылке вытащили необходимые данные из документа, вывели их куда надо.
10. Varlant1n 15.01.21 15:18 Сейчас в теме
(9) Спасибо! А можно будет хоть чуток кода хотя бы в виде макета получить, чтобы полностью разобраться в этом. То есть макет кода из моего кейса? Я буду Вам очень и очень благодарен за это!
13. Климов Сергей 15.01.21 15:30 Сейчас в теме
(10)
В вызывающей форме:
ТаблицаЗаказов = Запрос.Выполнить().Выгрузить(); // В результате запроса д.б. ссылки на заказы
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ТаблицаЗаказов", ТаблицаЗаказов);
ОткрытьФорму("МояФормаСКнопочками",ПараметрыФормы_);


В форме МояФормаСКнопочками

Процедура ПриСозданииНаСервере()

Для н = 0 По Параметры.ТаблицаЗаказов.Количество() - 1 Цикл


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

КонецЦикла;
Показать

Команду можно создать в дизайнере форм.
В обработчике команды

НомерСтроки = число(сред(ЭтаФорма.ТекущийЭлемент().Заголовок, 12)) - 1;
ЗаказСсылка = Параметры.ТаблицаЗаказов[НомерСтроки].Ссылка;


Как-то так.
15. Varlant1n 15.01.21 15:41 Сейчас в теме
(13)
В вызывающей форме:
В вызывающей форме у меня запрос к самому документу, а не к его табличной части. То есть там я проверяю есть ли в принципе документ.

А в форме с кнопками у меня есть запрос к табличной части данного документа.

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка, Водитель)
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ЗаданиеВодителя.Документы.(
    |        НомерСтроки КАК НомерСтроки
    |    ) КАК Документы
    |ИЗ
    |    Документ.ЗаданиеВодителя КАК ЗаданиеВодителя 
    |ГДЕ
    |    НАЧАЛОПЕРИОДА(ЗаданиеВодителя .Дата, ДЕНЬ) = НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ)
    |    И ЗаданиеВодителя .Проведен = ИСТИНА
    |    И ЗаданиеВодителя .Водитель= &Водитель";
    Запрос.УстановитьПараметр("Водитель", Водитель);
    Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата());
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    Если Выборка.Следующий() Тогда
                  /////////////////////////////////////////
    КонецЕсли;
КонецПроцедуры
Показать
16. Климов Сергей 15.01.21 16:28 Сейчас в теме
(15) Ну, если запрос в форме с кнопками, то и с передачей параметров огород городить не надо.
Что касается запроса: не вижу смысла выбирать номера строк табличной части. Надо выбирать ссылки на заказы.
17. Kovekh 15.01.21 16:39 Сейчас в теме
(15) Запрос фигня, если честно. Получайте не номер строки, а ссылку на документы из этих строки. Запрос пишите к ТЧ, а не к документу. Затем храните уид на эти документы, допустим, в подсказке элемента и получайте ваши документы в команде по этой подсказке.

Работы на 5 минут, если навыки программирования есть. Если навыков нет - пишите задание на разработку, определяйте бюджет. Здесь всё за вас вряд ли напишут. А если напишут, то для вас пользы никакой) А если нет пользы, то можно и заплатить тогда, чтобы не засорять память лишней информацией
18. Varlant1n 15.01.21 17:05 Сейчас в теме
(16)
(17)

Учел ваши замечания. У меня в вызывающей форме есть процедура в которую из функции и возвращается ссылка на документ ЗаданиеВодителя, если оно есть. Там в этой процедуре следующий код:

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


Эта процедура и перекидывает меня в процедуру в новой форме, в которой я написал следующий запрос:

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

Показать


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

Для каждого Строка Из ТаблицаЗначений Цикл
				
КонецЦикла;


Описать создание кнопок.
19. Kovekh 15.01.21 17:39 Сейчас в теме
(18) Уже лучше) Теперь запомните, что лучше не делать в запросе получение полей через 2 точки - это всегда дополнительное время обработки запроса. Здесь ладно ещё не сложный запрос, но если будет составное поле, у вас запрос может надолго повиснуть) Это я про
| ЗаданиеВодителяДокументы.Документ.Номер КАК Номер,
| ЗаданиеВодителяДокументы.Документ.Контрагент КАК Контрагент



Дальше в цикле создавайте элементы, как описано выше. Но маленькое уточнение. Элемент.Имя - это имя в конфигураторе, Элемент.Заголовок - как отображается для пользователя. Можете поэкспериментировать)
Соответственно, если вы при создании как-нибудь запихнете уид документа в Элемент.Имя, то сможете потом его получить обратно))

Помещение в имя:
Элемент.Имя = Строка(Строка.Документ.УникальныйИдентификатор()); //Стоит учесть, что в таком виде может не дать поместить и, возможно, придётся добавить ещё какие-нибудь символы в начале


Получение документа по имени:
ДокументСсылка = Документы.ЗаказКлиента.ПолучитьСсылку(Новый УникальныйИдентификатор(//Здесь получаете ссылку из имени вашего элемента));



А теперь самое весёлое - как получить нажатый элемент. Скорее всего, вам придётся приходить группу ваших элементов и смотреть пометку. Но, скорее всего, пометка не будет стоять. Потому предлагаю вам создавать не только разные элементы, но и разные команды программно, а действие у них у всех будет одинаковое. Потому что команду можно отловить в процедуре нажатия, а элемент - нет
20. Varlant1n 15.01.21 17:47 Сейчас в теме
(19) Нажатый элемент я думал получать через имя кнопки. То есть как Вы уточнили выше имя кнопки - это имя в конфигураторе. Я задам кнопкам имена просто цифрами. Допустим 01, 02, 03, 04, 05, и тд.. А у самих строк есть номера. Их я как-то постараюсь связать друг с другом.
21. Kovekh 15.01.21 17:48 Сейчас в теме
(20)Не получится. Я же говорю, нет возможности отследить, какой элемент нажат. Только если у них имена команд тоже будут отличаться
22. Varlant1n 15.01.21 17:58 Сейчас в теме
(21) Я попробую и отпишусь сюда, если вдруг получится то, что я предположил. Спасибо за внимание и за помощь! Удачи Вам!
23. Климов Сергей 15.01.21 17:59 Сейчас в теме
(21) А ЭтаФорма.ТекущийЭлемент() не годится? Сам не пробовал, честно говоря. Нужды не было.
24. Климов Сергей 15.01.21 18:05 Сейчас в теме
(21) Проверил. Кинул на форму три кнопки с одной командой. Код команды:

&НаКлиенте
Процедура Команда1(Команда)
	сообщить(ЭтаФорма.ТекущийЭлемент.Имя);
КонецПроцедуры


Выдаёт имена кнопок.
25. Varlant1n 15.01.21 18:08 Сейчас в теме
(24) Щас тоже попробую. Но я пока грамотно хочу создать кнопки. То есть команду я ещё не трогал. Щас с кнопками разбираюсь, с расположением, длиной, шириной и самое главное именем
26. Kovekh 15.01.21 18:12 Сейчас в теме
(24)С этой стороны чёт не подумал. Да, возможно, так и сработает, так что извиняюсь перед автором за дезинформацию)
27. Stepka1206 17.01.21 22:49 Сейчас в теме
как на счет добавить колонку в таблицу, а у элемнта(колонки на форме) установить признак гиперссылка?
28. Varlant1n 18.01.21 08:45 Сейчас в теме
(27) Не очень понял, что Вы предлагаете. Можно подробнее, пожалуйста.
34. Stepka1206 19.01.21 12:18 Сейчас в теме
(28)
В ячейке таблицы с видом гиперссылка вписывать некий текст, далее при нажатии по этому тексту определять что делать, с данными строки в которой выполнили нажатие.
Прикрепленные файлы:
29. Varlant1n 18.01.21 08:55 Сейчас в теме
На данный момент. Я сделал следующее:
1. Создал на форме вертикальную группу (ГруппаДокументов), в ней и будут храниться кнопки.
2. Создал на форме реквизит ТаблицаЗначений. С колонками, как в запросе. И типы им задал как в самом документе ЗаданиеВодителя.
3. Прописал запрос к табличной части ЗаданиеВодителя. Полученные данные загрузил в ТЗ. И через процедуру Для каждого решил перебрать данные и для каждой строки создать кнопку, но это все почему-то не работает. И отладчик не дает никакой инфы. Код :

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Если ТипЗнч(Параметры) = Тип("Структура") Тогда
		Если Параметры.Свойство("СсылкаНаДокумент") Тогда
			Запрос = Новый Запрос;
			Запрос.Текст =
			"ВЫБРАТЬ
			|	ЗаданиеВодителяДокументы.Документ КАК Документ,
			|	ЗаданиеВодителяДокументы.Документ.Номер КАК Номер,
			|	ЗаданиеВодителяДокументы.Документ.Контрагент КАК Контрагент
			|ИЗ
			|	Документ.ЗаданиеВодителя.Документы КАК ЗаданиеВодителяДокументы
			|ГДЕ
			|	ЗаданиеВодителяДокументы.Ссылка = &ЗаданиеВодителя";
			Запрос.УстановитьПараметр("ЗаданиеВодителя", Параметры.СсылкаНаДокумент);
			РезультатЗапроса = Запрос.Выполнить();
			ТаблицаЗначений = РезультатЗапроса.Выгрузить();
			
			Для каждого Строка Из ТаблицаЗначений Цикл
				ЭлементГруппы = Элементы.ГруппаДокументов;
				НоваяКнопка = Элементы.Добавить("Кн", Тип("КнопкаФормы"),ЭлементГруппы);
				НоваяКнопка.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
				НоваяКнопка.Высота = 3;
				НоваяКнопка.РастягиватьПоГоризонтали = Истина;
				НоваяКнопка.ИмяКоманды = "НажатиеКнопки";
				//НоваяКнопка.Заголовок = Строка(Номер);
				НоваяКнопка.Шрифт = ШрифтыСтиля.ОченьКрупныйШрифтТекста;
				НоваяКнопка.Доступность = Истина;
			КонецЦикла;
		КонецЕсли;	
	КонецЕсли;
КонецПроцедуры
Показать
30. Varlant1n 18.01.21 10:02 Сейчас в теме
(29) Одну ошибку нашел сам :
Создал на форме реквизит ТаблицаЗначений. С колонками, как в запросе. И типы им задал как в самом документе ЗаданиеВодителя


А сам в коде написал :
ТаблицаЗначений = РезультатЗапроса.Выгрузить();


Переделал и вот, что у меня есть сейчас:
ТаблицаЗначенийДокументы = РеквизитФормыВЗначение("ТаблицаЗначений");
ТаблицаЗначенийДокументы = Запрос.Выполнить().Выгрузить();
ЗначениеВРеквизитФормы(ТаблицаЗначенийДокументы, "ТаблицаЗначений");


Но все равно все это не работает. Думаю, что ошибка в само цикле создания кнопки, но так как через отладчик не могу проверить, что не так, не знаю, что сделать. И ошибку не выдает...
31. Varlant1n 18.01.21 10:10 Сейчас в теме
Я так понял, что эта тема умерла.
32. Varlant1n 18.01.21 13:47 Сейчас в теме
Я написал таким образом:

ИД = 0;
Для каждого Строка Из ТаблицаЗначений Цикл
	ЭлементГруппы = Элементы.ГруппаДокументов;
	НоваяКнопка = Элементы.Добавить("Кн" + Строка(ИД), Тип("КнопкаФормы"),ЭлементГруппы);
	НоваяКнопка.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
	НоваяКнопка.Высота = 3;
	НоваяКнопка.РастягиватьПоГоризонтали = Истина;
	НоваяКнопка.ИмяКоманды = "НажатиеКнопки";
	НоваяКнопка.Заголовок = Строка(Строка.Номер) + " " + Строка(Строка.Контрагент);
	НоваяКнопка.Шрифт = ШрифтыСтиля.ОченьКрупныйШрифтТекста;
	НоваяКнопка.Видимость = Истина;
	НоваяКнопка.Доступность = Истина;
	ИД = ИД + 1;
КонецЦикла;
Показать


Теперь у меня создается просто одна кнопка, а документов больше
33. Varlant1n 18.01.21 14:04 Сейчас в теме +2 $m
Получилось, тема закрыта
Оставьте свое сообщение
Вакансии
Программист 1С
Казань
зарплата от 150 000 руб.
Полный день

Разработчик 1С
Москва
зарплата от 200 000 руб. до 300 000 руб.
Полный день

Программист 1С (удаленно)
Самара
зарплата от 230 000 руб. до 230 000 руб.
Полный день

Руководитель группы разработки 1С
Москва
зарплата от 250 000 руб. до 250 000 руб.
Полный день

Специалист техподдержки
Санкт-Петербург
зарплата от 100 руб. до 150 руб.
Полный день