Пример добавления Команд, Полей ввода, Групп, Страниц, Реквизитов, Обработчиков событий.
Преимущества программной доработки форм:
- Можно использовать в расширениях
- Легко копировать / переносить доработки
- Различия видны при сравнении конфигурации
- Легче производить обновление конфигурации
В данном примере все элементы формы будут добавлены в событии формы ПриСозданииНаСервере()
Добавление команды
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//Добавление команды формы
Команда = Команды.Добавить(
"ПоказатьПредупреждение"); //Имя команды
Команда.Заголовок = "Показать предупреждение";
Команда.Действие = "КомандаПоказатьПредупреждение"; //Имя связанной процедуры
//Полный перечень свойств команды в синтакс-помощнике
// Интерфейс (управляемый)->Форма клиентского приложения->КомандаФормы
//Добавление кнопки формы
КнопкаФормы = Элементы.Добавить(
"КнопкаПоказатьПредупреждение", //Имя кнопки
Тип("КнопкаФормы"), //Тип, всегда КнопкаФормы
ЭтаФорма); //Контейнер для кнопки (Форма, Группа, Командная панель)
КнопкаФормы.ИмяКоманды = "ПоказатьПредупреждение"; //Связь с командой по имени
//Возможные варианты вида кнопки:
// -Гиперссылка
// -ГиперссылкаКоманднойПанели
// -КнопкаКоманднойПанели
// -ОбычнаяКнопка
//Если контейнер для формы - командная панель
//то вид кнопки должен быть КнопкаКоманднойПанели
КнопкаФормы.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
//Полный перечень свойств кнопки формы в синтакс-помощнике
// Интерфейс (управляемый)->Кнопка формы
КонецПроцедуры
//Процедура вызываемая командой "ПоказатьПредупреждение"
&НаКлиенте
Процедура КомандаПоказатьПредупреждение(Команда)
ПоказатьПредупреждение(, "ОК!");
КонецПроцедуры
Добавление поля ввода
//Пример:
//Добавление поля ввода для реквизита объекта "Комментарий"
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ПолеВвода = Элементы.Добавить(
"Комментарий", //Имя элемента формы
Тип("ПолеФормы"), //Тип, всегда ПолеФормы
ЭтаФорма); //Контейнер для поля ввода (Форма,Группа,Страница)
ПолеВвода.Заголовок = "Комментарий";
ПолеВвода.Вид = ВидПоляФормы.ПолеВвода;
//Установка связи элемента с данными
ПолеВвода.ПутьКДанным = "Объект.Комментарий";
//Можно добавить обработчик события
//См. синтакс-помощник чтобы узнать список событий
// Интерфейс (управляемый) -> Поле формы -> ПолеФормы -> События
// а так же остальные варианты расширения поля формы в зависимости от вида кнопки
// Интерфейс (управляемый) -> Поле формы -> Расширение поля ввода -> События
// и прочее
ПолеВвода.УстановитьДействие(
"ПриИзменении", //Имя события
"ПриИзмененииКомментария"); //Имя процедуры обработчика
КонецПроцедуры
&НаКлиенте
Процедура ПриИзмененииКомментария(Элемент)
Сообщить("Поле ""Комментарий"" изменено!");
КонецПроцедуры
Добавление реквизита формы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//Пример:
//Добавление реквизита с именем "АдресДоставки", тип Строка
ДобавляемыеРеквизиты = Новый Массив;
ТипРеквизита = Новый ОписаниеТипов("Строка");
РеквизитФормы = Новый РеквизитФормы(
"АдресДоставки", //Имя реквизита формы
ТипРеквизита, //Тип
"", //Путь (Пусто, "Объект", ИмяТЧ)
// например "Объект.Товары"
"Адрес доставки");//Заголовок
ДобавляемыеРеквизиты.Добавить(РеквизитФормы);
//Заставляем форму создать новые реквизиты
ИзменитьРеквизиты(ДобавляемыеРеквизиты);
//Обращение к реквизиту формы из кода
ЭтаФорма.АдресДоставки = "ул. Пушкина";
//Вывод реквизита на форму (при необходимости)
ПолеВвода = Элементы.Добавить("ФормаАдресДоставки", Тип("ПолеФормы"), ЭтаФорма);
ПолеВвода.Вид = ВидПоляФормы.ПолеВвода;
ПолеВвода.ПутьКДанным = "АдресДоставки";
КонецПроцедуры
Добавление группы формы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//Пример:
//Добавление группы формы
//Добавление элементов в группу формы
Группа = Элементы.Добавить(
"ГруппаШапка",
Тип("ГруппаФормы"),
ЭтаФорма);
Группа.Вид = ВидГруппыФормы.ОбычнаяГруппа;
Группа.Заголовок = "Реквизиты объекта:";
//Добавить поле ввода в группу
ПолеВвода = Элементы.Добавить("ФормаКомментарий", Тип("ПолеФормы"), Группа);
ПолеВвода.Вид = ВидПоляФормы.ПолеВвода;
ПолеВвода.ПутьКДанным = "Объект.Комментарий";
КонецПроцедуры
Добавление страниц формы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//Пример:
//Добавление группы страниц
//Добавление страниц
//Добавление элементов на страницы
СтраницыФормы = Элементы.Добавить(
"СтраницыФормы",
Тип("ГруппаФормы"),
ЭтаФорма);
СтраницыФормы.Вид = ВидГруппыФормы.Страницы;
//Подключить обработчик при смене страницы
СтраницыФормы.УстановитьДействие("ПриСменеСтраницы", "ДействиеПриСменеСтраницы");
//Добавление 1-й страницы
СтраницаФормы1 = Элементы.Добавить(
"Страница1",
Тип("ГруппаФормы"),
СтраницыФормы);
СтраницаФормы1.Вид = ВидГруппыФормы.Страница;
СтраницаФормы1.Заголовок = "Первая страница";
//Добавление 2-й страницы
СтраницаФормы2 = Элементы.Добавить(
"Страница2",
Тип("ГруппаФормы"),
СтраницыФормы);
СтраницаФормы2.Вид = ВидГруппыФормы.Страница;
СтраницаФормы2.Заголовок = "Вторая страница";
//Добавить поле ввода на страницу 1
ПолеВвода = Элементы.Добавить("ФормаКомментарий", Тип("ПолеФормы"), СтраницаФормы1);
ПолеВвода.Вид = ВидПоляФормы.ПолеВвода;
ПолеВвода.ПутьКДанным = "Объект.Комментарий";
//Добавить поле ввода на страницу 2
ПолеВвода = Элементы.Добавить("ФормаКомментарий2", Тип("ПолеФормы"), СтраницаФормы2);
ПолеВвода.Вид = ВидПоляФормы.ПолеВвода;
ПолеВвода.ПутьКДанным = "Объект.Комментарий";
КонецПроцедуры
&НаКлиенте
Процедура ДействиеПриСменеСтраницы(Элемент)
Сообщить("Изменена страница");
КонецПроцедуры
Обработка тестировалась на релизе платформы 8.3.13.1513.
Related Posts
- Получение логина и пароля техподдержки 1С из базы
- Класс для вывода отчета в Excel
- Счет-фактура для УПП
- Библиотека классов для создания внешней компоненты 1С на C#
- Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86
- Прайс-лист с артикулом в отдельной колонке
Смысл добавлять реквизиты и элементы программно, если обработчики для них нужно прописывать в коде формы.
Было бы больше пользы — если бы показали «типовые приемы» обработки событий программно добавленных элементов.
(1) Смысл в том что элементы формы могут «слететь» при обновлении конфигурации. А если их задавать программно, то объединение кода намного проще, особенно если пользоваться KDiff например.
Я давно перешел на такой способ добавления реквизитов на форму (в шапки документа, в табличную часть). Правда основной кусок кода выносится в Общие модули.
(1) В примере добавления поля ввода, показано добавление обработчика
/Можно добавить обработчик события
//См. синтакс-помощник чтобы узнать список событий
// Интерфейс (управляемый) -> Поле формы -> ПолеФормы -> События
// а так же остальные варианты расширения поля формы в зависимости от вида кнопки
// Интерфейс (управляемый) -> Поле формы -> Расширение поля ввода -> События
// и прочее
ПолеВвода.УстановитьДействие(
«ПриИзменении», //Имя события
«ПриИзмененииКомментария»); //Имя процедуры обработчика
(1) в современных конфигурациях, про обработчики уже позаботились. В формах есть подключаемая процедурка
Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
которая ведет в общий модуль СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду
Там в свою очередь, есть вызов ОбщегоМодуля МодификацияКонфигурацииКлиентПереопределяемый.ВыполнитьПереопределяемуюКоманду(Форма, Команда, ДополнительныеПараметры);
где по имени команды и формы, можно определить свою, и напилить свои обработчики.
В итоге, получим абсолютно неизмененный объект, на поддержке…но в нем, программно добавленная кнопка и свой обработчик событий…
единственное, что у некоторых элементов параметров, предполагается много…и они как бы будут недоступны..но тут приходится или маневры искать, или немного усовершенствовать.. но в простых случаях, вполне себе все решаемо
Если УФ и платформа больше 8.3.10, то имхо, проще заюзать расширение. В нем нагляднее и конфа не снимается с поддержки.
(5) Не соглашусь, таким образом невозможно понять, какие реквизиты были добавлены в расширении, а какие уже были в исходной конфигурации.
Когда придет время обновлять расширение, эти вопросы обязательно могут возникнуть.
С расширением порядок проблем при обновлении намного меньше. С 8.3.6 их начал юзать, и функционал расширений только улучшается.
Ранее да, на ОФ именно программным кодом пользовался, и вот ни разу не визуально, и весьма проблематично. Пользовался обработкой с инфостарта по декомпиляции форм. Т.е. сперва визуально делаешь, потом в програмный код. Так вот телодвижений и в УФ осталось много. С расширением все намного проще. Мое имхо, конечно же.
(3) Как добавить обработчик не расположенный в форме? В тех случаях когда я из внешней (по отношению к форме) части программы хочу добавить кнопку или поле ввода. Насколько я знаю (могу и ошибаться) назначить обработчик можно только расположенный в модуле формы. А значит надо исполнять «танцы с бубном» по вызову своих обработчиков (расположенных например в общем модуле) из обработчиков расположенных на форме. И тут получается несостыковочка. Вроде бы форму можно полностью построить программно. Но не полностью …. т.к. обработчики должны быть в форме заранее.
Если есть какой-то способ обойти это «ограничение» — буду рад если поделитесь со мной.
(4) Так-то оно так. Если дело касается добавления какой-нибудь «некузявой» кнопочки, или чего-то незначительно-дополняющего функциональность формы или объекта который форма представляет.
Но если копнуть глубже, и рассматривать некую систему в которой есть оснастка, в которую разные модули (подсистемы) добавляют нужные им элементы управления (списки, диаграммы, таблицы со связью один ко многим и т.п.). Да еще и замахнуться на механику, когда пользователь сам решает какие модули и подсистемы ему нужны… Другими словами, разработать решение в стиле «плагинов» как во всяких там WinAmp-ах и прочих модных штуках. И тут получается нужно в форме-оснастке предусмотреть все возможные типы событий (который на ИТС кстати рекомендуют обрамлять префиксом «Подключаемый_»), а потом еще и у этих событий предусмотреть модель поведения когда нужны: а) только клиентские вызовы, б) клиентские и внеконтекстные сервеные, в) клиентские и контекстные серверные вызовы.
Поэтому да, многое можно, но навык «танец с бубном» должен быть 99lvl
И речь в данном случае не о «сферическом слоне в вакууме», а о например Рабочем Месте, которое настраивается в зависимости от роли пользователя, подразделении пользователя, полномочиям которые ему делегировали временно или постоянно и т.п.
В целом, я не пытаюсь очернить, или критиковать подходы. Просто думаю разумно было бы — побольше раскрыть нюансы именно обработки событий программно-добавленных элементов. Описать на какие подводные грабли можно наступить, как обойти.
(1)https://infostart.ru/public/1106063/ как раз заложена логика обработки событий от элементов формы. Тут нужно поиграться с именами 🙂 и Выполнить(«Кусок кода») и будет магия практически программного создания всего :)) тоже столкнулся с проблемой сначала как блин подготовить неизвестное количество событий-процедур для команд… но оказалось нужна одна, но хитровыкорчеванная, грабли конечно, но вариант имеет право на жизнь.
Ошибочка. Добавлять элементы на форму надо с проверкой, например,
Если Элементы.Найти(«Владелец») = Неопределено Тогда
ПолеВвода = Элементы.Добавить(«Владелец», Тип(«ПолеФормы»), ЭтаФорма);
ПолеВвода.Заголовок = «Владелец»;
ПолеВвода.Вид = ВидПоляФормы.ПолеВвода;
ПолеВвода.ПутьКДанным = «Объект.Владелец»;
КонецЕсли;
Они ведь иногда появляются, когда 1с-овцы трезвеют…
К тому же, если на форме много изменений, процесс перехода на расширение может занять большое время, и элемент всё ещё может присутствовать в конфигурации на форме, поэтому надо включать защиту от дурака уже заранее.
Как добавить реквизиты/кнопки в нужное место(Форма, Группа, Командная панель) например в начало списка, по умолчанию элементы добавляются в конец
(12) Вставить вместо добавить. Пример для кнопки контекстного меню. Нам надо вставить ее в начало списка меню:
(13) Благодарю, помогло