К этой публикации меня подвигла работа, которую недавно выполнял. Пришлось перенести функционал десятка расширений в одно. К сожалению, изменения в одних и тех же объектах в разных расширениях для "ходовых" объекта не исключение, а скорее правило. И такая работа по переносу функционала превращается в занятие не для слабонервных.
Сам стараюсь в расширениях изменения в конструкторе форм не практиковать. Но встречаюсь с таким часто. Не исключение, когда у заказчика есть (или было) несколько подрядчиков. И каждый ведет собственное расширение. Чтобы не делить ответственность. Как следствие - изменение одних и тех же объектов в разных расширениях, под разные задачи, не редкое явление.
Ни коим образом не претендую на полноту и строгость реализации. Высокая скорость разработки как раз и достигается за счет вырождения некоторых возможностей и использования значений по умолчанию. Например, в моей реализации функций создания полей сразу создаются одноименные реквизиты и поля ввода. Зато быстро и без лишних раздумий. Такие значения удобны мне, но каждый может допилить под собственные предпочтения и взгляды на построение интерфейса.
Функции достаточно подробно описаны в коде. Используемые умолчания расположены, как правило, в верху кода функции.
Тем, кто реализует программно сложные формы очень рекомендую шпаргалку, которой сам пользуюсь в сложных случаях. Она имеет заслуженно высокую оценку.
//infostart.ru/1c/articles/1118319/?ysclid=lta3h29kir838274485#_Toc18589857
Цель моей публикации - поделиться функциями, которые лично у меня отбили охоту делать лишние изменения в конструкторе управляемой формы. С их помощью, в большинстве случаев, программное создание даже быстрее, чем интерактивное.
Конечно, никакого прямого запрета нет. Изменения в конструкторе не запрещены. Никаких нехороших последствий немедленно не наступает. Но со временем и ростом количества расширений это превращается в раздражающую проблему. И для Вас и для других участников разработки. Добавляя Вам их проклятия в карму. Оно Вам надо?
Концентрация же новых реквизитов и элементов в процедуре формы "ПриСозданииНаСервере" делает Ваши изменения более понятными и легко обнаруживаемыми. И более устойчивыми к обновлению формы.
Надо только следить, чтобы не исчезли группы формы типовой конфигурации, на которые Вы опирались при создании новых элементов. И стараться их выбирать исходя из разумных предположений.
Для демонстрации методики использования фукций модуля я сделал простую обработку. Вы сами можете ее повторить. Просто создайте новую обработку с формой. И поместите следующие тексты в модуль обработки и модуль формы. Не забудьте назначить в форме обработчик события "ПриСозданииНаСервере".
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Обработка = РеквизитФормыВЗначение("Объект");
//Описываем типы
ТипЧисло = Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(10, 2));
ТипСтрока = Новый ОписаниеТипов("Строка", , , , Новый КвалификаторыСтроки(1000));
ТипДата = Новый ОписаниеТипов("Дата", , , , , Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя));
ТипБулево = Новый ОписаниеТипов("Булево");
ТипДополнительноеЗначение = Новый ОписаниеТипов("СправочникСсылка.ЗначенияСвойствОбъектов");
//Создаем новую группу страниц и страницу
ГруппаСтраниц = Обработка.СоздатьГруппу(ЭтотОбъект, ВидГруппыФормы.Страницы, "ГруппаСтраниц", ЭтотОбъект);
ГруппаСтраница = Обработка.СоздатьГруппу(ЭтотОбъект, ВидГруппыФормы.Страница, "ГруппаСтраница", ГруппаСтраниц, "Демонстрация", ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда);
//Создаем две обычные группы
ГруппаЛево = Обработка.СоздатьГруппу(ЭтотОбъект, ВидГруппыФормы.ОбычнаяГруппа, "ГруппаЛево", ГруппаСтраница);
ГруппаПраво = Обработка.СоздатьГруппу(ЭтотОбъект, ВидГруппыФормы.ОбычнаяГруппа, "ГруппаПраво", ГруппаСтраница);
//Создаем поля и реквизиты простых типов
Обработка.СоздатьПолеСРеквизитом(ЭтотОбъект, "РеквизитЧисло", ТипЧисло, ГруппаЛево, "Поле число");
Обработка.СоздатьПолеСРеквизитом(ЭтотОбъект, "РеквизитСтрока", ТипСтрока, ГруппаПраво, "Поле строка");
Обработка.СоздатьПолеСРеквизитом(ЭтотОбъект, "РеквизитДата", ТипДата, ГруппаЛево, "Поле дата");
Обработка.СоздатьПолеСРеквизитом(ЭтотОбъект, "РеквизитФлаг", ТипБулево, ГруппаЛево, "Флаг", ВидПоляФормы.ПолеФлажка);
//Создаем тестовое свойство, поле и реквизит для ввода дополнительных значений
ИмяДополнительногоСведения = "ДополнительноеСвойствоТест";
Свойство = Обработка.ПолучитьСоздатьСвойство(ИмяДополнительногоСведения, ТипДополнительноеЗначение, , , , "Дополнительное свойство");
Обработка.СоздатьПолеДопЗначения(ЭтотОбъект, ИмяДополнительногоСведения, ГруппаЛево, Свойство.Наименование);
//Создаем кнопку привет
Обработка.СоздатьКнопку(ЭтотОбъект, "КомандаПоказатьСтроку", ГруппаПраво, "Показать строку");
//Создаем свертываемую группу и создаем и заполняем поле картинки
ГруппаКартинка = Обработка.СоздатьГруппу(ЭтотОбъект, ВидГруппыФормы.ОбычнаяГруппа, "ГруппаКартинка", ГруппаЛево, "Картинка", , ПоведениеОбычнойГруппы.Свертываемая, Ложь);
Обработка.СоздатьПолеСРеквизитом(ЭтотОбъект, "АдресКартинки", ТипСтрока, ГруппаКартинка, , ВидПоляФормы.ПолеКартинки);
Картинка = БиблиотекаКартинок.Календарь;
ЭтотОбъект.АдресКартинки = ПоместитьВоВременноеХранилище(Картинка.ПолучитьДвоичныеДанные());
Элементы.АдресКартинки.РазмерКартинки = РазмерКартинки.Пропорционально;
КонецПроцедуры
&НаКлиенте
Процедура КомандаПоказатьСтроку(Команда)
Если ЗначениеЗаполнено(ЭтотОбъект.РеквизитСтрока) Тогда
ПоказатьПредупреждение(, ЭтотОбъект.РеквизитСтрока);
Иначе
ПоказатьПредупреждение(, "Чтобы что то увидеть введите строку.");
КонецЕсли;
КонецПроцедуры
Запускаем и убеждаемся в работоспособности кода. Результат должен быть примерно такой:
Картинка свертывается. Кнопка работает.
Убедившись что работает, код модуля обработки можно перенести в общий модуль. Например, свой. Или тематический.
В форме обработки имеем примеры вызова функций модуля для быстрого создания основных типов полей.
Лично я пользуюсь с удовольствием. Чего и Вам желаю.
Обработка писалась и тестировалась на версии платформы 8.3.22.2411. Конфигурация, думаю, значения не имеет.
Как-то так.
Удачного плавания. Надеюсь, что прочитав это, кто-то будет меньше изменять формы в конструкторе.