При разработке решений возникает необходимость добавить реквизит формы, состав и типы которых зависят от данных. Например при построении динамических деревьев с периодами, или при выводе контактной информации и т.д.
Содержание
- Задача
- Добавление реквизитов
- Удаление реквизитов
- Добавление реквизита табличной части
- Добавление реквизита с типом Произвольный
Задача
Для наглядности разберем простой пример, в котором можно было обойтись только элементами формы, но мы создадим и реквизиты.
Есть некая конфигурация, в форме элемента справочника Номенклатура необходимо программно создавать реквизиты формы и элементы к ним:
- ЯчейкаХранения, тип СправочникСсылка.ЯчейкиХранения;
- ТекущийОстаток, тип Число.
Элементы объединить в группу с горизонтальной группировкой. На текущий момент форма имеет следующий вид:
Добавление реквизитов
В обработчике формы ПриСозданииНаСервере() опишем код, который разбивается на 3 этапа:
- Описание и создание реквизитов формы;
- Создание элементов формы, объединение в группу без отображения;
- Заполнение данных.
Ниже приведен готовый код, код снабжен комментариями и разбит на области для лучшего понимания
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) #Область ДобавлениеРеквизитовФормы // Массив для новых реквизитов ДобавляемыеРеквизиты = Новый Массив; // Опишем ревизиты формы Реквизит_ЯчейкаХранения = Новый РеквизитФормы("ЯчейкаХранения", Новый ОписаниеТипов("СправочникСсылка.ЯчейкиХранения"), , "Ячейка"); Реквизит_ТекущийОстаток = Новый РеквизитФормы("ТекущийОстаток", Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(10, 3)), , "Остаток"); // Для наглядности заполним массив после описания реквизитов формы ДобавляемыеРеквизиты.Добавить(Реквизит_ЯчейкаХранения); ДобавляемыеРеквизиты.Добавить(Реквизит_ТекущийОстаток); // Добавим новые реквизиты в форму ИзменитьРеквизиты(ДобавляемыеРеквизиты); #КонецОбласти #Область ДобавлениеЭлементовФормы // Горизонтальная группа без отображения на форме ГруппаФормы = Элементы.Добавить("Группа_СправочныеДанные", Тип("ГруппаФормы")); ГруппаФормы.Вид = ВидГруппыФормы.ОбычнаяГруппа; ГруппаФормы.Отображение = ОтображениеОбычнойГруппы.Нет; ГруппаФормы.ОтображатьЗаголовок = Ложь; ГруппаФормы.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная; // Элементы НовыйЭлемент = Элементы.Добавить("ЯчейкаХранения", Тип("ПолеФормы"), ГруппаФормы); НовыйЭлемент.ПутьКДанным = "ЯчейкаХранения"; НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода; НовыйЭлемент.ТолькоПросмотр = Истина; НовыйЭлемент = Элементы.Добавить("ТекущийОстаток", Тип("ПолеФормы"), ГруппаФормы); НовыйЭлемент.ПутьКДанным = "ТекущийОстаток"; НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода; НовыйЭлемент.ТолькоПросмотр = Истина; #КонецОбласти #Область ЗаполнениеДанных // Имитируем заполнение данных ЭтаФорма.ЯчейкаХранения = ПредопределенноеЗначение("Справочник.ЯчейкиХранения.Распаковка"); ЭтаФорма.ТекущийОстаток = 12; #КонецОбласти КонецПроцедуры
После выполнения приведенного кода форма будет выглядеть так:
Удаление реквизитов
Для удаления необходимо передать массив содержащий пути реквизитов в качестве второго параметра метода формы ИзменитьРеквизиты().
#Область УдалениеРеквизитовФормы // Массив удаляемых реквизитов УдаляемыеРеквизиты = Новый Массив; УдаляемыеРеквизиты.Добавить("ЯчейкаХранения"); УдаляемыеРеквизиты.Добавить("ТекущийОстаток"); // Удалим реквизиты формы ИзменитьРеквизиты( , УдаляемыеРеквизиты); #КонецОбласти
Внимание!!! Удалять можно только реквизиты созданные программно.
Добавление реквизита табличной части
Добавление реквизита и элемента формы для табличной части почти ничем не отличается, необходимо только указать путь «Объект.<ИмяТабличнойЧасти>». Ниже пример добавления реквизита Ячейка в ТЧ Комплектация.
#Область ДобавлениеРеквизитаТЧ // Массив для новых реквизитов ДобавляемыеРеквизиты = Новый Массив; // Опишем ревизиты формы Реквизит_Ячейка = Новый РеквизитФормы("Ячейка", Новый ОписаниеТипов("СправочникСсылка.ЯчейкиХранения"), "Объект.Комплектация", "Ячейка"); // Для наглядности заполним массив после описания реквизитов формы ДобавляемыеРеквизиты.Добавить(Реквизит_Ячейка); // Добавим новые реквизиты в форму ИзменитьРеквизиты(ДобавляемыеРеквизиты); НовыйЭлемент = Элементы.Добавить("КомплектацияЯчейка", Тип("ПолеФормы"), Элементы.Комплектация); НовыйЭлемент.ПутьКДанным = "Объект.Комплектация.Ячейка"; НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода; #КонецОбласти
Добавление реквизита с типом Произвольный
В одной из задач стало необходимо добавить реквизит с типом Произвольный, но ни СП, ни интернеты ответа не дали. В итоге через несколько попыток было найдено решение
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Реквизит", Новый ОписаниеТипов("")));
Внимание!!! Данные добавленного реквизита сохраняться в ИБ не будут.
удаление программно добавленных реквизитов |
Я |
02.08.16 — 15:00
Всем доброго дня.
Столкнулся с проблемой:
На форму добавляю свой реквизит типа «Строка», с отображением как «ПолеФормы». Затем при повторной активизации формы хочу проверить — добавлен ли реквизит на форму, и удалить его если он там есть.
Для добавления использую конструкцию:
НовыйРек = Новый РеквизитФормы(СтрЗаменить(ИмяРеквизита,» «,»»),ДопустимыеТипы,,ИмяРеквизита);
МассивРеквизитов = Новый Массив;
МассивРеквизитов.Добавить(НовыйРек);
ЭтаФорма.ИзменитьРеквизиты(МассивРеквизитов);
Но при попытке найти такой реквизит чтобы его удалить на форме — система просто не находит его в Элементы.
Если использовать ЭтаФорма[ИмяРеквизита] — находит конкретно значение типа Строка. Сделать с ней, само собой, ничего нельзя.
Вопрос — как можно удалить элемент, если он был добавлен раньше программно?
1 — 02.08.16 — 15:08
Проверить, если есть — просто не добавлять. Это вариант?
2 — 02.08.16 — 15:11
(1) Мне скорее надо его удалить, так как имя реквизита могло изменится, и чтобы старый не мешал — сначала пытаюсь убрать ранее добавленные. Так что всё же нужно удалять.
3 — 02.08.16 — 15:15
4 — 02.08.16 — 15:21
Элементы.Найти
5 — 02.08.16 — 15:22
или тут старообрядцы?
6 — 02.08.16 — 15:23
(4) Тут реквизиты формы, а не элементы.
7 — 02.08.16 — 15:26
(6) обсыпал голову пеплом. и на всякий случай другие части тела.
8 — 02.08.16 — 15:28
(3) похоже что всё печально. У меня обработка внутри конфигурации, но созданные реквизиты так же не получить через Метаданные(). Значит пытаться искать элементы по наименованию, а затем «переопределять» элементы на другие реквизиты. Спасибо за ссылку.
9 — 02.08.16 — 15:31
(0) Так что удалить то надо «Элемент формы» или «Реквизит Формы»?
10 — 02.08.16 — 15:32
Если реквизит то есть второй параметр у ИзменитьРеквизиты
ИзменитьРеквизиты(<ДобавляемыеРеквизиты>, <УдаляемыеРеквизиты>)
11 — 02.08.16 — 15:33
(10) Чтобы использовать ИзменитьРеквизиты надо сначала найти этот реквизит, и в массив передать. А я не могу найти такие реквизиты, если они были добавлены на форму программно. Если есть рабочий пример использования — буду признателен.
12 — 02.08.16 — 15:34
(0) Твой код добавляет реквизит формы, элемент формы она не создает. Поэтому в элементах ты и не находишь скорее всего.
13 — 02.08.16 — 15:37
(12) Элементы создаю отдельно, и сами элементы найти можно.
НовоеПолеФормы=ЭтаФорма.Элементы.Добавить(СтрЗаменить(ИмяРеквизита,» «,»»),Тип(«ПолеФормы»),НайденаяГруппа);
Но только я реквизит не могу найти, чтобы его удалить затем.
14 — 02.08.16 — 15:43
(13) я при добавлении сохраняю в списки
и при удалении чищу по спискам
//управление программно созданными реквизитами
&НаСервере
Процедура ЗафиксироватьПрограммноСозданныеРеквизитыИЭлементы(РеквизитПС)
//при обновлении формы необходимо полное перезаполнение,
//состав программно сформированных колонок может изменится
//сохраним названия созданных при открытии формы колонок,
//перед обновлением информации удалим согласно списка
СписокУдаляемыхРеквизитов.Добавить(РеквизитПС.Путь + «.» + РеквизитПС.Имя);
СписокУдаляемыхЭлементов.Добавить(РеквизитПС.Имя);
КонецПроцедуры
&НаСервере
Процедура УдалитьПрограммноСозданныеРеквизитыИЭлементы()
//удаление ранее созданных программно колонок
//убираем элементы формы
Для каждого ЭлементФ Из СписокУдаляемыхЭлементов Цикл
НайденныйЭлементФормы = ЭтаФорма.Элементы.Найти(ЭлементФ.Значение);
Если НайденныйЭлементФормы <> Неопределено Тогда
ЭтаФорма.Элементы.Удалить(НайденныйЭлементФормы);
КонецЕсли;
КонецЦикла;
//убираем реквизиты формы
МассивУдаляемыхРеквизитов = Новый Массив;
Для каждого ЭлементСписка Из СписокУдаляемыхРеквизитов Цикл
МассивУдаляемыхРеквизитов.Добавить(ЭлементСписка.Значение);
КонецЦикла;
ИзменитьРеквизиты(,МассивУдаляемыхРеквизитов);
СписокУдаляемыхРеквизитов.Очистить();
СписокУдаляемыхЭлементов.Очистить();
КонецПроцедуры
15 — 02.08.16 — 15:45
Зачем его искать?
<УдаляемыеРеквизиты> (необязательный)
Тип: Массив.
Массив, содержащий строки, описывающие пути к удаляемым реквизитам.
Удалять можно только ранее программно добавленные реквизиты.
В массиве Строки с путями и все.
16 — 02.08.16 — 15:49
//добавить реквизит
ИмяРеквизита = «Тест»;
Путь = «»;
НовыйРек = Новый РеквизитФормы(ИмяРеквизита,Новый ОписаниеТипов(«Строка»,,Новый КвалификаторыСтроки(100)),Путь,ИмяРеквизита);
МассивРеквизитов = Новый Массив;
МассивРеквизитов.Добавить(НовыйРек);
ЭтаФорма.ИзменитьРеквизиты(МассивРеквизитов);
//удалить реквизит
МассивУдалить = Новый Массив;
МассивУдалить.Добавить(«Тест»);
ЭтаФорма.ИзменитьРеквизиты(,МассивУдалить);
Strimteam
17 — 02.08.16 — 16:12
(16) Спасибо
(15) Спасибо
(14) Спасибо
Так же оказалось полезной функция ЭтаФорма.ПолучитьРеквизиты() . Элементы при добавлении на форму, и работе с формой — нормально по поиску находятся. Если же было обращение к другой форме (у меня открывалась подчинённая форма), то при возврате к оригинальной форме — элементы на форме есть, но через Элементы их в общем списке нет. Зато через ЭтаФорма.ПолучитьРеквизиты() можно увидеть что был реквизит, а значит был и элемент формы.
Всем большое спасибо за решение.
x3on, откуда 1С знает где этот реквизит? Может он в какой-то из табличных частей сидит…
Вот и нужно указать путь до удаляемого реквизита в виде строки
1C | ||
|
x3on, и внимательнее читаем СП:
Синтаксис:
ИзменитьРеквизиты(<ДобавляемыеРеквизиты>, <УдаляемыеРеквизиты>)
<УдаляемыеРеквизиты> (необязательный)
Тип: Массив.
Массив, содержащий строки, описывающие пути к удаляемым реквизитам.
Удалять можно только ранее программно добавленные реквизиты.
Добавлено через 1 минуту
хотя если они верхнеуровневые, то и так должно работать
1C | ||
|
Например, есть на управляемой форме программно добавленные реквизиты и соответственно элементы формы (колонки). Программным методотом нужно эти реквизиты и элементы формы удалить.
УдаляемыеРеквизитыТЗ = Новый Массив; ТЗ = СтрокиРабочийТабель.Выгрузить(); // СтрокиРабочийТабель – это ТаблицаЗначений на форме УдаляемыеРеквизитыТЗ.Добавить(СтрокиРабочийТабель.Линия1); // добавляемв массив сначала реквизиты, который нужно удалить Элементы.Удалить(Элементы[Линия1]); // теперь добавляем в массив элементы формы, которые нужно удалить ЭтаФорма.ИзменитьРеквизиты(, УдаляемыеРеквизитыТЗ); // непосредственное удаление реквизитов с помощью метода управляемой формы
Persempre |
|
||
---|---|---|---|
Добрый день. В обработке я программно создаю реквизиты. С созданием все хорошо а вот с удаление не получается.
Суть обработки такая — вношу товары в табличную часть и жму кнопку ( обработчик ниже) когда первый раз нажимаешь все Ок, но пользователь не будет закрывать обработку каждый раз чтоб редактировать список, второй раз нажимаешь и всё — реквизиты то созданы. а как удалить я не в курсе. Подскажите пожалуйста. Заранее спасибо Код 1C v 8.2 УП
|
Yandex |
|
||
---|---|---|---|
E_Migachev |
|
||
---|---|---|---|
Нужно использовать ИзменитьРеквизиты(,Реквизиты);
где Реквизиты — это массив имеющихся реквизитов на форме Для Управляемого Приложения Код 1C v 8.2 УП
Для обычного Код 1C v 8.х
|
Persempre |
|
||
---|---|---|---|
|
Спасибо. Реализовал чуть иначе:
Код 1C v 8.2 УП
|
Подсказка: Щелкнув по значку (справа от названия вопроса), вы получите список ответов на похожие вопросы! |
В данной статье описаны примеры программного создания объектов управляемой формы 1С : элементов, команд, реквизитов, а также описание стандартных возможностей для работы с ними.
Contents
- 1 Введение в управляемая форма 1С реквизиты элементы команды
- 2 Программное переопределение обработчиков событий формы и элементов формы
- 3 Программное создание групп формы.
- 4 Программное добавление команды на форму.
- 5 Программное создание декораций форм.
- 6 Программное добавление реквизита на форму.
- 7 Вывод реквизитов на форму.
- 8 Вызов процедур при создании на сервере 1С
- 9 Некоторые советы при программном редактировании формы
- 10 Полезные ссылки
Рекомендуется модифицировать управляемые формы типового решения 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)
На чтение 4 мин Просмотров 6.9к. Опубликовано 27.12.2017
Платформа 1С:Предприятие позволяет программно добавлять и изменять элементы управляемой формы. Разберемся для чего это может потребоваться.
Программная модификация формы может потребоваться в нескольких случаях:
- При доработке типовых конфигураций для облегчения процедуры последующего обновления. В этом случае будет изменен только модуль формы. Модули намного проще обновлять, чем форму.
- При реализации некоторых общих алгоритмов. Например, в подсистеме БСП «Запрет редактирования реквизитов объектов» для всех подключенных к подсистеме объектов предусмотрено программное создание кнопки для включения возможности редактирования реквизитов.
- При реализации некоторых специфических алгоритмов. Например, в справочнике Номенклатура создаются поля для редактирования дополнительных реквизитов.
В управляемой форме можно программно добавить, изменить и удалить:
- реквизиты;
- локальные команды;
- элементы.
Все указанные операции возможны только на сервере.
Программное изменение формы имеет ограничения:
- Удалить можно только программно добавленные реквизиты/команды/элементы. Нельзя программно удалить объекты, созданные в конфигураторе.
- Нельзя назначить реквизит основным.
Содержание
- Изменение команд формы
- Изменение реквизитов формы
- Изменение элементов формы
Изменение команд формы
Для управления составом команд у объекта УправляемаяФорма есть коллекция Команды. У коллекции есть несколько методов:
-
Добавить(<ИмяКоманды>)
-
Количество()
-
Найти(<ИмяКоманды>)
-
Удалить(<Команда>)
Коллекция Команды доступна как на клиенте, так и на сервере. Изменять коллекцию (методы Добавить() и Удалить()) можно только на сервере. Искать и получать количество элементов (методы Найти() и Количество()) можно как на клиенте, так и на сервере.
В качестве примера работы с командами формы создадим новую команду ИсторияИзменений с заголовком «История изменений…», которая будет вызвать обработчик ОтобразитьИсторию(). Создание выполняется при открытии формы.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Команда = Команды.Добавить(«ИсторияИзменений»);
Команда.Действие = «Подключаемый_ОтобразитьИсторию»;
Команда.Заголовок = «История изменений…»;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОтобразитьИсторию(Команда)
// действия команды
КонецПроцедуры
Обработчик команды должен располагаться в форме и иметь директиву компиляции &НаКлиенте.
Изменение реквизитов формы
Чтение состава реквизитов формы выполняется функцией ПолучитьРеквизиты(<Путь>), возвращающей массив типа РеквизитФормы. Параметр функции указывает путь к родительскому реквизиту (в виде строки). Если параметр опущен или указана пустая строка, возвращаются реквизиты верхнего уровня.
Изменение реквизитов выполняется методом ИзменитьРеквизиты(<ДобавляемыеРеквизиты>, <УдаляемыеРеквизиты>) объекта УправляемаяФорма. В параметр ДобавляемыеРеквизиты передается массив с элементами типа РеквизитФормы. В параметр УдаляемыеРеквизиты передается массив строк, описывающих пути к удаляемым реквизитам.
Внимание!
Процесс изменения состава реквизитов является достаточно ресурсоемким. Фактически выполняется пересоздание формы. В связи с этим работа с реквизитами формы выполняется в пакетном режиме.
Создадим новый реквизит формы с именем Покупатель:
// Описание добавляемых реквизитов
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(«Покупатель», Новый ОписаниеТипов(«СправочникСсылка.Контрагенты»), , «Клиент»));// Изменения состава реквизитов
ИзменитьРеквизиты(ДобавляемыеРеквизиты);
Изменение элементов формы
Для управления составом элементов у объекта УправляемаяФорма есть коллекция Элементы. У коллекции есть несколько методов:
-
Вставить(<Имя>, <ТипЭлемента>, <Родитель>, <Элемент>)
-
Добавить(<Имя>, <ТипЭлемента>, <Родитель>)
-
Количество()
-
Найти(<Имя>)
-
Переместить(<Элемент>, <Родитель>, <МестоРасположения>)
-
Удалить(<Элемент>)
Коллекция Элементы доступна как на клиенте, так и на сервере. Изменять коллекцию (методы Вставить(), Добавить(), Переместить() и Удалить()) можно только на сервере. Искать и получать количество элементов (методы Найти() и Количество()) можно как на клиенте, так и на сервере. Элементами коллекции могут быть:
- ГруппаФормы;
- ТаблицаФормы;
- ПолеФормы;
- КнопкаФормы.
Элементам формы можно программно назначить обработчики событий. Для этих целей предназначен метод УстановитьДействие(<ИмяСобытия>, <Действие>).
Рассмотрим несколько наиболее распространенных на практике примеров работы с командами, реквизитами и элементами формы.
Добавление команды и связанной с ней кнопки:
// Создание команды
Команда = Команды.Добавить(«ИсторияИзменений»);
Команда.Действие = «Подключаемый_ОтобразитьИсторию»; // В форме должна быть процедура с указанным наименованием
Команда.Заголовок = «История изменений…»;
// Создание кнопки и связь ее с командой
Элемент = Элементы.Добавить(«ИсторияИзменений», Тип(«КнопкаФормы»));
Элемент.ИмяКоманды = «ИсторияИзменений»;
Добавление реквизита и связанного с ним поля ввода:
// Описание добавляемых реквизитов
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(«Покупатель», Новый ОписаниеТипов(«СправочникСсылка.Контрагенты»), , «Клиент»));
// Изменение состава реквизитов
ИзменитьРеквизиты(ДобавляемыеРеквизиты);
// Создание поля ввода и связь с реквизитом
Элемент = Элементы.Добавить(«Покупатель», Тип(«ПолеФормы»));
Элемент.Вид = ВидПоляФормы.ПолеВвода;
Элемент.ПутьКДанным = «Покупатель»;
Назначение элементу формы обработчика события:
ЭлементПокупатель.УстановитьДействие(«ПриИзменении», «Подключаемый_ПокупательПриИзменении»);
&НаКлиенте
Процедура Подключаемый_ПокупательПриИзменении(Элемент)
// Действия события
КонецПроцедуры
Внимание!
Процедурам, которые устанавливаются в качестве обработчиков событий из кода с помощью метода УстановитьДействие(), рекомендуется задавать префикс Подключаемый_.
Внимание!
Скачать обработку с примерами программного поиска и изменения реквизитов, команд и элементов управляемой формы можно ЗДЕСЬ.