1С 8.3 Библиотека программного изменения формы (УФ)
Данные > Примеры кода 1С > 1С 8.3 Форма, элементы
Перейти в раздел примеры кода 1С 8.3:
Библиотека для программного изменения управляемых форм 8.3, которую можно внедрить в конфигурацию либо совсем бесшовно, либо практически бесшовно. Для дальнейшего поддержания конфигурации, удобнее вносить все изменения на форме программно. Для ускорения быстродействия, во всех процедурах библиотеки отсутствуют проверки корректности введенных имен и значений! Источник: https://infostart.ru/1c/articles/1270443/
Добавляет новую команду формы. Дополнительно можно сразу разместить кнопку на форме:
// Параметры:
// Форма - ФормаКлиентскогоПриложения - изменяемая форма
//
// ИмяКоманды - Строка - имя новой команды формы
//
// ДействиеКоманды - Строка - имя обработчика для команды
//
// ИмяГруппы - Строка - имя родительского элемента, если необходимо разместить команду на форме
// - Неопределено - если нужно только создать новую команду
// По умолчанию команда размещается в корне формы
//
// ВидКнопки - ВидКнопкиФормы - вид кнопки формы. По умолчанию ОбычнаяКнопка или КнопкаКоманднойПанели,
// зависит от родителя
//
// Заголовок - Строка - заголовок кнопки формы. Не обязательный
//
// ПоместитьПеред - Строка - имя элемента, перед которым необходимо разместить кнопку формы. Не обязательный
//
// Картинка - Картинка - картинка кнопки формы. Не обязательный
//
// ОтображениеКнопки - ОтображениеКнопки - вариант отражение кнопки на форме. Учитывается только если
// заполнен параметр Картинка. Не обязательный
//
Процедура ДобавитьРазместитьКомандуФормы(Форма, ИмяКоманды, ДействиеКоманды, ИмяГруппы = "", ВидКнопки = Неопределено,
Заголовок = "", ПоместитьПеред = "",
Картинка = Неопределено, ОтображениеКнопки = Неопределено,
Доступность = Истина) Экспорт
Команда = Форма.Команды.Добавить(ИмяКоманды);
Команда.Действие = ДействиеКоманды;
Если ЗначениеЗаполнено(Заголовок) Тогда
Команда.Заголовок = Заголовок;
КонецЕсли;
Если Картинка <> Неопределено Тогда
Команда.Картинка = Картинка;
Если ОтображениеКнопки <> Неопределено Тогда
Команда.Отображение = ОтображениеКнопки;
КонецЕсли;
КонецЕсли;
Если ИмяГруппы = Неопределено Тогда
Возврат;
ИначеЕсли ЗначениеЗаполнено(ИмяГруппы) Тогда
ЭлементРодитель = Форма.Элементы[ИмяГруппы];
Иначе
ЭлементРодитель = Форма;
КонецЕсли;
КнопкаФормы = Форма.Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), ЭлементРодитель);
КнопкаФормы.ИмяКоманды = ИмяКоманды;
КнопкаФормы.Доступность = Доступность;
Если ВидКнопки <> Неопределено Тогда
КнопкаФормы.Вид = ВидКнопки;
КонецЕсли;
Если ЗначениеЗаполнено(ПоместитьПеред) Тогда
Форма.Элементы.Переместить(КнопкаФормы, ЭлементРодитель, Форма.Элементы[ПоместитьПеред]);
КонецЕсли;
КонецПроцедуры
// Форма - ФормаКлиентскогоПриложения - изменяемая форма
//
// ИмяКоманды - Строка - имя новой команды формы
//
// ДействиеКоманды - Строка - имя обработчика для команды
//
// ИмяГруппы - Строка - имя родительского элемента, если необходимо разместить команду на форме
// - Неопределено - если нужно только создать новую команду
// По умолчанию команда размещается в корне формы
//
// ВидКнопки - ВидКнопкиФормы - вид кнопки формы. По умолчанию ОбычнаяКнопка или КнопкаКоманднойПанели,
// зависит от родителя
//
// Заголовок - Строка - заголовок кнопки формы. Не обязательный
//
// ПоместитьПеред - Строка - имя элемента, перед которым необходимо разместить кнопку формы. Не обязательный
//
// Картинка - Картинка - картинка кнопки формы. Не обязательный
//
// ОтображениеКнопки - ОтображениеКнопки - вариант отражение кнопки на форме. Учитывается только если
// заполнен параметр Картинка. Не обязательный
//
Процедура ДобавитьРазместитьКомандуФормы(Форма, ИмяКоманды, ДействиеКоманды, ИмяГруппы = "", ВидКнопки = Неопределено,
Заголовок = "", ПоместитьПеред = "",
Картинка = Неопределено, ОтображениеКнопки = Неопределено,
Доступность = Истина) Экспорт
Команда = Форма.Команды.Добавить(ИмяКоманды);
Команда.Действие = ДействиеКоманды;
Если ЗначениеЗаполнено(Заголовок) Тогда
Команда.Заголовок = Заголовок;
КонецЕсли;
Если Картинка <> Неопределено Тогда
Команда.Картинка = Картинка;
Если ОтображениеКнопки <> Неопределено Тогда
Команда.Отображение = ОтображениеКнопки;
КонецЕсли;
КонецЕсли;
Если ИмяГруппы = Неопределено Тогда
Возврат;
ИначеЕсли ЗначениеЗаполнено(ИмяГруппы) Тогда
ЭлементРодитель = Форма.Элементы[ИмяГруппы];
Иначе
ЭлементРодитель = Форма;
КонецЕсли;
КнопкаФормы = Форма.Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), ЭлементРодитель);
КнопкаФормы.ИмяКоманды = ИмяКоманды;
КнопкаФормы.Доступность = Доступность;
Если ВидКнопки <> Неопределено Тогда
КнопкаФормы.Вид = ВидКнопки;
КонецЕсли;
Если ЗначениеЗаполнено(ПоместитьПеред) Тогда
Форма.Элементы.Переместить(КнопкаФормы, ЭлементРодитель, Форма.Элементы[ПоместитьПеред]);
КонецЕсли;
КонецПроцедуры
Добавляет новый реквизит формы:
// Параметры:
// Форма - ФормаКлиентскогоПриложения - изменяемая форма
//
// ИмяРеквизита - Строка - имя нового реквизита формы
//
// ТипРеквизита - ОписаниеТипов - тип реквизита. По умолчанию строка
//
// ЗаголовокРеквизита - Строка - отображаемый текст реквизита. Не обязательный
//
// Путь - Строка - путь к создаваемому реквизиту. Не включает имя реквизита. Не обязательный
//
// СохраняемыеДанные - Булево - если реквизит содержит сохраняемые данные. По умолчанию Ложь
//
// РодительЭлемента - Строка - имя родителя элемента формы,
// если дополнительно необходимо разместить на форме. Не обязательный
//
// ИмяЭлемента - Строка - если заполнен параметр РодительЭлемента, то дополнительно можно указать имя элемента формы.
// По умолчанию именем будет ИмяРеквизита
//
Процедура ДобавитьРеквизитФормы(Форма, ИмяРеквизита, ТипРеквизита, ЗаголовокРеквизита = "", Путь = "",
СохраняемыеДанные = Ложь, РодительЭлемента = "", ИмяЭлемента = "") Экспорт
СтруктураРеквизита = Новый Структура;
СтруктураРеквизита.Вставить("ИмяРеквизита", ИмяРеквизита);
Если ЗначениеЗаполнено(ТипРеквизита) Тогда
СтруктураРеквизита.Вставить("ТипРеквизита", ТипРеквизита);
КонецЕсли;
Если ЗначениеЗаполнено(ЗаголовокРеквизита) Тогда
СтруктураРеквизита.Вставить("ЗаголовокРеквизита", ЗаголовокРеквизита);
КонецЕсли;
Если ЗначениеЗаполнено(Путь) Тогда
СтруктураРеквизита.Вставить("Путь", Путь);
КонецЕсли;
Если ЗначениеЗаполнено(СохраняемыеДанные) Тогда
СтруктураРеквизита.Вставить("СохраняемыеДанные", СохраняемыеДанные);
КонецЕсли;
Если ЗначениеЗаполнено(РодительЭлемента) Тогда
СтруктураРеквизита.Вставить("РодительЭлемента", РодительЭлемента);
КонецЕсли;
Если ЗначениеЗаполнено(ИмяЭлемента) Тогда
СтруктураРеквизита.Вставить("ИмяЭлемента", ИмяЭлемента);
КонецЕсли;
МассивРеквизитов = Новый Массив;
МассивРеквизитов.Добавить(СтруктураРеквизита);
ДобавитьРеквизитыФормы(Форма, МассивРеквизитов);
КонецПроцедуры
// Форма - ФормаКлиентскогоПриложения - изменяемая форма
//
// ИмяРеквизита - Строка - имя нового реквизита формы
//
// ТипРеквизита - ОписаниеТипов - тип реквизита. По умолчанию строка
//
// ЗаголовокРеквизита - Строка - отображаемый текст реквизита. Не обязательный
//
// Путь - Строка - путь к создаваемому реквизиту. Не включает имя реквизита. Не обязательный
//
// СохраняемыеДанные - Булево - если реквизит содержит сохраняемые данные. По умолчанию Ложь
//
// РодительЭлемента - Строка - имя родителя элемента формы,
// если дополнительно необходимо разместить на форме. Не обязательный
//
// ИмяЭлемента - Строка - если заполнен параметр РодительЭлемента, то дополнительно можно указать имя элемента формы.
// По умолчанию именем будет ИмяРеквизита
//
Процедура ДобавитьРеквизитФормы(Форма, ИмяРеквизита, ТипРеквизита, ЗаголовокРеквизита = "", Путь = "",
СохраняемыеДанные = Ложь, РодительЭлемента = "", ИмяЭлемента = "") Экспорт
СтруктураРеквизита = Новый Структура;
СтруктураРеквизита.Вставить("ИмяРеквизита", ИмяРеквизита);
Если ЗначениеЗаполнено(ТипРеквизита) Тогда
СтруктураРеквизита.Вставить("ТипРеквизита", ТипРеквизита);
КонецЕсли;
Если ЗначениеЗаполнено(ЗаголовокРеквизита) Тогда
СтруктураРеквизита.Вставить("ЗаголовокРеквизита", ЗаголовокРеквизита);
КонецЕсли;
Если ЗначениеЗаполнено(Путь) Тогда
СтруктураРеквизита.Вставить("Путь", Путь);
КонецЕсли;
Если ЗначениеЗаполнено(СохраняемыеДанные) Тогда
СтруктураРеквизита.Вставить("СохраняемыеДанные", СохраняемыеДанные);
КонецЕсли;
Если ЗначениеЗаполнено(РодительЭлемента) Тогда
СтруктураРеквизита.Вставить("РодительЭлемента", РодительЭлемента);
КонецЕсли;
Если ЗначениеЗаполнено(ИмяЭлемента) Тогда
СтруктураРеквизита.Вставить("ИмяЭлемента", ИмяЭлемента);
КонецЕсли;
МассивРеквизитов = Новый Массив;
МассивРеквизитов.Добавить(СтруктураРеквизита);
ДобавитьРеквизитыФормы(Форма, МассивРеквизитов);
КонецПроцедуры
Добавляет новые реквизиты формы:
// Параметры:
// Форма - ФормаКлиентскогоПриложения - изменяемая форма
//
// МассивРеквизитов - Массив структур - содержит:
// *ИмяРеквизита - Строка - имя нового реквизита формы
// *ТипРеквизита - ОписаниеТипов - тип реквизита. По умолчанию строка неограниченной длины
// *ЗаголовокРеквизита - Строка - отображаемый текст реквизита. Не обязательный
// *Путь - Строка - путь к создаваемому реквизиту. Не включает имя реквизита. Не обязательный
// *СохраняемыеДанные - Булево - если реквизит содержит сохраняемые данные. По умолчанию Ложь
// *РодительЭлемента - Строка - имя родителя элемента формы,
// *ИмяЭлемента - Строка - если заполнен параметр РодительЭлемента, то дополнительно можно указать имя элемента формы.
// По умолчанию именем будет ИмяРеквизита
//
Процедура ДобавитьРеквизитыФормы(Форма, МассивРеквизитов) Экспорт
ДобавляемыеРеквизиты = Новый Массив;
РеквизитыДляРазмещения = Новый Массив;
Для Каждого ОписаниеРеквизита Из МассивРеквизитов Цикл
ИмяРеквизита = ОписаниеРеквизита.ИмяРеквизита;
Если ОписаниеРеквизита.Свойство("ТипРеквизита") Тогда
ТипРеквизита = ОписаниеРеквизита.ТипРеквизита;
Иначе
ТипРеквизита = Новый ОписаниеТипов("Строка");
КонецЕсли;
ЗаголовокРеквизита = "";
Если ОписаниеРеквизита.Свойство("ЗаголовокРеквизита") Тогда
ЗаголовокРеквизита = ОписаниеРеквизита.ЗаголовокРеквизита;
КонецЕсли;
Путь = "";
Если ОписаниеРеквизита.Свойство("Путь") Тогда
Путь = ОписаниеРеквизита.Путь;
КонецЕсли;
СохраняемыеДанные = Ложь;
Если ОписаниеРеквизита.Свойство("СохраняемыеДанные") Тогда
СохраняемыеДанные = ОписаниеРеквизита.СохраняемыеДанные;
КонецЕсли;
РеквизитФормы = Новый РеквизитФормы(ИмяРеквизита, ТипРеквизита, Путь, ЗаголовокРеквизита, СохраняемыеДанные);
ДобавляемыеРеквизиты.Добавить(РеквизитФормы);
//+ Дополнительное размещение реквизитов на форме
Если ОписаниеРеквизита.Свойство("РодительЭлемента") Тогда
СтруктураЭлемента = Новый Структура;
СтруктураЭлемента.Вставить("ИмяГруппы", ОписаниеРеквизита.РодительЭлемента);
Если ОписаниеРеквизита.Свойство("Путь") Тогда
Шаблон = "%1.%2";
ПутьКДанным = СтрШаблон(Шаблон, ОписаниеРеквизита.Путь, ИмяРеквизита);
Иначе
ПутьКДанным = ИмяРеквизита;
КонецЕсли;
СтруктураЭлемента.Вставить("ПутьКДанным", ПутьКДанным);
ИмяЭлемента = ИмяРеквизита;
Если ОписаниеРеквизита.Свойство("ИмяЭлемента") Тогда
ИмяЭлемента = ОписаниеРеквизита.ИмяЭлемента;
КонецЕсли;
СтруктураРеквизитов = Новый Структура;
СтруктураРеквизитов.Вставить(ИмяЭлемента, СтруктураЭлемента);
РеквизитыДляРазмещения.Добавить(СтруктураРеквизитов);
КонецЕсли;
//- Дополнительное размещение реквизитов на форме
КонецЦикла;
Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
РазместитьРеквизитыНаФорме(Форма, РеквизитыДляРазмещения);
КонецПроцедуры
// Форма - ФормаКлиентскогоПриложения - изменяемая форма
//
// МассивРеквизитов - Массив структур - содержит:
// *ИмяРеквизита - Строка - имя нового реквизита формы
// *ТипРеквизита - ОписаниеТипов - тип реквизита. По умолчанию строка неограниченной длины
// *ЗаголовокРеквизита - Строка - отображаемый текст реквизита. Не обязательный
// *Путь - Строка - путь к создаваемому реквизиту. Не включает имя реквизита. Не обязательный
// *СохраняемыеДанные - Булево - если реквизит содержит сохраняемые данные. По умолчанию Ложь
// *РодительЭлемента - Строка - имя родителя элемента формы,
// *ИмяЭлемента - Строка - если заполнен параметр РодительЭлемента, то дополнительно можно указать имя элемента формы.
// По умолчанию именем будет ИмяРеквизита
//
Процедура ДобавитьРеквизитыФормы(Форма, МассивРеквизитов) Экспорт
ДобавляемыеРеквизиты = Новый Массив;
РеквизитыДляРазмещения = Новый Массив;
Для Каждого ОписаниеРеквизита Из МассивРеквизитов Цикл
ИмяРеквизита = ОписаниеРеквизита.ИмяРеквизита;
Если ОписаниеРеквизита.Свойство("ТипРеквизита") Тогда
ТипРеквизита = ОписаниеРеквизита.ТипРеквизита;
Иначе
ТипРеквизита = Новый ОписаниеТипов("Строка");
КонецЕсли;
ЗаголовокРеквизита = "";
Если ОписаниеРеквизита.Свойство("ЗаголовокРеквизита") Тогда
ЗаголовокРеквизита = ОписаниеРеквизита.ЗаголовокРеквизита;
КонецЕсли;
Путь = "";
Если ОписаниеРеквизита.Свойство("Путь") Тогда
Путь = ОписаниеРеквизита.Путь;
КонецЕсли;
СохраняемыеДанные = Ложь;
Если ОписаниеРеквизита.Свойство("СохраняемыеДанные") Тогда
СохраняемыеДанные = ОписаниеРеквизита.СохраняемыеДанные;
КонецЕсли;
РеквизитФормы = Новый РеквизитФормы(ИмяРеквизита, ТипРеквизита, Путь, ЗаголовокРеквизита, СохраняемыеДанные);
ДобавляемыеРеквизиты.Добавить(РеквизитФормы);
//+ Дополнительное размещение реквизитов на форме
Если ОписаниеРеквизита.Свойство("РодительЭлемента") Тогда
СтруктураЭлемента = Новый Структура;
СтруктураЭлемента.Вставить("ИмяГруппы", ОписаниеРеквизита.РодительЭлемента);
Если ОписаниеРеквизита.Свойство("Путь") Тогда
Шаблон = "%1.%2";
ПутьКДанным = СтрШаблон(Шаблон, ОписаниеРеквизита.Путь, ИмяРеквизита);
Иначе
ПутьКДанным = ИмяРеквизита;
КонецЕсли;
СтруктураЭлемента.Вставить("ПутьКДанным", ПутьКДанным);
ИмяЭлемента = ИмяРеквизита;
Если ОписаниеРеквизита.Свойство("ИмяЭлемента") Тогда
ИмяЭлемента = ОписаниеРеквизита.ИмяЭлемента;
КонецЕсли;
СтруктураРеквизитов = Новый Структура;
СтруктураРеквизитов.Вставить(ИмяЭлемента, СтруктураЭлемента);
РеквизитыДляРазмещения.Добавить(СтруктураРеквизитов);
КонецЕсли;
//- Дополнительное размещение реквизитов на форме
КонецЦикла;
Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
РазместитьРеквизитыНаФорме(Форма, РеквизитыДляРазмещения);
КонецПроцедуры
Добавляет в дерево элементов формы существующие реквизиты объекта и формы:
// Параметры:
// Форма - ФормаКлиентскогоПриложения - изменяемая форма
//
// МассивРеквизитов - Массив структур - содержит:
// * Имя - Имя добавляемого реквизита
// * Значение - Структура - содержит (все свойства не обязательные):
// ** ИмяГруппы - Строка - имя элемента родителя
// ** ПутьКДанным - Строка - путь к данным. Если не указано, то будет Объект.
// ** ВидПоляФормы - ВидПоляФормы - вид поля формы. По умолчанию ПолеВвода
// ** Видимость - Булево - значение свойства Видимость
// ** ТолькоПросмотр - Булево - значение свойства ТолькоПросмотр
// ** Доступность - Булево - значение свойства Доступность
// ** ПоместитьПеред - Строка - имя элемента, перед которым необходимо разместить
// ** ОбработкаСобытий - Массив структур - содержит:
// *** Событие - Строка - имя события элемента
// *** Действие - Строка - имя процедуры исполнителя события
//
Процедура РазместитьРеквизитыНаФорме(Форма, МассивРеквизитов) Экспорт
Для Каждого ТекРеквизит Из МассивРеквизитов Цикл
ИмяРеквизита = ТекРеквизит.Имя;
ПараметрыРеквизита = ТекРеквизит.Значение;
Если ПараметрыРеквизита.Свойство("ИмяГруппы") Тогда
ЭлементРодитель = Форма.Элементы[ПараметрыРеквизита.ИмяГруппы];
Иначе
ЭлементРодитель = Форма;
КонецЕсли;
Элемент = Форма.Элементы.Добавить(ИмяРеквизита, Тип("ПолеФормы"), ЭлементРодитель);
Если ПараметрыРеквизита.Свойство("ПутьКДанным") Тогда
Элемент.ПутьКДанным = ПараметрыРеквизита.ПутьКДанным;
Иначе
Элемент.ПутьКДанным = "Объект." + ИмяРеквизита;
КонецЕсли;
Если ПараметрыРеквизита.Свойство("ВидПоляФормы") Тогда
Элемент.Вид = ПараметрыРеквизита.ВидПоляФормы;
Иначе
Элемент.Вид = ВидПоляФормы.ПолеВвода;
КонецЕсли;
Если ПараметрыРеквизита.Свойство("Видимость") Тогда
Элемент.Видимость = ПараметрыРеквизита.Видимость;
КонецЕсли;
Если ПараметрыРеквизита.Свойство("ТолькоПросмотр") Тогда
Элемент.ТолькоПросмотр = ПараметрыРеквизита.ТолькоПросмотр;
КонецЕсли;
Если ПараметрыРеквизита.Свойство("Доступность") Тогда
Элемент.Доступность = ПараметрыРеквизита.Доступность;
КонецЕсли;
Если ПараметрыРеквизита.Свойство("ПоместитьПеред") Тогда
Форма.Элементы.Переместить(Элемент, ЭлементРодитель, Форма.Элементы[ПараметрыРеквизита.ПоместитьПеред]);
КонецЕсли;
//--- обработчики событий
Если ПараметрыРеквизита.Свойство("ОбработкаСобытий")
И ТипЗнч(ПараметрыРеквизита.ОбработкаСобытий) = Тип("Массив") Тогда
Для Каждого ТекСобытие Из ПараметрыРеквизита.ОбработкаСобытий Цикл
Элемент.УстановитьДействие(ТекСобытие.Событие, ТекСобытие.Действие);
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Форма - ФормаКлиентскогоПриложения - изменяемая форма
//
// МассивРеквизитов - Массив структур - содержит:
// * Имя - Имя добавляемого реквизита
// * Значение - Структура - содержит (все свойства не обязательные):
// ** ИмяГруппы - Строка - имя элемента родителя
// ** ПутьКДанным - Строка - путь к данным. Если не указано, то будет Объект.
// ** ВидПоляФормы - ВидПоляФормы - вид поля формы. По умолчанию ПолеВвода
// ** Видимость - Булево - значение свойства Видимость
// ** ТолькоПросмотр - Булево - значение свойства ТолькоПросмотр
// ** Доступность - Булево - значение свойства Доступность
// ** ПоместитьПеред - Строка - имя элемента, перед которым необходимо разместить
// ** ОбработкаСобытий - Массив структур - содержит:
// *** Событие - Строка - имя события элемента
// *** Действие - Строка - имя процедуры исполнителя события
//
Процедура РазместитьРеквизитыНаФорме(Форма, МассивРеквизитов) Экспорт
Для Каждого ТекРеквизит Из МассивРеквизитов Цикл
ИмяРеквизита = ТекРеквизит.Имя;
ПараметрыРеквизита = ТекРеквизит.Значение;
Если ПараметрыРеквизита.Свойство("ИмяГруппы") Тогда
ЭлементРодитель = Форма.Элементы[ПараметрыРеквизита.ИмяГруппы];
Иначе
ЭлементРодитель = Форма;
КонецЕсли;
Элемент = Форма.Элементы.Добавить(ИмяРеквизита, Тип("ПолеФормы"), ЭлементРодитель);
Если ПараметрыРеквизита.Свойство("ПутьКДанным") Тогда
Элемент.ПутьКДанным = ПараметрыРеквизита.ПутьКДанным;
Иначе
Элемент.ПутьКДанным = "Объект." + ИмяРеквизита;
КонецЕсли;
Если ПараметрыРеквизита.Свойство("ВидПоляФормы") Тогда
Элемент.Вид = ПараметрыРеквизита.ВидПоляФормы;
Иначе
Элемент.Вид = ВидПоляФормы.ПолеВвода;
КонецЕсли;
Если ПараметрыРеквизита.Свойство("Видимость") Тогда
Элемент.Видимость = ПараметрыРеквизита.Видимость;
КонецЕсли;
Если ПараметрыРеквизита.Свойство("ТолькоПросмотр") Тогда
Элемент.ТолькоПросмотр = ПараметрыРеквизита.ТолькоПросмотр;
КонецЕсли;
Если ПараметрыРеквизита.Свойство("Доступность") Тогда
Элемент.Доступность = ПараметрыРеквизита.Доступность;
КонецЕсли;
Если ПараметрыРеквизита.Свойство("ПоместитьПеред") Тогда
Форма.Элементы.Переместить(Элемент, ЭлементРодитель, Форма.Элементы[ПараметрыРеквизита.ПоместитьПеред]);
КонецЕсли;
//--- обработчики событий
Если ПараметрыРеквизита.Свойство("ОбработкаСобытий")
И ТипЗнч(ПараметрыРеквизита.ОбработкаСобытий) = Тип("Массив") Тогда
Для Каждого ТекСобытие Из ПараметрыРеквизита.ОбработкаСобытий Цикл
Элемент.УстановитьДействие(ТекСобытие.Событие, ТекСобытие.Действие);
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Добавляет в дерево элементов формы существующие реквизиты объекта и формы:
// Параметры:
// Форма - ФормаКлиентскогоПриложения - изменяемая форма
//
// Имя - Имя добавляемого реквизита
// ИмяГруппы - Строка - имя элемента родителя
// ПутьКДанным - Строка - путь к данным. Если не указано, то будет Объект.
// ВидПоляФормы - ВидПоляФормы - вид поля формы. По умолчанию ПолеВвода
// Видимость - Булево - значение свойства Видимость
// ТолькоПросмотр - Булево - значение свойства ТолькоПросмотр
// Доступность - Булево - значение свойства Доступность
// ПоместитьПеред - Строка - имя элемента, перед которым необходимо разместить
// ОбработкаСобытий - Массив структур - содержит:
// * Событие - Строка - имя события элемента
// * Действие - Строка - имя процедуры исполнителя события
// ТипЭлемента - Поле формы или например Таблица формы, по умолчанию тип поле формы
//
Процедура РазместитьРеквизитНаФорме(Форма, Имя, ИмяГруппы = "", ПутьКДанным = "", ПутьКДаннымПодвала = "", ПВидПоляФормы = Неопределено, Видимость = Истина,
ТолькоПросмотр = Ложь, Доступность = Истина, ПоместитьПеред = "", ОбработкаСобытий = Неопределено, Заголовок = "") Экспорт
//Для каждого ТекРеквизит Из МассивРеквизитов Цикл
УстановитьПривилегированныйРежим(Истина);
Если ЗначениеЗаполнено(ИмяГруппы) Тогда
ЭлементРодитель = Форма.Элементы[ИмяГруппы];
Иначе
ЭлементРодитель = Форма;
КонецЕсли;
Элемент = Форма.Элементы.Добавить(Имя, Тип("ПолеФормы"), ЭлементРодитель);
Если ЗначениеЗаполнено(Заголовок) Тогда
Элемент.Заголовок = Заголовок;
КонецЕсли;
Если ЗначениеЗаполнено(ПутьКДанным) Тогда
Элемент.ПутьКДанным = ПутьКДанным;
Иначе
Элемент.ПутьКДанным = "Объект." + Имя;
КонецЕсли;
Если ЗначениеЗаполнено(ПутьКДаннымПодвала) Тогда
Элемент.ПутьКДаннымПодвала = ПутьКДаннымПодвала;
КонецЕсли;
Если ПВидПоляФормы <> Неопределено Тогда
Элемент.Вид = ПВидПоляФормы;
Иначе
Элемент.Вид = ВидПоляФормы.ПолеВвода;
КонецЕсли;
Если ЗначениеЗаполнено(Видимость) Тогда
Элемент.Видимость = Видимость;
КонецЕсли;
Если ЗначениеЗаполнено(ТолькоПросмотр) Тогда
Элемент.ТолькоПросмотр = ТолькоПросмотр;
КонецЕсли;
Если ЗначениеЗаполнено(Доступность) Тогда
Элемент.Доступность = Доступность;
КонецЕсли;
Если ЗначениеЗаполнено(ПоместитьПеред) Тогда
Форма.Элементы.Переместить(Элемент, ЭлементРодитель, Форма.Элементы[ПоместитьПеред]);
КонецЕсли;
//--- обработчики событий
Если ОбработкаСобытий <> Неопределено
И ТипЗнч(ОбработкаСобытий) = Тип("Массив") Тогда
Для Каждого ТекСобытие Из ОбработкаСобытий Цикл
Элемент.УстановитьДействие(ТекСобытие.Событие, ТекСобытие.Действие);
КонецЦикла;
КонецЕсли;
//КонецЦикла;
КонецПроцедуры
// Форма - ФормаКлиентскогоПриложения - изменяемая форма
//
// Имя - Имя добавляемого реквизита
// ИмяГруппы - Строка - имя элемента родителя
// ПутьКДанным - Строка - путь к данным. Если не указано, то будет Объект.
// ВидПоляФормы - ВидПоляФормы - вид поля формы. По умолчанию ПолеВвода
// Видимость - Булево - значение свойства Видимость
// ТолькоПросмотр - Булево - значение свойства ТолькоПросмотр
// Доступность - Булево - значение свойства Доступность
// ПоместитьПеред - Строка - имя элемента, перед которым необходимо разместить
// ОбработкаСобытий - Массив структур - содержит:
// * Событие - Строка - имя события элемента
// * Действие - Строка - имя процедуры исполнителя события
// ТипЭлемента - Поле формы или например Таблица формы, по умолчанию тип поле формы
//
Процедура РазместитьРеквизитНаФорме(Форма, Имя, ИмяГруппы = "", ПутьКДанным = "", ПутьКДаннымПодвала = "", ПВидПоляФормы = Неопределено, Видимость = Истина,
ТолькоПросмотр = Ложь, Доступность = Истина, ПоместитьПеред = "", ОбработкаСобытий = Неопределено, Заголовок = "") Экспорт
//Для каждого ТекРеквизит Из МассивРеквизитов Цикл
УстановитьПривилегированныйРежим(Истина);
Если ЗначениеЗаполнено(ИмяГруппы) Тогда
ЭлементРодитель = Форма.Элементы[ИмяГруппы];
Иначе
ЭлементРодитель = Форма;
КонецЕсли;
Элемент = Форма.Элементы.Добавить(Имя, Тип("ПолеФормы"), ЭлементРодитель);
Если ЗначениеЗаполнено(Заголовок) Тогда
Элемент.Заголовок = Заголовок;
КонецЕсли;
Если ЗначениеЗаполнено(ПутьКДанным) Тогда
Элемент.ПутьКДанным = ПутьКДанным;
Иначе
Элемент.ПутьКДанным = "Объект." + Имя;
КонецЕсли;
Если ЗначениеЗаполнено(ПутьКДаннымПодвала) Тогда
Элемент.ПутьКДаннымПодвала = ПутьКДаннымПодвала;
КонецЕсли;
Если ПВидПоляФормы <> Неопределено Тогда
Элемент.Вид = ПВидПоляФормы;
Иначе
Элемент.Вид = ВидПоляФормы.ПолеВвода;
КонецЕсли;
Если ЗначениеЗаполнено(Видимость) Тогда
Элемент.Видимость = Видимость;
КонецЕсли;
Если ЗначениеЗаполнено(ТолькоПросмотр) Тогда
Элемент.ТолькоПросмотр = ТолькоПросмотр;
КонецЕсли;
Если ЗначениеЗаполнено(Доступность) Тогда
Элемент.Доступность = Доступность;
КонецЕсли;
Если ЗначениеЗаполнено(ПоместитьПеред) Тогда
Форма.Элементы.Переместить(Элемент, ЭлементРодитель, Форма.Элементы[ПоместитьПеред]);
КонецЕсли;
//--- обработчики событий
Если ОбработкаСобытий <> Неопределено
И ТипЗнч(ОбработкаСобытий) = Тип("Массив") Тогда
Для Каждого ТекСобытие Из ОбработкаСобытий Цикл
Элемент.УстановитьДействие(ТекСобытие.Событие, ТекСобытие.Действие);
КонецЦикла;
КонецЕсли;
//КонецЦикла;
КонецПроцедуры
Устанавливает обработчик события для элемента формы:
// Параметры:
// Форма - ФормаКлиентскогоПриложения - изменяемая форма
//
// ИмяЭлемента - Строка - имя элемента формы
//
// Событие - Строка - имя события элемента
//
// Действие - Строка - имя процедуры исполнителя события
//
Процедура УстановитьСобытиеЭлементаФормы(Форма, ИмяЭлемента, Событие, Действие) Экспорт
Элемент = Форма.Элементы[ИмяЭлемента];
Элемент.УстановитьДействие(Событие, Действие);
КонецПроцедуры
// Форма - ФормаКлиентскогоПриложения - изменяемая форма
//
// ИмяЭлемента - Строка - имя элемента формы
//
// Событие - Строка - имя события элемента
//
// Действие - Строка - имя процедуры исполнителя события
//
Процедура УстановитьСобытиеЭлементаФормы(Форма, ИмяЭлемента, Событие, Действие) Экспорт
Элемент = Форма.Элементы[ИмяЭлемента];
Элемент.УстановитьДействие(Событие, Действие);
КонецПроцедуры
Добавляет в дерево элементов формы новую группу:
// Параметры:
// Форма - ФормаКлиентскогоПриложения - изменяемая форма
//
// ИмяГруппы - Строка - имя новой группы
//
// РодительГруппы - Строка - родитель группы. Не обязательно
//
// ВидГруппы - ВидГруппыФормы - вид группы. По умолчанию ОбычнаяГруппа
//
// Группировка - ГруппировкаПодчиненныхЭлементовФормы - вариант группировки. По умолчанию ГоризонтальнаяЕслиВозможно
//
// ОтображатьЗаголовок - Булево - значение свойства ОтображатьЗаголовок группы. По умолчанию Ложь
//
// Заголовок - Строка - заголовок группы. По умолчанию заголовок пустой
//
Процедура ДобавитьГруппуНаФорму(Форма, ИмяГруппы, РодительГруппы = "",
ВидГруппы = Неопределено,
Группировка = Неопределено,
ОтображатьЗаголовок = Ложь,
Заголовок = Неопределено,
Объединенная = Истина,
ПоместитьПеред = "") Экспорт
Если НЕ ПустаяСтрока(РодительГруппы) Тогда
ЭлементРодитель = Форма.Элементы[РодительГруппы];
Иначе
ЭлементРодитель = Форма;
КонецЕсли;
ГруппаФормы = Форма.Элементы.Добавить(ИмяГруппы, Тип("ГруппаФормы"), ЭлементРодитель);
ГруппаФормы.Вид = ?(ВидГруппы = Неопределено, ВидГруппыФормы.ОбычнаяГруппа, ВидГруппы);
ГруппаФормы.Группировка = ?(Группировка = Неопределено,
ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяЕслиВозможно,
Группировка);
ГруппаФормы.ОтображатьЗаголовок = ОтображатьЗаголовок;
ГруппаФормы.Заголовок = Заголовок;
Если ВидГруппы = ВидГруппыФормы.ОбычнаяГруппа Тогда
ГруппаФормы.Объединенная = Объединенная;
КонецЕсли;
Если ЗначениеЗаполнено(ПоместитьПеред) Тогда
Форма.Элементы.Переместить(ГруппаФормы, Форма.Элементы[РодительГруппы], Форма.Элементы[ПоместитьПеред]);
КонецЕсли;
КонецПроцедуры
// Форма - ФормаКлиентскогоПриложения - изменяемая форма
//
// ИмяГруппы - Строка - имя новой группы
//
// РодительГруппы - Строка - родитель группы. Не обязательно
//
// ВидГруппы - ВидГруппыФормы - вид группы. По умолчанию ОбычнаяГруппа
//
// Группировка - ГруппировкаПодчиненныхЭлементовФормы - вариант группировки. По умолчанию ГоризонтальнаяЕслиВозможно
//
// ОтображатьЗаголовок - Булево - значение свойства ОтображатьЗаголовок группы. По умолчанию Ложь
//
// Заголовок - Строка - заголовок группы. По умолчанию заголовок пустой
//
Процедура ДобавитьГруппуНаФорму(Форма, ИмяГруппы, РодительГруппы = "",
ВидГруппы = Неопределено,
Группировка = Неопределено,
ОтображатьЗаголовок = Ложь,
Заголовок = Неопределено,
Объединенная = Истина,
ПоместитьПеред = "") Экспорт
Если НЕ ПустаяСтрока(РодительГруппы) Тогда
ЭлементРодитель = Форма.Элементы[РодительГруппы];
Иначе
ЭлементРодитель = Форма;
КонецЕсли;
ГруппаФормы = Форма.Элементы.Добавить(ИмяГруппы, Тип("ГруппаФормы"), ЭлементРодитель);
ГруппаФормы.Вид = ?(ВидГруппы = Неопределено, ВидГруппыФормы.ОбычнаяГруппа, ВидГруппы);
ГруппаФормы.Группировка = ?(Группировка = Неопределено,
ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяЕслиВозможно,
Группировка);
ГруппаФормы.ОтображатьЗаголовок = ОтображатьЗаголовок;
ГруппаФормы.Заголовок = Заголовок;
Если ВидГруппы = ВидГруппыФормы.ОбычнаяГруппа Тогда
ГруппаФормы.Объединенная = Объединенная;
КонецЕсли;
Если ЗначениеЗаполнено(ПоместитьПеред) Тогда
Форма.Элементы.Переместить(ГруппаФормы, Форма.Элементы[РодительГруппы], Форма.Элементы[ПоместитьПеред]);
КонецЕсли;
КонецПроцедуры
Добавляет в дерево элементов формы существующие реквизиты объекта и формы:
// Параметры:
// Форма - ФормаКлиентскогоПриложения - изменяемая форма
//
// Имя - Имя добавляемого реквизита
// ИмяГруппы - Строка - имя элемента родителя
// ПутьКДанным - Строка - путь к данным. Если не указано, то будет Объект.
// ВидПоляФормы - ВидПоляФормы - вид поля формы. По умолчанию ПолеВвода
// Видимость - Булево - значение свойства Видимость
// ТолькоПросмотр - Булево - значение свойства ТолькоПросмотр
// Доступность - Булево - значение свойства Доступность
// ПоместитьПеред - Строка - имя элемента, перед которым необходимо разместить
// ОбработкаСобытий - Массив структур - содержит:
// * Событие - Строка - имя события элемента
// * Действие - Строка - имя процедуры исполнителя события
// ТипЭлемента - Поле формы или например Таблица формы, по умолчанию тип поле формы
//
Процедура РазместитьТаблицуНаФорме(Форма, Имя, ИмяГруппы = "", ПутьКДанным = "", Видимость = Истина, ТолькоПросмотр = Ложь,
Доступность = Истина, ПоместитьПеред = "", ОбработкаСобытий = Неопределено, Подвал = Ложь) Экспорт
Если ЗначениеЗаполнено(ИмяГруппы) Тогда
ЭлементРодитель = Форма.Элементы[ИмяГруппы];
Иначе
ЭлементРодитель = Форма;
КонецЕсли;
Элемент = Форма.Элементы.Добавить(Имя, Тип("ТаблицаФормы"), ЭлементРодитель);
Если ЗначениеЗаполнено(ПутьКДанным) Тогда
Элемент.ПутьКДанным = ПутьКДанным;
Иначе
Элемент.ПутьКДанным = "Объект." + Имя;
КонецЕсли;
Если ЗначениеЗаполнено(Видимость) Тогда
Элемент.Видимость = Видимость;
КонецЕсли;
Если ЗначениеЗаполнено(ТолькоПросмотр) Тогда
Элемент.ТолькоПросмотр = ТолькоПросмотр;
КонецЕсли;
Если ЗначениеЗаполнено(Доступность) Тогда
Элемент.Доступность = Доступность;
КонецЕсли;
Если ЗначениеЗаполнено(ПоместитьПеред) Тогда
Форма.Элементы.Переместить(Элемент, ЭлементРодитель, Форма.Элементы[ПоместитьПеред]);
КонецЕсли;
Элемент.Подвал = Подвал;
//--- обработчики событий
Если ОбработкаСобытий <> Неопределено
И ТипЗнч(ОбработкаСобытий) = Тип("Массив") Тогда
Для Каждого ТекСобытие Из ОбработкаСобытий Цикл
Элемент.УстановитьДействие(ТекСобытие.Событие, ТекСобытие.Действие);
КонецЦикла;
КонецЕсли;
//КонецЦикла;
КонецПроцедуры
// Форма - ФормаКлиентскогоПриложения - изменяемая форма
//
// Имя - Имя добавляемого реквизита
// ИмяГруппы - Строка - имя элемента родителя
// ПутьКДанным - Строка - путь к данным. Если не указано, то будет Объект.
// ВидПоляФормы - ВидПоляФормы - вид поля формы. По умолчанию ПолеВвода
// Видимость - Булево - значение свойства Видимость
// ТолькоПросмотр - Булево - значение свойства ТолькоПросмотр
// Доступность - Булево - значение свойства Доступность
// ПоместитьПеред - Строка - имя элемента, перед которым необходимо разместить
// ОбработкаСобытий - Массив структур - содержит:
// * Событие - Строка - имя события элемента
// * Действие - Строка - имя процедуры исполнителя события
// ТипЭлемента - Поле формы или например Таблица формы, по умолчанию тип поле формы
//
Процедура РазместитьТаблицуНаФорме(Форма, Имя, ИмяГруппы = "", ПутьКДанным = "", Видимость = Истина, ТолькоПросмотр = Ложь,
Доступность = Истина, ПоместитьПеред = "", ОбработкаСобытий = Неопределено, Подвал = Ложь) Экспорт
Если ЗначениеЗаполнено(ИмяГруппы) Тогда
ЭлементРодитель = Форма.Элементы[ИмяГруппы];
Иначе
ЭлементРодитель = Форма;
КонецЕсли;
Элемент = Форма.Элементы.Добавить(Имя, Тип("ТаблицаФормы"), ЭлементРодитель);
Если ЗначениеЗаполнено(ПутьКДанным) Тогда
Элемент.ПутьКДанным = ПутьКДанным;
Иначе
Элемент.ПутьКДанным = "Объект." + Имя;
КонецЕсли;
Если ЗначениеЗаполнено(Видимость) Тогда
Элемент.Видимость = Видимость;
КонецЕсли;
Если ЗначениеЗаполнено(ТолькоПросмотр) Тогда
Элемент.ТолькоПросмотр = ТолькоПросмотр;
КонецЕсли;
Если ЗначениеЗаполнено(Доступность) Тогда
Элемент.Доступность = Доступность;
КонецЕсли;
Если ЗначениеЗаполнено(ПоместитьПеред) Тогда
Форма.Элементы.Переместить(Элемент, ЭлементРодитель, Форма.Элементы[ПоместитьПеред]);
КонецЕсли;
Элемент.Подвал = Подвал;
//--- обработчики событий
Если ОбработкаСобытий <> Неопределено
И ТипЗнч(ОбработкаСобытий) = Тип("Массив") Тогда
Для Каждого ТекСобытие Из ОбработкаСобытий Цикл
Элемент.УстановитьДействие(ТекСобытие.Событие, ТекСобытие.Действие);
КонецЦикла;
КонецЕсли;
//КонецЦикла;
КонецПроцедуры
Созданает динамический список:
&НаСервере
Процедура СозданиеДинамическогоСписка(
Форма, //Тип форма - Форма документа
ИмяСписка = "Список", //тип строка - имя будущего списка на форме и реквизита
ТекстЗапроса = "", //тип строка - запрос, если он не указан, необходимо указать таблицу
МассивКолонок, //тип массив - массив создаваемых колонок, значения тип строка. Пример: "Д,ДоговораКонтрагента" значит будет создана колонка
// с заголовком "Д" и колонкой списка "ДоговораКонтрагента". Если указать просто "ДоговораКонтрагента",
// заголовок будет идентичен заголовку по умолчанию типа "Договор контрагента".
СписокДействий = Неопределено, //типа структура - структура содержит действия (свойства) динамического списка, можно указать только те которые необходимы.
// пример: СписокДействий = Новый Структура("Выбор,ПриАктивизацииСтроки","СписокВыбор","СписокПриАктивизацииСтроки")
ТаблицаСписка = "", //тип строка - содержит имя основной таблицы, пример: "Документ.РеализацияТоваровУслуг"
ДобавитьВ = "", //тип строка - имя элемента на который будет размещен список, если пустое, тогда добавляется на форму
ВставитьПеред = "", //тип строка - имя элемента перед которым будет размещен список, если пустое, будет просто добавлен в конец
СвояКоманднаяПанель = Ложь, //тип булево - если ИСТИНА, скрывает стандартную панель и создает свою пустую для будущего наполнения ИмяСписка+"КоманднаяПанель2"
ПараметрыЗапроса = Неопределено) Экспорт //тип структура - содержит перечень параметров, если они используются в запросе.
//Защита от дурака
Если ТекстЗапроса = "" И ТаблицаСписка = "" Тогда Сообщить("Ошибка формирования динамического списка, укажите запрос или таблицу"); Возврат; КонецЕсли;
Элементы = Форма.Элементы;
//Создаем свою командную панель, тот случай когда я не нашел способа снять галочку "Автозаполнение"
Если СвояКоманднаяПанель Тогда
Если ВставитьПеред = "" Тогда
ГруппаДинамическогоСписка = Элементы.Добавить("Группа" + ИмяСписка + "CоСвоейКоманднойПанелью",Тип("ГруппаФормы"),?(ДобавитьВ = "",Форма,Форма.Элементы[ДобавитьВ]));
Иначе
ГруппаДинамическогоСписка = Элементы.Вставить("Группа" + ИмяСписка + "CоСвоейКоманднойПанелью",Тип("ГруппаФормы"),?(ДобавитьВ = "",Форма,Форма.Элементы[ДобавитьВ]),Форма.Элементы[ВставитьПеред]);
КонецЕсли;
ГруппаДинамическогоСписка.Вид = ВидГруппыФормы.ОбычнаяГруппа;
ГруппаДинамическогоСписка.ОтображатьЗаголовок = Ложь;
ГруппаДинамическогоСписка.Отображение = ОтображениеОбычнойГруппы.Нет;
ГруппаДинамическогоСписка.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
КоманднаяПанельСписка = Элементы.Добавить(ИмяСписка + "КоманднаяПанель2",Тип("ГруппаФормы"),ГруппаДинамическогоСписка);
КоманднаяПанельСписка.Вид = ВидГруппыФормы.КоманднаяПанель;
КонецЕсли;
//Создаем реквизит формы
ТипыРеквизита = Новый Массив;
ТипыРеквизита.Добавить(Тип("ДинамическийСписок"));
ОписаниеТиповДляРеквизита = Новый ОписаниеТипов(ТипыРеквизита);
ДинамическийСписок = Новый РеквизитФормы(ИмяСписка, ОписаниеТиповДляРеквизита,,"",Ложь); //Имя реквизита
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(ДинамическийСписок);
//Задаем свойства реквизиту
Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
РеквизитДинамическийСписок = Форма[ИмяСписка]; //Имя реквизита
Если ТекстЗапроса = "" Тогда
РеквизитДинамическийСписок.ПроизвольныйЗапрос = Ложь;
РеквизитДинамическийСписок.ОсновнаяТаблица = ТаблицаСписка;
Иначе
РеквизитДинамическийСписок.ПроизвольныйЗапрос = Истина;
РеквизитДинамическийСписок.ТекстЗапроса = ТекстЗапроса;
Если ТаблицаСписка <> "" Тогда РеквизитДинамическийСписок.ОсновнаяТаблица = ТаблицаСписка; КонецЕсли;
КонецЕсли;
//Заполняем параметры если они были указаны
Если ПараметрыЗапроса <> Неопределено Тогда
Для Каждого Параметра Из ПараметрыЗапроса Цикл
РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра(Параметра.Ключ,Параметра.Значение);
КонецЦикла;
КонецЕсли;
//Размещаем реквизит на форме
Если Ложь
Или ВставитьПеред = ""
Или СвояКоманднаяПанель //Если своя командная панель тогда нет логики уже в параметре ВставитьПеред
Тогда
ТаблицаФормы = Элементы.Добавить(ИмяСписка,Тип("ТаблицаФормы"),?(СвояКоманднаяПанель,ГруппаДинамическогоСписка,?(ДобавитьВ = "",Форма,Форма.Элементы[ДобавитьВ])));
Иначе
ТаблицаФормы = Элементы.Вставить(ИмяСписка,Тип("ТаблицаФормы"),?(ДобавитьВ = "",Форма,Форма.Элементы[ДобавитьВ]),Форма.Элементы[ВставитьПеред]);
КонецЕсли;
ТаблицаФормы.ПутьКДанным = ИмяСписка; //Имя реквизита
//Если своя панель тогда скрываем стандартную
Если СвояКоманднаяПанель Тогда
Элементы[ИмяСписка].ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;
КонецЕсли;
//Создание колонок на основание МассивКолонок
Для Каждого Элемента Из МассивКолонок Цикл
ПараметрыКолонки = СтрЗаменить(Элемента,",",Символы.ПС);
Если СтрЧислоСтрок(ПараметрыКолонки) > 1 Тогда
Заголовок = СтрПолучитьСтроку(ПараметрыКолонки, 1);
ИмяКолонки = СтрПолучитьСтроку(ПараметрыКолонки, 2);
Иначе
Заголовок = "";
ИмяКолонки = ПараметрыКолонки;
КонецЕсли;
НоваяКолонкаТаблицы = Элементы.Добавить(ИмяСписка + ИмяКолонки, Тип("ПолеФормы"), ТаблицаФормы);
Если Заголовок <> "" Тогда НоваяКолонкаТаблицы.Заголовок = Заголовок; КонецЕсли;
НоваяКолонкаТаблицы.ПутьКДанным = ИмяСписка + "." + ИмяКолонки;
КонецЦикла;
//Задаем действия (События) на основание СписокДействий, если он определен
Если СписокДействий <> Неопределено Тогда
ПереченьСвойств = "ПриИзменении
|Выбор
|ПриАктивизацииСтроки
|ВыборЗначения
|ПриАктивизацииПоля
|ПриАктивизацииЯчейки
|ПередНачаломДобавления
|ПередНачаломИзменения
|ПередУдалением
|ПриНачалеРедактирования
|ПередОкончаниемРедактирования
|ПриОкончанииРедактирования
|ОбработкаВыбора
|ПередРазворачиванием
|ПередСворачиванием
|ПослеУдаления
|ПриСменеТекущегоРодителя
|ОбработкаЗаписиНового
|ПриСохраненииПользовательскихНастроекНаСервере
|ПередЗагрузкойПользовательскихНастроекНаСервере
|ПриЗагрузкеПользовательскихНастроекНаСервере
|ПриОбновленииСоставаПользовательскихНастроекНаСервере
|ОбработкаЗапросаОбновления
|ПриПолученииДанныхНаСервере
|НачалоПеретаскивания
|ПроверкаПеретаскивания
|ОкончаниеПеретаскивания
|Перетаскивание";
Для Счетчик = 1 По 28 Цикл
ИмяСвойства = СтрПолучитьСтроку(ПереченьСвойств, Счетчик);
Элементы[ИмяСписка].УстановитьДействие(ИмяСвойства,?(СписокДействий.Свойство(ИмяСвойства),СписокДействий[ИмяСвойства],""));
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура СозданиеДинамическогоСписка(
Форма, //Тип форма - Форма документа
ИмяСписка = "Список", //тип строка - имя будущего списка на форме и реквизита
ТекстЗапроса = "", //тип строка - запрос, если он не указан, необходимо указать таблицу
МассивКолонок, //тип массив - массив создаваемых колонок, значения тип строка. Пример: "Д,ДоговораКонтрагента" значит будет создана колонка
// с заголовком "Д" и колонкой списка "ДоговораКонтрагента". Если указать просто "ДоговораКонтрагента",
// заголовок будет идентичен заголовку по умолчанию типа "Договор контрагента".
СписокДействий = Неопределено, //типа структура - структура содержит действия (свойства) динамического списка, можно указать только те которые необходимы.
// пример: СписокДействий = Новый Структура("Выбор,ПриАктивизацииСтроки","СписокВыбор","СписокПриАктивизацииСтроки")
ТаблицаСписка = "", //тип строка - содержит имя основной таблицы, пример: "Документ.РеализацияТоваровУслуг"
ДобавитьВ = "", //тип строка - имя элемента на который будет размещен список, если пустое, тогда добавляется на форму
ВставитьПеред = "", //тип строка - имя элемента перед которым будет размещен список, если пустое, будет просто добавлен в конец
СвояКоманднаяПанель = Ложь, //тип булево - если ИСТИНА, скрывает стандартную панель и создает свою пустую для будущего наполнения ИмяСписка+"КоманднаяПанель2"
ПараметрыЗапроса = Неопределено) Экспорт //тип структура - содержит перечень параметров, если они используются в запросе.
//Защита от дурака
Если ТекстЗапроса = "" И ТаблицаСписка = "" Тогда Сообщить("Ошибка формирования динамического списка, укажите запрос или таблицу"); Возврат; КонецЕсли;
Элементы = Форма.Элементы;
//Создаем свою командную панель, тот случай когда я не нашел способа снять галочку "Автозаполнение"
Если СвояКоманднаяПанель Тогда
Если ВставитьПеред = "" Тогда
ГруппаДинамическогоСписка = Элементы.Добавить("Группа" + ИмяСписка + "CоСвоейКоманднойПанелью",Тип("ГруппаФормы"),?(ДобавитьВ = "",Форма,Форма.Элементы[ДобавитьВ]));
Иначе
ГруппаДинамическогоСписка = Элементы.Вставить("Группа" + ИмяСписка + "CоСвоейКоманднойПанелью",Тип("ГруппаФормы"),?(ДобавитьВ = "",Форма,Форма.Элементы[ДобавитьВ]),Форма.Элементы[ВставитьПеред]);
КонецЕсли;
ГруппаДинамическогоСписка.Вид = ВидГруппыФормы.ОбычнаяГруппа;
ГруппаДинамическогоСписка.ОтображатьЗаголовок = Ложь;
ГруппаДинамическогоСписка.Отображение = ОтображениеОбычнойГруппы.Нет;
ГруппаДинамическогоСписка.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
КоманднаяПанельСписка = Элементы.Добавить(ИмяСписка + "КоманднаяПанель2",Тип("ГруппаФормы"),ГруппаДинамическогоСписка);
КоманднаяПанельСписка.Вид = ВидГруппыФормы.КоманднаяПанель;
КонецЕсли;
//Создаем реквизит формы
ТипыРеквизита = Новый Массив;
ТипыРеквизита.Добавить(Тип("ДинамическийСписок"));
ОписаниеТиповДляРеквизита = Новый ОписаниеТипов(ТипыРеквизита);
ДинамическийСписок = Новый РеквизитФормы(ИмяСписка, ОписаниеТиповДляРеквизита,,"",Ложь); //Имя реквизита
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(ДинамическийСписок);
//Задаем свойства реквизиту
Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
РеквизитДинамическийСписок = Форма[ИмяСписка]; //Имя реквизита
Если ТекстЗапроса = "" Тогда
РеквизитДинамическийСписок.ПроизвольныйЗапрос = Ложь;
РеквизитДинамическийСписок.ОсновнаяТаблица = ТаблицаСписка;
Иначе
РеквизитДинамическийСписок.ПроизвольныйЗапрос = Истина;
РеквизитДинамическийСписок.ТекстЗапроса = ТекстЗапроса;
Если ТаблицаСписка <> "" Тогда РеквизитДинамическийСписок.ОсновнаяТаблица = ТаблицаСписка; КонецЕсли;
КонецЕсли;
//Заполняем параметры если они были указаны
Если ПараметрыЗапроса <> Неопределено Тогда
Для Каждого Параметра Из ПараметрыЗапроса Цикл
РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра(Параметра.Ключ,Параметра.Значение);
КонецЦикла;
КонецЕсли;
//Размещаем реквизит на форме
Если Ложь
Или ВставитьПеред = ""
Или СвояКоманднаяПанель //Если своя командная панель тогда нет логики уже в параметре ВставитьПеред
Тогда
ТаблицаФормы = Элементы.Добавить(ИмяСписка,Тип("ТаблицаФормы"),?(СвояКоманднаяПанель,ГруппаДинамическогоСписка,?(ДобавитьВ = "",Форма,Форма.Элементы[ДобавитьВ])));
Иначе
ТаблицаФормы = Элементы.Вставить(ИмяСписка,Тип("ТаблицаФормы"),?(ДобавитьВ = "",Форма,Форма.Элементы[ДобавитьВ]),Форма.Элементы[ВставитьПеред]);
КонецЕсли;
ТаблицаФормы.ПутьКДанным = ИмяСписка; //Имя реквизита
//Если своя панель тогда скрываем стандартную
Если СвояКоманднаяПанель Тогда
Элементы[ИмяСписка].ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;
КонецЕсли;
//Создание колонок на основание МассивКолонок
Для Каждого Элемента Из МассивКолонок Цикл
ПараметрыКолонки = СтрЗаменить(Элемента,",",Символы.ПС);
Если СтрЧислоСтрок(ПараметрыКолонки) > 1 Тогда
Заголовок = СтрПолучитьСтроку(ПараметрыКолонки, 1);
ИмяКолонки = СтрПолучитьСтроку(ПараметрыКолонки, 2);
Иначе
Заголовок = "";
ИмяКолонки = ПараметрыКолонки;
КонецЕсли;
НоваяКолонкаТаблицы = Элементы.Добавить(ИмяСписка + ИмяКолонки, Тип("ПолеФормы"), ТаблицаФормы);
Если Заголовок <> "" Тогда НоваяКолонкаТаблицы.Заголовок = Заголовок; КонецЕсли;
НоваяКолонкаТаблицы.ПутьКДанным = ИмяСписка + "." + ИмяКолонки;
КонецЦикла;
//Задаем действия (События) на основание СписокДействий, если он определен
Если СписокДействий <> Неопределено Тогда
ПереченьСвойств = "ПриИзменении
|Выбор
|ПриАктивизацииСтроки
|ВыборЗначения
|ПриАктивизацииПоля
|ПриАктивизацииЯчейки
|ПередНачаломДобавления
|ПередНачаломИзменения
|ПередУдалением
|ПриНачалеРедактирования
|ПередОкончаниемРедактирования
|ПриОкончанииРедактирования
|ОбработкаВыбора
|ПередРазворачиванием
|ПередСворачиванием
|ПослеУдаления
|ПриСменеТекущегоРодителя
|ОбработкаЗаписиНового
|ПриСохраненииПользовательскихНастроекНаСервере
|ПередЗагрузкойПользовательскихНастроекНаСервере
|ПриЗагрузкеПользовательскихНастроекНаСервере
|ПриОбновленииСоставаПользовательскихНастроекНаСервере
|ОбработкаЗапросаОбновления
|ПриПолученииДанныхНаСервере
|НачалоПеретаскивания
|ПроверкаПеретаскивания
|ОкончаниеПеретаскивания
|Перетаскивание";
Для Счетчик = 1 По 28 Цикл
ИмяСвойства = СтрПолучитьСтроку(ПереченьСвойств, Счетчик);
Элементы[ИмяСписка].УстановитьДействие(ИмяСвойства,?(СписокДействий.Свойство(ИмяСвойства),СписокДействий[ИмяСвойства],""));
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Изменяет свойства элементов формы:
// Параметры:
// Форма - ФормаКлиентскогоПриложения - изменяемая форма
//
// ИмяЭлемента - Строка - имя элемента формы
//
// ИмяСвойства - Строка - имя свойства элемента
//
// ЗначениеСвойства - Произвольный - значение свойства элемента
//
Процедура ИзменитьСвойствоЭлементаФормы(Форма, ИмяЭлемента, ИмяСвойства, ЗначениеСвойства) Экспорт
Элемент = Форма.Элементы[ИмяЭлемента];
Элемент[ИмяСвойства] = ЗначениеСвойства;
КонецПроцедуры
// Форма - ФормаКлиентскогоПриложения - изменяемая форма
//
// ИмяЭлемента - Строка - имя элемента формы
//
// ИмяСвойства - Строка - имя свойства элемента
//
// ЗначениеСвойства - Произвольный - значение свойства элемента
//
Процедура ИзменитьСвойствоЭлементаФормы(Форма, ИмяЭлемента, ИмяСвойства, ЗначениеСвойства) Экспорт
Элемент = Форма.Элементы[ИмяЭлемента];
Элемент[ИмяСвойства] = ЗначениеСвойства;
КонецПроцедуры
0
комментарии
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник