В данной статье описаны примеры программного создания объектов управляемой формы 1С : элементов, команд, реквизитов, а также описание стандартных возможностей для работы с ними.
Введение в управляемая форма 1С реквизиты элементы команды
Рекомендуется модифицировать управляемые формы типового решения 1С программно для удобного будущего обновления и исключения конфликтов, а также для удобной работы с изменениями и надежности при использовании механизма расширений.
В некоторых типовых конфигурациях 1С (ЕРП 2, УТ 11) используется механизм упрощенного изменения конфигурации. Статьи о типовом механизме можно найти в разделе полезных ссылок. Данный механизм используется в БСП, и его необходимо знать при модификации типовых конфигураций.
При добавлении элементов на форму программно можно отредактировать практически любое свойство из панель свойств, которое можно установить вручную в конфигураторе.
Также все описанные в текущем разделе процедуры и функции находятся во внешней обработке УпрФормы.
Примеры работы с объектом «ДанныеФормыКоллекция» и созданием дин. списка и таблицы значений программно можно будет посмотреть в части 2.
Для запуска обработки в режиме предприятия необходимо наличие объектов «Справочники.Номенклатура», подчиненный ему «Справочники.ХарактеристикиНоменклатуры» и «РегистрыСведений.ЦеныНоменклатуры”.
Программное переопределение обработчиков событий формы и элементов формы
Переопределить обработчики событий формы можно в обработчике «ПриСозданииНаСервере» (кроме самого обрабочика «ПриСозданииНаСервере») или в теле модуля формы в контексте сервера (например, Переопределение событий ПриЧтениинаСервере и ПриСозданииНаСервере).
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЭтаФорма.УстановитьДействие(“ОбработкаВыбора”, “пр_ОбработкаВыбора”)
КонецПроцедуры
В теле модуля формы:
#Если Сервер Тогда
ЭтаФорма.УстановитьДействие("ПриСозданииНаСервере", "пр_ПриСозданииНаСервере");
#КонецЕсли
А в новой процедуре нужно добавить вызов основной, если такая процедура есть.
&НаСервере
Процедура пр_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ПриСозданииНаСервере(Отказ, СтандартнаяОбработка);
КонецПроцедуры
Аналогично можно поступить и с обработчиками элементов формы:
Элементы.Номенклатура.УстановитьДействие(“ПриИзменении”, “пр_НоменклатураПриИзменении”)
Программное создание групп формы.
&НаСервере
Процедура пр_СоздатьГруппы()
ГруппаСтраницы = Элементы.Добавить("пр_Страницы", Тип("ГруппаФормы"),ЭтаФорма);
ГруппаСтраницы.Вид = ВидГруппыФормы.Страницы;
НоваяСтраница = Элементы.Добавить("пр_Страница", Тип("ГруппаФормы"),ГруппаСтраницы);
НоваяСтраница.Вид = ВидГруппыФормы.Страница;
НоваяСтраница.Заголовок = "Страница 1";
НоваяГруппа = Элементы.Добавить("пр_Группа1", Тип("ГруппаФормы"),НоваяСтраница);
НоваяГруппа.Вид = ВидГруппыФормы.ОбычнаяГруппа;
НоваяГруппа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяЕслиВозможно;
НоваяГруппа.Заголовок = "Группа 1";
КонецПроцедуры
Доступные виды групп формы:
Программное добавление команды на форму.
Удалить команду можно при помощи метода коллекции формы команд: Команды.Удалить(<Команда>). Удалять можно только те команды, которые были созданы программно.
&НаСервере
Процедура пр_СоздатьНовуюКоманду()
//создать новую команду у формы
НоваяКоманда = Команды.Добавить("пр_Команда1");
НоваяКоманда.Действие = "пр_Команда1";
НоваяКоманда.Картинка = БиблиотекаКартинок.Облако;
НоваяКоманда.Отображение = ОтображениеКнопки.Картинка;
//вывести команду в элементы
ЭлементКоманда = Элементы.Добавить("пр_Команда1", Тип("КнопкаФормы"), Элементы.ФормаКоманднаяПанель);
ЭлементКоманда.Заголовок = "Вывести сообщение";
ЭлементКоманда.ИмяКоманды = "пр_Команда1";
//удалить команду
//Команды.Удалить(НоваяКоманда);
КонецПроцедуры
&НаКлиенте
Процедура пр_Команда1(Команда)
Сообщить("Команда выполнена.");
КонецПроцедуры
Программное создание декораций форм.
&НаСервере
Процедура пр_СоздатьДекорацию()
//добавить надпись
Элемент = Элементы.Добавить("Надпись1", Тип("ДекорацияФормы"), Элементы["пр_Группа1"]);
Элемент.Вид = ВидДекорацииФормы.Надпись;
Элемент.Заголовок = "Добавленная надпись";
//для того, чтобы добавить картинку, необходимо выбрать ВидДекорацииФормы.Картинка
Элемент = Элементы.Добавить("Картинка1", Тип("ДекорацияФормы"), Элементы["пр_Группа1"]);
Элемент.Вид = ВидДекорацииФормы.Картинка;
Элемент.Картинка = БиблиотекаКартинок.Бесконечность;
КонецПроцедуры
Программное добавление реквизита на форму.
Добавлять новые реквизиты в управляемую форму и удалять необходимо с помощью метода ИзменитьРеквизиты(), куда в параметры передается массив добавляемых реквизитов и массив удаляемых. Удалять при этом можно только те реквизиты, которые были созданы программно.
&НаСервере
Процедура пр_СоздатьРеквизиты()
// Массив для новых реквизитов
ДобавляемыеРеквизиты = Новый Массив;
// Опишем ревизиты формы
Реквизит_Использование = Новый РеквизитФормы("пр_Использование", Новый ОписаниеТипов("Булево"), "", "Использование");
Реквизит_Номенклатура = Новый РеквизитФормы("пр_Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"), "", "Номенклатура");
Реквизит_Характеристика = Новый РеквизитФормы("пр_Характеристика", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"), "", "Характеристика");
Реквизит_Количество = Новый РеквизитФормы("пр_Количество", Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(10, 3)), "", "Количество");
Реквизит_УдалитьКоличество = Новый РеквизитФормы("пр_УдалитьКоличество", Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(10, 3)), "", "Удалить_Количество");
//если используется БСП, то можно для определения описания типов использовать функцию
//ОбщегоНазначения.ОписаниеТипаСтрока(ДлинаСтроки)
//ОбщегоНазначения.ОписаниеТипаЧисло(Разрядность, РазрядностьДробнойЧасти = 0, ЗнакЧисла = Неопределено)
//ОбщегоНазначения.ОписаниеТипаДата(ЧастиДаты)
Реквизит_Информация = Новый РеквизитФормы("пр_Информация", ОбщегоНазначения.ОписаниеТипаСтрока(100), "", "Информация");
// Для наглядности заполним массив после описания реквизитов формы
ДобавляемыеРеквизиты.Добавить(Реквизит_Использование);
ДобавляемыеРеквизиты.Добавить(Реквизит_Номенклатура);
ДобавляемыеРеквизиты.Добавить(Реквизит_Характеристика);
ДобавляемыеРеквизиты.Добавить(Реквизит_Количество);
ДобавляемыеРеквизиты.Добавить(Реквизит_УдалитьКоличество);
ДобавляемыеРеквизиты.Добавить(Реквизит_Информация);
// Добавим новые реквизиты в форму
ИзменитьРеквизиты(ДобавляемыеРеквизиты);
КонецПроцедуры
&НаСервере
Процедура пр_УдалитьРеквизиты()
// Массив для удаляемых реквизитов
УдаляемыеРеквизиты = Новый Массив;
//указываем путь к удаляемому реквизиту
УдаляемыеРеквизиты.Добавить("пр_УдалитьКоличество");
//К добавленным реквизитам нужно обращаться через переменную ЭтаФорма
// Добавим новые реквизиты в форму
ИзменитьРеквизиты(,УдаляемыеРеквизиты);
КонецПроцедуры
Вывод реквизитов на форму.
&НаСервере
Процедура пр_ВывестиРеквизитыНаФорму()
НовыйЭлемент = Элементы.Добавить("пр_Использование", Тип("ПолеФормы"), Элементы.пр_Страница1);
НовыйЭлемент.ПутьКДанным = "пр_Использование";
НовыйЭлемент.Вид = ВидПоляФормы.ПолеФлажка;
НовыйЭлемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Право;
//установим обработчик события элементы
НовыйЭлемент.УстановитьДействие("ПриИзменении", "пр_ИспользованиеПриИзменении");
НовыйЭлемент = Элементы.Добавить("пр_Номенклатура", Тип("ПолеФормы"), Элементы.пр_Страница1);
НовыйЭлемент.ПутьКДанным = "пр_Номенклатура";
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
//установить параметр выбора элемента
НовыйМассив = Новый Массив();
НовыйПараметр = Новый ПараметрВыбора("Отбор.ПометкаУдаления", Ложь);
НовыйМассив.Добавить(НовыйПараметр);
НовыеПараметры = Новый ФиксированныйМассив(НовыйМассив);
НовыйЭлемент.ПараметрыВыбора = НовыеПараметры;
НовыйЭлемент.УстановитьДействие("ПриИзменении", "пр_НоменклатураПриИзменении");
НовыйЭлемент = Элементы.Добавить("пр_Характеристика", Тип("ПолеФормы"), Элементы.пр_Страница1);
НовыйЭлемент.ПутьКДанным = "пр_Характеристика";
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.Заголовок = "Характеристика номенклатуры";
//добавить связь параметров выбора по реквизиту владелец в зависимости от выбранной номенклатуры
НоваяСвязь = Новый СвязьПараметраВыбора("Отбор.Владелец", "пр_Номенклатура");
НовыйМассив = Новый Массив();
НовыйМассив.Добавить(НоваяСвязь);
НовыйЭлемент.СвязиПараметровВыбора = Новый ФиксированныйМассив(НовыйМассив);
НовыйЭлемент.УстановитьДействие("ПриИзменении", "пр_ХарактеристикаПриИзменении");
НовыйЭлемент = Элементы.Добавить("пр_Количество", Тип("ПолеФормы"), Элементы.пр_Страница1);
НовыйЭлемент.ПутьКДанным = "пр_Количество";
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
//установить формат
НовыйЭлемент.ФорматРедактирования = "ЧДЦ=0; ЧРГ=.; ЧН=Отсутствует";
НовыйЭлемент = Элементы.Добавить("пр_Информация", Тип("ПолеФормы"), Элементы.пр_Страница1);
НовыйЭлемент.ПутьКДанным = "пр_Информация";
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
//установить список выбора
НовыйЭлемент.РежимВыбораИзСписка = Истина;
Массив = Новый Массив;
Массив.Добавить("Необходимо дозаказать");
Массив.Добавить("Достаточно");
Массив.Добавить("Оформить полный заказ");
НовыйЭлемент.СписокВыбора.ЗагрузитьЗначения(Массив);
КонецПроцедуры
&НаКлиенте
Процедура пр_ИспользованиеПриИзменении(Элемент)
КонецПроцедуры
Вызов процедур при создании на сервере 1С
После описания всех процедур выводим их в процедуре ПриСозданииНаСервере. Также можно изменить программно некоторые свойства формы, например, заголовок. Чтобы был виден только наш заголовок, нужно отключить свойство Автозаголовок.
&НаСервере &НаСервере Процедура пр_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) //установим заголовок формы ЭтаФорма.Заголовок = "Шаблон для программной работы с реквизитами, командами и элементами формы"; ЭтаФорма.АвтоЗаголовок = Ложь; пр_СоздатьГруппы(); пр_СоздатьНовуюКоманду(); пр_СоздатьДекорацию(); пр_СоздатьРеквизиты(); пр_УдалитьРеквизиты(); пр_ВывестиРеквизитыНаФорму(); КонецПроцедуры
Некоторые советы при программном редактировании формы
- Если вы не используете префиксы при создании новых команд и элементов рекомендуется проверять существование создаваемых объектов по имени с помощью метода Найти(), который вернет Неопределено, если объект в коллекции не найден:
- Элементы.Найти(«пр_Владелец»);
- Команды.Найти(«пр_НоваяКоманда»);
- Чтобы проверить уникальность реквизита на форме можно воспользоваться следующей функцией:
&НаКлиентеНаСервереБезКонтекста
// Функция определяет существует ли реквизит у объекта.
//
Функция ЕстьРеквизитОбъекта(мОбъект, ИмяРеквизита)
КлючУникальности = Новый УникальныйИдентификатор;
СтруктураРеквизита = Новый Структура(ИмяРеквизита, КлючУникальности);
ЗаполнитьЗначенияСвойств(СтруктураРеквизита, мОбъект);
Возврат СтруктураРеквизита[ИмяРеквизита] <> КлючУникальности;
КонецФункции // ЕстьРеквизитОбъекта()
- Свойства, методы и коллекции управляемой формы описаны в синтакс-помощнике в разделе «Интерфейс (управляемый)»;
- Изучите БСП, если она имеется в вашей конфигурации. Например в общем модуле «ОбщегоНазначения» уже описаны функции для создания объекта ОписаниеТипов, необходимого при создании новых реквизитов на форме:
- ОбщегоНазначения.ОписаниеТипаСтрока(ДлинаСтроки) — Создает объект ОписаниеТипов, содержащий тип Строка;
- ОбщегоНазначения.ОписаниеТипаЧисло(Разрядность, РазрядностьДробнойЧасти = 0, ЗнакЧисла = Неопределено) — Создает объект ОписаниеТипов, содержащий тип Число;
- ОбщегоНазначения.ОписаниеТипаДата(ЧастиДаты) — Создает объект ОписаниеТипов, содержащий тип Дата;
- ОбщегоНазначенияВызовСервера.ЦветСтиля(ИмяЦветаСтиля) — Функция получает цвет стиля по имени элемента стиля;
- ОбщегоНазначенияВызовСервера.ШрифтСтиля(ИмяШрифтаСтиля) — Функция получает шрифт стиля по имени элемента стиля.
Итак, взглянем на получившийся результат. Все элементы на форме созданы программно:

Полезные ссылки
1. Типовой механизм упрощенного изменения конфигурации в ERP 2.0 и УТ 11
2. Типовой функционал модификации конфигурации линейки ERP-решений (УТ 11, КА 2 и ERP 2)
3. 1С Управляемые Формы. Программное создание таблицы значений и динамического списка (Часть 2)

Все комментарии
Чтобы оставить комментарий, необходимо войти или зарегистрироваться.
Пока нет комментариев. Будьте первым!