Имя: Пароль:
1C
 
Программное создание кнопок на форме
0 Varlant1n
 
18.01.21
09:21
Есть документ ЗаданиеВодителя. У этого документа есть табличная часть в которой хранятся ссылки на документ ЗаказКлиента. Мне надо в другой форме (ФормаВыборДокумента) сделать программное создание кнопок того же количества, что и строк в табличной части.

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

На данный момент. Я сделал следующее:
1. Создал на форме вертикальную группу (ГруппаДокументов), в ней и будут храниться кнопки.
2. Создал на форме реквизит ТаблицаЗначений. С колонками, как в запросе. И типы им задал как в самом документе ЗаданиеВодителя.
3. Прописал запрос к табличной части ЗаданиеВодителя. Полученные данные загрузил в ТЗ. И через процедуру Для каждого решил перебрать данные и для каждой строки создать кнопку, но это все почему-то не работает. И отладчик не дает никакой инфы. Код :

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

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

Ну это так, в порядке бреда.
4 Varlant1n
 
18.01.21
09:31
(3) Извините, еще раз. А я правильно в коде определил группу в которой должны появляться эти кнопки?
5 ДенисЧ
 
18.01.21
09:33
(4) Мне отсюда не видно )))
Если группа, в которую должны добавляться кнопки, называется ГруппаДокументов, то правильно...
6 Varlant1n
 
18.01.21
09:34
(5) Да, ГруппаДокументов
7 acht
 
18.01.21
09:35
(0) > но это все почему-то не работает.
Как именно оно не работает?
8 acht
 
18.01.21
09:35
Там минимум две ошибки
9 acht
 
18.01.21
09:36
> Создал на форме реквизит ТаблицаЗначений. С колонками,
и позже
> ТаблицаЗначений = РезультатЗапроса.Выгрузить();

И
> НоваяКнопка = Элементы.Добавить("Кн", Тип("КнопкаФормы"),ЭлементГруппы);
В цикле
10 Varlant1n
 
18.01.21
09:39
(9) А как мне это исправить?
11 Varlant1n
 
18.01.21
09:41
(9) Первое понял:

ТаблицаЗначений.Загрузить(РезультатЗапроса);
12 Varlant1n
 
18.01.21
09:43
(11) Но и так не работает
13 Varlant1n
 
18.01.21
09:49
(9) Сделал даже так:

ТаблицаЗначенийДокументы = РеквизитФормыВЗначение("ТаблицаЗначений");
ТаблицаЗначенийДокументы = Запрос.Выполнить().Выгрузить();
ЗначениеВРеквизитФормы(ТаблицаЗначенийДокументы, "ТаблицаЗначений");            
            
Для каждого Строка Из ТаблицаЗначений Цикл
    ЭлементГруппы = Элементы.ГруппаДокументов;
    НоваяКнопка = Элементы.Добавить("Кн", Тип("КнопкаФормы"),ЭлементГруппы);
    НоваяКнопка.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
    НоваяКнопка.Высота = 3;
    НоваяКнопка.РастягиватьПоГоризонтали = Истина;
    НоваяКнопка.ИмяКоманды = "НажатиеКнопки";
    НоваяКнопка.Заголовок = Строка(Номер);
    НоваяКнопка.Шрифт = ШрифтыСтиля.ОченьКрупныйШрифтТекста;
    НоваяКнопка.Видимость = Истина;
    НоваяКнопка.Доступность = Истина;
КонецЦикла;
14 acht
 
18.01.21
09:51
(13) Почему ты так упорно не хочешь рассказать о выдаваемых сообщениях об ошибках? Если у твоего виска держат пистолет - отправь в ответ строку из точек.
15 Varlant1n
 
18.01.21
09:52
(14) Так в том то и дело, что ошибок никаких не выдает и отладчик не дает никакой инфы. Просто не срабатывает. В этом и вся проблема. Я даже не могу понять, что не так
16 acht
 
18.01.21
10:17
(15) > и отладчик не дает никакой инфы. Просто не срабатывает.

Надо сделать над собой усилие и все-таки в отладчике по шагам пройти по коду, анализируя в какую ветку оно попадает и почему.
17 Varlant1n
 
18.01.21
10:30
(16) Отладчик в принципе даже не проходит по запросу
18 Guk
 
18.01.21
10:36
(17) наверное надо включить отладку на сервере...
19 SiAl-chel
 
18.01.21
10:37
(13)

НоваяКнопка = Элементы.Добавить("Кн", Тип("КнопкаФормы"),ЭлементГруппы);

Ты тут создаешь каждый раз элемент формы с одним и тем же именем. А это уже ошибка, начиная со второй строки твоей ТаблицаЗначений.
20 Varlant1n
 
18.01.21
13:48
(19) Я исправил таким образом. Но теперь проблема в том, что документов у меня два, то есть и кнопок должно быть два, но создается всего лишь одна кнопка

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

И, кстати, выше проблема с отладкой и вообще с тем, что у меня не работал код в событии формы, заключалось в условии :

Если ТипЗнч(Параметры) = Тип("Структура") Тогда
КонецЕсли;

Потому что, как я понял "Параметры" - это не структура.
23 Varlant1n
 
18.01.21
14:03
(22) Все получилось, тема закрыта
24 SiAl-chel
 
18.01.21
14:41
(22) Поэтому в процедурах и функциях я всегда ставлю точку остановки на первом операторе.