Программное рисование форм для F³
Нарисовал программно номер и дату документа в формах.
Сначала получились большие непонятные пустые пространства, раскрасил их чтобы понять причину:

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

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

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




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