Программное рисование форм для F³

Нарисовал программно номер и дату документа в формах.

Сначала получились большие непонятные пустые пространства, раскрасил их чтобы понять причину:

Потом вспомнил что это из-за того, что выводятся заголовки, отключил их, в цвете получилось так:

В обычном виде компактно:

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

Объем: 1.5 час

Код по созданию формы пока выглядит так:


Функция СоздатьЭлементы(Форма) Экспорт
	
	СоздатьГруппыШапки(Форма);
	СоздатьЭлементыШапки(Форма);
	СоздатьГруппыТаблиц(Форма); 
	СоздатьЭлементыТаблиц(Форма);
	
КонецФункции

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

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


Функция СоздатьЭлементыШапки(Форма) Экспорт
	
	Элементы = Форма.Элементы;
	
	ДП = Новый Структура("Заголовок, Ширина, АвтомаксимальнаяШирина, РастягиватьПоГоризонтали", "№", 9, ложь, ложь);
	СоздатьЭлементФормы(Форма, "Номер", "ГруппаНомерДата", , , , "Объект.Номер", ДП); 

	ДП = Новый Структура("Заголовок, Ширина, АвтомаксимальнаяШирина, РастягиватьПоГоризонтали", "от", 12, ложь, ложь);
	СоздатьЭлементФормы(Форма, "Дата", "ГруппаНомерДата", , , , "Объект.Дата", ДП); 
	
КонецФункции


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

	Если Форма.Элементы.Найти("СтраницаМарки")  = Неопределено Тогда
		Группа = Форма.Элементы.Вставить("СтраницаМарки", Тип("ГруппаФормы"), Элементы.Страницы);
		Группа.Вид = ВидГруппыФормы.Страница;
		Группа.Заголовок = "Марки";
	КонецЕсли;
	
	Если Форма.Элементы.Найти("СтраницаДополнительно") = Неопределено Тогда
		Группа = Форма.Элементы.Вставить("СтраницаДополнительно", Тип("ГруппаФормы"), Элементы.Страницы);
		Группа.Вид = ВидГруппыФормы.Страница;
		Группа.Заголовок = "Дополнительно";
	КонецЕсли;
	
	
КонецФункции

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


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


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

image_pdfimage_print

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Вам может также понравиться...

комментария 2

  1. rzd:

    И ничего на GitHub

    • да, я пока работаю над программной генерацией форм, думаю, как сделаю, можно будет и на гиты выложить…

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *