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