Как вывести реквизит на форму 1с программно

Программное добавление элементов на формы является очень удобным подходом при доработке типовых конфигураций. Это позволяет минимизировать коллизии и ошибки при объединении форм, использовать при обновлениях трехсторнонее сравнение кода при помощи внешних программ, например KDiff3, переиспользовать однажды написанный код в других доработках.

Содержание

В качестве примера будем использовать пустую обработку, в которой есть реквизит НашНужныйРеквизит. Все манипуляции по добавлению, удалению элементов и реквизитов формы производятся на сервере, и можно использовать как предопределенные обработчики, например &ПриСозданииНаСервере, так и любые другие методы с директивой &НаСервере. В нашем примере будем все элементы добавлять при помощи отдельных команд, для большей наглядности.

Как в 1С программно добавить элемент формы?

Вывести существующий реквизит

&НаСервере
Процедура ДобавитьПолеВводаНаСервере()	
	// Проверка нужна, чтобы избежать ошибки при попытке создания элемента с одним и тем же именем несколько раз
	Если Элементы.Найти("НашНужныйЭлемент") = Неопределено Тогда
		// Вначале просто добавляем элемент в коллекцию Элементы
		НовыйЭлемент = Элементы.Добавить("НашНужныйЭлемент", Тип("ПолеФормы"));		
		//Затем донастраиваем его и указываем нужные свойства
		НовыйЭлемент.ПутьКДанным = "Объект.НашНужныйРеквизит";
		НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
		НовыйЭлемент.Заголовок = "Программно добавленное поле ввода";
	КонецЕсли;	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьПолеВвода(Команда)
	ДобавитьПолеВводаНаСервере();
КонецПроцедуры

Создать новый реквизит формы

&НаСервере
Процедура ДобавитьРеквизитФлажокНаСервере()
	
	Если Элементы.Найти("НужныйФлажок") = Неопределено Тогда
		НовыеРеквизиты = Новый Массив;
		//Обратите внимание, типизация реквизитов использует именно Описание типов, а не отдельный тип.
		ТипРеквизита = Новый ОписаниеТипов("Булево");
		РеквизитФлажок = Новый РеквизитФормы("НужныйФлажок", ТипРеквизита, "", "Нужный флажок");
		НовыеРеквизиты.Добавить(РеквизитФлажок);		
		ИзменитьРеквизиты(НовыеРеквизиты);		
		НовыйЭлемент = Элементы.Добавить("НужныйФлажок", Тип("ПолеФормы"));
		НовыйЭлемент.ПутьКДанным = "НужныйФлажок";
		НовыйЭлемент.Вид = ВидПоляФормы.ПолеФлажка;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРеквизитФлажок(Команда)
	ДобавитьРеквизитФлажокНаСервере();
КонецПроцедуры

Вставить элемент формы в нужное место

&НаСервере
Процедура ВставитьКартинкуПередФлажкомНаСервере()
	Если Элементы.Найти("ВставленнаяКартинка") = Неопределено Тогда
		СледующийЭлемент = Элементы.Найти("НужныйФлажок");
		// Если флажок найден - вставим элемент перед ним, если нет - добавим в конец
		// Заодно рассмотрим как добавить программно декорацию-картинку на форму
		ЭлементКартинка = Элементы.Вставить("ВставленнаяКартинка", Тип("ДекорацияФормы"),,СледующийЭлемент);
		ЭлементКартинка.Вид = ВидДекорацииФормы.Картинка;
		// Обратите внимание, картинка в этом случае может быть либо Пустая, либо ИзБиблиотеки
		ЭлементКартинка.Картинка = БиблиотекаКартинок.Реквизит;
	КонецЕсли;	
КонецПроцедуры

&НаКлиенте
Процедура ВставитьКартинкуПередФлажком(Команда)
	ВставитьКартинкуПередФлажкомНаСервере();
КонецПроцедуры

Как программно добавить команду в управляемую форму?

&НаСервере
Процедура ДобавитьПрограммноКомандуНаСервере()
	Если Элементы.Найти("КнопкаПредупредить") = Неопределено Тогда
		//Добавим команду в коллекцию команд
		КомандаПредупредить = Команды.Добавить("Предупредить");
		КомандаПредупредить.Заголовок = "Предупредить!";
		КомандаПредупредить.Действие = "КомандаПредупредить";
		
		КнопкаКоманды = Элементы.Добавить("КнопкаПредупредить", Тип("КнопкаФормы"));
		КнопкаКоманды.ИмяКоманды = "Предупредить";
		// Если помещаем просто на форму, то вид - обычная кнопка
		// Если укажем контейнер с типом Командная панель, то вид - КнопкаКоманднойПанели
		КнопкаКоманды.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьПрограммноКоманду(Команда)
	ДобавитьПрограммноКомандуНаСервере();
КонецПроцедуры

&НаКлиенте
Процедура КомандаПредупредить(Команда)
	ПоказатьПредупреждение(, "А ведь я предупреждал!");
КонецПроцедуры

Как добавить таблицу на форму программно?

На программном добавлении таблицы на форму стоит остановиться отдельно. Порядок действий следующий:
Сперва создаем основной реквизит – саму таблицу формы. Далее – создаем подчиненные реквизиты-колонки. В простейшем случае колонки можно создать, перебрав колонки таблицы значений – источника. Далее следует создать связанные с только что созданными реквизитами элементы формы – также сперва основной элемент – таблицу, а затем подчиненные элементы – колонки.

&НаСервере
Процедура СоздатьТаблицуЗначенийНаСервере()
	
	Если Элементы.Найти("ДинамическаяТаблицаЭлемент") <> Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	НовыеРеквизиты = Новый Массив;
	
	ТипРеквизита = Новый ОписаниеТипов("ТаблицаЗначений");
	РеквизитТЗ = Новый РеквизитФормы("ДинамическаяТаблица", ТипРеквизита, "", "Динамическая таблица");
	
	НовыеРеквизиты.Добавить(РеквизитТЗ);
	
	ТЗ = Новый ТаблицаЗначений;
	ТЗ.Колонки.Добавить("Отметка", Новый ОписаниеТипов("Булево"));
	ТЗ.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"));
	ТЗ.Колонки.Добавить("Комментарий", Новый ОписаниеТипов("Строка"));
	
	Для Каждого КолонкаТаблицы Из ТЗ.Колонки Цикл
		НовыеРеквизиты.Добавить(Новый РеквизитФормы(КолонкаТаблицы.Имя, КолонкаТаблицы.ТипЗначения, "ДинамическаяТаблица"));
	КонецЦикла;	
	ИзменитьРеквизиты(НовыеРеквизиты);
	
	ЭлементТаблица = Элементы.Добавить("ДинамическаяТаблицаЭлемент", Тип("ТаблицаФормы"));
	ЭлементТаблица.ПутьКДанным = "ДинамическаяТаблица";
	ЭлементТаблица.Отображение = ОтображениеТаблицы.Список;
	
	Для Каждого КолонкаТаблицы Из ТЗ.Колонки Цикл
		ЭлементКолонкаТаблицы = Элементы.Добавить(КолонкаТаблицы.Имя, Тип("ПолеФормы"), ЭлементТаблица);
		Если КолонкаТаблицы.ТипЗначения.СодержитТип(Тип("Булево")) Тогда
			ЭлементКолонкаТаблицы.Вид = ВидПоляФормы.ПолеФлажка;
		Иначе
			ЭлементКолонкаТаблицы.Вид = ВидПоляФормы.ПолеВвода;
		КонецЕсли;
		ЭлементКолонкаТаблицы.ПутьКДанным = "ДинамическаяТаблица." + КолонкаТаблицы.Имя;
	КонецЦикла;	

КонецПроцедуры

&НаКлиенте
Процедура СоздатьТаблицуЗначений(Команда)
	СоздатьТаблицуЗначенийНаСервере();
КонецПроцедуры

Как программно установить обработчик события элемента формы?

&НаСервере
Процедура ДобавитьОбработчикДействияНаСервере()
	// Если таблицу еще не создали, ничего не делаем
	Если Элементы.Найти("ДинамическаяТаблицаЭлемент") = Неопределено Тогда
		Возврат;
	КонецЕсли;	
	Элементы.ДинамическаяТаблицаЭлемент.УстановитьДействие("ПриИзменении", "ПриИзмененииТаблицы");	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьОбработчикДействия(Команда)
	ДобавитьОбработчикДействияНаСервере();
КонецПроцедуры

// Количество и порядок параметров метода-обработчика должны соответствовать событию
// Подробнее см. синтакс-помощник
&НаКлиенте
Процедура ПриИзмененииТаблицы(Элемент)
	Сообщить("Изменили колонку " + Элемент.ТекущийЭлемент.Имя); 	
КонецПроцедуры

Чтобы вывести реквизиты на форму программно нужно в обработчике «ПриСозданииНаСервере» в форме выполнить следующий алгоритм:

Реквизит должен находится в метаданных.

Листинг кода:


Поле = Элементы.Добавить(«ТестовыйРеквизит», Тип(«ПолеФормы»), Элементы.ГруппаРеквизиты);
//»ТестовыйРеквизит» — Название реквизита (Метаданные)
//Тип(«ПолеФормы») — тип добавляемого объекта
//Элементы.ГруппаРеквизиты — группа куда добавляем наш реквизит
Поле.ПутьКДанным = «Объект.ТестовыйРеквизит»;//Обязательно надо указывать путь к данным, иначе поле не отобразится на форме
Поле.Вид = ВидПоляФормы.ПолеВвода; //Указываем что это поле ввода
//Все свойства созданного элемента «Поле» можно глянуть при отладке, там все как в свойствах

Чтобы вставить нужный нам реквизит перед каким либо уже существующим реквизитом нужно использовать параметр «Вставить()» . Четвертым параметром этого метода и будет являть тот реквизит перед которым мы будем вставлять наш реквизит.

Поле = Элементы.Вставить(«ТестовыйРеквизит», Тип(«ПолеФормы»),Элементы.ГруппаРеквизиты,Элементы.СтранаПроисхождения);
//Элементы.СтранаПроисхождения — реквизит перед которым вставляем
Поле.ПутьКДанным = «Объект.ТестовыйРеквизит»;
Поле.Вид = ВидПоляФормы.ПолеВвода; 

Программное добавление поля ввода на форму:

Листинг:

//Программное создание реквизита на форме
Массив = Новый Массив;
Массив.Добавить(Новый РеквизитФормы(«Статус», Новый ОписаниеТипов(«Строка»)));
ИзменитьРеквизиты(Массив);  //Изменяем массив содержащий реквизиты формы

//Теперь добавим созданный нам реквизит на форму уже изученным способом программно
Поле = Элементы.Вставить(«Статус», Тип(«ПолеФормы»),Элементы.ГруппаРеквизиты,Элементы.СтранаПроисхождения);
Поле.ПутьКДанным = «Статус»;
Поле.Вид = ВидПоляФормы.ПолеВвода;

Чтобы подключить событие к созданному полю нужно создать процедуру и подключить ее к полю:

*Процедура команды обязательно должна выполняться в директиве компиляции «&НаКлиенте»

Добавление команды на форму программно: 

НашаКоманда = Команды.Добавить(«НашаКоманда»);
НашаКоманда.Действие = «НашаКомандаПроцедура»;  //Указываем имя процедуры на клиенте 
//которую будет вызывать команда
Кнопка = Элементы.Вставить(«НашаКоманда», Тип(«КнопкаФормы»));
Кнопка.ИмяКоманды = «НашаКоманда»;
Кнопка.Вид = ВидКнопкиФормы.ОбычнаяКнопка;

Посмотрим, как можно программно добавить реквизиты и новые элементы на форму. В форме элемента справочника «Номенклатура» создадим два реквизита формы и элементы для них. Новые элементы объединим в группу с горизонтальной группировкой.

Сейчас форма имеет следующий вид:

После добавления новых элементов она будет иметь вид:

Итак, добавляем реквизиты:

  • ЕдиницаИзмерения, тип СправочникСсылка.ЕдиницыИзмерения;
  • ТекущийОстаток, тип Число.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    #Область ДобавлениеРеквизитовФормы

    // Массив для новых реквизитов
    ДобавляемыеРеквизиты = Новый Массив();

    // Описываем новые ревизиты формы
    РеквизитЕдиницаИзмерения = Новый РеквизитФормы(
        "ЕдиницаИзмерения",
        Новый ОписаниеТипов("СправочникСсылка.ЕдиницыИзмерения"),
        ,
        "Единица измерения"
    );
    РеквизитТекущийОстаток = Новый РеквизитФормы(
        "ТекущийОстаток",
        Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(10, 3)),
        ,
        "Текущий остаток"
    );

    // Заполняем массив новых реквизитов
    ДобавляемыеРеквизиты.Добавить(РеквизитЕдиницаИзмерения);
    ДобавляемыеРеквизиты.Добавить(РеквизитТекущийОстаток);

    // Добавляем новые реквизиты в форму
    ИзменитьРеквизиты(ДобавляемыеРеквизиты);

    #КонецОбласти

    #Область ДобавлениеЭлементовФормы

    // Добавляем группу без отображения на форме
    НоваяГруппаФормы = Элементы.Добавить(
        "ЕдиницаИзмеренияОстаток",
        Тип("ГруппаФормы")
    );
    НоваяГруппаФормы.Вид                 = ВидГруппыФормы.ОбычнаяГруппа;
    НоваяГруппаФормы.Отображение         = ОтображениеОбычнойГруппы.Нет;
    НоваяГруппаФормы.ОтображатьЗаголовок = Ложь;
    НоваяГруппаФормы.Группировка         = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная;

    // Добавляем элементы внутрь новой группы
    НовыйЭлемент = Элементы.Добавить(
        "ЯчейкаХранения",
        Тип("ПолеФормы"),
        НоваяГруппаФормы
    );
    НовыйЭлемент.ПутьКДанным    = "ЕдиницаИзмерения";
    НовыйЭлемент.Вид            = ВидПоляФормы.ПолеВвода;
    НовыйЭлемент.ТолькоПросмотр = Истина;

    НовыйЭлемент = Элементы.Добавить(
        "ТекущийОстаток",
        Тип("ПолеФормы"),
        НоваяГруппаФормы
    );
    НовыйЭлемент.ПутьКДанным    = "ТекущийОстаток";
    НовыйЭлемент.Вид            = ВидПоляФормы.ПолеВвода;
    НовыйЭлемент.ТолькоПросмотр = Истина;

    #КонецОбласти

    #Область ЗаполнениеДанных

    // Имитируем заполнение данных
    ЭтаФорма.ЕдиницаИзмерения = ПредопределенноеЗначение(
        "Справочник.ЕдиницыИзмерения.Штука"
    );
    ЭтаФорма.ТекущийОстаток = 12;

    #КонецОбласти

КонецПроцедуры

Для удаления необходимо передать массив реквизитов на удаление в качестве второго параметра метода формы ИзменитьРеквизиты(). Удалять можно только реквизиты, созданные программно.

Теперь посмотрим, как можно изменить основной реквизит формы. Изменим табличную часть Состав документа РасходнаяНакладная:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    // Массив для новых реквизитов
    ДобавляемыеРеквизиты = Новый Массив();

    // Описываем новый ревизит формы
    РеквизитЕдиницаИзмерения = Новый РеквизитФормы(
        "ЕдиницаИзмерения",
        Новый ОписаниеТипов("СправочникСсылка.ЕдиницыИзмерения"),
        "Объект.Состав",
        "Единица измерения"
    );

    // Заполняем массив новых реквизитов
    ДобавляемыеРеквизиты.Добавить(РеквизитЕдиницаИзмерения);

    // Добавляем новый реквизит в форму
    ИзменитьРеквизиты(ДобавляемыеРеквизиты);

    // Добавляем элемент формы для нового реквизита
    НовыйЭлемент = Элементы.Добавить(
        "ЕдиницаИзмерения",
        Тип("ПолеФормы"),
        Элементы.Состав
    );
    НовыйЭлемент.ПутьКДанным = "Объект.Состав.ЕдиницаИзмерения";
    НовыйЭлемент.Вид         = ВидПоляФормы.ПолеВвода;

КонецПроцедуры

Важно понимать, что данные добавленного реквизита сохраняться в ИБ не будут.

Поиск:
1С:Предприятие • Изменить реквизиты • При создании на сервере • Реквизит • Управляемая форма • Элемент формы

Содержание:

  1. Добавляем реквизит
  2. Добавление кнопки
  3. Добавление группы
  4. Добавляем табличную часть 1С

В связи с развитием системы расширений многие разработчики 1С сталкиваются с проблемой: если форма захвачена и на ней произведены изменения, то после обновления в основной конфигурации формы, эти изменения не будут отражены на захваченной форме. Получается, что форму после обновления надо каждый раз проверять. Это трудно и «убивает» все плюсы расширения. Но из любой непростой ситуации есть выход, если знать, где его искать. Можно захватить форму в расширение и не изменять её, а все новые реквизиты добавить программно. Тогда при обновлении формы в основной конфигурации 1С 8.3, форма измениться в расширении, и добавленные реквизиты будут корректно отображаться в ней.

В этой статье я постараюсь собрать все основные методы создания реквизитов на форме. 

1.     Добавляем реквизит

Начнем с самого простого. Мы добавили реквизит «МоеРасширение_НаименованиеНаАнглийском» в справочник контрагентов.

                Для того, чтобы вывести его на форму програмно, пишем код процедуры «МоеРасширение_ПриСозданииНаСервереПосле» (Отказ, Стандартная Обработка).

                НовыйЭлемент = Элементы.Добавить («МоеРасширение_НаименованиеНаАнглийском», Тип(«ПолеФормы»));

                НовыйЭлемент.ПутьКДанным                = «Объект. МоеРасширение_НаименованиеНаАнглийском»;

                НовыйЭлемент.Вид                                     = ВидПоляФормы.ПолеВвода;

                НовыйЭлемент.ТолькоПросмотр         = Ложь;

                НовыйЭлемент.Видимость                      = Истина;

                НовыйЭлемент.Доступность                  = Истина.

Теперь мы добавим на форму реквизит, которого нет в конфигурации. Например, выведем на форму текущую задолженность: реквизит «МоеРасширение_ТекущаяЗадолженность».

Сначала создадим реквизит:

                ДобавляемыеРеквизиты           = Новый Массив;

                НовыйРеквизит = Новый РеквизитФормы(«МоеРасширение_ТекущаяЗадолженность»),      Новый ОписаниеТипов («Число», «Текущая задолженность»);

                ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);

                ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты).

Затем выведем его на форму таким же образом, как и добавленный в конфигурацию реквизит, разница только в поле «ПутьКДанным» – здесь мы пишем наименование только что созданного реквизита:

                НовыйЭлемент = Элементы.Добавить(«МоеРасширение_НаименованиеНаАнглийском», Тип(«ПолеФормы»));

                НовыйЭлемент.ПутьКДанным                = «МоеРасширение_ТекущаяЗадолженность»;

                НовыйЭлемент.Вид                                     = ВидПоляФормы.ПолеВвода;

                НовыйЭлемент.ТолькоПросмотр         = Истина;

                НовыйЭлемент.Видимость                      = Истина;

                НовыйЭлемент.Доступность                  = Истина.

Теперь переместим наши реквизиты под поле «Полное наименование». Для этого надо определить на форме место добавления, в нашем случаем – над группой «ГруппаКолонки»:

Элементы.Переместить(Элементы.МоеРасширение_НаименованиеНаАнглийском,Элементы.ГруппаКолонки.Родитель,Элементы.ГруппаКолонки);

Элементы.Переместить(Элементы.МоеРасширение_ТекущаяЗадолженность,Элементы.ГруппаКолонки.Родитель,Элементы.ГруппаКолонки).

Получаем результат:

Для того, чтобы отрабатывались процедуры событий для этих реквизитов, можем указать действия:

                Элементы. МоеРасширение_ТекущаяЗадолженность.УстановитьДействие(«ПриИзменении», «МоеРасширение_РасшифроватьЗадолженность»). 

2.     Добавление кнопки

Для того, чтобы произвести добавление кнопки на форму, сначала надо програмно добавить команду.

                НоваяКоманда = Команды.Добавить(«МоеРасширение_ПоказатьОСВ»);

                НоваяКоманда.Действие = «МоеРасширение_ПоказатьОСВ»;

                НоваяКоманда.Заголовок = «Показать ОСВ».

ВАЖНО!! В поле действие пишется имя процедуры.

Теперь добавляем саму кнопку:

                НоваяКнопка = Элементы.Добавить(«МоеРасширение_Кнопка_ПоказатьОСВ», Тип(«КнопкаФормы»));

                НоваяКнопка.ИмяКоманды = «МоеРасширение_ПоказатьОСВ». 

3.     Добавление группы

Для добавления группы переместим кнопку к полю «Текущая задолженность». На этом этапе нам надо создать группу и переместить в нее уже созданные наши элементы.

Создаем группу и помещаем ее под наименованием. Затем переносим в нее реквизит «Текущая задолженность» и кнопку «Показать ОСВ»:

                НоваяГруппа =Элементы.Добавить(«МоеРасширение_ГруппаЗадолженность», Тип(«ГруппаФормы»));

                НоваяГруппа.Вид = ВидГруппыФормы.ОбычнаяГруппа;

                НоваяГруппа.Заголовок = «»;

                НоваяГруппа.ОтображатьЗаголовок = Ложь;

                НоваяГруппа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;

                Элементы.Переместить(НоваяГруппа,Элементы.ГруппаКолонки.Родитель,Элементы.ГруппаКолонки);

                Элементы.Переместить(Элементы.МоеРасширение_ТекущаяЗадолженность,НоваяГруппа);

                Элементы.Переместить(Элементы.МоеРасширение_Кнопка_ПоказатьОСВ,НоваяГруппа). 

4.     Добавляем табличную часть 1С

Добавим к контрагенту табличную часть 1С «МоеРасширение_Номенклатура» с реквизитом «Номенклатура» и выведем ее на форму.

Сначала мы добавляем табличную часть на форму, после чего описываем все колонки, которые должны отображаться на форме.

ВАЖНО! При создании реквизитов таблицы родителем указывается реквизит формы «Табличная часть».

                НоваяТабличнаяЧасть = Элементы.Добавить(«МоеРасширение_ТаблицаНоменклатура», Тип(«ТаблицаФормы»));

                НоваяТабличнаяЧасть.ПутьКДанным = «Объект.МоеРасширение_Номенклатура»;

                НовыйРеквизитТабличнойЧасти = Элементы.Добавить(«МоеРасширение_Номенклатура», Тип(«ПолеФормы»),НоваяТабличнаяЧасть);

                НовыйРеквизитТабличнойЧасти.Заголовок = «Номенклатура»;

                НовыйРеквизитТабличнойЧасти.Вид = ВидПоляФормы.ПолеВвода;

                НовыйРеквизитТабличнойЧасти.ПутьКДанным = «Объект.МоеРасширение_Номенклатура.Номенклатура».

 

Используя этот базовый набор, можно изменить любую форму программно. И при обновлениях форма всегда будет подстраиваться под выбранный алгоритм. Если форма поменяется глобально, то расширение выдаст ошибку. Тогда, переписав несколько строчек кода, мы снова получим рабочую форму. Это быстрее и проще, чем каждый раз анализировать диалоговую форму.

Специалист компании «Кодерлайн» 

Максим Федоров

При разработке решений возникает необходимость добавить реквизит формы, состав и типы которых зависят от данных. Например при построении динамических деревьев с периодами, или при выводе контактной информации и т.д.

Содержание

  1. Задача
  2. Добавление реквизитов
  3. Удаление реквизитов
  4. Добавление реквизита табличной части
  5. Добавление реквизита с типом Произвольный

1С. Программное добавление и удаление реквизитов формы

Задача

Для наглядности разберем простой пример, в котором можно было обойтись только элементами формы, но мы создадим и реквизиты.

Есть некая конфигурация, в форме элемента справочника Номенклатура необходимо программно создавать реквизиты формы и элементы к ним:

  • ЯчейкаХранения, тип СправочникСсылка.ЯчейкиХранения;
  • ТекущийОстаток, тип Число.

Элементы объединить в группу с горизонтальной группировкой. На текущий момент форма имеет следующий вид:

добавить реквизит формы

Добавление реквизитов

В обработчике формы ПриСозданииНаСервере() опишем код, который разбивается на 3 этапа:

  1. Описание и создание реквизитов формы;
  2. Создание элементов формы, объединение в группу без отображения;
  3. Заполнение данных.

Ниже приведен готовый код, код снабжен комментариями и разбит на области для лучшего понимания

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
    #Область ДобавлениеРеквизитовФормы
	
    // Массив для новых реквизитов
    ДобавляемыеРеквизиты	= Новый Массив;
		
    // Опишем ревизиты формы
    Реквизит_ЯчейкаХранения = Новый РеквизитФормы("ЯчейкаХранения",	Новый ОписаниеТипов("СправочникСсылка.ЯчейкиХранения"),	, "Ячейка");
    Реквизит_ТекущийОстаток = Новый РеквизитФормы("ТекущийОстаток",	Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(10, 3)), , "Остаток");
	
    // Для наглядности заполним массив после описания реквизитов формы
    ДобавляемыеРеквизиты.Добавить(Реквизит_ЯчейкаХранения);
    ДобавляемыеРеквизиты.Добавить(Реквизит_ТекущийОстаток);
	
    // Добавим новые реквизиты в форму
    ИзменитьРеквизиты(ДобавляемыеРеквизиты);
	
    #КонецОбласти
	
    #Область ДобавлениеЭлементовФормы
	
    // Горизонтальная группа без отображения на форме
    ГруппаФормы = Элементы.Добавить("Группа_СправочныеДанные", Тип("ГруппаФормы"));
    ГруппаФормы.Вид                        = ВидГруппыФормы.ОбычнаяГруппа;
    ГруппаФормы.Отображение                = ОтображениеОбычнойГруппы.Нет;
    ГруппаФормы.ОтображатьЗаголовок        = Ложь;
    ГруппаФормы.Группировка                = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная;
	
    // Элементы
	
    НовыйЭлемент = Элементы.Добавить("ЯчейкаХранения", Тип("ПолеФормы"), ГруппаФормы);
    НовыйЭлемент.ПутьКДанным                  = "ЯчейкаХранения";
    НовыйЭлемент.Вид                          = ВидПоляФормы.ПолеВвода;
    НовыйЭлемент.ТолькоПросмотр               = Истина;
	
    НовыйЭлемент = Элементы.Добавить("ТекущийОстаток", Тип("ПолеФормы"), ГруппаФормы);
    НовыйЭлемент.ПутьКДанным                  = "ТекущийОстаток";
    НовыйЭлемент.Вид                          = ВидПоляФормы.ПолеВвода;
    НовыйЭлемент.ТолькоПросмотр               = Истина;
	
    #КонецОбласти
	
    #Область ЗаполнениеДанных
	
    //  Имитируем заполнение данных
    ЭтаФорма.ЯчейкаХранения = ПредопределенноеЗначение("Справочник.ЯчейкиХранения.Распаковка");
    ЭтаФорма.ТекущийОстаток = 12;
	
    #КонецОбласти
	
КонецПроцедуры

После выполнения приведенного кода форма будет выглядеть так:

реквизит программно

Удаление реквизитов

Для удаления необходимо передать массив содержащий пути реквизитов в качестве второго параметра метода формы ИзменитьРеквизиты().

    #Область УдалениеРеквизитовФормы
	
    // Массив удаляемых реквизитов
    УдаляемыеРеквизиты = Новый Массив;
    УдаляемыеРеквизиты.Добавить("ЯчейкаХранения");
    УдаляемыеРеквизиты.Добавить("ТекущийОстаток");
	
    // Удалим реквизиты формы
    ИзменитьРеквизиты( , УдаляемыеРеквизиты);
	
    #КонецОбласти

Внимание!!! Удалять можно только реквизиты созданные программно.

Добавление реквизита табличной части

Добавление реквизита и элемента формы для табличной части почти ничем не отличается, необходимо только указать путь «Объект.<ИмяТабличнойЧасти>». Ниже пример добавления реквизита Ячейка в ТЧ Комплектация.

    #Область ДобавлениеРеквизитаТЧ
	
    // Массив для новых реквизитов
    ДобавляемыеРеквизиты = Новый Массив;
	
    // Опишем ревизиты формы
    Реквизит_Ячейка = Новый РеквизитФормы("Ячейка",	Новый ОписаниеТипов("СправочникСсылка.ЯчейкиХранения"),	"Объект.Комплектация", "Ячейка");
	
    // Для наглядности заполним массив после описания реквизитов формы
    ДобавляемыеРеквизиты.Добавить(Реквизит_Ячейка);
	
    // Добавим новые реквизиты в форму
    ИзменитьРеквизиты(ДобавляемыеРеквизиты);
	
    НовыйЭлемент = Элементы.Добавить("КомплектацияЯчейка", Тип("ПолеФормы"), Элементы.Комплектация);
    НовыйЭлемент.ПутьКДанным    = "Объект.Комплектация.Ячейка";
    НовыйЭлемент.Вид            = ВидПоляФормы.ПолеВвода;
	
    #КонецОбласти

Добавление реквизита с типом Произвольный

В одной из задач стало необходимо добавить реквизит с типом Произвольный, но ни СП, ни интернеты ответа не дали. В итоге через несколько попыток было найдено решение

ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Реквизит", Новый ОписаниеТипов("")));

Внимание!!! Данные добавленного реквизита сохраняться в ИБ не будут.

В данной статье описаны примеры программного создания объектов управляемой формы 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)

Файлы материала
Описание

Новый реквизит на форму, можно добавить программно через расширение, при этом не забирать саму форму в расширение (это удобно тем, что последующие обновления внешнего вида формы не смогут сломать наше расширение). В типовых конфигурациях, данный способ можно реализовывать в процедуре “ПриСозданииНаСервере” общего модуля “УправлениеСвойствами” .

Программное добавление реквизита на форму

Для примера, стоит задача в конфигурации ЗУП 3.1 добавить реквизит «Способ отражения зарплаты в БУ» для позиции штатного расписания в группе “Дополнительные данные”.

Способ отражение в позиции штатного расписания

Создадим расширение и выполним следующую последовательность действий:

  1. Добавим в расширение справочник “Штатное расписание” и создадим реквизит “АВ_СпособОтражения” с типом данных “СправочникСсылка.СпособыОтраженияЗарплатыВБухУчете”

добавление реквизита АВ_СпособОтражения в расширение

2. Заберем в расширение процедуру “ПриСозданииНаСервере” из общего модуля “УправлениеСвойствами”, программно добавим поле в форму и свяжем его с реквизитом объекта добавленного на первом шаге.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

&После(«ПриСозданииНаСервере»)

Процедура АВ_ПриСозданииНаСервере(Форма, ДополнительныеПараметры)

Если Форма.ИмяФормы = «Справочник.ШтатноеРасписание.Форма.ФормаЭлемента» Тогда

#Область ДобавлениеЭлементовФормы

ИмяГруппы = «ГруппаДополнительныеРеквизиты»;

ГруппаФормы = Форма.Элементы.Найти(ИмяГруппы);

Если ГруппаФормы <> Неопределено Тогда

ИмяЭлемента = «АВ_СпособОтражения»;

Если Форма.Элементы.Найти(ИмяЭлемента) = Неопределено Тогда

ЭлементФормы = Форма.Элементы.Добавить(ИмяЭлемента, Тип(«ПолеФормы»), ГруппаФормы);

//Вместо Добавить() можно использовать метод Вставить()

//в 4-й параметре указывается Элемент перед которым должен быть вставлен новый элемент.

//ЭлементФормы = Форма.Элементы.Вставить(ИмяЭлемента, Тип(«ПолеФормы»), ГруппаФормы, Форма.Элементы.Найти(«ИмяСледующегоЭлементаФормы»));

ЭлементФормы.Вид = ВидПоляФормы.ПолеВвода;

ЭлементФормы.ПутьКДанным = «Объект.АВ_СпособОтражения»;

//ЭлементФормы.МногострочныйРежим = Истина;

//ЭлементФормы.Высота = 3;

КонецЕсли;

КонецЕсли;

#КонецОбласти

КонецЕсли;

КонецПроцедуры

Образец расширения для скачивания в начале описания.

Программное добавление реквизита в табличную часть формы

Например, таким же способом, добавим в табличную часть “Рабочие места” реквизит “Спецжиры” с типом “Булево”.

Результат спецоценки условий труда с  колонкой спецжиры

Добавление реквизита в табличную часть

&После(«ПриСозданииНаСервере»)

Процедура АВ_ПриСозданииНаСервере(Форма, ДополнительныеПараметры)

Если Форма.ИмяФормы = «Документ.РезультатыСпецоценкиУсловийТруда.Форма.ФормаДокумента» Тогда

#Область ДобавлениеЭлементовФормы

ИмяЭлемента = «АВ_ЕстьСпецжиры»;

Если Форма.Элементы.Найти(ИмяЭлемента) = Неопределено Тогда

ЭлементФормы = Форма.Элементы.Добавить(«Спецжиры», Тип(«ПолеФормы»), Форма.Элементы.РабочиеМеста);        

ЭлементФормы.Вид = ВидПоляФормы.ПолеФлажка;

ЭлементФормы.ПутьКДанным = «Объект.РабочиеМеста.АВ_ЕстьСпецжиры»;

//ЭлементФормы.ТолькоПросмотр = Истина;

КонецЕсли;

#КонецОбласти

КонецЕсли;

КонецПроцедуры

В результате получим табличную часть с новой колонкой.

Программное добавление табличной части на форму

Аналогично добавим табличную часть “АВ_ВредныеФакторы” на форму справочника “Профессии”.

Табличная часть добавленная через расширение

Добавление табличной части на форму

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

&После(«ПриСозданииНаСервере»)

Процедура АВ_ПриСозданииНаСервере(Форма, ДополнительныеПараметры)

Если Форма.ИмяФормы = «Справочник.ПрофессииРабочих.Форма.ФормаЭлемента» Тогда

#Область ДобавлениеЭлементовФормы

ИмяГруппы = «ГруппаДополнительныеРеквизиты»;

ГруппаФормы = Форма.Элементы.Найти(ИмяГруппы);

Если ГруппаФормы <> Неопределено Тогда

ИмяЭлемента = «АВ_ВредныеФакторы»;

Если Форма.Элементы.Найти(ИмяЭлемента) = Неопределено Тогда   

ЭлементФормыТаблица = Форма.Элементы.Добавить(ИмяЭлемента, Тип(«ТаблицаФормы»), ГруппаФормы);  

ЭлементФормыТаблица.ПутьКДанным = «Объект.АВ_ВредныеФакторы»;

ЭлементФормы = Форма.Элементы.Добавить(«ВредныйФактор», Тип(«ПолеФормы»), ЭлементФормыТаблица);

ЭлементФормы.Вид = ВидПоляФормы.ПолеВвода;

ЭлементФормы.ПутьКДанным = «Объект.АВ_ВредныеФакторы.ВредныйФактор»;    

КонецЕсли;

КонецЕсли;

#КонецОбласти

КонецЕсли;

КонецПроцедуры

Связь реквизитов формы с элементами формы

Кроме того, реквизиты формы можно создавать программно и связывать их с элементами формы

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

#Область ДобавлениеРеквизитовФормы

// Массив для новых реквизитов

ДобавляемыеРеквизиты = Новый Массив;

// Опишем ревизиты формы

Реквизит_РабочееМесто = Новый РеквизитФормы(«АВ_РабочееМесто», Новый ОписаниеТипов(«СправочникСсылка.РабочиеМестаОхраныТруда»), , «Рабочее место»);

// Заполним массив после описания реквизитов формы

ДобавляемыеРеквизиты.Добавить(Реквизит_РабочееМесто);

// Добавим новые реквизиты в форму

Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);

#КонецОбласти

#Область ДобавлениеЭлементовФормы

...

#КонецОбласти

#Область ЗаполнениеДанных

Форма.АВ_РабочееМесто = Форма.Объект.АВ_РабочееМесто;

#КонецОбласти


Расширения, Типовые приемы, Шаблоны и заготовки

Понравилась статья? Поделить с друзьями:
  • Как выглядит бизнес класс в поезде ласточка
  • Как выглядит бизнес класс в самолете победа
  • Как выглядит личный кабинет тинькофф бизнес
  • Как выглядят места бизнес класса в самолете
  • Как выглядят реквизиты банковской карты втб