//////////////////////////////////////////////////////////////////////////////////
// Модуль Динамического Формирования Интерфейса
// Начало разработки 26.03.2020 года
// Автор и разработчик: Котов Дмитрий Вадимович
// При поддержеке участников сообщества GitHub & Infostart
// https://github.com/KotovDima1C/DFI
// Инфостарт https://infostart.ru/profile/564942/
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
//Создание описание типов
// Создание описания типа Строка
// ДлинаСтроки - Число - длина строки
Функция ОписаниеТипаСтрока(ДлинаСтроки = 0) Экспорт
Возврат Новый ОписаниеТипов("Строка",,кСтрока(ДлинаСтроки));
// Создание описания типа Число
// ДлинаЧисла - Число - общая длина числа
// ТочностьЧисла - Число - количество символов после запятой
Функция ОписаниеТипаЧисло(ДлинаЧисла = 15,ТочностьЧисла = 2) Экспорт
Возврат Новый ОписаниеТипов("Число",кЧисло(ДлинаЧисла,ТочностьЧисла));
// Создание описания типа ДатаВремя
// ДатаВремя - Строка - Варианты: "ДатаВремя", "Дата" или "Время"
Функция ОписаниеТипаДатаВремя(ДатаВремя = "ДатаВремя") Экспорт
Возврат Новый ОписаниеТипов("Дата",,,кДатаВремя(ДатаВремя));
// Создание типа "Таблица значений"
Функция ОписаниеТипаТаблицаЗначений() Экспорт
МассивТипаВыбора = Новый Массив;
МассивТипаВыбора.Добавить(Тип("ТаблицаЗначений"));
Возврат Новый ОписаниеТипов(МассивТипаВыбора);
// Создание типа "Динамический список"
Функция ОписаниеТипаДинамическийСписок() Экспорт
МассивТипаВыбора = Новый Массив;
МассивТипаВыбора.Добавить(Тип("ДинамическийСписок"));
Возврат Новый ОписаниеТипов(МассивТипаВыбора);
// Создание типа "Булево"
Функция ОписаниеТипаБулево() Экспорт
Возврат Новый ОписаниеТипов("Булево");
// Создание описания ссылочного типа справочника
// ИмяДокумента - Строка - Имя документа в дереве метаданных
Функция ОписаниеТипаДокумент(ИмяДокумента) Экспорт
Возврат Новый ОписаниеТипов("ДокументСсылка." + ИмяДокумента);
// Создание описания ссылочного типа справочника
// ИмяСправочника - Строка - Имя справочника в дереве метаданных
Функция ОписаниеТипаСправочник(ИмяСправочника) Экспорт
Возврат Новый ОписаниеТипов("СправочникСсылка." + ИмяСправочника);
// Создание описания типа перечисление
// ИмяПеречисления - Строка - Имя перечисления в дереве метаданных
Функция ОписаниеТипаПеречисление(ИмяПеречисления) Экспорт
Возврат Новый ОписаниеТипов("ПеречислениеСсылка." + ИмяПеречисления);
///////////////////////////////////////////////////////////////////////////////////
//Создание квалификаторов
// Создание квалификатора для типа Строка
// ДлинаСтроки - Число - длина строки
Функция кСтрока(ДлинаСтроки = 0) Экспорт
Возврат Новый КвалификаторыСтроки(ДлинаСтроки);
// Создание квалификатора для типа Число
// ДлинаЧисла - Число - общая длина числа
// ТочностьЧисла - Число - количество символов после запятой
Функция кЧисло(ДлинаЧисла = 15,ТочностьЧисла = 2) Экспорт
Возврат Новый КвалификаторыЧисла(ДлинаЧисла,ТочностьЧисла);
// Создание квалификатора для типа ДатаВремя
// ДатаВремя - Строка - Варианты: "ДатаВремя", "Дата" или "Время"
Функция кДатаВремя(ДатаВремя = "ДатаВремя") Экспорт
Возврат Новый КвалификаторыДаты(ЧастиДаты[ДатаВремя]);
#Область СозданиеРеквизитовКоманд
// Создание одного реквизита
// Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
// ИмяРеквизита - Строка - Имя реквизита
// ОписаниеТипа - ОписаниеТипа - Описание типа реквизита
Процедура СоздатьРеквизит(Форма,ИмяРеквизита,ОписаниеТипа) Экспорт
структураРеквизитов = Новый Структура;
структураРеквизитов.Вставить(ОчиститьОтЗапрещенныхСимволов(ИмяРеквизита),ОписаниеТипа);
СоздатьРеквизиты(Форма,структураРеквизитов);
// Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
// структураРеквизитов - Структура - Где ключ это Имя реквизита, а значение это описание типа реквизита
Процедура СоздатьРеквизиты(Форма,структураРеквизитов) Экспорт
ДобавляемыеРеквизиты = Новый Массив;
Для Каждого тРеквизит Из структураРеквизитов Цикл
НовыйРеквизит = Новый РеквизитФормы(тРеквизит.Ключ,тРеквизит.Значение);
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
// Создание реквизитов для таблицы
// Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
// ИмяТаблицы - Строка - Имя таблицы куда добавляете реквизиты
// структураРеквизитов - Структура - Где ключ это Имя реквизита, а значение это описание типа реквизита
Процедура СоздатьРеквизитыТаблицы(Форма,ИмяТаблицы,структураРеквизитов) Экспорт
ДобавляемыеРеквизиты = Новый Массив;
Для Каждого тРеквизит Из структураРеквизитов Цикл
НовыйРеквизит = Новый РеквизитФормы(тРеквизит.Ключ,тРеквизит.Значение,ИмяТаблицы);
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
// Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
// ИмяКоманды - Строка - Имя команды
// Заголовок - Строка - Заголовок команды
// ИмяДействия - Строка - Имя процедуры действия команды
// Пример процедуры в модуле формы "Процедура <ИмяДействия>(Команда)"
// СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
Процедура СоздатьКоманду(Форма,
СтруктураСвойств = Неопределено) Экспорт
НоваяКоманда = Форма.Команды.Добавить(ОчиститьОтЗапрещенныхСимволов(ИмяКоманды));
НоваяКоманда.Заголовок = Заголовок;
НоваяКоманда.Действие = ОчиститьОтЗапрещенныхСимволов(ИмяДействия);
ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);
УстановитьСвойстваЭлементу(НоваяКоманда,СтруктураСвойств);
#Область ВспомогательныеФункции
Процедура ЕслиСтруктураНеопределеноТоНовая(текущаяСруктура)
Если текущаяСруктура = Неопределено Тогда
текущаяСруктура = Новый Структура;
Процедура ОпределитьЭлементФормы(Форма,Элемент)
Если Элемент = Неопределено Тогда Возврат КонецЕсли;
Если ТипЗнч(Элемент) = Тип("Строка") Тогда
// может прийти "ИмяТаблицы.КоманднаяПанель"
Иерархия = СтрРазделить(Элемент, ".");
Элемент = Форма.Элементы;
Для Каждого Шаг Из Иерархия Цикл
Процедура ПолучитьСостояниеРастягиванияЭлементаПоГоризонтали(Элемент,Состояние)
Элемент.РастягиватьПоГоризонтали = ИСТИНА;
ИначеЕсли Состояние = 2 Тогда
Элемент.РастягиватьПоГоризонтали = ЛОЖЬ;
Процедура ПолучитьСостояниеРастягиванияЭлементаПоВертикали(Элемент,Состояние)
Элемент.РастягиватьПоВертикали = ИСТИНА;
ИначеЕсли Состояние = 2 Тогда
Элемент.РастягиватьПоВертикали = ЛОЖЬ;
Процедура ПолучитьСостояниеГруппировкиЭлемента(Элемент,Состояние)
Элемент.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
ИначеЕсли Состояние = 2 Тогда
Элемент.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяЕслиВозможно;
ИначеЕсли Состояние = 3 Тогда
Элемент.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
Процедура ПолучитьСостояниеГруппировкиКолонкиЭлемента(Элемент,Состояние)
Элемент.Группировка = ГруппировкаКолонок.Горизонтальная;
ИначеЕсли Состояние = 2 Тогда
Элемент.Группировка = ГруппировкаКолонок.Вертикальная;
ИначеЕсли Состояние = 3 Тогда
Элемент.Группировка = ГруппировкаКолонок.ВЯчейке;
Процедура УстановитьМножествоСтруктурСвойствЭлементу(Элемент,
СтруктураСвойств2 = Неопределено,
СтруктураСвойств3 = Неопределено,
СтруктураСвойств4 = Неопределено,
СтруктураСвойств5 = Неопределено,
СтруктураСвойств6 = Неопределено,
СтруктураСвойств7 = Неопределено,
СтруктураСвойств8 = Неопределено,
СтруктураСвойств9 = Неопределено,
СтруктураСвойств10 = Неопределено) Экспорт
УстановитьСвойстваЭлементу(Элемент,СтруктураСвойств1);
Если СтруктураСвойств2 <> Неопределено Тогда УстановитьСвойстваЭлементу(Элемент,СтруктураСвойств2) КонецЕсли;
Если СтруктураСвойств3 <> Неопределено Тогда УстановитьСвойстваЭлементу(Элемент,СтруктураСвойств3) КонецЕсли;
Если СтруктураСвойств4 <> Неопределено Тогда УстановитьСвойстваЭлементу(Элемент,СтруктураСвойств4) КонецЕсли;
Если СтруктураСвойств5 <> Неопределено Тогда УстановитьСвойстваЭлементу(Элемент,СтруктураСвойств5) КонецЕсли;
Если СтруктураСвойств6 <> Неопределено Тогда УстановитьСвойстваЭлементу(Элемент,СтруктураСвойств6) КонецЕсли;
Если СтруктураСвойств7 <> Неопределено Тогда УстановитьСвойстваЭлементу(Элемент,СтруктураСвойств7) КонецЕсли;
Если СтруктураСвойств8 <> Неопределено Тогда УстановитьСвойстваЭлементу(Элемент,СтруктураСвойств8) КонецЕсли;
Если СтруктураСвойств9 <> Неопределено Тогда УстановитьСвойстваЭлементу(Элемент,СтруктураСвойств9) КонецЕсли;
Если СтруктураСвойств10 <> Неопределено Тогда УстановитьСвойстваЭлементу(Элемент,СтруктураСвойств10) КонецЕсли;
Процедура УстановитьСвойстваЭлементу(Элемент,СтруктураСвойств) Экспорт
Для Каждого тСвойство Из СтруктураСвойств Цикл
Элемент[тСвойство.Ключ] = тСвойство.Значение;
Процедура УстановитьСобытияЭлементу(Элемент,СтруктураСобытий) Экспорт
Для Каждого тСвойство Из СтруктураСобытий Цикл
Элемент.УстановитьДействие(тСвойство.Ключ,тСвойство.Значение);
Процедура УстановитьПараметрыЗапросу(РеквизитДинамическийСписок,ПараметрыЗапроса) Экспорт
Для Каждого Параметра из ПараметрыЗапроса Цикл
РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра(Параметра.Ключ,Параметра.Значение);
Функция СоздатьЭлементФормы(Форма,ИмяЭлемента,ТипЭлемента,РодительЭлемента,ЭлементПеред = Неопределено)
Если ЭлементПеред = Неопределено Тогда
НовыйЭлемент = Форма.Элементы.Добавить(ОчиститьОтЗапрещенныхСимволов(ИмяЭлемента),ТипЭлемента,РодительЭлемента);
НовыйЭлемент = Форма.Элементы.Вставить(ОчиститьОтЗапрещенныхСимволов(ИмяЭлемента),ТипЭлемента,РодительЭлемента,ЭлементПеред);
Процедура СоздатьКолонкиДляТаблицыФормы(Форма,ТаблицаФормы,СтруктураКолонок,ЭтоДС = ЛОЖЬ)
ИмяСписка = ТаблицаФормы.Имя;
Для Каждого тКолонка Из СтруктураКолонок Цикл
ИмяКолонки = тКолонка.Ключ;
НоваяКолонкаТаблицы = СоздатьЭлементФормы(Форма,ИмяСписка + ИмяКолонки,Тип("ПолеФормы"),ТаблицаФормы);
НоваяКолонкаТаблицы.Вид = ?(ЭтоДС,ВидПоляФормы.ПолеНадписи,ВидПоляФормы.ПолеВвода);
Если тКолонка.Значение <> "" Тогда НоваяКолонкаТаблицы.Заголовок = тКолонка.Значение КонецЕсли;
// ++bugfix https://github.com/JusteRU
НоваяКолонкаТаблицы.ПутьКДанным = ТаблицаФормы.ПутьКДанным + "." + ИмяКолонки;
Функция ПолучитьГоризонтальноеПоложение(ШифрПоложения)
Если ШифрПоложения = 1 Тогда
нГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Лево;
ИначеЕсли ШифрПоложения = 2 Тогда
нГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Центр;
ИначеЕсли ШифрПоложения = 3 Тогда
нГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Право;
нГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Авто;
Возврат нГоризонтальноеПоложение;
#Область СозданиеЭлементов
// Создать обычную группу без отображения
// Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
// ИмяГруппы - Строка - Имя элемента на форме
// РодительГруппы - Строка - достаточно указать название элемента формы
// - Элементы - можно в качестве родителя передать элемент формы
// ГруппировкаОбычнойГруппы - Число - Принимаемые значения:
// 2 - ГоризонтальнаяЕслиВозможно
// 3 - ГоризонтальнаяВсегда
// РастягиватьГоризонтально - Число - Принимаемые значения:
// РастягиватьВертикально - Число - Принимаемые значения:
// СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
// ЭлементПеред - Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
// - Элементы - можно передать элемент формы
Функция СздГруппаОбычнаяБезОтображения(Форма,
ГруппировкаОбычнойГруппы = 0,
РастягиватьГоризонтально = 0,
РастягиватьВертикально = 0,
СтруктураСвойств = Неопределено,
ЭлементПеред = Неопределено) Экспорт
ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);
ОпределитьЭлементФормы(Форма,РодительГруппы);
ОпределитьЭлементФормы(Форма,ЭлементПеред);
НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяГруппы,Тип("ГруппаФормы"),РодительГруппы,ЭлементПеред);
НовыйЭлемент.Вид = ВидГруппыФормы.ОбычнаяГруппа;
НовыйЭлемент.Отображение = ОтображениеОбычнойГруппы.Нет;
НовыйЭлемент.ОтображатьЗаголовок = ЛОЖЬ;
ПолучитьСостояниеГруппировкиЭлемента(НовыйЭлемент,ГруппировкаОбычнойГруппы);
ПолучитьСостояниеРастягиванияЭлементаПоГоризонтали(НовыйЭлемент,РастягиватьГоризонтально);
ПолучитьСостояниеРастягиванияЭлементаПоВертикали(НовыйЭлемент,РастягиватьВертикально);
УстановитьСвойстваЭлементу(НовыйЭлемент,СтруктураСвойств);
// Создать обычную группу
// Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
// ИмяГруппы - Строка - Имя элемента на форме
// РодительГруппы - Строка - достаточно указать название элемента формы
// - Элементы - можно в качестве родителя передать элемент формы
// Заголовок - Строка - Заголовок группы
// ГруппировкаОбычнойГруппы - Число - Принимаемые значения:
// 2 - ГоризонтальнаяЕслиВозможно
// 3 - ГоризонтальнаяВсегда
// РастягиватьГоризонтально - Число - Принимаемые значения:
// РастягиватьВертикально - Число - Принимаемые значения:
// СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
// ЭлементПеред - Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
// - Элементы - можно передать элемент формы
Функция СздГруппаОбычная(Форма,
ГруппировкаОбычнойГруппы = 0,
РастягиватьГоризонтально = 0,
РастягиватьВертикально = 0,
СтруктураСвойств = Неопределено,
ЭлементПеред = Неопределено) Экспорт
ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);
ОпределитьЭлементФормы(Форма,РодительГруппы);
ОпределитьЭлементФормы(Форма,ЭлементПеред);
НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяГруппы,Тип("ГруппаФормы"),РодительГруппы,ЭлементПеред);
НовыйЭлемент.Вид = ВидГруппыФормы.ОбычнаяГруппа;
НовыйЭлемент.Отображение = ОтображениеОбычнойГруппы.СлабоеВыделение;
НовыйЭлемент.ОтображатьЗаголовок = ИСТИНА;
ПолучитьСостояниеГруппировкиЭлемента(НовыйЭлемент,ГруппировкаОбычнойГруппы);
ПолучитьСостояниеРастягиванияЭлементаПоГоризонтали(НовыйЭлемент,РастягиватьГоризонтально);
ПолучитьСостояниеРастягиванияЭлементаПоВертикали(НовыйЭлемент,РастягиватьВертикально);
Если Заголовок <> "" Тогда НовыйЭлемент.Заголовок = Заголовок КонецЕсли;
УстановитьСвойстваЭлементу(НовыйЭлемент,СтруктураСвойств);
// Создать группу страниц
// Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
// ИмяГруппы - Строка - Имя элемента на форме
// РодительГруппы - Строка - достаточно указать название элемента формы
// - Элементы - можно в качестве родителя передать элемент формы
// РастягиватьГоризонтально - Число - Принимаемые значения:
// РастягиватьВертикально - Число - Принимаемые значения:
// ПриСменеСтраницы - Строка - При смене страницы???
// СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
// ЭлементПеред - Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
// - Элементы - можно передать элемент формы
Функция СздГруппаСтраниц(Форма,
РастягиватьГоризонтально = 0,
РастягиватьВертикально = 0,
СтруктураСвойств = Неопределено,
ЭлементПеред = Неопределено) Экспорт
ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);
ОпределитьЭлементФормы(Форма,РодительГруппы);
ОпределитьЭлементФормы(Форма,ЭлементПеред);
НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяГруппы,Тип("ГруппаФормы"),РодительГруппы,ЭлементПеред);
НовыйЭлемент.Вид = ВидГруппыФормы.Страницы;
ПолучитьСостояниеРастягиванияЭлементаПоГоризонтали(НовыйЭлемент,РастягиватьГоризонтально);
ПолучитьСостояниеРастягиванияЭлементаПоВертикали(НовыйЭлемент,РастягиватьВертикально);
Если ПриСменеСтраницы <> "" Тогда НовыйЭлемент.ПриСменеСтраницы = ПриСменеСтраницы КонецЕсли;
УстановитьСвойстваЭлементу(НовыйЭлемент,СтруктураСвойств);
// Создать страницу группы страницы
// Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
// ИмяСтраницы - Строка - Имя элемента на форме
// ГруппаСтраницы - Строка - достаточно указать название элемента формы
// - Элементы - можно в качестве родителя передать элемент формы
// Заголовок - Строка - Заголовок страницы
// ГруппировкаОбычнойГруппы - Число - Принимаемые значения:
// 2 - ГоризонтальнаяЕслиВозможно
// 3 - ГоризонтальнаяВсегда
// РастягиватьГоризонтально - Число - Принимаемые значения:
// РастягиватьВертикально - Число - Принимаемые значения:
// СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
// СтраницаПеред - Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
// - Элементы - можно передать элемент формы
Функция СздСтраница(Форма,
ГруппировкаОбычнойГруппы = 0,
РастягиватьГоризонтально = 0,
РастягиватьВертикально = 0,
СтруктураСвойств = Неопределено,
СтраницаПеред = Неопределено) Экспорт
ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);
ОпределитьЭлементФормы(Форма,ГруппаСтраницы);
ОпределитьЭлементФормы(Форма,СтраницаПеред);
НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяСтраницы,Тип("ГруппаФормы"),ГруппаСтраницы,СтраницаПеред);
НовыйЭлемент.Вид = ВидГруппыФормы.Страница;
ПолучитьСостояниеГруппировкиЭлемента(НовыйЭлемент,ГруппировкаОбычнойГруппы);
ПолучитьСостояниеРастягиванияЭлементаПоГоризонтали(НовыйЭлемент,РастягиватьГоризонтально);
ПолучитьСостояниеРастягиванияЭлементаПоВертикали(НовыйЭлемент,РастягиватьВертикально);
Если Заголовок <> "" Тогда НовыйЭлемент.Заголовок = Заголовок КонецЕсли;
УстановитьСвойстваЭлементу(НовыйЭлемент,СтруктураСвойств);
// Создать обычную группу
// Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
// ИмяГруппы - Строка - Имя элемента на форме
// РодительПанели - Строка - достаточно указать название элемента формы
// - Элементы - можно в качестве родителя передать элемент формы
// СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
// ЭлементПеред - Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
// - Элементы - можно передать элемент формы
Функция СздГруппаКоманднаяПанель(Форма,
СтруктураСвойств = Неопределено,
ЭлементПеред = Неопределено) Экспорт
ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);
ОпределитьЭлементФормы(Форма,РодительПанели);
ОпределитьЭлементФормы(Форма,ЭлементПеред);
НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяПанели,Тип("ГруппаФормы"),РодительПанели,ЭлементПеред);
НовыйЭлемент.Вид = ВидГруппыФормы.КоманднаяПанель;
УстановитьСвойстваЭлементу(НовыйЭлемент,СтруктураСвойств);
// Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
// ИмяГруппы - Строка - Имя элемента на форме
// РодительГруппы - Строка - достаточно указать название элемента формы
// - Элементы - можно в качестве родителя передать элемент формы
// СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
// ЭлементПеред - Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
// - Элементы - можно передать элемент формы
ЭлементПеред = Неопределено) Экспорт
ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);
ОпределитьЭлементФормы(Форма,РодительГруппы);
ОпределитьЭлементФормы(Форма,ЭлементПеред);
НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяГруппы,Тип("ГруппаФормы"),РодительГруппы,ЭлементПеред);
УстановитьСвойстваЭлементу(НовыйЭлемент,СтруктураСвойств);
// Создание поля популярных видов
// Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
// ИмяПоля - Строка - Имя элемента на форме
// РодительПоля - Строка - достаточно указать название элемента формы
// - Элементы - можно в качестве родителя передать элемент формы
// Заголовок - Строка - заголовок элемента
// ШифрВидаПоля - Число - возможно указать шифр следующих значений:
// 0 - Без указания типа, тип можно передать в структуре свойств
// ПутьКДанным - Строка - Путь к данным значения
// СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
// СтруктураСобытий - Структура - Содержит значения событий, где ключ название события и в значение название процедуры тип "строка"
// ЭлементПеред - Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
// - Элементы - можно передать элемент формы
СтруктураСвойств = Неопределено,
СтруктураСобытий = Неопределено,
ЭлементПеред = Неопределено) Экспорт
ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);
ЕслиСтруктураНеопределеноТоНовая(СтруктураСобытий);
ОпределитьЭлементФормы(Форма,РодительПоля);
ОпределитьЭлементФормы(Форма,ЭлементПеред);
НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяПоля,Тип("ПолеФормы"),РодительПоля,ЭлементПеред);
Если ШифрВидаПоля <> 0 Тогда
ВидПоля = СокрЛП(СтрПолучитьСтроку(НаборВидов,ШифрВидаПоля));
НовыйЭлемент.Вид = ВидПоляФормы[ВидПоля];
Если Заголовок <> "" Тогда НовыйЭлемент.Заголовок = Заголовок КонецЕсли;
Если ПутьКДанным <> "" Тогда НовыйЭлемент.ПутьКДанным = ПутьКДанным КонецЕсли;
УстановитьСвойстваЭлементу(НовыйЭлемент,СтруктураСвойств);
УстановитьСобытияЭлементу(НовыйЭлемент,СтруктураСобытий);
// Создание поля популярных видов
// Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
// ИмяПоля - Строка - Имя элемента на форме
// РодительПоля - Строка - достаточно указать название элемента формы
// - Элементы - можно в качестве родителя передать элемент формы
// Заголовок - Строка - заголовок элемента
// тВидФлажка - Число - возможные варианты:
// ПутьКДанным - Строка - Путь к данным значения
// СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
// СтруктураСобытий - Структура - Содержит значения событий, где ключ название события и в значение название процедуры тип "строка"
// ЭлементПеред - Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
// - Элементы - можно передать элемент формы
Функция СздПолеФлажок(Форма,
СтруктураСвойств = Неопределено,
СтруктураСобытий = Неопределено,
ЭлементПеред = Неопределено) Экспорт
НовыйЭлемент = СздПоле(Форма,ИмяПоля,РодительПоля,Заголовок,2,ПутьКДанным,СтруктураСвойств,СтруктураСобытий,ЭлементПеред);
Если тВидФлажка <> 0 Тогда
ВидПоля = СокрЛП(СтрПолучитьСтроку(НаборВидов,тВидФлажка));
НовыйЭлемент.ВидФлажка = ВидФлажка[ВидПоля];
//Быстрая функция по созданию декорации надпись
// Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
// ИмяДекорации - Строка - Имя элемента на форме
// РодительДекорации - Строка - достаточно указать название элемента формы
// - Элементы - можно в качестве родителя передать элемент формы
// ЗаголовокДекорации - Строка - текст который содержит декорация
// РастягиватьПоГоризонтали - Булево - растянуть надпись на всю ширину формы
// ЭлементПеред - Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
// - Элементы - можно передать элемент формы
Функция СздДекорацияНадпись(Форма,
РастягиватьПоГоризонтали = ИСТИНА,
ЭлементПеред = Неопределено) Экспорт
ОпределитьЭлементФормы(Форма,РодительДекорации);
ОпределитьЭлементФормы(Форма,ЭлементПеред);
НовыйЭлемент = СздДекорация(Форма,ИмяДекорации,РодительДекорации,,,ЭлементПеред);
НовыйЭлемент.Заголовок = ЗаголовокДекорации;
Если РастягиватьПоГоризонтали Тогда
НовыйЭлемент.АвтоМаксимальнаяШирина = ЛОЖЬ;
НовыйЭлемент.РастягиватьПоГоризонтали = ИСТИНА;
//Быстрая функция по созданию декорации картинки
// Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
// ИмяДекорации - Строка - Имя элемента на форме
// РодительДекорации - Строка - достаточно указать название элемента формы
// - Элементы - можно в качестве родителя передать элемент формы
// ИмяКартинки - Строка - Имя картинки в дереве метаданных
// ЭлементПеред - Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
// - Элементы - можно передать элемент формы
Функция СздДекорацияКартинка(Форма,
ЭлементПеред = Неопределено) Экспорт
НовыйЭлемент = СздДекорация(Форма,ИмяДекорации,РодительДекорации,,,ЭлементПеред);
НовыйЭлемент.Вид = ВидДекорацииФормы.Картинка;
НовыйЭлемент.Картинка = БиблиотекаКартинок[ИмяКартинки];
//Общая функция создания декорации с видом надпись и картинка
// Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
// ИмяДекорации - Строка - Имя элемента на форме
// РодительДекорации - Строка - достаточно указать название элемента формы
// - Элементы - можно в качестве родителя передать элемент формы
// СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
// СтруктураСобытий - Структура - Содержит значения событий, где ключ название события и в значение название процедуры тип "строка"
// ЭлементПеред - Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
// - Элементы - можно передать элемент формы
Функция СздДекорация(Форма,
СтруктураСвойств = Неопределено,
СтруктураСобытий = Неопределено,
ЭлементПеред = Неопределено) Экспорт
ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);
ЕслиСтруктураНеопределеноТоНовая(СтруктураСобытий);
ОпределитьЭлементФормы(Форма,РодительДекорации);
ОпределитьЭлементФормы(Форма,ЭлементПеред);
НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяДекорации,Тип("ДекорацияФормы"),РодительДекорации,ЭлементПеред);
УстановитьСвойстваЭлементу(НовыйЭлемент,СтруктураСвойств);
УстановитьСобытияЭлементу(НовыйЭлемент,СтруктураСобытий);
//Общая функция создания кнопки
// Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
// ИмяКнопки - Строка - Имя элемента на форме
// РодительКнопки - Строка - достаточно указать название элемента формы
// - Элементы - можно в качестве родителя передать элемент формы
// ЗаголовокКнопки - Строка - отображаемый заголовок кнопки
// ИмяКоманды - Строка - Имя команды
// ВидКнопки - Число - Принимаемые значения
// СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
// СтруктураСобытий - Структура - Содержит значения событий, где ключ название события и в значение название процедуры тип "строка"
// ЭлементПеред - Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
// - Элементы - можно передать элемент формы
СтруктураСвойств = Неопределено,
ЭлементПеред = Неопределено) Экспорт
ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);
ОпределитьЭлементФормы(Форма,РодительКнопки);
ОпределитьЭлементФормы(Форма,ЭлементПеред);
//НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяКнопки,Тип("ДекорацияФормы"),РодительКнопки,ЭлементПеред);
НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяКнопки,Тип("КнопкаФормы"),РодительКнопки,ЭлементПеред);
Если ВидКнопки <> 0 Тогда
НаборВидов = "ОбычнаяКнопка
ВидПоля = СокрЛП(СтрПолучитьСтроку(НаборВидов,ВидКнопки));
НовыйЭлемент.Вид = ВидКнопкиФормы[ВидПоля];
Если ЗаголовокКнопки <> "" Тогда НовыйЭлемент.Заголовок = ЗаголовокКнопки; КонецЕсли;
Если ИмяКоманды <> "" Тогда НовыйЭлемент.ИмяКоманды = ИмяКоманды; КонецЕсли;
УстановитьСвойстваЭлементу(НовыйЭлемент,СтруктураСвойств);
// Создаем динамический список версия 2.0
// Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
// ИмяСписка - Строка - Имя будущей таблицы формы
// РодительСписка - Строка - достаточно указать название элемента формы
// - Элементы - можно в качестве родителя передать элемент формы
// ТекстЗапроса - Строка - если не заполнен, то обязательно должен быть заполнен параметр ТаблицаСписка
// ПараметрыЗапроса - Структура - Содержит параметры для запроса, где ключ - имя параметры, а значение соответственно
// ТаблицаСписка - Строка - имя таблицы списка,
// СтруктураКолонок - Структура - Ключ имя колонки в динамическом списке, значение это заголовок колонки
// Для сложных случаев лучше передать "неопределено" и впоспользоваться процедурой формирования колонок таблицы формы этого же модуля ДФИ
// СвояКоманднаяПанель - Булево - используется если требуется снять флаг "Автозаполнение" и наполнить самостоятельно
// Из-за специфики работы, нет программной возможности снятия флага "Автозаполнение", по этому создается своя командная панель, а стандартная скрывается полностью.
// Имя новой командной панели <ИмяСписка>+"КоманднаяПанель2"
// СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
// СтруктураСобытий - Структура - Содержит значения событий, где ключ название события и в значение название процедуры тип "строка"
// ЭлементПеред - Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
// - Элементы - можно передать элемент формы
Функция СздДинамическийСписок(Форма,
ПараметрыЗапроса = Неопределено,
СтруктураКолонок = Неопределено,
СтруктураСвойств = Неопределено,
СтруктураСобытий = Неопределено,
СвояКоманднаяПанель = ЛОЖЬ,
ЭлементПеред = Неопределено
СоздатьРеквизит(Форма,ИмяСписка,ОписаниеТипаДинамическийСписок());
РеквизитДинамическийСписок = Форма[ИмяСписка];
Если ТекстЗапроса = "" Тогда
РеквизитДинамическийСписок.ПроизвольныйЗапрос = ЛОЖЬ;
РеквизитДинамическийСписок.ОсновнаяТаблица = ТаблицаСписка;
РеквизитДинамическийСписок.ПроизвольныйЗапрос = ИСТИНА;
РеквизитДинамическийСписок.ТекстЗапроса = ТекстЗапроса;
Если ТаблицаСписка <> "" Тогда РеквизитДинамическийСписок.ОсновнаяТаблица = ТаблицаСписка; КонецЕсли;
ЕслиСтруктураНеопределеноТоНовая(ПараметрыЗапроса);
УстановитьПараметрыЗапросу(РеквизитДинамическийСписок,ПараметрыЗапроса);
ТаблицаФормы = СздТаблицаФормы(Форма,ИмяСписка,РодительСписка,ИмяСписка,СтруктураКолонок,СтруктураСвойств,СтруктураСобытий,СвояКоманднаяПанель,ЭлементПеред);
// Создаем колонку для Таблицы формы (Динамического списка)
// Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
// ИмяКолонки - Строка - Имя будущей колонки
// ТипКолонки - Число - Принимаемые значения:
// Заголовок - Строка - Заголовок колонки
// ПутьКДанным - Строка - Путь к данным, не забывайте про точку и "Объект", пример "Объект.Товары.Номенклатура"
// СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
// СтруктураСобытий - Структура - Содержит значения событий, где ключ название события и в значение название процедуры тип "строка"
// ЭлементПеред - Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
// - Элементы - можно передать элемент формы
Функция СздКолонкаТаблицыФормы(Форма,
ОтображатьШапку = ИСТИНА,
СтруктураСвойств = Неопределено,
СтруктураСобытий = Неопределено,
ЭлементПеред = Неопределено
ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);
ЕслиСтруктураНеопределеноТоНовая(СтруктураСобытий);
ОпределитьЭлементФормы(Форма,Родитель);
ОпределитьЭлементФормы(Форма,ЭлементПеред);
Если ТипКолонки <> 0 Тогда
НаборВидов = "ПолеНадписи
ВидПоля = СокрЛП(СтрПолучитьСтроку(НаборВидов,ТипКолонки));
НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяКолонки,Тип("ПолеФормы"),Родитель,ЭлементПеред);
НовыйЭлемент.Заголовок = Заголовок;
НовыйЭлемент.Вид = ВидПоляФормы[ВидПоля];
НовыйЭлемент.ПутьКДанным = ПутьКДанным;
НовыйЭлемент.ОтображатьВШапке = ОтображатьШапку;
НовыйЭлемент.ОтображатьВПодвале = ОтображатьПодвал;
УстановитьСвойстваЭлементу(НовыйЭлемент,СтруктураСвойств);
УстановитьСобытияЭлементу(НовыйЭлемент,СтруктураСобытий);
// Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
// ИмяТаблицы - Строка - Имя будущей таблицы
// РодительТаблицы - Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
// - Элементы - можно передать элемент формы
// ПутьКДанным - Строка - Путь к данным реквизита
// СтруктураКолонок - Структура - Содержит значения колонок, где ключ имя колонки и значение это заголовок если необходимо изменить, иначе можно передать ""
// СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
// СтруктураСобытий - Структура - Содержит значения событий, где ключ название события и в значение название процедуры тип "строка"
// СвояКоманднаяПанель - Булево - используется если требуется снять флаг "Автозаполнение" и наполнить самостоятельно
// Из-за специфики работы, нет программной возможности снятия флага "Автозаполнение", по этому создается своя командная панель, а стандартная скрывается полностью.
// Имя новой командной панели <ИмяСписка>+"КоманднаяПанель2"
// ЭлементПеред - Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
// - Элементы - можно передать элемент формы
Функция СздТаблицаФормы(Форма,
СтруктураКолонок = Неопределено,
СтруктураСвойств = Неопределено,
СтруктураСобытий = Неопределено,
СвояКоманднаяПанель = ЛОЖЬ,
ЭлементПеред = Неопределено
ЕслиСтруктураНеопределеноТоНовая(СтруктураКолонок);
ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);
ЕслиСтруктураНеопределеноТоНовая(СтруктураСобытий);
ОпределитьЭлементФормы(Форма,РодительТаблицы);
ОпределитьЭлементФормы(Форма,ЭлементПеред);
Если СвояКоманднаяПанель Тогда
ГруппаДинамическогоСписка = СздГруппаОбычнаяБезОтображения(Форма,"ДополнительнаяГруппаКоманднаяПанель" + ИмяТаблицы,РодительТаблицы,1,1,1,,ЭлементПеред);
КоманднаяПанельСписка = СздГруппаКоманднаяПанель(Форма,ИмяТаблицы + "КоманднаяПанель2",ГруппаДинамическогоСписка);
ТаблицаФормы = СоздатьЭлементФормы(Форма,ИмяТаблицы,Тип("ТаблицаФормы"),ГруппаДинамическогоСписка);
ТаблицаФормы.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;
ТаблицаФормы = СоздатьЭлементФормы(Форма,ИмяТаблицы,Тип("ТаблицаФормы"),РодительТаблицы,ЭлементПеред);
ТаблицаФормы.ПутьКДанным = ПутьКДанным;
СоздатьКолонкиДляТаблицыФормы(Форма,ТаблицаФормы,СтруктураКолонок);
УстановитьСвойстваЭлементу(ТаблицаФормы,СтруктураСвойств);
УстановитьСобытияЭлементу(ТаблицаФормы,СтруктураСобытий);
// Создать обычную группу без отображения
// Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
// ИмяГруппы - Строка - Имя элемента на форме
// РодительГруппы - Строка - достаточно указать название элемента формы
// - Элементы - можно в качестве родителя передать элемент формы
// ГруппировкаГруппы - Число - Принимаемые значения:
// РастягиватьГоризонтально - Число - Принимаемые значения:
// ОтображатьВШапке - Булево - Если необходимо вывести заголовок
// СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
// ЭлементПеред - Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
// - Элементы - можно передать элемент формы
Функция СздГруппаКолонокТаблицыФормы(Форма,
РастягиватьГоризонтально = 0,
СтруктураСвойств = Неопределено,
ЭлементПеред = Неопределено) Экспорт
ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);
ОпределитьЭлементФормы(Форма,РодительГруппы);
ОпределитьЭлементФормы(Форма,ЭлементПеред);
НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяГруппы,Тип("ГруппаФормы"),РодительГруппы,ЭлементПеред);
НовыйЭлемент.Вид = ВидГруппыФормы.ГруппаКолонок;
НовыйЭлемент.ОтображатьВШапке = ОтображатьВШапке;
НовыйЭлемент.Заголовок = Заголовок;
ПолучитьСостояниеГруппировкиКолонкиЭлемента(НовыйЭлемент,ГруппировкаГруппы);
ПолучитьСостояниеРастягиванияЭлементаПоГоризонтали(НовыйЭлемент,РастягиватьГоризонтально);
УстановитьСвойстваЭлементу(НовыйЭлемент,СтруктураСвойств);
// Создание специфического элемента, выпадающий список.
// Создается автоматически строковый реквизит с идентичным названием
// Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
// ИмяСписка - Строка - Имя элемента на форме
// РодительСписка - Строка - достаточно указать название элемента формы
// - Элементы - можно в качестве родителя передать элемент формы
// Заголовок - Строка - отображаемый заголовок кнопки
// МассивЗначений - Массив - массив значений выбора из списка (содержит строковый тип)
// РедактированиеТекста - Булево - Редактирование текста, если ЛОЖЬ, то можно выбирать только из списка
// СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
// СтруктураСобытий - Структура - Содержит значения событий, где ключ название события и в значение название процедуры тип "строка"
// ЭлементПеред - Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
// - Элементы - можно передать элемент формы
Функция СздВыпадающийСписок(Форма,
РедактированиеТекста = ЛОЖЬ,
СтруктураСвойств = Неопределено,
СтруктураСобытий = Неопределено,
ЭлементПеред = Неопределено
СоздатьРеквизит(Форма,ИмяСписка,ОписаниеТипаСтрока(100));
НовыйРеквизит = Форма[ИмяСписка];
НовыйЭлемент = СздПоле(Форма,ИмяСписка,РодительСписка,ЗаголовокЭлемента,1,ИмяСписка,СтруктураСвойств,СтруктураСобытий,ЭлементПеред);
НовыйЭлемент.КнопкаВыпадающегоСписка = ИСТИНА;
Для Каждого текЭлемент Из МассивЗначений Цикл
НовыйЭлемент.СписокВыбора.Добавить(текЭлемент);
Если ЗаголовокЭлемента <> "" Тогда НовыйЭлемент.Заголовок = ЗаголовокЭлемента; КонецЕсли;
НовыйЭлемент.РедактированиеТекста = РедактированиеТекста;
// Создание специфического элемента, переключатель
// Создается автоматически реквизит с типом число с идентичным названием
// Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
// ИмяПереключателя - Строка - Имя элемента на форме
// РодительЭлемента - Строка - достаточно указать название элемента формы
// - Элементы - можно в качестве родителя передать элемент формы
// Заголовок - Строка - отображаемый заголовок кнопки
// МассивЗначений - Массив - Массив значений выбора из списка (содержит строковый тип),
// Важно отметить, что номер в массиве соответствует номеру в списке выбора переключателя.
// тВидПереключателя - Число - Принимает значения:
// СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
// СтруктураСобытий - Структура - Содержит значения событий, где ключ название события и в значение название процедуры тип "строка"
// ЭлементПеред - Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
// - Элементы - можно передать элемент формы
Функция СздПереключатель(Форма,
СтруктураСвойств = Неопределено,
СтруктураСобытий = Неопределено,
ЭлементПеред = Неопределено
СоздатьРеквизит(Форма,ИмяПереключателя,ОписаниеТипаЧисло(10,0));
НовыйРеквизит = Форма[ИмяПереключателя];
НовыйЭлемент = СздПоле(Форма,ИмяПереключателя,РодительЭлемента,ЗаголовокЭлемента,4,ИмяПереключателя,СтруктураСвойств,СтруктураСобытий,ЭлементПеред);
Если ЗаголовокЭлемента <> "" Тогда НовыйЭлемент.Заголовок = ЗаголовокЭлемента; КонецЕсли;
Если тВидПереключателя <> 0 Тогда
НаборВидов = "Переключатель
ВидПоля = СокрЛП(СтрПолучитьСтроку(НаборВидов,тВидПереключателя));
НовыйЭлемент.ВидПереключателя = ВидПереключателя[ВидПоля];
Для Каждого текЭлемент Из МассивЗначений Цикл
НовыйЭлемент.СписокВыбора.Добавить(Счетчик,текЭлемент);
// Создание поля гиперссылки
// Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
// ИмяПоля - Строка - Имя элемента на форме
// РодительПоля - Строка - достаточно указать название элемента формы
// - Элементы - можно в качестве родителя передать элемент формы
// Заголовок - Строка - заголовок элемента
// БезЗаголовка - Булево - по умолчанию заголовок не выводится
// ПутьКДанным - Строка - Путь к данным значения
// СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
// СтруктураСобытий - Структура - Содержит значения событий, где ключ название события и в значение название процедуры тип "строка"
// ЭлементПеред - Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
// - Элементы - можно передать элемент формы
Функция СздПолеГиперссылка(Форма,
СтруктураСвойств = Неопределено,
СтруктураСобытий = Неопределено,
ЭлементПеред = Неопределено) Экспорт
ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);
ЕслиСтруктураНеопределеноТоНовая(СтруктураСобытий);
ОпределитьЭлементФормы(Форма,РодительПоля);
ОпределитьЭлементФормы(Форма,ЭлементПеред);
НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяПоля,Тип("ПолеФормы"),РодительПоля,ЭлементПеред);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеНадписи;
НовыйЭлемент.Гиперссылка = ИСТИНА;
Если БезЗаголовка Тогда НовыйЭлемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет КонецЕсли;
Если Заголовок <> "" Тогда НовыйЭлемент.Заголовок = Заголовок КонецЕсли;
Если ПутьКДанным <> "" Тогда НовыйЭлемент.ПутьКДанным = ПутьКДанным КонецЕсли;
УстановитьСвойстваЭлементу(НовыйЭлемент,СтруктураСвойств);
УстановитьСобытияЭлементу(НовыйЭлемент,СтруктураСобытий);
// Форма - ФормаКлиентскогоПриложения - Форма на которой создаются элементы
// ИмяПоля - Строка - Имя элемента на форме
// РодительПоля - Строка - достаточно указать название элемента формы
// - Элементы - можно в качестве родителя передать элемент формы
// Заголовок - Строка - заголовок элемента
// БезЗаголовка - Булево - по умолчанию заголовок не выводится
// ПутьКДанным - Строка - Путь к данным значения
// СтруктураСвойств - Структура - Содержит значения свойств, где ключ название свойства и значение
// СтруктураСобытий - Структура - Содержит значения событий, где ключ название события и в значение название процедуры тип "строка"
// ЭлементПеред - Строка - достаточно указать название элемента формы перед которым требуется вставить новый элемент
// - Элементы - можно передать элемент формы
Функция СздПолеНадписи(Форма,
СтруктураСвойств = Неопределено,
СтруктураСобытий = Неопределено,
ЭлементПеред = Неопределено) Экспорт
ЕслиСтруктураНеопределеноТоНовая(СтруктураСвойств);
ЕслиСтруктураНеопределеноТоНовая(СтруктураСобытий);
ОпределитьЭлементФормы(Форма,РодительПоля);
ОпределитьЭлементФормы(Форма,ЭлементПеред);
НовыйЭлемент = СоздатьЭлементФормы(Форма,ИмяПоля,Тип("ПолеФормы"),РодительПоля,ЭлементПеред);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеНадписи;
Если БезЗаголовка Тогда НовыйЭлемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет КонецЕсли;
Если Заголовок <> "" Тогда НовыйЭлемент.Заголовок = Заголовок КонецЕсли;
Если ПутьКДанным <> "" Тогда НовыйЭлемент.ПутьКДанным = ПутьКДанным КонецЕсли;
УстановитьСвойстваЭлементу(НовыйЭлемент,СтруктураСвойств);
УстановитьСобытияЭлементу(НовыйЭлемент,СтруктураСобытий);
#Область УдалениеЭлементовИРеквизитов
//Удалить реквизиты ранее созданный программно!
// МассивУдаляемыхРеквизитов - Массив - Содержит строковые типы с именами реквизитов, ТОЛЬКО СОЗДАННЫЕ ПРОГРАММНО!
Процедура УдлРеквизиты(Форма,МассивУдаляемыхРеквизитов) Экспорт
Форма.ИзменитьРеквизиты(,МассивУдаляемыхРеквизитов);
//Удалить реквизит ранее созданный программно!
// ИмяРеквизита - Строка - Имя удаляемого реквизита, ТОЛЬКО СОЗДАННЫЕ ПРОГРАММНО!
Процедура УдлРеквизит(Форма,ИмяРеквизита) Экспорт
МассивУдаляемыхРеквизитов = Новый Массив;
МассивУдаляемыхРеквизитов.Добавить(ИмяРеквизита);
УдлРеквизиты(Форма,МассивУдаляемыхРеквизитов);
//Удалить элементы ранее созданный программно!
// МассивУдаляемыхЭлементов - Массив - Содержит строковые типы с именами удаляемых элементов, ТОЛЬКО СОЗДАННЫЕ ПРОГРАММНО!
Процедура УдлЭлементы(Форма,МассивУдаляемыхЭлементов) Экспорт
Для Каждого текЭлемент Из МассивУдаляемыхЭлементов Цикл
Если Форма.Элементы.Найти(текЭлемент) <> Неопределено Тогда
Форма.Элементы.Удалить(Форма.Элементы[текЭлемент]);
//Удалить элемент ранее созданный программно!
// ИмяРеквизита - Строка - Имя удаляемого элемента на форме, ТОЛЬКО СОЗДАННЫЕ ПРОГРАММНО!
Процедура УдлЭлемент(Форма,ИмяЭлемента) Экспорт
МассивУдаляемыхЭлементов = Новый Массив;
МассивУдаляемыхЭлементов.Добавить(ИмяЭлемента);
УдлЭлементы(Форма,МассивУдаляемыхЭлементов);
//Удалить элемент и реквизит ранее созданный программно!
// ИмяРеквизитаЭлемента - Строка - Имя удаляемого элемента и реквизита на форме СОВПАДАЕТ!!! и ТОЛЬКО СОЗДАННЫЕ ПРОГРАММНО!
Процедура УдлРеквизитИЭлемент(Форма,ИмяРеквизитаЭлемента) Экспорт
УдлРеквизит(Форма,ИмяРеквизитаЭлемента);
УдлЭлемент(Форма,ИмяРеквизитаЭлемента);
//Основные свойства поля ввода
//Заголовок - Строка - Заголовок поля на форме
//Вид - ВидПоляФормы - Вид поля формы клиентского приложения
//ПутьКДанным - Строка - Путь к данным реквизита формы или объекта
//ПоложениеЗаголовка - ПоложениеЗаголовкаЭлементаФормы - Определяет положение заголовка относительно поля в макете формы. Следует заметить, что для отключения вывода заголовка следует установить это свойство в значение Нет.
//Видимость - Булево - Видимость элемента на форме
//Доступность - Булево - Доступность элемента на форме
//ТолькоПросмотр - Булево - Только просмотр элемента на форме
//ПропускатьПриВводе - Булево - Указывает необходимость пропуска поля при вводе данных
//АктивизироватьПоУмолчанию - Булево - Если свойство установлено, данный элемент будет активизирован при открытии формы
//ВажностьПриОтображении - ВажностьПриОтображении - Указывает важность элемента при отображении (используется для адаптации формы к ширине экрана мобильного устройства)
//Маска - Строка - (Поле ввода) Содержит посимвольную строку маски интерактивного ввода текста в поле.
//В строке маски допустимо использование следующих специальных символов:
//! - любой введенный символ преобразуется в верхний регистр;
//9 - допустимо ввести произвольный символ цифры;
//# - допустимо ввести произвольный символ цифры или - (знак минус) или + (знак плюс) или пробел;
//N - допустимо ввести любые алфавитно-цифровые символы (буквы или цифры);
//U - допустимо ввести любые алфавитно-цифровые символы (буквы или цифры) и любой введенный символ преобразуется в верхний регистр;
//X (латинского алфавита) - допустимо ввести произвольный символ;
//^ - недопустимо вводить этот символ интерактивно пользователем, он может устанавливаться только из языка;
//h - допустим ввод символов обозначения шестнадцатеричных цифр;
//@ - допустимо ввести любые алфавитно-цифровые символы (буквы или цифры) в верхнем регистре или пробел.
//Если в маске из специальных символов используются только символы "@", то все символы текста, соответствующие символам маски, не являющимся специальными символами, удаляются после последнего непустого блока из символов "@". Например, при маске "@@.@@.@@." текст "41. 2. ." преобразуется в "41.2".
//Для того, чтобы использовать в маске один из специальных символов, нужно использовать перед ним символ "\".
//Допускается указание нескольких масок в одном параметре. Маски разделяются символом ";". В этом случае использоваться будет та маска, к которой подходит введенный текст.
//РежимПароля - Булево - (Поле ввода, поле надписи) Содержит признак специального режима для ввода пароля, в котором все вводимые символы отображаются символом "*" (звездочка).
//МногострочныйРежим - Булево - Управляет многострочным режимом в поле ввода.
//РасширенноеРедактирование - Булево - (Поле ввода) Если свойство установлено в Истина, то включается расширенный режим редактирования, при котором само поле ввода обрабатывает нажатие клавиши TAB (в текст вставляется символ табуляции и переход к следующему полю не происходит), а также доступен поиск по тексту с помощью стандартных действий.
//Гиперссылка - Булево - (Поле надписи, поле картинки) можно обработать событие гиперссылки "ОбработкаНавигационнойСсылки"
Функция СтруктураСвойствОсновные(Заголовок = "",
ПоложениеЗаголовка = Неопределено,
Видимость = Неопределено,
Доступность = Неопределено,
ТолькоПросмотр = Неопределено,
ПропускатьПриВводе = Неопределено,
АктивизироватьПоУмолчанию = Неопределено,
РежимПароля = Неопределено,
МногострочныйРежим = Неопределено,
РасширенноеРедактирование = Неопределено,
Гиперссылка = Неопределено) Экспорт
СтруктураСвойств = Новый Структура;
Если Заголовок <> "" Тогда СтруктураСвойств.Вставить("Заголовок",Заголовок) КонецЕсли;
Если Вид <> Неопределено Тогда СтруктураСвойств.Вставить("Вид",Вид) КонецЕсли;
Если ПутьКДанным <> "" Тогда СтруктураСвойств.Вставить("ПутьКДанным",ПутьКДанным) КонецЕсли;
Если ПоложениеЗаголовка <> Неопределено Тогда СтруктураСвойств.Вставить("ПоложениеЗаголовка",ПоложениеЗаголовка) КонецЕсли;
Если Видимость <> Неопределено Тогда СтруктураСвойств.Вставить("Видимость",Видимость) КонецЕсли;
Если Доступность <> Неопределено Тогда СтруктураСвойств.Вставить("Доступность",Доступность) КонецЕсли;
Если ТолькоПросмотр <> Неопределено Тогда СтруктураСвойств.Вставить("ТолькоПросмотр",ТолькоПросмотр) КонецЕсли;
Если ПропускатьПриВводе <> Неопределено Тогда СтруктураСвойств.Вставить("ПропускатьПриВводе",ПропускатьПриВводе) КонецЕсли;
Если АктивизироватьПоУмолчанию <> Неопределено Тогда СтруктураСвойств.Вставить("АктивизироватьПоУмолчанию",АктивизироватьПоУмолчанию) КонецЕсли;
Если Маска <> "" Тогда СтруктураСвойств.Вставить("Маска",Маска) КонецЕсли;
Если РежимПароля <> Неопределено Тогда СтруктураСвойств.Вставить("РежимПароля",РежимПароля) КонецЕсли;
Если МногострочныйРежим <> Неопределено Тогда СтруктураСвойств.Вставить("МногострочныйРежим",МногострочныйРежим) КонецЕсли;
Если РасширенноеРедактирование <> Неопределено Тогда СтруктураСвойств.Вставить("РасширенноеРедактирование",РасширенноеРедактирование) КонецЕсли;
Если Гиперссылка <> Неопределено Тогда СтруктураСвойств.Вставить("Гиперссылка",Гиперссылка) КонецЕсли;
Возврат СтруктураСвойств;
// Подсказка - Строка - Текст подсказки
// ОтображениеПодсказки - ОтображениеПодсказки - Задает способ отображения подсказки элемента формы
// ПодсказкаВвода - Строка - Текст подсказки ввода в поле формы
Функция СтруктураСвойствПодсказка(Подсказка = Неопределено,
ОтображениеПодсказки = Неопределено,
ПодсказкаВвода = Неопределено) Экспорт
СтруктураСвойств = Новый Структура;
Если Подсказка <> Неопределено Тогда СтруктураСвойств.Вставить("Подсказка",Подсказка) КонецЕсли;
Если ОтображениеПодсказки <> Неопределено Тогда СтруктураСвойств.Вставить("ОтображениеПодсказки",ОтображениеПодсказки) КонецЕсли;
Если ПодсказкаВвода <> Неопределено Тогда СтруктураСвойств.Вставить("ПодсказкаВвода",ПодсказкаВвода) КонецЕсли;
Возврат СтруктураСвойств;
// Ширина - Число - Ширина элемента
// Высота - Число - Высота элемента
// АвтоМаксимальнаяШирина - Булево - Отключение автоматической ширины
// МаксимальнаяШирина - Число - Максимальная ширина элемента на форме, работает если АвтоМаксимальнаяШирина - ОТКЛЮЧЕНА
// АвтоМаксимальнаяВысота - Булево - Отключение автоматической высоты
// МаксимальнаяВысота - Число - Максимальная высота элемента на форме, работает если АвтоМаксимальнаяВысота - ОТКЛЮЧЕНА
// РастягиватьПоГоризонтали - Булево - Если требуется принудительно задать автоматическое растягивание по ширине
// РастягиватьПоВертикали - Булево - Если требуется принудительно задать автоматическое растягивание по высоте
// тГоризонтальноеПоложение - Число - Принимаемые значения:
// тГоризонтальноеПоложениеВШапке - Число - Принимаемые значения:
// тГоризонтальноеПоложениеВПодвале - Число - Принимаемые значения:
Функция СтруктураСвойствРасположение(Ширина = Неопределено,
АвтоМаксимальнаяШирина = Неопределено,
МаксимальнаяШирина = Неопределено,
АвтоМаксимальнаяВысота = Неопределено,
МаксимальнаяВысота = Неопределено,
РастягиватьПоГоризонтали = Неопределено,
РастягиватьПоВертикали = Неопределено,
тГоризонтальноеПоложение = Неопределено,
тГоризонтальноеПоложениеВШапке = Неопределено,
тГоризонтальноеПоложениеВПодвале = Неопределено) Экспорт
СтруктураСвойств = Новый Структура;
Если Ширина <> Неопределено Тогда СтруктураСвойств.Вставить("Ширина",Ширина) КонецЕсли;
Если Высота <> Неопределено Тогда СтруктураСвойств.Вставить("Высота",Высота) КонецЕсли;
Если АвтоМаксимальнаяШирина <> Неопределено Тогда СтруктураСвойств.Вставить("АвтоМаксимальнаяШирина",АвтоМаксимальнаяШирина) КонецЕсли;
Если МаксимальнаяШирина <> Неопределено Тогда СтруктураСвойств.Вставить("МаксимальнаяШирина",МаксимальнаяШирина) КонецЕсли;
Если АвтоМаксимальнаяВысота <> Неопределено Тогда СтруктураСвойств.Вставить("АвтоМаксимальнаяВысота",АвтоМаксимальнаяВысота) КонецЕсли;
Если МаксимальнаяВысота <> Неопределено Тогда СтруктураСвойств.Вставить("МаксимальнаяВысота",МаксимальнаяВысота) КонецЕсли;
Если РастягиватьПоГоризонтали <> Неопределено Тогда СтруктураСвойств.Вставить("РастягиватьПоГоризонтали",РастягиватьПоГоризонтали) КонецЕсли;
Если РастягиватьПоВертикали <> Неопределено Тогда СтруктураСвойств.Вставить("РастягиватьПоВертикали",РастягиватьПоВертикали) КонецЕсли;
Если тГоризонтальноеПоложение <> Неопределено Тогда СтруктураСвойств.Вставить("ГоризонтальноеПоложение",ПолучитьГоризонтальноеПоложение(тГоризонтальноеПоложение)) КонецЕсли;
Если тГоризонтальноеПоложениеВШапке <> Неопределено Тогда СтруктураСвойств.Вставить("ГоризонтальноеПоложениеВШапке",ПолучитьГоризонтальноеПоложение(тГоризонтальноеПоложениеВШапке)) КонецЕсли;
Если тГоризонтальноеПоложениеВПодвале <> Неопределено Тогда СтруктураСвойств.Вставить("ГоризонтальноеПоложениеВПодвале",ПолучитьГоризонтальноеПоложение(тГоризонтальноеПоложениеВПодвале)) КонецЕсли;
Возврат СтруктураСвойств;
// Отображение - ОтображениеТаблицы - Отображение данных в таблице
// РежимВводаСтрок - РежимВводаСтрокТаблицы - Режим ввода строк в таблице
// РежимВыделения - РежимВыделенияТаблицы - Определяет режим выделения строк в таблице
// РежимВыделенияСтроки - РежимВыделенияСтрокиТаблицы - Определяет режим выделения строки в таблице
// Шапка - Булево - Определяет наличие шапки у таблицы
// Подвал - Булево - Определяет наличие подвала у таблицы
// АвтоВводНовойСтроки - Булево - Содержит признак автоматического ввода новой строки после заполнения текущей
// ВысотаВСтрокахТаблицы - Число - Содержит высоту таблицы. Задается в строках. Указывает количество строк, отображаемых в области данных таблицы. Таблица занимает такую высоту, чтобы разместились шапка, подвал и заданное число строк в области данных. Число строк в общем случае не является числом записей данных, отображаемых в таблице, так как одна запись данных может выводиться в несколько строк таблицы. Более того, разные строки данных могут занимать разную высоту
Функция СтруктураСвойствТаблицыФормы(Отображение = Неопределено,
РежимВводаСтрок = Неопределено,
РежимВыделения = Неопределено,
РежимВыделенияСтроки = Неопределено,
АвтоВводНовойСтроки = Неопределено,
ВысотаВСтрокахТаблицы = Неопределено) Экспорт
СтруктураСвойств = Новый Структура;
Если Отображение <> Неопределено Тогда СтруктураСвойств.Вставить("Отображение",Отображение) КонецЕсли;
Если РежимВводаСтрок <> Неопределено Тогда СтруктураСвойств.Вставить("РежимВводаСтрок",РежимВводаСтрок) КонецЕсли;
Если РежимВыделения <> Неопределено Тогда СтруктураСвойств.Вставить("РежимВыделения",РежимВыделения) КонецЕсли;
Если РежимВыделенияСтроки <> Неопределено Тогда СтруктураСвойств.Вставить("РежимВыделенияСтроки",РежимВыделенияСтроки) КонецЕсли;
Если Шапка <> Неопределено Тогда СтруктураСвойств.Вставить("Шапка",Шапка) КонецЕсли;
Если Подвал <> Неопределено Тогда СтруктураСвойств.Вставить("Подвал",Подвал) КонецЕсли;
Если АвтоВводНовойСтроки <> Неопределено Тогда СтруктураСвойств.Вставить("АвтоВводНовойСтроки",АвтоВводНовойСтроки) КонецЕсли;
Если ВысотаВСтрокахТаблицы <> Неопределено Тогда СтруктураСвойств.Вставить("ВысотаВСтрокахТаблицы",ВысотаВСтрокахТаблицы) КонецЕсли;
Возврат СтруктураСвойств;
#Область СлужебныеПроцедурыИФункции
// Функция - Очистить от запрещенных символов
// ПроверяемаяСтрока - Строка - Имя элемента
// ДопРазрешенныеСимволы - Строка - Дополнительно разрешенные символы
// Возвращаемое значение:
// Строка - Имя элемента очищенное от запрещенных символов
Функция ОчиститьОтЗапрещенныхСимволов(ПроверяемаяСтрока, ДопРазрешенныеСимволы = Неопределено)
Если НЕ ЗначениеЗаполнено(ПроверяемаяСтрока) Тогда
Возврат ПроверяемаяСтрока;
РазрешенныеСимволы = "абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ" +
"abcdefghijklmnopqrstuvwxyzQWERTYUIOPASDFGHJKLZXCVBNM" +
Если ЗначениеЗаполнено(ДопРазрешенныеСимволы) Тогда
РазрешенныеСимволы = РазрешенныеСимволы + ДопРазрешенныеСимволы;
Для Сч = 1 по СтрДлина(СокрЛП(ПроверяемаяСтрока)) Цикл
ТекСимв = Сред(ПроверяемаяСтрока, Сч, 1);
Если Найти(РазрешенныеСимволы, ТекСимв) > 0 Тогда
ОчищеннаяСтрока = ОчищеннаяСтрока + ТекСимв;