1с переопределить стандартную команду
Введение в управляемая форма 1С реквизиты элементы команды
Рекомендуется модифицировать управляемые формы типового решения 1С программно для удобного будущего обновления и исключения конфликтов, а также для удобной работы с изменениями и надежности при использовании механизма расширений.
В некоторых типовых конфигурациях 1С (ЕРП 2, УТ 11) используется механизм упрощенного изменения конфигурации. Статьи о типовом механизме можно найти в разделе полезных ссылок. Данный механизм используется в БСП, и его необходимо знать при модификации типовых конфигураций.
При добавлении элементов на форму программно можно отредактировать практически любое свойство из панель свойств, которое можно установить вручную в конфигураторе.
Также все описанные в текущем разделе процедуры и функции находятся во внешней обработке УпрФормы.
Примеры работы с объектом «ДанныеФормыКоллекция» и созданием дин. списка и таблицы значений программно можно будет посмотреть в части 2.
Для запуска обработки в режиме предприятия необходимо наличие объектов «Справочники.Номенклатура», подчиненный ему «Справочники.ХарактеристикиНоменклатуры» и «РегистрыСведений.ЦеныНоменклатуры”.
Программное переопределение обработчиков событий формы и элементов формы
Переопределить обработчики событий формы можно в обработчике «ПриСозданииНаСервере» (кроме самого обрабочика «ПриСозданииНаСервере») или в теле модуля формы в контексте сервера (например, Переопределение событий ПриЧтениинаСервере и ПриСозданииНаСервере).
В теле модуля формы:
А в новой процедуре нужно добавить вызов основной, если такая процедура есть.
Аналогично можно поступить и с обработчиками элементов формы:
Программное создание групп формы.
Доступные виды групп формы:
Программное добавление команды на форму.
Удалить команду можно при помощи метода коллекции формы команд: Команды.Удалить(). Удалять можно только те команды, которые были созданы программно.
Программное создание декораций форм.
Программное добавление реквизита на форму.
Добавлять новые реквизиты в управляемую форму и удалять необходимо с помощью метода ИзменитьРеквизиты(), куда в параметры передается массив добавляемых реквизитов и массив удаляемых. Удалять при этом можно только те реквизиты, которые были созданы программно.
Вывод реквизитов на форму.
Вызов процедур при создании на сервере 1С
После описания всех процедур выводим их в процедуре ПриСозданииНаСервере. Также можно изменить программно некоторые свойства формы, например, заголовок. Чтобы был виден только наш заголовок, нужно отключить свойство Автозаголовок.
Некоторые советы при программном редактировании формы
- Если вы не используете префиксы при создании новых команд и элементов рекомендуется проверять существование создаваемых объектов по имени с помощью метода Найти(), который вернет Неопределено, если объект в коллекции не найден:
- Элементы.Найти(«пр_Владелец»);
- Команды.Найти(«пр_НоваяКоманда»);
- Свойства, методы и коллекции управляемой формы описаны в синтакс-помощнике в разделе «Интерфейс (управляемый)»;
- Изучите БСП, если она имеется в вашей конфигурации. Например в общем модуле «ОбщегоНазначения» уже описаны функции для создания объекта ОписаниеТипов, необходимого при создании новых реквизитов на форме:
- ОбщегоНазначения.ОписаниеТипаСтрока(ДлинаСтроки) — Создает объект ОписаниеТипов, содержащий тип Строка;
- ОбщегоНазначения.ОписаниеТипаЧисло(Разрядность, РазрядностьДробнойЧасти = 0, ЗнакЧисла = Неопределено) — Создает объект ОписаниеТипов, содержащий тип Число;
- ОбщегоНазначения.ОписаниеТипаДата(ЧастиДаты) — Создает объект ОписаниеТипов, содержащий тип Дата;
- ОбщегоНазначенияВызовСервера.ЦветСтиля(ИмяЦветаСтиля) — Функция получает цвет стиля по имени элемента стиля;
- ОбщегоНазначенияВызовСервера.ШрифтСтиля(ИмяШрифтаСтиля) — Функция получает шрифт стиля по имени элемента стиля.
Итак, взглянем на получившийся результат. Все элементы на форме созданы программно:
Бывает, что возникает задача, когда перед записью или проведением документа необходимо задать пользователю вопрос для дальнейше записи. Процедура "ПередЗаписью" не всегда может подойти и возникает необходимо переопределить действие кнопки "Провести и закрыть". Ниже расскажу простой способ, как это можно сделать.
Уверен, что для многих эта задача не представляет никакой сложности. Очень даже возможно, что эта задача решается и другими способами.
Имеется: Документ с реквизитами НомерВх и ДатаВх, а также основная форма документа
Зачада: Перед записью необходимо задать вопрос пользователю и по результату ответа продолжить запись, либо не продолжать.
В свойствах формы редактируем список команд: снимаем галки с команд "Провести и закрыть", "Записать", "Провести".
Для командной панели убираем признак "Автозаполнение". Добавляем на форму свои команды, а также добавляем группу с типовыми командами. Далее описываем код для созданных команд:
Далее описываем код команд и проверку на дубли
Для каждой команды определяем ПараметрыЗаписи, а также добавляем признак "Закрыть", чтобы после того, как будет задан вопрос, можно было определить надо ли закрывать форму или оставить форму открытой.
Собственно, процедура самой проверки
Далее процедура обработки оповещения, в которой происходит запись и закрытие документа (если он должен закрыться)
Остается ещё один момент: документ может быть записан при закрытии на крестик, тогда будут отрабатывать только типовые механизмы записи документа. Для себя решил это следующим образом (возможно, не очень правильно):
Добавлен реквизит формыВ процедуре ПередЗаписью следующий код
В процедуре ПриСозданииНаСервере устанавливаем флаг в положение ИСТИНА
Вот и всё, типовые команды заменены на наши и можно задавать вопросы пользователю до записи документа. Надеюсь статья будет кому-то полезна. Самого на написание статьи подтолкнула ситуация, когда при нажатии на кнопку "Провести и закрыть" выводится вопрос, подтверждаю запись, но документ не закрывается, закрыть документ можно только по крестику.
Каждый программист 1С хотя бы раз задумывался над тем, как уменьшить в разы трудозатраты на обновления переписанных конфигураций. Как не забыть добавить некий код, команду, кнопку в форму типовой конфигурации, изменить стандартный обработчик события формы – этот список можно продолжать до бесконечности. В этой статье изложен метод для управляемых форм, который позволяет реализовать эту возможность.
Предлагаемый метод состоит в том, чтобы в модуле формы в процедуре «ПриСозданииНаСервере» переопределить обработчики событий для этой формы, которые будут вызывать старые обработчики (если это нужно) и выполнить нужный код до и после этого вызова. Так же обеспечить возможность вносить изменения в поведения программы на лету – без отключения от базы пользователей и без использования динамического обновления конфигурации, то есть изменения уже будут готовы к использованию.
Что же для этого нужно? Рассматриваемый пример работает на конфигурации «Управление торговлей, редакция 11», для любой другой конфигурации адаптировать его не составит большого труда.
1. Нужно создать общий модуль МодульПереназначенияОбра ботчиков, вот такой он у меня:
// Общая процедура перед переназначения обработчиков
//
// Параметры:
// УправляемаяФорма – УправляемаяФорма – Управляемая форма.
//
Процедура ПереназначитьОбработчики ( УправляемаяФорма ) Экспорт
Если ТипЗнч ( УправляемаяФорма ) = Тип ( "УправляемаяФорма" ) Тогда
ОбщаяВнешняяОбработка = ПолучитьВнешнийОбъект ( "Библиотека внешних обработок" );ВнешняяОбработкаСерийныеНомера = ПолучитьВнешнийОбъект ( "Серийные номера" );
ИмяВнешнейОбработкиСерийныеНомера = ПолучитьИмяВнешнегоОбъекта ( "Серийные номера" );
ВнешняяОбработкаСерийныеНомера . ПодготовитьСерийныеНомераКРаботе ( УправляемаяФорма , ОбщаяВнешняяОбработка , ИмяВнешнейОбработкиСерийныеНомера );ОбщаяВнешняяОбработка . ПодменитьДействиеУправляемоеПриложение ( УправляемаяФорма , "ПриЗакрытии" , , "ВыполнитьОткатОбработчиков" );
//Пример как можно изменить свойства управляемой формы
УправляемаяФорма . ПоведениеКлавишиEnter = ТипПоведенияКлавишиEnter . ПереходПоЭлементамФормы ;
КонецЕсли;
КонецПроцедуры// Получаем внешнюю обработку или внешний отчет.
//
// Параметры:
// ИмяВнешнегоОбъекта – Строка - имя внешнего объекта;
// ЭтоОтчет – Булево – Ложь (Внешняя обработка), Истина (Внешний отчет).
//
// Возвращаемое значение:
// – ВнешняяОбработка или ВнешнийОтчет
//
Функция ПолучитьВнешнийОбъект ( ИмяВнешнегоОбъекта , ЭтоОтчет = Ложь) Экспорт
Ссылка = Справочники . ДополнительныеОтчетыИОбработки . НайтиПоНаименованию ( ИмяВнешнегоОбъекта );
Если Ссылка = Неопределено Тогда
ВызватьИсключение "Внешний объект с именем не найден: " + ИмяВнешнегоОбъекта ;
КонецЕсли;
ДвоичныеДанные = Ссылка . ХранилищеОбработки . Получить ();
АдресХранилища = ПоместитьВоВременноеХранилище ( ДвоичныеДанные );
ИмяВнОбработки = ?( ЭтоОтчет , ВнешниеОтчеты , ВнешниеОбработки ). Подключить ( АдресХранилища , , Ложь);
ОбработкаОбъект = ?( ЭтоОтчет , ВнешниеОтчеты , ВнешниеОбработки ). Создать ( ИмяВнОбработки );
Возврат ОбработкаОбъект ;
КонецФункции// Получаем имя внешней обработки или внешнего отчета.
//
// Параметры:
// ИмяВнешнегоОбъекта – Строка - имя внешнего объекта;
// ЭтоОтчет – Булево – Ложь (Внешняя обработка), Истина (Внешний отчет).
//
// Возвращаемое значение:
// – Строка - Имя внешней обработки или отчета.
//
Функция ПолучитьИмяВнешнегоОбъекта ( ИмяВнешнегоОбъекта , ЭтоОтчет = Ложь) Экспорт
Ссылка = Справочники . ДополнительныеОтчетыИОбработки . НайтиПоНаименованию ( ИмяВнешнегоОбъекта );
Если Ссылка = Неопределено Тогда
ВызватьИсключение "Внешний объект с именем не найден: " + ИмяВнешнегоОбъекта ;
КонецЕсли;
ДвоичныеДанные = Ссылка . ХранилищеОбработки . Получить ();
АдресХранилища = ПоместитьВоВременноеХранилище ( ДвоичныеДанные );
Возврат ?( ЭтоОтчет , ВнешниеОтчеты , ВнешниеОбработки ). Подключить ( АдресХранилища , , Ложь);
КонецФункции// Получаем ссылку на элемент справочника ДополнительныеОтчетыИОбработки.
//
// Параметры:
// ИмяВнешнегоОбъекта – Строка - имя внешнего объекта;
//
//
// Возвращаемое значение:
// – СправочникСсылка.ДополнительныеОтчетыИОбработки - ссылка на элемент справочника ДополнительныеОтчетыИОбработки.
//
Функция ПолучитьСсылкуНаВнешнийОбъект ( ИмяВнешнегоОбъекта ) Экспорт
Возврат Справочники . ДополнительныеОтчетыИОбработки . НайтиПоНаименованию ( ИмяВнешнегоОбъекта );
КонецФункции2. Далее, нужно загрузить общую внешнюю обработку в режиме предприятия. Код обработки:
// Функция добавляет элемент в коллекцию элементов формы и возращает его.
//
// Параметры:
// ЭлементыФормы – ВсеЭлементыФормы – Содержит коллекцию всех элементов управляемой формы;
// Параметры – Структура – параметры добавляемого элемента;
// Родитель – ГруппаФормы, ТаблицаФормы, УправляемаяФорма – родитель добавляемого элемента.
//
// Возвращаемое значение:
// – ДекорацияФормы, ГруппаФормы, КнопкаФормы, ТаблицаФормы, ПолеФормы – элемент управляемой формы.
//
Функция ДобавитьЭлементВКоллекциюЭлементовФормы ( ЭлементыФормы , Параметры , Родитель = Неопределено) ЭкспортПерем ИмяЭлемента , ТипЭлемента ;
Если НЕ ТипЗнч ( Параметры ) = Тип ( "Структура" ) Тогда
ВызватьИсключение "Параметры элемента формы не заданы!" ;
КонецЕсли;Если НЕ Параметры . Свойство ( "Имя" , ИмяЭлемента ) Тогда
ВызватьИсключение "Имя элемента формы не задано!" ;
КонецЕсли;Если НЕ Параметры . Свойство ( "ТипЭлемента" , ТипЭлемента ) Тогда
ВызватьИсключение "Тип элемента формы не задан!" ;
КонецЕсли;Если НЕ Родитель = Неопределено Тогда
Если ТипЗнч ( Родитель ) <> Тип ( "ГруппаФормы" )
И ТипЗнч ( Родитель ) <> Тип ( "ТаблицаФормы" )
И ТипЗнч ( Родитель ) <> Тип ( "УправляемаяФорма" ) Тогда
ВызватьИсключение "Родитель должен иметь один из перечисленных типов: ГруппаФормы; ТаблицаФормы; УправляемаяФорма." ;
КонецЕсли;
КонецЕсли;ЭлементФормы = ЭлементыФормы . Добавить ( ИмяЭлемента , ТипЭлемента , Родитель );
ЗаполнитьЗначенияСвойств ( ЭлементФормы , Параметры );
Возврат ЭлементФормы ;// Функция добавляет команду в коллекцию команд формы и возращает его.
//
// Параметры:
// Команды – КомандыФормы – Содержит коллекцию всех элементов управляемой формы;
// Параметры – Структура – параметры добавляемой команды.
//
// Возвращаемое значение:
// – КомандаФормы – команда управляемой формы.
//
Функция ДобавитьКомандуВКоллекциюКомандФормы ( Команды , Параметры ) ЭкспортЕсли НЕ ТипЗнч ( Параметры ) = Тип ( "Структура" ) Тогда
ВызватьИсключение "Параметры команды не заданы!" ;
КонецЕсли;Если НЕ Параметры . Свойство ( "Имя" , ИмяЭлемента ) Тогда
ВызватьИсключение "Имя команды не задано!" ;
КонецЕсли;Команда = Команды . Добавить ( ИмяЭлемента );
ЗаполнитьЗначенияСвойств ( Команда , Параметры );
Возврат Команда ;Процедура ПереместитьЭлементВКоллекциюЭлементовФормы ( ЭлементыФормы , ИмяЭлемента , ИмяРодителя , МестоРасположения ) Экспорт
ЭлементыФормы . Переместить ( ЭлементыФормы . Найти ( ИмяЭлемента ), ЭлементыФормы . Найти ( ИмяРодителя ), ЭлементыФормы . Найти ( МестоРасположения ));
КонецПроцедуры// Переопределяет обработчик события формы.
// Сохраняет штатный обработчик события внутри формы и устанавливает новый.
//
// Параметры:
// Форма – УправляемаяФорма – Управляемая форма;
// ИмяСобытияФормы – Строка – имя события;
// ПолноеИмяЭлементаФормы – Строка – полное имя элемента формы;
// НовоеДействие - Строка - имя процедуры обработчика;
// ОбработкаИсключений – Булево – сообщать о наличии старого обработчика.
//
Процедура ПодменитьДействиеУправляемоеПриложение ( Форма , ИмяСобытияФормы = "" , ПолноеИмяЭлементаФормы = "" , НовоеДействие , ОбработкаИсключений = Ложь) ЭкспортОбъект = Форма ;
ИмяЭлементаФормы = "" ;
Если НЕ ПустаяСтрока ( ПолноеИмяЭлементаФормы ) ТогдаМассивФрагментов = РазобратьСтрокуВМассивПоРазделителю ( ПолноеИмяЭлементаФормы );
ИмяЭлементаФормы = МассивФрагментов [ 0 ];
Объект = Форма . Элементы . Найти ( ИмяЭлементаФормы );
Если Объект = Неопределено Тогда
ВызватьИсключение "Элемент формы: " + ИмяЭлементаФормы + " не найден!" ;
КонецЕсли;Если МассивФрагментов . Количество () > 1 Тогда
ИмяЭлементаФормы = ИмяЭлементаФормы + МассивФрагментов [ 1 ];
Если ТипЗнч ( Объект ) = Тип ( "ТаблицаФормы" ) Тогда
Объект = Объект . Колонки [ МассивФрагментов [ 1 ]]. ЭлементУправления ;
ИначеЕсли ТипЗнч ( Объект ) = Тип ( "КоманднаяПанель" ) Тогда
Объект = Объект . Кнопки [ МассивФрагментов [ 1 ]];
Иначе
ВызватьИсключение "Ошибка на этапе получения элемента формы. Тип значения(" + ТипЗнч ( Объект ) + ")" ;
КонецЕсли;
КонецЕсли;
КонецЕсли;СтарыеОбработчики = "OldHandlers" ;
МассивРеквизитов = Форма . ПолучитьРеквизиты ();
Для Каждого РеквизитФормы Из МассивРеквизитов Цикл
Если РеквизитФормы . Имя = СтарыеОбработчики Тогда
СтарыеОбработчики = Неопределено;
Прервать;
КонецЕсли;
КонецЦикла;Если НЕ СтарыеОбработчики = Неопределено Тогда
МассивНовыхРеквизитов = Новый Массив ;
МассивНовыхРеквизитов . Добавить (Новый РеквизитФормы ( СтарыеОбработчики , Новый ОписаниеТипов ( "СписокЗначений" )));
Форма . ИзменитьРеквизиты ( МассивНовыхРеквизитов );
КонецЕсли;Если ТипЗнч ( Объект ) = Тип ( "КнопкаФормы" ) Тогда
СтароеДействие = Объект . ИмяКоманды ;
Иначе
СтароеДействие = Объект . ПолучитьДействие ( ИмяСобытияФормы );
КонецЕсли;Если ОбработкаИсключений И НЕ СтароеДействие = Неопределено Тогда
ВызватьИсключение "Конфликт обработчиков события """ + ИмяСобытияФормы + """ объекта """ + Строка ( Объект ) + """" ;
КонецЕсли;Если ТипЗнч ( Объект ) = Тип ( "КнопкаФормы" ) Тогда
Объект . ИмяКоманды = НовоеДействие ;
Иначе
Объект . УстановитьДействие ( ИмяСобытияФормы , НовоеДействие );
КонецЕсли;OldHandlers = Форма . OldHandlers ;
Если НЕ СтароеДействие = Неопределено И НЕ ПустаяСтрока ( СтароеДействие ) Тогда
OldHandlers . Добавить ( ИмяЭлементаФормы + "." + ИмяСобытияФормы , СтароеДействие );
КонецЕсли;
КонецПроцедуры// Возвращает старый обработчик события формы.
//
// Параметры:
// Форма – УправляемаяФорма – Управляемая форма;
// ИмяСобытияФормы – Строка – имя события;
// ПолноеИмяЭлементаФормы – Строка – полное имя элемента формы;
// СтароеДействие - Строка - имя процедуры обработчика.
//
Процедура ОткатитьДействиеУправляемоеПриложение ( Форма , ИмяСобытияФормы = "" , ПолноеИмяЭлементаФормы = "" , СтароеДействие ) ЭкспортОбъект = Форма ;
ИмяЭлементаФормы = "" ;
Если НЕ ПустаяСтрока ( ПолноеИмяЭлементаФормы ) ТогдаМассивФрагментов = РазобратьСтрокуВМассивПоРазделителю ( ПолноеИмяЭлементаФормы );
ИмяЭлементаФормы = МассивФрагментов [ 0 ];
Объект = Форма . Элементы . Найти ( ИмяЭлементаФормы );
Если Объект = Неопределено Тогда
ВызватьИсключение "Элемент формы: " + ИмяЭлементаФормы + " не найден!" ;
КонецЕсли;Если МассивФрагментов . Количество () > 1 Тогда
ИмяЭлементаФормы = ИмяЭлементаФормы + МассивФрагментов [ 1 ];
Если ТипЗнч ( Объект ) = Тип ( "ТаблицаФормы" ) Тогда
Объект = Объект . Колонки [ МассивФрагментов [ 1 ]]. ЭлементУправления ;
ИначеЕсли ТипЗнч ( Объект ) = Тип ( "КоманднаяПанель" ) Тогда
Объект = Объект . Кнопки [ МассивФрагментов [ 1 ]];
Иначе
ВызватьИсключение "Ошибка на этапе получения элемента формы. Тип значения(" + ТипЗнч ( Объект ) + ")" ;
КонецЕсли;
КонецЕсли;Если ТипЗнч ( Объект ) = Тип ( "КнопкаФормы" ) Тогда
Объект . ИмяКоманды = СтароеДействие ;
Иначе
Объект . УстановитьДействие ( ИмяСобытияФормы , СтароеДействие );
КонецЕсли;
КонецПроцедуры// Возвращает старые обработчики событий формы.
// Сохраняет штатный обработчик события внутри формы и устанавливает новый.
//
// Параметры:
// Форма – УправляемаяФорма – Управляемая форма.
//
Процедура ВыполнитьОткатОбработчиков ( Форма ) Экспорт
Для Каждого Обработчик Из Форма . OldHandlers Цикл
Строка = Обработчик . Значение ;
ИндексТочки = Найти ( Строка , "." );
ОткатитьДействиеУправляемоеПриложение ( Форма , Прав ( Строка , СтрДлина ( Строка )- ИндексТочки ), Лев ( Строка , ИндексТочки - 1 ), Обработчик . Представление );
КонецЦикла;
КонецПроцедуры// Функция разбивает строку разделителем.
//
// Параметры:
// Строка - Строка - которую разбиваем;
// Разделитель - Строка - символ-разделитель.
//
// Возвращаемое значение:
// - Массив - содержащий фрагменты, на которые разбивает строку разделитель.
//
Функция РазобратьСтрокуВМассивПоРазделителю ( Строка , Разделитель = "." ) Экспорт
МассивСтрок = Новый Массив ;
СтрокаЗамены = СтрЗаменить ( Строка , Разделитель , Символы . ПС );
Для i = 1 По СтрЧислоСтрок ( СтрокаЗамены ) Цикл МассивСтрок . Добавить ( СтрПолучитьСтроку ( СтрокаЗамены , i )); КонецЦикла;
Возврат МассивСтрок ;
КонецФункцииНа данном этапе, все уже готово для использования. Вот видео-пример использования механизма.
Имеется УТ11.3
для доработки без снятия конфигурации с поддержки сделал копии форм документов - в них внес свои изменения и столкнулся с проблемкой.Мне нужно чтобы при создании док-та на основании открывалась моя скопированная форма а не форма документа по умолчанию.
Можно как-то подменить стандартную команду при создании на основании?(2) сути не меняет - это два различных метода. в данном конкретном случае нельзя сказать, что какой-то метод лучше другого :)
(2) от расширений отказался - много ограничений, ну и например при очередном обновлении например пропал журнал документов - который был доработан ))) а вместо него появилась обработка (1) там куча стандартных команд - не хочется все их руками перетягивать - нужно только 1 заменить.
(5) поддерживаю!
8 месяцев поддерживал БП с расширениями (самостоятельно написанными). Два раза приходилось с нуля переписывать некоторые механизмы в расширениях. В итоге, отказался от расширений.
Хотя, если доработки незначительные (и фирма 1С кардинально не меняет формы, состав реквизитов), можно сидеть и на расширениях(9)
Несколько месяцев работают.
Особо глюков не заметил.
А почему отказались ?
Из за трудности поддержки ?(9) хм. ну так один фиг, свои доработки основной конфы(без расширений) придется переделывать при обновлении.
без снятия с поддержки никак. подмена формы находится в модуле менеджера объекта. вот если бы можно было независимо делать эту подмену (по типу ООП), тогда да.
(4) (14) Можно поподробнее, чтото не едет у меня (((
Мне нужно чтобы документ создался на основании, но открылась нужная формаа приоткрытии ОткрытьФорму - ничего не открывается
или я чтото не так понимаю. на 8ке недавно программирую.(18) спасибо разобрался.
так-же замечательно работает при добавлении команды в документ, которая открывает нужную форму. Может кому-то пригодится.
А переопределить глобальную к сожалению никак (((
Хотелось бы конечно не трогать ни модуль менеджера ни команды документа, а прицепиться как в расширении &после Имяпроцедуры или &вместо и выполнить нужный код.Одним из требований для прохождения аудита расширения в модели сервиса является программная модификация управляемых форм без заимствования самой формы в расширение.
Мы рассмотрим основные составляющие этой задачи: добавление реквизитов, добавление элементов формы и назначение обработчиков событий элементов формы.
Добавление реквизитов
Для добавления реквизитов используется метод объекта ФормаКлиентскогоПриложения
Реквизиты формы, добавленные через конфигуратор, удалить невозможно, поэтому второй аргумент процедуры можно не указывать.
Переменная ДобавляемыеРеквизиты является массивом объектов типа РеквизитФормы .
Например, если мы создаем таблицу значений из двух колонок, то программный код для их создания будет выглядеть следующим образом:
К добавленным реквизитам верхнего уровня из модуля можно обращаться только с помощью конструкции ЭтотОбъект. ˂Имя реквизита˃ .
Процедуру ИзменитьРеквизиты логично вызывать из обработчика ПриСозданииНаСервере , но т.к. мы не заимствуем форму в расширение, то следует найти другую точку входа. Для конфигураций УТ 11, КА 2 и ERP 2 существует типовой механизм упрощенного изменения конфигураций. Нас интересует модуль МодификацияКонфигурацииПереопределяемый , в состав которого входит процедура
Данную процедуру можно заимствовать в расширение, добавить проверку имени формы и вставить код изменения реквизитов:
Для остальных конфигураций придется переопределять другие процедуры. Например
Использование той или иной процедуры следует проверить в модуле редактируемой формы.
Изменение элементов формы
Управление элементами формы производится через коллекцию Элементы объекта ФормаКлиентскогоПриложения , с помощью которой можно добавлять, удалять, изменять свойства элементов формы, а также перемещать элементы формы между родителями.
Для добавления нового элемента формы требуется передать в функцию Добавить данной коллекции имя элемента, его тип и родителя (при необходимости). Например:
По аналогии с добавлением реквизитов, данный код можно выполнять в функциях МодификацияКонфигурацииПереопределяемый.ПриСозданииНаСервере (УТ, КА, ERP) , ПодключаемыеКоманды.ПриСозданииНаСервере или ВерсионированиеОбъектов.ПриСозданииНаСервере .
При создании новых элементов формы старайтесь добавлять к их именам префикс своего расширения, чтобы избежать конфликтов с элементами формы типовой конфигурации. Этот же совет следует применять к именованию реквизитов формы, процедур, функций и глобальным переменным.
Обработка событий формы
Выполнить код по событию элемента формы можно двумя способами:
- Создать команду, указать для этой команды имя обработчика события и назначить эту команду элементу формы
- Выполнить метод УстановитьДействие элемента формы, чтобы указать имя обработчика события в модуле формы
Оба метода предполагают наличие в модуле формы процедуры с сигнатурой, соответствующей обработчику события. Для первого способа в модуле формы должна быть клиентская процедура, принимающая единственный аргумент - Команда. Для второго - всё зависит от события, для которого выполняется обработчик. Так, например, для события ПриИзменении элемента формы с типом ПолеВвода будет требоваться процедура, принимающая единственный аргумент - ЭлементФормы . А для события ПередНачаломДобавления таблицы формы - целых 6 аргументов ( ЭлементФормы , Отказ , Копирование , Родитель , ЭтоГруппа , Параметр ). Поэтому для некоторых событий попросту невозможно подобрать соответствующие клиентские методы в модуле формы и заимствования формы в расширение не избежать.
Для самых простых случаев (команда или событие без параметров) можно использовать следующие комбинации обработчиков и переопределяемых процедур:
- обработчик Подключаемый_ВыполнитьПереопределяемуюКоманду с переопределением процедуры МодификацияКонфигурацииКлиентПереопределяемый.ВыполнитьПереопределяемуюКоманду для УТ, КА и ERP;
- обработчик Подключаемый_ВыполнитьКоманду с переопределением процедуры ПодключаемыеКомандыКлиент.ВыполнитьКоманду
При этом в предопределенной процедуре обязательно проверять имя команды (или имя элемента формы) и имя самой формы.
Либо вариант с использованием команд:
Обратите внимание, что при использовании процедур, не предназначенных для программной обработки команд, следует возвращать поток выполнения методом глобального контекста ПродолжитьВыполнение , чтобы не нарушить работу типовых механизмов.
Полезные советы
Работа с динамическими списками
Довольно частой задачей является модификация в расширении текста запроса динамического списка. Многие разработчики просто копируют текст запроса из конфигуратора, редактируют его и заменяют стандартный в свойстве ТекстЗапроса объекта Динамический список .
Для небольших изменений гораздо лучше воспользоваться объектом СхемаЗапроса , появившемся в версии платформы 8.3.5. Он позволит всегда иметь актуальный текст запроса, если он поменяется при обновлении конфигурации.
Переопределение открываемой формы
В некоторых случаях, когда требуется кардинальное изменение формы, следует не забывать о возможности переопределения открываемой формы в модуле менеджера объекта метаданных.
Для этого следует реализовать новую форму (не заимствовать её, а написать с нуля) и в модуле менеджера переопределить процедуру ОбработкаПолученияФормы .
Данный метод следует использовать с осторожностью или ограничивать его использование ключами открытия формы, т.к. в этом случае мы делаем недоступной типовую форму.
Читайте также: