Программное создание кнопок на форме
Есть документ ЗаданиеВодителя. У этого документа есть табличная часть в которой хранятся ссылки на документ ЗаказКлиента. Мне надо в другой форме (ФормаВыборДокумента) сделать программное создание кнопок того же количества, что и строк в табличной части.
П.С. заголовки кнопок тоже должны программно меняться и соответсвовать заказку клиента.
На данный момент. Я сделал следующее:
1. Создал на форме вертикальную группу (ГруппаДокументов), в ней и будут храниться кнопки.
2. Создал на форме реквизит ТаблицаЗначений. С колонками, как в запросе. И типы им задал как в самом документе ЗаданиеВодителя.
3. Прописал запрос к табличной части ЗаданиеВодителя. Полученные данные загрузил в ТЗ. И через процедуру Для каждого решил перебрать данные и для каждой строки создать кнопку, но это все почему-то не работает. И отладчик не дает никакой инфы. Код :
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если ТипЗнч(Параметры) = Тип(«Структура») Тогда
Если Параметры.Свойство(«СсылкаНаДокумент») Тогда
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| ЗаданиеВодителяДокументы.Документ КАК Документ,
| ЗаданиеВодителяДокументы.Документ.Номер КАК Номер,
| ЗаданиеВодителяДокументы.Документ.Контрагент КАК Контрагент
|ИЗ
| Документ.ЗаданиеВодителя.Документы КАК ЗаданиеВодителяДокументы
|ГДЕ
| ЗаданиеВодителяДокументы.Ссылка = &ЗаданиеВодителя»;
Запрос.УстановитьПараметр(«ЗаданиеВодителя», Параметры.СсылкаНаДокумент);
РезультатЗапроса = Запрос.Выполнить();
ТаблицаЗначений = РезультатЗапроса.Выгрузить();
Для каждого Строка Из ТаблицаЗначений Цикл
ЭлементГруппы = Элементы.ГруппаДокументов;
НоваяКнопка = Элементы.Добавить(«Кн», Тип(«КнопкаФормы»),ЭлементГруппы);
НоваяКнопка.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
НоваяКнопка.Высота = 3;
НоваяКнопка.РастягиватьПоГоризонтали = Истина;
НоваяКнопка.ИмяКоманды = «НажатиеКнопки»;
//НоваяКнопка.Заголовок = Строка(Номер);
НоваяКнопка.Шрифт = ШрифтыСтиля.ОченьКрупныйШрифтТекста;
НоваяКнопка.Доступность = Истина;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
(1) Не понял( Можете, пожалуйста написать подробнее? Я буду Вам очень благодарен. И еще правильно ли я написал остальное? Запрос уверен, что правильно, а вот сама эта часть:
Источник
1С. Программное добавление кнопки с обработчиком
При доработке типовых решений для облегчения дальнейших обновлений использую программное добавление кнопки с обработчиком
Задача
Программно добавить на командную панель кнопку с выполнением произвольного кода по ее нажатию.
Реализация
Для наглядности создадим новую обработку с «Пустой» формой. Её внешний вид будет следующим
В обработчике события формы ПриСозданииНаСервере() добавим код генерации команды и кнопки
И создадим обработчик нашей команды
В итоге на форме появится кнопка выполняющая наш обработчик. Выглядеть все это будет как добавленная кнопка в конфигураторе
Так же кнопки формы имеют свойство КнопкаПоУмолчанию, если присвоить значение Истина
тогда кнопка будет выделена цветом и шрифтом
а как код то добавить чтобы выполнялся?
или код нужно заранее на форму поместить, тогда нет смысла добавлять программно команду, если код всеравно нужно помещать заранее на конкретную форму.
Алексей, доброго времени суток! Хороший вопрос!
Все верно, код обработчика придется добавить в модуль формы.
А теперь давайте посмотрим не только на разработку, но и на сопровождение и дальнейшее обновление доработанной конфигурации.
Если добавить команду «руками», то при обновлении дважды измененной формы команда будет потеряна. Ведь, модули формы мы можем сравнить, а формы нет.
Если команду добавить программно в модуле формы или соответствующем модуле БСП, а обработчик в модуле формы. При этом выделив все свои процедуры префиксом и поместив их в отдельную область, то мы получим ситуацию, когда все наши изменения можно легко увидеть в сравнении модулей. Не придется держать чек-лист со списком команд/реквизитов/элементов для ручного добавления и перепроверки после обновления.
И тут мы приходим к правилу — формы «руками» не правятся вообще. Все «ручные» изменения выявляются на этапе ревью, вносивший такие изменения бурно порицается.
Обдумав данный механизм, просится к добавлению:
1. Автотест с открытием форм и исполнением программного изменения;
2. Корректная обработка ситуаций, когда программное изменение не получилось. С соответствующим выводом на этапе тестирования.
Не долго думая пишем придуманное выше и наслаждаемся результатом.
Источник
Новичок новичку: как добавить программно кнопку на форму путем расширения
Если Вы спросите на форуме: «А как программно добавить свою кнопку на форму в какую-либо типовую конфигурацию», то получите 2 типа ответов:
1. Это сто раз обсуждалось, гугли!
2. Это есть в синтаксис-помощнике. Ищи!
Так как эта статья для новичков, то предполагаем, что спрашивающий — это новичок, и у него возникнет много вопросов вида:
— А что такое ТипЭлемента? И кто его родил, раз есть Родитель? Я хочу всего лишь кнопку, которая называется «МояКнопка». Вот в имя это и должен написать, а зачем все остальное не понятно.
— А почему кнопка имеет какой-то вид? И почему он обычный? А разве бывает необычный?
— Что за команда? Я хочу просто кнопку! Я не хочу командовать!
— А куда этот код вставлять?
Где-то на 3-5 вопросе форумчане вернутся к 1 и 2 типу ответов.
Давайте вместе разбираться в этом вопросе.
Разберем строку: МояКнопка = ЭтаФорма.Элементы.Добавить(Имя, ТипЭлемента, Родитель);
МояКнопка — это временная переменная, в которой будет определен добавляемый элемент. Название может быть любым (конечно кроме названий, которые уже зарезервированы системой). Название ни на что не влияет и нигде не отображается — пишите что хотите! Кнопка — это элемент формы (как надпись, как декорация, как картинка, как поле ввода. ), поэтому далее я буду называть ее новый элемент или просто «элемент», чтобы Вы понимали, что все это может относиться не только к кнопке, но и вообще к любым элементам формы.
Так вот, после того как элемент будет определен (то есть, по сути, появится на форме), эта переменная будет уже не нужна и в ней можно будет определять уже другой элемент (кнопку, поле, картинку. ).
Отступление: Так как у переменной мы не объявляли тип, то ее дальше можно использовать не только для описания элементов формы, но и вообще для чего угодно! Допустим, хранить в ней сумму документа.
ЭтаФорма.Элементы.Добавить — это функция которая называется Добавить. Все что стоит перед названием, по сути, есть путь, куда следует добавлять новый элемент. То есть, новый элемент мы добавляем в элементы формы. По сути, добавлять мы будем элемент в массив, который называется «Элементы». Этот массив есть у каждой формы и его название неизменно (всегда пишем «Элементы»). А добавлять будем на эту же форму, в которой выполняется код — «ЭтаФорма».
Отступление: Так как мы будем вставлять новый элемент в туже форму, в которой находится код, то «ЭтаФорма» можно не указывать.
Имя — Это имя кнопки. Оно должно быть уникальным для данной формы. То есть, если на форме уже есть элемент, который называется «Кнопка1», то мы должны дать иное имя, например, «Кнопка2». Имя кнопки, в большинстве случаев визуально не отображается, но это в большинстве! Поэтому, в отличие от переменной «МояКнопка», имя лучше давать осмысленное.
Имя можно задать явно и через переменную:
ТипЭлемента — тут все просто. Для кнопки всегда КнопкаФормы, Для группы — ГруппаФормы и т.д. (об этом будет ниже). Задать можно также 2 способами. Оптимальный:
Родитель — место на форме. Если информация до слова Добавить определяет форму, где будет расположен новый элемент, то Родитель — место на форме. Функция «Добавить» всегда добавляет элемент в конец Родителя. Примеры:
Важное отступление: Группа может включаться в группу, но все равно останется элементы формы, а не станет элементом группы, в которую включена. И путь у вложенной группы будет: ЭтаФорма.Элементы.ВложеннаяГруппа.
Разберем строку: МояКнопка.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
Да у элемента формы есть вид. Только у одних кнопок их 4:
Из названия понятно, что кнопка может выглядеть как кнопка и как гиперссылка (синенькая надпись). Кроме того, если кнопка находится в Командной панели, то и вид принимает соответствующий.
Разберем строку: МояКнопка.ИмяКоманды = ИмяКоманды;
Здесь очень важное отступление.
Кнопка без команды бесполезна, а потому, по умолчанию, на форме кнопка БЕЗ привязанной к ней КОМАНДЫ НЕ ОТОБРАЖАЕТСЯ.
Убедитесь в этом сами, бросив в конфигураторе на форму кнопку без команды.
Поэтому наш код нужно добавить следующими строками:
Перейдем от теоретической к практической части.
Задача, не снимая с поддержки типовую конфигурацию, программно добавить на форму документа свою кнопку, по нажатию которой сообщается «Привет, Мир!».
Важное отступление: Рисование кнопки программно позволит избежать ситуации, когда после обновления кардинально поменялась форма документа, в результате которой расширение не сможет нарисовать необходимый элемент и выпадет в ошибку. При программном добавлении элемента на форму, ошибка может возникнуть только в том случае, когда удалили саму форму (которую, кстати, также можно программно нарисовать и тогда ошибки не будет) . Даже если разработчик оставит форму полностью пустой, все равно добавить новый элемент на нее не составит труда.
Однако. Это подходит только для добавления в начало или конец формы. Если требуется элемент запихать внутрь Родителя, то этот метод надежностью ничем не будет отличаться от рисования элементов вручную. Разработчик переименовав или удалив Родителя нарушит логику программы в обоих случаях. И даже , если Родителя указывать по номеру в массиве элементов формы, то это спасет только от переименования, если же разработчик решит удалить некоторые элементы с формы, то нумерация элементов поменяется и в ряде случаев приведет к ошибке.
В любом случае, этот метод чуть более надежный. Хотя и требует больше внимания от программиста, так как система в случае ручного рисования элементов предупредит об изменениях, а в случае программного — нет.
Возьмем документ «ПоступлениеТоваровУслуг» бухгалтерии предприятия 3.0
Дабы не снимать типовую конфигурацию с поддержки воспользуемся расширением конфигурации.
Открываем конфигуратор.
Конфигурация — Расширения конфигурации. Добавить. Обзываем как хотим. Снимаем все галочки, кроме «Активно».
В основной конфигурации ищем документ поступление товаров и услуг. Раскрываем. Переходим к формам документа. Ищем «ФормаСписка». Через нажатие правой кнопки мыши на ней и выбора «Добавить в расширение» отправляем на доработку в расширение.
Все! Основная конфигурация нам больше не нужна. Далее все действия производим в расширении.
Открываем форму документа «ПоступлениеТоваровУслуг» (она у нас одна, так как переносили мы только одну — нужную).
Ищем событие формы ПриСозданииНаСервере нажимаем открыть. Так как никаких процедур при создании на сервере у нас еще нет, то система нам предлагает создать такую. Нам следует выбрать когда будет выполняться наш код. До или После кода который уже написан фирмой 1С. Наименее деструктивным методом обычно является После, что система наим и предлагает выбрать. Соглашаемся.
Отступление: вот мы и вернулись к вопросу куда вставлять код. Глупо конечно же жать одну кнопку, чтобы рисовалась другая. Нет, мы хотим чтобы кнопка рисовалась автоматически при открытии формы. А при открытии формы происходит 2 события: это создание формы и непосредственно ее открытие. Так как нам нужна серверная процедура, а серверной является создание, то приоритетным выбором будет событие ПриСозданииНаСервере.
Открывается модуль формы с единственной процедурой, в которой мы и должны прописать код новой кнопки.
Но прежде чем начать писать код, нам надо определиться, куда же будем вставлять кнопку, а также ее вид.
Все случаи рассматривать не будем. Но частные разберем:
1. Обычная кнопка в конце формы.
2. Обычная кнопка в начале формы.
3. Гиперссылка в начале формы.
4. Добавление нескольких кнопок в группу, которая находится в начале формы.
5. Выпадающая кнопка (подменю) в начале формы.
6. Выпадающая кнопка в Родителе.
Случай № 1.
Случай всем хорош, кроме неудобного расположения кнопки. Поэтому переходим ко второму.
Случай № 2.
Как же нам рисовать кнопку в начале, если функция Добавить, рисует в конце? А никак! Для это существует другая функция: Вставить. Функции полностью идентичные, то есть результат будет одинаков если написать следующее:
Однако у функции Вставить, есть параметр Элемент — это элемент, который уже существует на форме и который будет якорем для нашего. Но мы не знаем какие элементы уже существуют на форме. Но знаем, что они в массиве, а у каждого элемента массива есть индекс и у первого он равен 0. А потому изменим наш код так:
Превратим кнопку в гиперссылку. Для этого нужно добавить всего одну строку — вид кнопки.
Без группировки элементы располагаются друг под другом. Если же мы хотим расположить их в ряд, то придется добавить на форму группу.
Случай № 5.
Все сводится к тому, что требуется создать группу с видом КоманднаяПанель, в нее вставить еще одну группу с видом подменю, у вот в подменю уже пихать кнопки.
Ищем на форме группу вида КоманднаяПанель. Можно программно через перебор всех элементов. Я же просто знаю, что в типовых формах почти всегда есть группа с названием ГруппаКоманднаяПанель, вид которой КоманднаяПанель. Так как это стандарт, воспользуемся этим.
Ну и самое главное — сама процедура приветствующая мир:
Источник