Содержание:
1. Функция проверки существования реквизита на управляемой форме
2. Процедура добавление реквизита управляемой формы
3. Процедура добавление реквизита управляемой формы «ПолеВвода»
4. Процедура добавление реквизита управляемой формы «ПолеФлажка»
5. Процедура добавление реквизита управляемой формы «Кнопка»
6. Процедура программного добавление реквизита формы «ГруппаФормы»
7. Вспомогательная функция проверки корректности имени добавляемого элемента управляемой формы
Программная модификация форм используется в нескольких случаях:
· При доработке типовых конфигураций (в частности обновление на новый релиз вендора). В этом случае будет изменен только модуль управляемой формы. Модули намного проще обновлять, чем форму.
· При реализации некоторых общих алгоритмов. Например, в подсистеме БСП.
Программной модификации формы подлежать следующие сущности: реквизиты управляемой формы, локальные команды, элементы управляемой формы.
При программной модификации управляемой формы существует ряд ограничений: нельзя программно удалить объекты, созданные в конфигураторе, удалению подлежат объекты формы созданные программно, реквизиты создаваемые программно нельзя назначать основными.
Все программные модификации формы производятся только на сервере.
Создадим и опишем некоторые функции которые в дальнейшем облегчать разработчикам модификации управляемых форм в 1С 8. Все процедуры и функции необходимо будет поместить в общий модуль с вариантом исполнения на сервере:
1. Функция проверки существования реквизита на управляемой форме
Функция РеквизитСуществует(Форма, ИмяРеквизита, ИмяРодителя = "") Экспорт
Реквизиты = Форма.ПолучитьРеквизиты(ИмяРодителя);
РеквизитСуществует = Ложь;
Для Каждого Реквизит Из Реквизиты Цикл
Если Реквизит.Имя = ИмяРеквизита Тогда
РеквизитСуществует = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат РеквизитСуществует;
КонецФункции
Описание функции – В качестве входных параметров передаются: обрабатываемая форма «Форма», «ИмяРеквизита» - имя реквизита поиска, «ИмяРодитя» - область поиска реквизита на форме. Функция получает коллекцию реквизитов управляемой формы и проверяет переданное имя реквизита с текущим реквизитом формы, если есть совпадение функция возвращает Истина иначе Ложь.
2. ПРОЦЕДУРА ДОБАВЛЕНИЯ РЕКВИЗИТА управляемой ФОРМЫ
Процедура ДобавитьРеквизитФормы(МассивДобавляемыхРеквизитов, ИмяРеквизита, ТипРеквизита, Путь = "", Заголовок = "") Экспорт
НовыйРеквизит = Новый РеквизитФормы(ИмяРеквизита, ТипРеквизита, Путь, Заголовок);
МассивДобавляемыхРеквизитов.Добавить(НовыйРеквизит);
КонецПроцедуры
Описание процедуры:
Входные параметры
· МассивДобавляемыхРеквизитов – массив;
· ИмяРеквизита – имя добавляемого реквизита;
· ТипРеквизита – тип реквизита (Содержит тип реквизита);
· Путь - содержит путь к реквизиту. Не включает имя реквизита;
· Заголовок - содержит отображаемый текст реквизита.
Процедура добавляет на управляемую форму новый реквизит формы с именем.
3. ПРОЦЕДУРА ДОБАВЛЕНИЯ РЕКВИЗИТА управляемой ФОРМЫ «ПолеВвода»
Процедура ДобавитьПолеВвода(Форма, ИмяЭлемента, ПутьКДанным, Заголовок = "" , Знач Родитель = Неопределено, Знач ЭлементПредУстановки = Неопределено, ДоступностьПВ = Истина, ТЗОбработчиковСобытий = Неопределено) Экспорт
Если Не ТипЗнч(Родитель) = Тип("ГруппаФормы")
И Не ТипЗнч(Родитель) = Тип("ТаблицаФормы")
И Не ТипЗнч(Родитель) = Тип("УправляемаяФорма") Тогда
// Никогда не знаешь, с чем имеешь дело!
Родитель = Неопределено
КонецЕсли;
Если ИмяЭлемента = "" Или СтрНайти(ИмяЭлемента, " ") Или НачинаетсяСЧисла(ИмяЭлемента) Тогда
Сообщить("Не удалось добавить поле формы """ + ИмяЭлемента + """. Необходимо исправление!", СтатусСообщения.Внимание);
Возврат
КонецЕсли;
Если ЭлементПредУстановки = Неопределено Тогда
Элемент = Форма.Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), Родитель);
Иначе
Элемент = Форма.Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), Родитель);
Форма.Элементы.Переместить(Элемент, Родитель, ЭлементПредУстановки);
КонецЕсли;
Элемент.Заголовок = Заголовок;
Элемент.ПутьКДанным = ПутьКДанным;
Элемент.Вид = ВидПоляФормы.ПолеВвода;
Элемент.Доступность = ДоступностьПВ;
// Привязка обработчиков событий
Если ТЗОбработчиковСобытий = Неопределено Тогда
Возврат;
КонецЕсли;
Для Каждого Строка Из ТЗОбработчиковСобытий Цикл
Форма.Элементы[ИмяЭлемента].УстановитьДействие(Строка.ИмяСобытия, Строка.Действие);
КонецЦикла;
КонецПроцедуры
Описание процедуры:
Входные параметры
· Форма – модифицируемая форма;
· ИмяЭлемента – имя добавляемого реквизита;
· ТипРеквизита – тип реквизита (Содержит тип реквизита);
· ПутьКДанным - содержит путь к реквизиту. Не включает имя реквизита;
· Заголовок - содержит отображаемый текст реквизита;
· Родитель - родитель для добавляемого элемента. Если не указан, то добавляется на верхний уровень формы;
· ЭлементПредУстановки – элемент, перед которым нужно разместить добавляемый элемент. Если не задан, то перемещается в конец коллекции.
· ДоступностьПВ – свойство «Доступность» добавляемого элемента;
· ТЗОбработчиковСобытий – таблица значений с описанием действий добавляемого элемента.
Процедура добавляет на управляемую форму новый реквизит формы с типом ПолеВвода.
4. ПРОЦЕДУРА ДОБАВЛЕНИЯ РЕКВИЗИТА управляемой ФОРМЫ «ПолеФлажка»
Процедура ДобавитьПолеФлажка(Форма, ИмяЭлемента, ПутьКДанным, Заголовок = "" , Знач Родитель = Неопределено, Знач ЭлементПредУстановки = Неопределено, ДоступностьПВ = Истина) Экспорт
Если Не ТипЗнч(Родитель) = Тип("ГруппаФормы")
И Не ТипЗнч(Родитель) = Тип("ТаблицаФормы")
И Не ТипЗнч(Родитель) = Тип("УправляемаяФорма") Тогда
// Никогда не знаешь, с чем имеешь дело!
Родитель = Неопределено
КонецЕсли;
Если ИмяЭлемента = "" Или СтрНайти(ИмяЭлемента, " ") Или НачинаетсяСЧисла(ИмяЭлемента) Тогда
Сообщить("Не удалось добавить поле формы """ + ИмяЭлемента + """. Необходимо исправление!", СтатусСообщения.Внимание);
Возврат
КонецЕсли;
Если ЭлементПредУстановки = Неопределено Тогда
Элемент = Форма.Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), Родитель);
Иначе
Элемент = Форма.Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), Родитель);
Форма.Элементы.Переместить(Элемент, Родитель, ЭлементПредУстановки);
КонецЕсли;
Элемент.Заголовок = Заголовок;
Элемент.ПутьКДанным = ПутьКДанным;
Элемент.Вид = ВидПоляФормы.ПолеФлажка;
Элемент.Доступность = ДоступностьПВ;
КонецПроцедуры
Описание процедуры:
Входные параметры
· Форма – модифицируемая форма;
· ИмяЭлемента – имя добавляемого реквизита;
· ТипРеквизита – тип добавляемого реквизита (Содержит тип реквизита);
· ПутьКДанным - содержит путь к реквизиту. Не включает имя реквизита;
· Заголовок - содержит отображаемый текст реквизита;
· Родитель - родитель для добавляемого элемента. Если не указан, то добавляется на верхний уровень формы;
· ЭлементПредУстановки – элемент, перед которым нужно разместить добавляемый элемент. Если не задан, то перемещается в конец коллекции.
· ДоступностьПВ – свойство «Доступность» добавляемого элемента.
Процедура добавляет на форму новый реквизит формы с типом ПолеФлажка.
5. ПРОЦЕДУРА ДОБАВЛЕНИЯ РЕКВИЗИТА управляемой ФОРМЫ «Кнопка»
Процедура ДобавитьКнопку(Форма, ИмяЭлемента, Заголовок = "", ВидКнопки = Неопределено,
Знач ГруппаКоманд = Неопределено, Знач ЭлементПредУстановки = Неопределено,
КартинкаКнопки = Неопределено, ПодксазкаКнопки = Неопределено) Экспорт
Если Не ТипЗнч(ГруппаКоманд) = Тип("ГруппаФормы")
И Не ТипЗнч(ГруппаКоманд) = Тип("УправляемаяФорма") Тогда
// Никогда не знаешь, с чем имеешь дело!
ГруппаКоманд = Неопределено;
КонецЕсли;
Если ВидКнопки = Неопределено Тогда
ВидКнопки = ВидКнопкиФормы.ОбычнаяКнопка;
КонецЕсли;
НоваяКоманда = Форма.Команды.Добавить(ИмяЭлемента);
НоваяКоманда.Действие = "плрНажатиеКнопки" + ИмяЭлемента;
НоваяКоманда.Заголовок = Заголовок;
Если ЭлементПредУстановки = Неопределено Тогда
НовыйЭлемент = Форма.Элементы.Вставить(ИмяЭлемента, Тип("КнопкаФормы"), ГруппаКоманд);
Иначе
НовыйЭлемент = Форма.Элементы.Вставить(ИмяЭлемента, Тип("КнопкаФормы"), ГруппаКоманд, ЭлементПредУстановки);
КонецЕсли;
НовыйЭлемент.Заголовок = Заголовок;
НовыйЭлемент.Вид = ВидКнопки;
НовыйЭлемент.ИмяКоманды = ИмяЭлемента;
Если КартинкаКнопки <> Неопределено Тогда
НовыйЭлемент.Картинка = КартинкаКнопки;
НовыйЭлемент.Отображение = ОтображениеКнопки.Картинка;
КонецЕсли;
Если ПодксазкаКнопки <> Неопределено Тогда
НовыйЭлемент.ОтображениеПодсказки = ОтображениеПодсказки.Авто;
НоваяКоманда.Подсказка = ПодксазкаКнопки;
КонецЕсли;
КонецПроцедуры
Описание процедуры программного добавления реквизита формы:
Входные параметры
· Форма – модифицируемая форма;
· ИмяЭлемента – имя добавляемого реквизита;
· Вид кнопки – тип добавляемого реквизита (содержит тип реквизита);
· ГруппаКомманд - родитель для добавляемого элемента. Если не указан, то добавляется на верхний уровень формы;
· ЭлементПредУстановки – элемент, перед которым нужно разместить добавляемый элемент. Если не задан, то перемещается в конец коллекции.
· КартинкаКнопки – признак графического отображения кнопки;
· ПодсказкаКнопки – текстовое представление подсказки кнопки.
Процедура добавляет на форму новый реквизит формы с типом КнопкаФормы.
6. ПРОЦЕДУРА программного ДОБАВЛЕНИЯ РЕКВИЗИТА ФОРМЫ «ГруппаФормы»
Процедура ДобавитьГруппуФормы(Форма, ИмяЭлемента, Заголовок, Знач ВидГруппы, БезОтображения = Ложь, Знач Группировка = Неопределено, Знач Родитель = Неопределено) Экспорт
НовыйЭлемент = Форма.Элементы.Добавить(ИмяЭлемента, Тип("ГруппаФормы"), Родитель);
НовыйЭлемент.Заголовок = Заголовок;
НовыйЭлемент.Вид = ВидГруппы;
Если ВидГруппы = ВидГруппыФормы.ОбычнаяГруппа Тогда
Если Группировка = Неопределено Тогда
НовыйЭлемент.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяЕслиВозможно;
ИначеЕсли Группировка Тогда
НовыйЭлемент.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
КонецЕсли;
Если БезОтображения Тогда
НовыйЭлемент.ОтображатьЗаголовок = Ложь;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Описание процедуры программного добавления реквизита формы:
Входные параметры
· Форма – модифицируемая форма;
· ИмяЭлемента – имя добавляемого реквизита;
· ВидГруппы – тип добавляемого реквизита (содержит тип реквизита);
· БезОтображения – свойство типа элемента формы «ГруппаФормы» отображать заголовок;
· Группировка – свойство указывающее расположение элементов в группе;
· Родитель - родитель для добавляемого элемента. Если не указан, то добавляется на верхний уровень формы.
Процедура добавляет на форму новый реквизит формы с типом «ГруппаФормы».
7. Вспомогательная функция проверки корректности имени добавляемого элемента управляемой формы
Функция НачинаетсяСЧисла(ИмяЭлемента)
КодВозврата = Ложь;
Для Счетчик = 0 По 9 Цикл
Если СтрНачинаетсяС(ИмяЭлемента, Строка(Счетчик)) Тогда
КодВозврата = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат КодВозврата;
КонецФункции
Описание функции:
Входные параметры
· ИмяЭлемента – имя добавляемого реквизита.
Функция проверяет корректность передаваемого имени реквизита в 1С. Функция возвращает Истина если имя соответствуют правилу формирования имен объектов иначе Ложь.
Заключение – в статье представлены наиболее часто используемы функции при программной модификации управляемой формы в 1С 8.
Спасибо за внимание уважаемые коллеги.
Специалист компании «Кодерлайн»
Дмитрий Гречушкин