Как известно, расширение может быть выгружено в файлы и собрано из файлов. Значит, можно подготовить файлы, из которых расширение будет собрано, даже если раньше его не существовало. Файлы эти должны соответствовать некоторым требованиям, но легко могут быть созданы программно штатными средствами. Что, собственно, и было выполнено для самых основных объектов. Сразу предупреждаю: работы с формами, общими макетами, общими картинками и собственными прикладными объектами тут нет. По формам и макетам уже достаточно публикаций. Данная работа просто иллюстрирует имеющуюся возможность и может быть превращена в полноценное решение.
Можно создать новое расширение. Можно модифицировать имеющееся. Инструментарий для чтения хмл-файлов, ввиду их невеликих размеров, может быть любой из предложенного в платформе. Я некоторое время раздумывал, а не вытащить ли xsd из платформы для полноценного xdto, но всё-таки остановился на классическом DOM, его в случае изменений платформы проще допиливать, да он и прозрачнее.
Для объектов принята единая нотация. Самое главное - идентификаторы. В приведённом примере они генерируются в коде, и если такой код запускать каждый раз, то, очевидно, "УникальныйИдентификатор" каждый раз будет возвращать новые значения. Поэтому для практического применения рекомендуется единожды эти ID создать, где-то зафиксировать, и передавать и при первом создании, и при программных обновлениях/изменениях. Свойства объектов максимально приближены к описанным в метаданных, задействованы системные перечисления из свойств метаданных.
#Область СлужебныеВспомогательныеМеханизмы
&НаСервереБезКонтекста
Функция ПревращениеИмениВНаименование(рСтрока) Экспорт
Если СтрДлина(рСтрока)<=1 Тогда Возврат рСтрока КонецЕсли;
сим=Сред(рСтрока,1,1);
рПредВерхний=(ВРег(сим)=сим);
резстро=сим;
Для й=2 По СтрДлина(рСтрока) Цикл
сим=Сред(рСтрока,й,1);
Если сим="_" Тогда сим="." КонецЕсли;
рТекВерхний=(ВРег(сим)=сим);
Если рТекВерхний и не рПредВерхний Тогда
резстро=резстро+" "+НРег(сим);
Иначе
резстро=резстро+сим;
КонецЕсли;
рПредВерхний=рТекВерхний;
КонецЦикла;
Возврат резстро;
КонецФункции
&НаСервереБезКонтекста
Процедура ЗаписатьОбъявленияПространствИмён(Узел)
Узел.УстановитьСоответствиеПространстваИмен("","http://v8.1c.ru/8.3/MDClasses"); // основное
Узел.УстановитьСоответствиеПространстваИмен("app","http://v8.1c.ru/8.2/managed-application/core");
Узел.УстановитьСоответствиеПространстваИмен("cfg","http://v8.1c.ru/8.1/data/enterprise/current-config");
Узел.УстановитьСоответствиеПространстваИмен("cmi","http://v8.1c.ru/8.2/managed-application/cmi");
Узел.УстановитьСоответствиеПространстваИмен("ent","http://v8.1c.ru/8.1/data/enterprise");
Узел.УстановитьСоответствиеПространстваИмен("lf","http://v8.1c.ru/8.2/managed-application/logform");
Узел.УстановитьСоответствиеПространстваИмен("style","http://v8.1c.ru/8.1/data/ui/style");
Узел.УстановитьСоответствиеПространстваИмен("sys","http://v8.1c.ru/8.1/data/ui/fonts/system");
Узел.УстановитьСоответствиеПространстваИмен("v8","http://v8.1c.ru/8.1/data/core");
Узел.УстановитьСоответствиеПространстваИмен("v8ui","http://v8.1c.ru/8.1/data/ui");
Узел.УстановитьСоответствиеПространстваИмен("web","http://v8.1c.ru/8.1/data/ui/colors/web");
Узел.УстановитьСоответствиеПространстваИмен("win","http://v8.1c.ru/8.1/data/ui/colors/windows");
Узел.УстановитьСоответствиеПространстваИмен("xen","http://v8.1c.ru/8.3/xcf/enums");
Узел.УстановитьСоответствиеПространстваИмен("xpr","http://v8.1c.ru/8.3/xcf/predef");
Узел.УстановитьСоответствиеПространстваИмен("xr","http://v8.1c.ru/8.3/xcf/readable");
Узел.УстановитьСоответствиеПространстваИмен("xs","http://www.w3.org/2001/XMLSchema");
Узел.УстановитьСоответствиеПространстваИмен("xsi","http://www.w3.org/2001/XMLSchema-instance");
КонецПроцедуры
&НаСервереБезКонтекста
Функция ЗаписатьДокументДОМ(док)
хмл=Новый ЗаписьXML;
хмл.УстановитьСтроку("UTF-8");
рЗапись=Новый ЗаписьDOM;
рЗапись.Записать(док,хмл);
резСтрока=хмл.Закрыть();
резСтрока=СтрЗаменить(резСтрока,""","""");
Возврат резСтрока;
КонецФункции
&НаСервереБезКонтекста
Функция СоздатьТекстовыйУзелДОМ(док, ИмяУзла, ТекстУзла)
Попытка
рУзел=док.СоздатьЭлемент(СокрЛП(ИмяУзла));
рУзел.ТекстовоеСодержимое=ТекстУзла;
Возврат рУзел;
Исключение
Сообщить("СоздатьТекстовыйУзелДОМ, общая ошибка: "+ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции
&НаСервереБезКонтекста
Функция СоздатьЛокализованныйТекстовыйУзелДОМ(док, ИмяУзла="v8:item", ТекстУзла, ЯзыкУзла="ru")
Попытка
рУзел=док.СоздатьЭлемент(СокрЛП(ИмяУзла));
рУзел.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "v8:lang", СокрЛП(ЯзыкУзла)));
рУзел.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "v8:content", ТекстУзла));
Возврат рУзел;
Исключение
Сообщить("СоздатьЛокализованныйТекстовыйУзелДОМ, общая ошибка: "+ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции
&НаСервереБезКонтекста
Функция БулевоСтрокой(Значение)
Возврат Формат(Значение,"БЛ=false; БИ=true");
КонецФункции
&НаСервереБезКонтекста
Процедура ЗаписатьИмяСинонимКомментарий(док, Узел, ВходПараметры)
Узел.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "Name", ВходПараметры.Имя));
Узел_Synonym=док.СоздатьЭлемент("Synonym");
Узел_Synonym.ДобавитьДочерний(СоздатьЛокализованныйТекстовыйУзелДОМ(док, , ВходПараметры.Синоним));
Узел.ДобавитьДочерний(Узел_Synonym);
Узел.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "Comment", ВходПараметры.Комментарий));
КонецПроцедуры
// Используем собственную механику, без применения сериализации XDTO - во-первых, в запущенной конфигурации некоторых типов может не быть; во-вторых, мнение платформы по формату
// представления типов может отличаться от принятого для XDTO; в третьих, так более управляемо и прозрачно.
//
&НаСервереБезКонтекста
Функция СоздатьУзелОписанияТипов(док, ИмяУзла="Type", ОписТипов)
рУзелОписТипов=док.СоздатьЭлемент(СокрЛП(ИмяУзла));
Если ТипЗнч(ОписТипов)=Тип("ОписаниеТипов") Тогда
Для каждого рТип Из ОписТипов.Типы() Цикл
#Область ОпределениеИмениТегаТипаИПредставленияТипа
рИмяТегаТипа="v8:Type";
Если ТипЗнч(рТип)=Тип("Тип") Тогда
Если рТип=Тип("Число") Тогда
стрТип="xs:decimal";
ИначеЕсли рТип=Тип("Строка") Тогда
стрТип="xs:string";
ИначеЕсли рТип=Тип("Дата") Тогда
стрТип="xs:dateTime";
ИначеЕсли рТип=Тип("Булево") Тогда
стрТип="xs:boolean";
ИначеЕсли рТип=Тип("ХранилищеЗначения") Тогда
стрТип="v8:ValueStorage";
ИначеЕсли рТип=Тип("УникальныйИдентификатор") Тогда
стрТип="v8:UUID";
ИначеЕсли рТип=Тип("ДвоичныеДанные") Тогда
стрТип="xs:base64Binary";
ИначеЕсли рТип=Тип("СправочникиМенеджер") Тогда
рИмяТегаТипа="v8:TypeSet";
стрТип="cfg:CatalogRef";
ИначеЕсли рТип=Тип("ДокументыМенеджер") Тогда
рИмяТегаТипа="v8:TypeSet";
стрТип="cfg:DocumentRef";
ИначеЕсли рТип=Тип("ПеречисленияМенеджер") Тогда
рИмяТегаТипа="v8:TypeSet";
стрТип="cfg:EnumRef";
ИначеЕсли рТип=Тип("ПланыВидовРасчетаМенеджер") Тогда
рИмяТегаТипа="v8:TypeSet";
стрТип="cfg:ChartOfCharacteristicTypesRef";
Иначе
Если Метаданные.НайтиПоТипу(рТип)<>Неопределено Тогда
стрТип="cfg:"+XMLТип(рТип).ИмяТипа;
Иначе
Сообщить("Невозможно обработать тип данных """+Строка(рТип)+""", пропускается!");
Продолжить;
КонецЕсли;
КонецЕсли;
ИначеЕсли ТипЗнч(рТип)=Тип("Структура") и рТип.Свойство("ПредставлениеТипа") Тогда
стрТип=рТип.ПредставлениеТипа;
Если рТип.Свойство("ИмяТегаТипа") Тогда рИмяТегаТипа=рТип.ИмяТегаТипа КонецЕсли;
Иначе
Продолжить;
КонецЕсли;
#КонецОбласти
рУзелОписТипов.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, рИмяТегаТипа, стрТип));
КонецЦикла; // по типам в описании
#Область ОбработкаКвалификаторов
Если ОписТипов.СодержитТип(Тип("Число")) Тогда
рКвалификатор=ОписТипов.КвалификаторыЧисла;
Узел_Квалификатор=док.СоздатьЭлемент("v8:NumberQualifiers");
Узел_Квалификатор.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "v8:Digits", Формат(рКвалификатор.Разрядность,"ЧГ=0")));
Узел_Квалификатор.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "v8:FractionDigits", Формат(рКвалификатор.РазрядностьДробнойЧасти,"ЧГ=0")));
Узел_Квалификатор.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "v8:AllowedSign", ?(рКвалификатор.ДопустимыйЗнак=ДопустимыйЗнак.Любой,"Any","Nonnegative")));
рУзелОписТипов.ДобавитьДочерний(Узел_Квалификатор);
ИначеЕсли ОписТипов.СодержитТип(Тип("Строка")) Тогда
рКвалификатор=ОписТипов.КвалификаторыСтроки;
стрДлина=?(рКвалификатор.Длина=0,"Variable",Формат(рКвалификатор.Длина,"ЧГ=0"));
стрДопустимаяДлина=?(рКвалификатор.ДопустимаяДлина=ДопустимаяДлина.Переменная,"Variable","Fixed");
Узел_Квалификатор=док.СоздатьЭлемент("v8:StringQualifiers");
Узел_Квалификатор.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "v8:Length", стрДлина));
Узел_Квалификатор.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "v8:AllowedLength", стрДопустимаяДлина));
рУзелОписТипов.ДобавитьДочерний(Узел_Квалификатор);
ИначеЕсли ОписТипов.СодержитТип(Тип("Дата")) Тогда
рЧастиДаты=ОписТипов.КвалификаторыДаты.ЧастиДаты;
Если рЧастиДаты=ЧастиДаты.Дата Тогда
стрЧастиДаты="Date";
ИначеЕсли рЧастиДаты=ЧастиДаты.Время Тогда
стрЧастиДаты="Time";
Иначе
стрЧастиДаты="DateTime";
КонецЕсли;
Узел_Квалификатор=док.СоздатьЭлемент("v8:DateQualifiers");
Узел_Квалификатор.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "v8:DateFractions", стрЧастиДаты));
рУзелОписТипов.ДобавитьДочерний(Узел_Квалификатор);
ИначеЕсли ОписТипов.СодержитТип(Тип("ДвоичныеДанные")) Тогда
рКвалификатор=ОписТипов.КвалификаторыСтроки;
стрДлина=?(рКвалификатор.Длина=0,"Variable",Формат(рКвалификатор.Длина,"ЧГ=0"));
стрДопустимаяДлина=?(рКвалификатор.ДопустимаяДлина=ДопустимаяДлина.Переменная,"Variable","Fixed");
Узел_Квалификатор=док.СоздатьЭлемент("v8:BinaryDataQualifiers");
Узел_Квалификатор.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "v8:Length", стрДлина));
Узел_Квалификатор.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "v8:AllowedLength", стрДопустимаяДлина));
рУзелОписТипов.ДобавитьДочерний(Узел_Квалификатор);
КонецЕсли;
#КонецОбласти
ИначеЕсли ТипЗнч(ОписТипов)=Тип("Строка") Тогда
рУзелОписТипов.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "v8:TypeSet", СокрЛП(ОписТипов)));
КонецЕсли;
Возврат рУзелОписТипов;
КонецФункции
&НаСервереБезКонтекста
Функция ПостроитьИдентификаторыКлассовПлатформы()
мИД=Новый Массив;
мИД.Добавить("9cd510cd-abfc-11d4-9434-004095e12fc7");
мИД.Добавить("9fcd25a0-4822-11d4-9414-008048da11f9");
мИД.Добавить("e3687481-0a87-462c-a166-9f34594f9bba");
мИД.Добавить("9de14907-ec23-4a07-96f0-85521cb6b53b");
мИД.Добавить("51f2d5d8-ea4d-4064-8892-82951750031e");
мИД.Добавить("e68182ea-4237-4383-967f-90c1e3370bc7");
мИД.Добавить("fb282519-d103-4dd3-bc12-cb271d631dfc");
Возврат мИД;
КонецФункции
&НаСервереБезКонтекста
Функция ПостроитьСоответствиеСтандартныхГруппКоманд()
соот=Новый Соответствие;
соот.Вставить(СтандартнаяГруппаКоманд.КоманднаяПанельФормыВажное,"FormCommandBarImportant");
соот.Вставить(СтандартнаяГруппаКоманд.КоманднаяПанельФормыСоздатьНаОсновании,"FormCommandBarCreateBasedOn");
соот.Вставить(СтандартнаяГруппаКоманд.ПанельДействийОтчеты,"ActionsPanelReports");
соот.Вставить(СтандартнаяГруппаКоманд.ПанельДействийСервис,"ActionsPanelTools");
соот.Вставить(СтандартнаяГруппаКоманд.ПанельДействийСоздать,"ActionsPanelCreate");
соот.Вставить(СтандартнаяГруппаКоманд.ПанельНавигацииВажное,"NavigationPanelImportant");
соот.Вставить(СтандартнаяГруппаКоманд.ПанельНавигацииОбычное,"NavigationPanelOrdinary");
соот.Вставить(СтандартнаяГруппаКоманд.ПанельНавигацииСмТакже,"NavigationPanelSeeAlso");
соот.Вставить(СтандартнаяГруппаКоманд.ПанельНавигацииФормыВажное,"FormNavigationPanelImportant");
соот.Вставить(СтандартнаяГруппаКоманд.ПанельНавигацииФормыПерейти,"FormNavigationPanelGoTo");
соот.Вставить(СтандартнаяГруппаКоманд.ПанельНавигацииФормыСмТакже,"FormNavigationPanelSeeAlso");
Возврат соот;
КонецФункции
&НаСервереБезКонтекста
Функция ПостроитьСоответствиеИмёнКлассов()
соот=Новый Соответствие;
соот.Вставить("ГруппаКоманд","CommandGroup");
соот.Вставить("ОбщаяКартинка","CommonPicture");
соот.Вставить("ОбщаяКоманда","CommonCommand");
соот.Вставить("ОбщийМакет","CommonTemplate");
соот.Вставить("ОбщийМодуль","CommonModule");
соот.Вставить("ОбщаяФорма","CommonForm");
соот.Вставить("ПараметрСеанса","SessionParameter");
соот.Вставить("ПодпискаНаСобытие","EventSubscription");
соот.Вставить("Подсистема","Subsystem");
соот.Вставить("Роль","Role");
соот.Вставить("Язык","Language");
Возврат соот;
КонецФункции
&НаСервереБезКонтекста
Функция ПолучитьДополнениеИмениКласса(КлассОбъекта)
Если КлассОбъекта="ОбщаяКоманда" или КлассОбъекта="CommonCommand" Тогда
Возврат "CommandModule";
ИначеЕсли КлассОбъекта="ОбщаяФорма" или КлассОбъекта="CommonForm" Тогда
Возврат "Form";
ИначеЕсли КлассОбъекта="ОбщийМодуль" или КлассОбъекта="CommonModule" Тогда
Возврат "Module";
ИначеЕсли КлассОбъекта="ОбщаяКартинка" или КлассОбъекта="CommonPicture" Тогда
Возврат "Picture";
ИначеЕсли КлассОбъекта="ОбщийМакет" или КлассОбъекта="CommonTemplate" Тогда
Возврат "Template";
ИначеЕсли КлассОбъекта="Роль" или КлассОбъекта="Role" Тогда
Возврат "Rights";
Иначе
Возврат "";
КонецЕсли;
КонецФункции
&НаСервереБезКонтекста
Функция ИнициироватьОбъект(КлассОбъекта, Имя, Синоним="", Комментарий="")
струОбъект=Новый Структура;
струОбъект.Вставить("КлассОбъекта",КлассОбъекта);
струОбъект.Вставить("Имя",СокрЛП(Имя));
струОбъект.Вставить("Синоним",СокрЛП(?(ПустаяСтрока(Синоним),ПревращениеИмениВНаименование(Имя),Синоним)));
струОбъект.Вставить("Комментарий",СокрЛП(Комментарий));
струОбъект.Вставить("ИДОбъекта",Строка(Новый УникальныйИдентификатор));
струОбъект.Вставить("ЕстьНаполнение",Ложь);
струОбъект.Вставить("ВерсияФормата","2.11");
Возврат струОбъект;
КонецФункции
&НаСервереБезКонтекста
Функция ПолучитьОбъектыПоКлассу(МассивОбъектов, КлассОбъекта)
мРезультат=Новый Массив;
Для каждого рОбъект Из МассивОбъектов Цикл
Если рОбъект.КлассОбъекта=КлассОбъекта Тогда мРезультат.Добавить(рОбъект) КонецЕсли;
КонецЦикла;
Возврат мРезультат;
КонецФункции
#КонецОбласти
#Область СериализацияОбъектов
&НаСервереБезКонтекста
Функция ПостроитьХМЛ_ConfigDumpInfo(ВходПараметры)
Попытка
док=Новый ДокументDOM;
док.ВерсияXML="1.0";
Узел_ConfigVersions=док.СоздатьЭлемент("ConfigVersions");
Для каждого рОбъект Из ВходПараметры.Объекты Цикл // порядок не важен
рИДВерсии=Строка(Новый УникальныйИдентификатор);
Узел_Metadata=док.СоздатьЭлемент("Metadata");
Узел_Metadata.УстановитьАтрибут("name",СокрЛП(рОбъект.КлассОбъекта)+"."+СокрЛП(рОбъект.Имя));
Узел_Metadata.УстановитьАтрибут("id",рОбъект.ИДОбъекта);
Узел_Metadata.УстановитьАтрибут("configVersion",рИДВерсии);
Узел_ConfigVersions.ДобавитьДочерний(Узел_Metadata);
//
Если рОбъект.ЕстьНаполнение Тогда // это не просто объявление, а реально наполненный объект
рДополнениеИмени=ПолучитьДополнениеИмениКласса(рОбъект.КлассОбъекта);
рДополнениеИД=".0"; // пока так
//
Узел_Metadata=док.СоздатьЭлемент("Metadata");
Узел_Metadata.УстановитьАтрибут("name",СокрЛП(рОбъект.КлассОбъекта)+"."+СокрЛП(рОбъект.Имя)+?(ПустаяСтрока(рДополнениеИмени),"",".")+рДополнениеИмени);
Узел_Metadata.УстановитьАтрибут("id",рОбъект.ИДОбъекта+рДополнениеИД);
Узел_Metadata.УстановитьАтрибут("configVersion",рИДВерсии);
Узел_ConfigVersions.ДобавитьДочерний(Узел_Metadata);
КонецЕсли;
//
КонецЦикла;
// пишем модули приложения
Если не ПустаяСтрока(ВходПараметры.МодульПриложения) Тогда
Узел_Metadata=док.СоздатьЭлемент("Metadata");
Узел_Metadata.УстановитьАтрибут("name","Configuration."+ВходПараметры.Имя+".ManagedApplicationModule");
Узел_Metadata.УстановитьАтрибут("id",Строка(Новый УникальныйИдентификатор));
Узел_Metadata.УстановитьАтрибут("configVersion",Строка(Новый УникальныйИдентификатор));
КонецЕсли;
Если не ПустаяСтрока(ВходПараметры.МодульСеанса) Тогда
Узел_Metadata=док.СоздатьЭлемент("Metadata");
Узел_Metadata.УстановитьАтрибут("name","Configuration."+ВходПараметры.Имя+".SessionModule");
Узел_Metadata.УстановитьАтрибут("id",Строка(Новый УникальныйИдентификатор));
Узел_Metadata.УстановитьАтрибут("configVersion",Строка(Новый УникальныйИдентификатор));
КонецЕсли;
Если не ПустаяСтрока(ВходПараметры.МодульВнешнегоСоединения) Тогда
Узел_Metadata=док.СоздатьЭлемент("Metadata");
Узел_Metadata.УстановитьАтрибут("name","Configuration."+ВходПараметры.Имя+".ExternalConnectionModule");
Узел_Metadata.УстановитьАтрибут("id",Строка(Новый УникальныйИдентификатор));
Узел_Metadata.УстановитьАтрибут("configVersion",Строка(Новый УникальныйИдентификатор));
КонецЕсли;
// пишем отдельно запись о самом расширении в целом
рИДВерсии=Строка(Новый УникальныйИдентификатор);
Узел_Metadata=док.СоздатьЭлемент("Metadata");
Узел_Metadata.УстановитьАтрибут("name","Configuration."+ВходПараметры.Имя);
Узел_Metadata.УстановитьАтрибут("id",рОбъект.ИДОбъекта);
Узел_Metadata.УстановитьАтрибут("configVersion",рИДВерсии);
Узел_ConfigVersions.ДобавитьДочерний(Узел_Metadata);
Узел_ConfigDumpInfo=док.СоздатьЭлемент("ConfigDumpInfo");
Узел_ConfigDumpInfo.УстановитьСоответствиеПространстваИмен("","http://v8.1c.ru/8.3/xcf/dumpinfo");
Узел_ConfigDumpInfo.УстановитьСоответствиеПространстваИмен("xen","http://v8.1c.ru/8.3/xcf/enums",Истина);
Узел_ConfigDumpInfo.УстановитьСоответствиеПространстваИмен("xs","http://www.w3.org/2001/XMLSchema",Истина);
Узел_ConfigDumpInfo.УстановитьСоответствиеПространстваИмен("xsi","http://www.w3.org/2001/XMLSchema-instance",Истина);
Узел_ConfigDumpInfo.УстановитьАтрибут("format","Hierarchical"); // выгрузка в файлы иерархическая
Узел_ConfigDumpInfo.УстановитьАтрибут("version",ВходПараметры.ВерсияФормата);
//
Узел_ConfigDumpInfo.ДобавитьДочерний(Узел_ConfigVersions);
док.ДобавитьДочерний(Узел_ConfigDumpInfo);
резСтрока=ЗаписатьДокументДОМ(док);
Возврат резСтрока;
Исключение
Сообщить("ПостроитьХМЛ_ConfigDumpInfo, общая ошибка: "+ОписаниеОшибки());
Возврат "";
КонецПопытки;
КонецФункции
&НаСервереБезКонтекста
Функция ПостроитьХМЛ_Configuration(ВходПараметры)
Попытка
док=Новый ДокументDOM;
док.ВерсияXML="1.0";
#Область ОбщееОбъявление
Узел_MetaDataObject=док.СоздатьЭлемент("MetaDataObject");
ЗаписатьОбъявленияПространствИмён(Узел_MetaDataObject);
Узел_MetaDataObject.УстановитьАтрибут("version",ВходПараметры.ВерсияФормата);
соотУРИ=Узел_MetaDataObject.ПолучитьСоответствияПространствИмен();
Узел_InternalInfo=док.СоздатьЭлемент("InternalInfo");
мИД=ПостроитьИдентификаторыКлассовПлатформы();
Для каждого рИД Из мИД Цикл
рУИДОбъекта=Строка(Новый УникальныйИдентификатор);
Узел_ContainedObject=док.СоздатьЭлемент("xr:ContainedObject");
Узел_ContainedObject.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "xr:ClassId", рИД));
Узел_ContainedObject.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "xr:ObjectId", рУИДОбъекта));
Узел_InternalInfo.ДобавитьДочерний(Узел_ContainedObject);
КонецЦикла;
Узел_Configuration=док.СоздатьЭлемент("Configuration");
Узел_Configuration.УстановитьАтрибут("uuid",ВходПараметры.ИДОбъекта);
Узел_Configuration.ДобавитьДочерний(Узел_InternalInfo);
#КонецОбласти
#Область МетасвойстваРасширения
Узел_Properties=док.СоздатьЭлемент("Properties");
ЗаписатьИмяСинонимКомментарий(док, Узел_Properties, ВходПараметры);
Если ВходПараметры.Назначение=Метаданные.СвойстваОбъектов.НазначениеРасширенияКонфигурации.Адаптация Тогда
стрНазначение="Customization";
ИначеЕсли ВходПараметры.Назначение=Метаданные.СвойстваОбъектов.НазначениеРасширенияКонфигурации.Дополнение Тогда
стрНазначение="AddOn";
ИначеЕсли ВходПараметры.Назначение=Метаданные.СвойстваОбъектов.НазначениеРасширенияКонфигурации.Исправление Тогда
стрНазначение="Patch";
КонецЕсли;
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "ConfigurationExtensionPurpose", стрНазначение));
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "ObjectBelonging", "Adopted")); // это принадлежность самого расширения, в свойствах видно, но недоступно
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "KeepMappingToExtendedConfigurationObjectsByIDs", БулевоСтрокой(ВходПараметры.ПоддерживатьСоответствиеПоИД))); // флаг ИД-стыковки
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "NamePrefix", СокрЛП(ВходПараметры.Префикс)));
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "ConfigurationExtensionCompatibilityMode", СтрЗаменить(Строка(ВходПараметры.РежимСовместимости),"Версия","Version")));
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "DefaultRunMode", "ManagedApplication")); // интересно было бы попробовать указать расширение для обычных форм!
рУзел=док.СоздатьЭлемент("v8:Value");
рУзел.УстановитьАтрибут(соотУРИ.Получить("xsi"),"xsi:type","app:ApplicationUsePurpose");
рУзел.ТекстовоеСодержимое="PlatformApplication";
Узел_UsePurposes=док.СоздатьЭлемент("UsePurposes");
Узел_UsePurposes.ДобавитьДочерний(рУзел);
Узел_Properties.ДобавитьДочерний(Узел_UsePurposes);
//
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "ScriptVariant", "Russian"));
рУзел=док.СоздатьЭлемент("xr:Item");
рУзел.УстановитьАтрибут(соотУРИ.Получить("xsi"),"xsi:type","xr:MDObjectRef");
рУзел.ТекстовоеСодержимое="Role."+СокрЛП(ВходПараметры.ИмяОсновнойРоли);
Узел_DefaultRoles=док.СоздатьЭлемент("DefaultRoles");
Узел_DefaultRoles.ДобавитьДочерний(рУзел);
Узел_Properties.ДобавитьДочерний(Узел_DefaultRoles);
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "Vendor", ВходПараметры.Поставщик));
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "Version", ВходПараметры.Версия));
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "DefaultLanguage", "Language.Русский")); // тоже при желании параметризуется
Узел_BriefInformation=док.СоздатьЭлемент("BriefInformation");
Узел_BriefInformation.ДобавитьДочерний(СоздатьЛокализованныйТекстовыйУзелДОМ(док, , ВходПараметры.КраткаяИнформация));
Узел_Properties.ДобавитьДочерний(Узел_BriefInformation);
Узел_DetailedInformation=док.СоздатьЭлемент("DetailedInformation");
Узел_DetailedInformation.ДобавитьДочерний(СоздатьЛокализованныйТекстовыйУзелДОМ(док, , ВходПараметры.ПодробнаяИнформация));
Узел_Properties.ДобавитьДочерний(Узел_DetailedInformation);
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "Copyright", ВходПараметры.АвторскиеПрава));
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "VendorInformationAddress", ВходПараметры.АдресИнформацииОПоставщике));
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "ConfigurationInformationAddress", ВходПараметры.АдресИнформацииОКонфигурации));
Если ВходПараметры.РежимСовместимостиИнтерфейса=Метаданные.СвойстваОбъектов.РежимСовместимостиИнтерфейса.Версия8_2 Тогда
стрРежим="Version8_2";
ИначеЕсли ВходПараметры.РежимСовместимостиИнтерфейса=Метаданные.СвойстваОбъектов.РежимСовместимостиИнтерфейса.Версия8_2РазрешитьТакси Тогда
стрРежим="Version8_2EnableTaxi";
ИначеЕсли ВходПараметры.РежимСовместимостиИнтерфейса=Метаданные.СвойстваОбъектов.РежимСовместимостиИнтерфейса.ТаксиРазрешитьВерсия8_2 Тогда
стрРежим="TaxiEnableVersion8_2";
ИначеЕсли ВходПараметры.РежимСовместимостиИнтерфейса=Метаданные.СвойстваОбъектов.РежимСовместимостиИнтерфейса.Такси Тогда
стрРежим="Taxi";
КонецЕсли;
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "InterfaceCompatibilityMode", стрРежим));
Узел_Configuration.ДобавитьДочерний(Узел_Properties);
#КонецОбласти
#Область ДочерниеОбъекты
Узел_ChildObjects=док.СоздатьЭлемент("ChildObjects");
Для каждого рОбъект Из ВходПараметры.Объекты Цикл // порядок не важен
Узел_ChildObjects.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, рОбъект.КлассОбъекта, рОбъект.Имя));
КонецЦикла;
Узел_Configuration.ДобавитьДочерний(Узел_ChildObjects);
#КонецОбласти
Узел_MetaDataObject.ДобавитьДочерний(Узел_Configuration);
док.ДобавитьДочерний(Узел_MetaDataObject);
резСтрока=ЗаписатьДокументДОМ(док);
Возврат резСтрока;
Исключение
Сообщить("ПостроитьХМЛ_Configuration, общая ошибка: "+ОписаниеОшибки());
Возврат "";
КонецПопытки;
КонецФункции
&НаСервереБезКонтекста
Функция ПостроитьХМЛ_Подсистема(ВходПараметры)
Попытка
док=Новый ДокументDOM;
док.ВерсияXML="1.0";
Узел_MetaDataObject=док.СоздатьЭлемент("MetaDataObject");
ЗаписатьОбъявленияПространствИмён(Узел_MetaDataObject);
Узел_MetaDataObject.УстановитьАтрибут("version",ВходПараметры.ВерсияФормата);
соотУРИ=Узел_MetaDataObject.ПолучитьСоответствияПространствИмен();
xsiУРИ=соотУРИ.Получить("xsi");
Узел_Properties=док.СоздатьЭлемент("Properties");
ЗаписатьИмяСинонимКомментарий(док, Узел_Properties, ВходПараметры);
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "IncludeHelpInContents", БулевоСтрокой(ВходПараметры.ВключатьСправкуВСодержание)));
Узел_Explanation=док.СоздатьЭлемент("Explanation");
Узел_Explanation.ДобавитьДочерний(СоздатьЛокализованныйТекстовыйУзелДОМ(док, , ВходПараметры.Описание));
Узел_Properties.ДобавитьДочерний(Узел_Explanation);
Узел_Properties.ДобавитьДочерний(док.СоздатьЭлемент("Picture")); // в текущей версии не делаем
#Область СоставПодсистемы
Узел_Content=док.СоздатьЭлемент("Content");
соотКлассов=ПостроитьСоответствиеИмёнКлассов();
Для каждого рОбъект Из ВходПараметры.Состав Цикл
Если ТипЗнч(рОбъект)=Тип("Строка") Тогда
стрОбъект=СокрЛП(рОбъект);
Иначе
Попытка рПолноеИмя=рОбъект.ПолноеИмя() Исключение Продолжить КонецПопытки;
мстроИмени=СтрРазделить(,".",Ложь);
рКлассОбъекта=соотКлассов.Получить(мстроИмени.Получить(0));
Если рКлассОбъекта=Неопределено Тогда
Сообщить("Для объекта "+рПолноеИмя+" не удалось определить служебное имя родительского класса, пропускается!");
Продолжить;
КонецЕсли;
стрОбъект=рКлассОбъекта+"."+рОбъект.Имя;
КонецЕсли;
рУзел=док.СоздатьЭлемент("xr:Item");
рУзел.УстановитьАтрибут(xsiУРИ,"xsi:type","xr:MDObjectRef");
рУзел.ТекстовоеСодержимое=стрОбъект;
Узел_Content.ДобавитьДочерний(рУзел);
КонецЦикла;
//
Узел_Properties.ДобавитьДочерний(Узел_Content);
#КонецОбласти
Узел_Subsystem=док.СоздатьЭлемент("Subsystem");
Узел_Subsystem.УстановитьАтрибут("uuid",ВходПараметры.ИДОбъекта);
Узел_Subsystem.ДобавитьДочерний(Узел_Properties);
// подчинённые подсистемы
Узел_ChildObjects=док.СоздатьЭлемент("ChildObjects");
Узел_Subsystem.ДобавитьДочерний(Узел_ChildObjects);
Узел_MetaDataObject.ДобавитьДочерний(Узел_Subsystem);
док.ДобавитьДочерний(Узел_MetaDataObject);
резСтрока=ЗаписатьДокументДОМ(док);
Возврат резСтрока;
Исключение
Сообщить("ПостроитьХМЛ_Подсистема, общая ошибка: "+ОписаниеОшибки());
Возврат "";
КонецПопытки;
КонецФункции
&НаСервереБезКонтекста
Функция ПостроитьХМЛ_Язык(ВходПараметры)
резСтрока="<?xml version=""1.0"" encoding=""UTF-8""?>
|<MetaDataObject xmlns=""http://v8.1c.ru/8.3/MDClasses"" xmlns:app=""http://v8.1c.ru/8.2/managed-application/core"" xmlns:cfg=""http://v8.1c.ru/8.1/data/enterprise/current-config"" xmlns:cmi=""http://v8.1c.ru/8.2/managed-application/cmi"" xmlns:ent=""http://v8.1c.ru/8.1/data/enterprise"" xmlns:lf=""http://v8.1c.ru/8.2/managed-application/logform"" xmlns:style=""http://v8.1c.ru/8.1/data/ui/style"" xmlns:sys=""http://v8.1c.ru/8.1/data/ui/fonts/system"" xmlns:v8=""http://v8.1c.ru/8.1/data/core"" xmlns:v8ui=""http://v8.1c.ru/8.1/data/ui"" xmlns:web=""http://v8.1c.ru/8.1/data/ui/colors/web"" xmlns:win=""http://v8.1c.ru/8.1/data/ui/colors/windows"" xmlns:xen=""http://v8.1c.ru/8.3/xcf/enums"" xmlns:xpr=""http://v8.1c.ru/8.3/xcf/predef"" xmlns:xr=""http://v8.1c.ru/8.3/xcf/readable"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" version="""+ВходПараметры.ВерсияФормата+""">
| <Language uuid="""+СокрЛП(ВходПараметры.ИДОбъекта)+""">
| <InternalInfo/>
| <Properties>
| <Name>"+СокрЛП(ВходПараметры.Имя)+"</Name>
| <Comment/>
| <ObjectBelonging>Adopted</ObjectBelonging>
| <ExtendedConfigurationObject>874fead0-d1f1-4826-a60d-eb068f566abd</ExtendedConfigurationObject>
| <LanguageCode>"+ВходПараметры.КодЯзыка+"</LanguageCode>
| </Properties>
| </Language>
|</MetaDataObject>";
Возврат резСтрока;
КонецФункции
&НаСервереБезКонтекста
Функция ПостроитьХМЛ_Роль(ВходПараметры)
Попытка
док=Новый ДокументDOM;
док.ВерсияXML="1.0";
Узел_MetaDataObject=док.СоздатьЭлемент("MetaDataObject");
ЗаписатьОбъявленияПространствИмён(Узел_MetaDataObject);
Узел_MetaDataObject.УстановитьАтрибут("version",ВходПараметры.ВерсияФормата);
Узел_Properties=док.СоздатьЭлемент("Properties");
ЗаписатьИмяСинонимКомментарий(док, Узел_Properties, ВходПараметры);
Узел_Role=док.СоздатьЭлемент("Role");
Узел_Role.УстановитьАтрибут("uuid",ВходПараметры.ИДОбъекта);
Узел_Role.ДобавитьДочерний(Узел_Properties);
Узел_MetaDataObject.ДобавитьДочерний(Узел_Role);
док.ДобавитьДочерний(Узел_MetaDataObject);
резСтрока=ЗаписатьДокументДОМ(док);
Возврат резСтрока;
Исключение
Сообщить("ПостроитьХМЛ_Роль, общая ошибка: "+ОписаниеОшибки());
Возврат "";
КонецПопытки;
КонецФункции
&НаСервереБезКонтекста
Функция ПостроитьХМЛ_ПраваРоли(ВходПараметры)
Попытка
док=Новый ДокументDOM;
док.ВерсияXML="1.0";
Узел_Rights=док.СоздатьЭлемент("Rights");
Узел_Rights.УстановитьСоответствиеПространстваИмен("","http://v8.1c.ru/8.2/roles");
Узел_Rights.УстановитьСоответствиеПространстваИмен("xs","http://www.w3.org/2001/XMLSchema",Истина);
Узел_Rights.УстановитьСоответствиеПространстваИмен("xsi","http://www.w3.org/2001/XMLSchema-instance",Истина);
Узел_Rights.УстановитьАтрибут("http://www.w3.org/2001/XMLSchema-instance", "xsi:type", "Rights");
Узел_Rights.УстановитьАтрибут("version",ВходПараметры.ВерсияФормата);
Узел_Rights.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "setForNewObjects", БулевоСтрокой(ВходПараметры.УстанавливатьДляНовыхОбъектов)));
Узел_Rights.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "setForAttributesByDefault", БулевоСтрокой(ВходПараметры.УстанавливатьДляРеквизитовИТабЧастейПоУмолчанию)));
Узел_Rights.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "independentRightsOfChildObjects", БулевоСтрокой(ВходПараметры.НезависимыеПраваПодчиненныхОбъектов)));
Узел_object=док.СоздатьЭлемент("object");
Узел_object.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "name", "Configuration."+ВходПараметры.ИмяРасширения));
стрПравДоступа="ThinClient,WebClient,MobileClient,
|MainWindowModeNormal,MainWindowModeWorkplace,MainWindowModeEmbeddedWorkplace,MainWindowModeFullscreenWorkplace,MainWindowModeKiosk,
|AnalyticsSystemClient,SaveUserData,Output";
мПравДоступа=СтрРазделить(СтрЗаменить(стрПравДоступа,Символы.ПС,""),",",Ложь);
струПрав=?(ВходПараметры.Свойство("Права"),ВходПараметры.Права,Неопределено);
Если ТипЗнч(струПрав)<>Тип("Структура") Тогда струПрав=Новый Структура КонецЕсли;
//
Для каждого рПравоДоступа Из мПравДоступа Цикл
рНаличиеПрава=?(струПрав.Свойство(рПравоДоступа),струПрав[рПравоДоступа],Истина);
Если ТипЗнч(рНаличиеПрава)<>Тип("Булево") Тогда рНаличиеПрава=Истина КонецЕсли; // по умолчанию эти права есть и должны быть
// вносим
рУзелПраво=док.СоздатьЭлемент("right");
рУзелПраво.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "name", рПравоДоступа));
рУзелПраво.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "value", БулевоСтрокой(рНаличиеПрава)));
Узел_object.ДобавитьДочерний(рУзелПраво);
КонецЦикла;
Узел_Rights.ДобавитьДочерний(Узел_object);
док.ДобавитьДочерний(Узел_Rights);
резСтрока=ЗаписатьДокументДОМ(док);
Возврат резСтрока;
Исключение
Сообщить("ПостроитьХМЛ_ПраваРоли, общая ошибка: "+ОписаниеОшибки());
Возврат "";
КонецПопытки;
КонецФункции
&НаСервереБезКонтекста
Функция ПостроитьХМЛ_ОбщийМодуль(ВходПараметры)
Попытка
док=Новый ДокументDOM;
док.ВерсияXML="1.0";
Узел_MetaDataObject=док.СоздатьЭлемент("MetaDataObject");
ЗаписатьОбъявленияПространствИмён(Узел_MetaDataObject);
Узел_MetaDataObject.УстановитьАтрибут("version",ВходПараметры.ВерсияФормата);
Узел_Properties=док.СоздатьЭлемент("Properties");
ЗаписатьИмяСинонимКомментарий(док, Узел_Properties, ВходПараметры);
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "Global", БулевоСтрокой(ВходПараметры.Глобальный)));
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "ClientManagedApplication", БулевоСтрокой(ВходПараметры.КлиентУправляемоеПриложение)));
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "Server", БулевоСтрокой(ВходПараметры.Сервер)));
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "ExternalConnection", БулевоСтрокой(ВходПараметры.ВнешнееСоединение)));
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "ClientOrdinaryApplication", БулевоСтрокой(ВходПараметры.КлиентОбычноеПриложение)));
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "ServerCall", БулевоСтрокой(ВходПараметры.ВызовСервера)));
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "Privileged", БулевоСтрокой(ВходПараметры.Привилегированный)));
Если ВходПараметры.ПовторноеИспользование=Метаданные.СвойстваОбъектов.ПовторноеИспользованиеВозвращаемыхЗначений.НеИспользовать Тогда
стрЗначение="DontUse";
ИначеЕсли ВходПараметры.ПовторноеИспользование=Метаданные.СвойстваОбъектов.ПовторноеИспользованиеВозвращаемыхЗначений.НаВремяВызова Тогда
стрЗначение="DuringRequest";
ИначеЕсли ВходПараметры.ПовторноеИспользование=Метаданные.СвойстваОбъектов.ПовторноеИспользованиеВозвращаемыхЗначений Тогда
стрЗначение="DuringSession";
КонецЕсли;
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "ReturnValuesReuse", стрЗначение));
Узел_CommonModule=док.СоздатьЭлемент("CommonModule");
Узел_CommonModule.УстановитьАтрибут("uuid",ВходПараметры.ИДОбъекта);
Узел_CommonModule.ДобавитьДочерний(Узел_Properties);
Узел_MetaDataObject.ДобавитьДочерний(Узел_CommonModule);
док.ДобавитьДочерний(Узел_MetaDataObject);
резСтрока=ЗаписатьДокументДОМ(док);
Возврат резСтрока;
Исключение
Сообщить("ПостроитьХМЛ_ОбщийМодуль, общая ошибка: "+ОписаниеОшибки());
Возврат "";
КонецПопытки;
КонецФункции
&НаСервереБезКонтекста
Функция ПостроитьХМЛ_ПараметрСеанса(ВходПараметры)
Попытка
док=Новый ДокументDOM;
док.ВерсияXML="1.0";
Узел_MetaDataObject=док.СоздатьЭлемент("MetaDataObject");
ЗаписатьОбъявленияПространствИмён(Узел_MetaDataObject);
Узел_MetaDataObject.УстановитьАтрибут("version",ВходПараметры.ВерсияФормата);
Узел_Properties=док.СоздатьЭлемент("Properties");
ЗаписатьИмяСинонимКомментарий(док, Узел_Properties, ВходПараметры);
Узел_Properties.ДобавитьДочерний(СоздатьУзелОписанияТипов(док, , ВходПараметры.ОписаниеТипов));
Узел_SessionParameter=док.СоздатьЭлемент("SessionParameter");
Узел_SessionParameter.УстановитьАтрибут("uuid",ВходПараметры.ИДОбъекта);
Узел_SessionParameter.ДобавитьДочерний(Узел_Properties);
Узел_MetaDataObject.ДобавитьДочерний(Узел_SessionParameter);
док.ДобавитьДочерний(Узел_MetaDataObject);
резСтрока=ЗаписатьДокументДОМ(док);
Возврат резСтрока;
Исключение
Сообщить("ПостроитьХМЛ_ПараметрСеанса, общая ошибка: "+ОписаниеОшибки());
Возврат "";
КонецПопытки;
КонецФункции
&НаСервереБезКонтекста
Функция ПостроитьХМЛ_ПодпискаНаСобытие(ВходПараметры)
Попытка
док=Новый ДокументDOM;
док.ВерсияXML="1.0";
Узел_MetaDataObject=док.СоздатьЭлемент("MetaDataObject");
ЗаписатьОбъявленияПространствИмён(Узел_MetaDataObject);
Узел_MetaDataObject.УстановитьАтрибут("version",ВходПараметры.ВерсияФормата);
Узел_Properties=док.СоздатьЭлемент("Properties");
ЗаписатьИмяСинонимКомментарий(док, Узел_Properties, ВходПараметры);
Узел_Properties.ДобавитьДочерний(СоздатьУзелОписанияТипов(док, "Source", ВходПараметры.Источник));
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "Event", ВходПараметры.Событие));
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "Handler", "CommonModule."+СокрЛП(ВходПараметры.Обработчик))); // строка вида <ИмяОбщегоМодуля>.<ИмяПроцедурыОбработчика>
Узел_EventSubscription=док.СоздатьЭлемент("EventSubscription");
Узел_EventSubscription.УстановитьАтрибут("uuid",ВходПараметры.ИДОбъекта);
Узел_EventSubscription.ДобавитьДочерний(Узел_Properties);
Узел_MetaDataObject.ДобавитьДочерний(Узел_EventSubscription);
док.ДобавитьДочерний(Узел_MetaDataObject);
резСтрока=ЗаписатьДокументДОМ(док);
Возврат резСтрока;
Исключение
Сообщить("ПостроитьХМЛ_ПодпискаНаСобытие, общая ошибка: "+ОписаниеОшибки());
Возврат "";
КонецПопытки;
КонецФункции
&НаСервереБезКонтекста
Функция ПостроитьХМЛ_ОбщаяКоманда(ВходПараметры)
Попытка
док=Новый ДокументDOM;
док.ВерсияXML="1.0";
Узел_MetaDataObject=док.СоздатьЭлемент("MetaDataObject");
ЗаписатьОбъявленияПространствИмён(Узел_MetaDataObject);
Узел_MetaDataObject.УстановитьАтрибут("version",ВходПараметры.ВерсияФормата);
Узел_Properties=док.СоздатьЭлемент("Properties");
ЗаписатьИмяСинонимКомментарий(док, Узел_Properties, ВходПараметры);
соотГрупп=ПостроитьСоответствиеСтандартныхГруппКоманд();
стрГруппаКоманд=соотГрупп.Получить(ВходПараметры.Группа);
Если стрГруппаКоманд=Неопределено Тогда Возврат "" КонецЕсли;
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "Group", стрГруппаКоманд));
Если ВходПараметры.Отображение=ОтображениеКнопки.Авто Тогда
стрОтображение="Auto";
ИначеЕсли ВходПараметры.Отображение=ОтображениеКнопки.Картинка Тогда
стрОтображение="Picture";
ИначеЕсли ВходПараметры.Отображение=ОтображениеКнопки.КартинкаИТекст Тогда
стрОтображение="PictureAndText";
ИначеЕсли ВходПараметры.Отображение=ОтображениеКнопки.Текст Тогда
стрОтображение="Text";
КонецЕсли;
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "Representation", стрОтображение));
Узел_ToolTip=док.СоздатьЭлемент("ToolTip");
Узел_ToolTip.ДобавитьДочерний(СоздатьЛокализованныйТекстовыйУзелДОМ(док, , ВходПараметры.Подсказка));
Узел_Properties.ДобавитьДочерний(Узел_ToolTip);
// Картинку пока не делаем, при желании делается так, например:
// <Picture>
// <xr:Ref>StdPicture.CalculationType</xr:Ref>
// <xr:LoadTransparent>true</xr:LoadTransparent>
// </Picture>
// Сочетание клавиш пока не делаем, при желании делается в <Shortcut>
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "IncludeHelpInContents", БулевоСтрокой(ВходПараметры.ВключатьСправкуВСодержание)));
Узел_CommandParameterType=док.СоздатьЭлемент("CommandParameterType");
Узел_CommandParameterType.ДобавитьДочерний(СоздатьУзелОписанияТипов(док, , ВходПараметры.ТипПараметраКоманды));
Узел_Properties.ДобавитьДочерний(Узел_CommandParameterType);
стрРежим=?(ВходПараметры.РежимИспользованияПараметра=РежимИспользованияПараметраКоманды.Множественный,"Multiple","Single"); // в т.ч. и если передано пустое
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "ParameterUseMode", стрРежим));
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "ModifiesData", БулевоСтрокой(ВходПараметры.ИзменяетДанные)));
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "OnMainServerUnavalableBehavior", "Auto")); // пока ПоведениеПриНедоступностиОсновногоСервера так
Узел_CommonCommand=док.СоздатьЭлемент("CommonCommand");
Узел_CommonCommand.УстановитьАтрибут("uuid",ВходПараметры.ИДОбъекта);
Узел_CommonCommand.ДобавитьДочерний(Узел_Properties);
Узел_MetaDataObject.ДобавитьДочерний(Узел_CommonCommand);
док.ДобавитьДочерний(Узел_MetaDataObject);
резСтрока=ЗаписатьДокументДОМ(док);
Возврат резСтрока;
Исключение
Сообщить("ПостроитьХМЛ_ОбщаяКоманда, общая ошибка: "+ОписаниеОшибки());
Возврат "";
КонецПопытки;
КонецФункции
&НаСервереБезКонтекста
Функция ПостроитьХМЛ_ГруппаОбщихКоманд(ВходПараметры)
Попытка
док=Новый ДокументDOM;
док.ВерсияXML="1.0";
Узел_MetaDataObject=док.СоздатьЭлемент("MetaDataObject");
ЗаписатьОбъявленияПространствИмён(Узел_MetaDataObject);
Узел_MetaDataObject.УстановитьАтрибут("version",ВходПараметры.ВерсияФормата);
Узел_Properties=док.СоздатьЭлемент("Properties");
ЗаписатьИмяСинонимКомментарий(док, Узел_Properties, ВходПараметры);
Если ВходПараметры.Отображение=ОтображениеКнопки.Авто Тогда
стрОтображение="Auto";
ИначеЕсли ВходПараметры.Отображение=ОтображениеКнопки.Картинка Тогда
стрОтображение="Picture";
ИначеЕсли ВходПараметры.Отображение=ОтображениеКнопки.КартинкаИТекст Тогда
стрОтображение="PictureAndText";
ИначеЕсли ВходПараметры.Отображение=ОтображениеКнопки.Текст Тогда
стрОтображение="Text";
КонецЕсли;
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "Representation", стрОтображение));
Узел_ToolTip=док.СоздатьЭлемент("ToolTip");
Узел_ToolTip.ДобавитьДочерний(СоздатьЛокализованныйТекстовыйУзелДОМ(док, , ВходПараметры.Подсказка));
Узел_Properties.ДобавитьДочерний(Узел_ToolTip);
// Картинку пока не делаем
Если ВходПараметры.Категория=КатегорияГруппыКоманд.КоманднаяПанельФормы Тогда
стрКатегория="FormCommandBar";
ИначеЕсли ВходПараметры.Категория=КатегорияГруппыКоманд.ПанельДействий Тогда
стрКатегория="ActionsPanel";
ИначеЕсли ВходПараметры.Категория=КатегорияГруппыКоманд.ПанельНавигации Тогда
стрКатегория="NavigationPanel";
ИначеЕсли ВходПараметры.Категория=КатегорияГруппыКоманд.ПанельНавигацииФормы Тогда
стрКатегория="FormNavigationPanel";
КонецЕсли;
Узел_Properties.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "Category", стрКатегория));
Узел_CommandGroup=док.СоздатьЭлемент("CommandGroup");
Узел_CommandGroup.УстановитьАтрибут("uuid",ВходПараметры.ИДОбъекта);
Узел_CommandGroup.ДобавитьДочерний(Узел_Properties);
Узел_MetaDataObject.ДобавитьДочерний(Узел_CommandGroup);
док.ДобавитьДочерний(Узел_MetaDataObject);
резСтрока=ЗаписатьДокументДОМ(док);
Возврат резСтрока;
Исключение
Сообщить("ПостроитьХМЛ_ГруппаОбщихКоманд, общая ошибка: "+ОписаниеОшибки());
Возврат "";
КонецПопытки;
КонецФункции
&НаСервереБезКонтекста
Функция ПостроитьХМЛ_ОбъявлениеСправки(ВходПараметры)
Попытка
док=Новый ДокументDOM;
док.ВерсияXML="1.0";
Узел_Help=док.СоздатьЭлемент("Help");
Узел_Help.УстановитьСоответствиеПространстваИмен("xsi","http://www.w3.org/2001/XMLSchema-instance");
Узел_Help.УстановитьСоответствиеПространстваИмен("xs","http://www.w3.org/2001/XMLSchema");
Узел_Help.УстановитьСоответствиеПространстваИмен("","http://v8.1c.ru/8.3/xcf/extrnprops");
Узел_Help.УстановитьАтрибут("version",ВходПараметры.ВерсияФормата);
Узел_Help.ДобавитьДочерний(СоздатьТекстовыйУзелДОМ(док, "Page", "ru"));
док.ДобавитьДочерний(Узел_Help);
резСтрока=ЗаписатьДокументДОМ(док);
Возврат резСтрока;
Исключение
Сообщить("ПостроитьХМЛ_ГруппаОбщихКоманд, общая ошибка: "+ОписаниеОшибки());
Возврат "";
КонецПопытки;
КонецФункции
#КонецОбласти
#Область ЗаписьВФайлы
&НаСервереБезКонтекста
Функция ОбработатьРоли(ОсновнойПуть, МассивОбъектов)
Если МассивОбъектов.Количество()=0 Тогда Возврат Истина КонецЕсли; // не ошибка, но ничего не делаем
рПуть=ОсновнойПуть+"Roles\";
СоздатьКаталог(рПуть);
Для каждого рОбъект Из МассивОбъектов Цикл
хмлОбъекта=ПостроитьХМЛ_Роль(рОбъект);
Если ПустаяСтрока(хмлОбъекта) Тогда Возврат Ложь КонецЕсли;
//
рИмяФайла=рПуть+СокрЛП(рОбъект.Имя)+".xml";
т=Новый ТекстовыйДокумент;
т.УстановитьТекст(хмлОбъекта);
т.Записать(рИмяФайла,КодировкаТекста.UTF8);
//
Если рОбъект.Права.Количество()>0 Тогда
хмлНаполнения=ПостроитьХМЛ_ПраваРоли(рОбъект);
Если ПустаяСтрока(хмлНаполнения) Тогда Возврат Ложь КонецЕсли;
//
рПутьНаполнения=рПуть+СокрЛП(рОбъект.Имя)+"\Ext\";
СоздатьКаталог(рПутьНаполнения);
т=Новый ТекстовыйДокумент;
т.УстановитьТекст(хмлНаполнения);
т.Записать(рПутьНаполнения+"rights.xml",КодировкаТекста.UTF8);
//
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
&НаСервереБезКонтекста
Функция ОбработатьЯзыки(ОсновнойПуть, МассивОбъектов)
Если МассивОбъектов.Количество()=0 Тогда Возврат Истина КонецЕсли; // не ошибка, но ничего не делаем
рПуть=ОсновнойПуть+"Languages\";
СоздатьКаталог(рПуть);
Для каждого рОбъект Из МассивОбъектов Цикл
хмлОбъекта=ПостроитьХМЛ_Язык(рОбъект);
Если ПустаяСтрока(хмлОбъекта) Тогда Возврат Ложь КонецЕсли;
//
рИмяФайла=рПуть+СокрЛП(рОбъект.Имя)+".xml";
т=Новый ТекстовыйДокумент;
т.УстановитьТекст(хмлОбъекта);
т.Записать(рИмяФайла,КодировкаТекста.UTF8);
//
КонецЦикла;
Возврат Истина;
КонецФункции
&НаСервереБезКонтекста
Функция ОбработатьОбщиеМодули(ОсновнойПуть, МассивОбъектов)
Если МассивОбъектов.Количество()=0 Тогда Возврат Истина КонецЕсли; // не ошибка, но ничего не делаем
рПуть=ОсновнойПуть+"CommonModules\";
СоздатьКаталог(рПуть);
Для каждого рОбъект Из МассивОбъектов Цикл
хмлОбъекта=ПостроитьХМЛ_ОбщийМодуль(рОбъект);
Если ПустаяСтрока(хмлОбъекта) Тогда Возврат Ложь КонецЕсли;
//
рИмяФайла=рПуть+СокрЛП(рОбъект.Имя)+".xml";
т=Новый ТекстовыйДокумент;
т.УстановитьТекст(хмлОбъекта);
т.Записать(рИмяФайла,КодировкаТекста.UTF8);
//
Если не ПустаяСтрока(рОбъект.Модуль) Тогда
рПутьНаполнения=рПуть+СокрЛП(рОбъект.Имя)+"\Ext\";
СоздатьКаталог(рПутьНаполнения);
т=Новый ТекстовыйДокумент;
т.УстановитьТекст(рОбъект.Модуль);
т.Записать(рПутьНаполнения+"module.bsl",КодировкаТекста.UTF8);
//
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
&НаСервереБезКонтекста
Функция ОбработатьПараметрыСеанса(ОсновнойПуть, МассивОбъектов)
Если МассивОбъектов.Количество()=0 Тогда Возврат Истина КонецЕсли; // не ошибка, но ничего не делаем
рПуть=ОсновнойПуть+"SessionParameters\";
СоздатьКаталог(рПуть);
Для каждого рОбъект Из МассивОбъектов Цикл
хмлОбъекта=ПостроитьХМЛ_ПараметрСеанса(рОбъект);
Если ПустаяСтрока(хмлОбъекта) Тогда Возврат Ложь КонецЕсли;
//
рИмяФайла=рПуть+СокрЛП(рОбъект.Имя)+".xml";
т=Новый ТекстовыйДокумент;
т.УстановитьТекст(хмлОбъекта);
т.Записать(рИмяФайла,КодировкаТекста.UTF8);
//
КонецЦикла;
Возврат Истина;
КонецФункции
&НаСервереБезКонтекста
Функция ОбработатьПодпискиНаСобытия(ОсновнойПуть, МассивОбъектов)
Если МассивОбъектов.Количество()=0 Тогда Возврат Истина КонецЕсли; // не ошибка, но ничего не делаем
рПуть=ОсновнойПуть+"EventSubscriptions\";
СоздатьКаталог(рПуть);
Для каждого рОбъект Из МассивОбъектов Цикл
хмлОбъекта=ПостроитьХМЛ_ПодпискаНаСобытие(рОбъект);
Если ПустаяСтрока(хмлОбъекта) Тогда Возврат Ложь КонецЕсли;
//
рИмяФайла=рПуть+СокрЛП(рОбъект.Имя)+".xml";
т=Новый ТекстовыйДокумент;
т.УстановитьТекст(хмлОбъекта);
т.Записать(рИмяФайла,КодировкаТекста.UTF8);
//
КонецЦикла;
Возврат Истина;
КонецФункции
&НаСервереБезКонтекста
Функция ОбработатьОбщиеКоманды(ОсновнойПуть, МассивОбъектов)
Если МассивОбъектов.Количество()=0 Тогда Возврат Истина КонецЕсли; // не ошибка, но ничего не делаем
рПуть=ОсновнойПуть+"CommonCommands\";
СоздатьКаталог(рПуть);
Для каждого рОбъект Из МассивОбъектов Цикл
хмлОбъекта=ПостроитьХМЛ_ОбщаяКоманда(рОбъект);
Если ПустаяСтрока(хмлОбъекта) Тогда Возврат Ложь КонецЕсли;
//
рИмяФайла=рПуть+СокрЛП(рОбъект.Имя)+".xml";
т=Новый ТекстовыйДокумент;
т.УстановитьТекст(хмлОбъекта);
т.Записать(рИмяФайла,КодировкаТекста.UTF8);
//
Если не ПустаяСтрока(рОбъект.МодульКоманды) Тогда
рПутьНаполнения=рПуть+СокрЛП(рОбъект.Имя)+"\Ext\";
СоздатьКаталог(рПутьНаполнения);
т=Новый ТекстовыйДокумент;
т.УстановитьТекст(рОбъект.МодульКоманды);
т.Записать(рПутьНаполнения+"commandmodule.bsl",КодировкаТекста.UTF8);
//
КонецЕсли;
//
Если не ПустаяСтрока(рОбъект.СправочнаяИнформация) Тогда
рПутьНаполнения=рПуть+СокрЛП(рОбъект.Имя)+"\Ext\";
СоздатьКаталог(рПутьНаполнения);
т=Новый ТекстовыйДокумент;
т.УстановитьТекст(ПостроитьХМЛ_ОбъявлениеСправки(рОбъект));
т.Записать(рПутьНаполнения+"help.xml",КодировкаТекста.UTF8);
//
рПутьНаполнения=рПуть+СокрЛП(рОбъект.Имя)+"\Ext\Help\";
СоздатьКаталог(рПутьНаполнения);
т=Новый ТекстовыйДокумент;
т.ДобавитьСтроку("<html><head><meta http-equiv=""Content-Type"" content=""text/html; charset=utf-8""><link rel=""stylesheet"" type=""text/css"" href=""v8help://service_book/service_style""></head>");
т.ДобавитьСтроку("<body>");
т.ДобавитьСтроку(рОбъект.СправочнаяИнформация); // сам текст, если имеет разметку хтмл, должен быть БЕЗ тегов заголовка и тела!
т.ДобавитьСтроку("</body></html>");
т.Записать(рПутьНаполнения+"ru.html",КодировкаТекста.UTF8);
//
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
&НаСервереБезКонтекста
Функция ОбработатьГруппыОбщихКоманд(ОсновнойПуть, МассивОбъектов)
Если МассивОбъектов.Количество()=0 Тогда Возврат Истина КонецЕсли; // не ошибка, но ничего не делаем
рПуть=ОсновнойПуть+"CommandGroups\";
СоздатьКаталог(рПуть);
Для каждого рОбъект Из МассивОбъектов Цикл
хмлОбъекта=ПостроитьХМЛ_ГруппаОбщихКоманд(рОбъект);
Если ПустаяСтрока(хмлОбъекта) Тогда Возврат Ложь КонецЕсли;
//
рИмяФайла=рПуть+СокрЛП(рОбъект.Имя)+".xml";
т=Новый ТекстовыйДокумент;
т.УстановитьТекст(хмлОбъекта);
т.Записать(рИмяФайла,КодировкаТекста.UTF8);
//
КонецЦикла;
Возврат Истина;
КонецФункции
#КонецОбласти
Задание свойств конкретных объектов и вызов всех действий по созданию файлов расширения
// Возвращает общую успешность
&НаСервереБезКонтекста
Функция СозданиеФайловРасширения(ПутьПостроения)
соотКлассов=ПостроитьСоответствиеИмёнКлассов();
рКлассЯзык=соотКлассов.Получить("Язык");
#Область ПодготовкаДанныхОбъектов_КонкретныйПример
рИмяРасширения="РасширениеСознания";
рПрефикс="Дзен_";
мОбъектов=Новый Массив;
струЯзык=ИнициироватьОбъект(соотКлассов.Получить("Язык"),"Русский");
струЯзык.Вставить("КодЯзыка","ru");
мОбъектов.Добавить(струЯзык);
струРоль=ИнициироватьОбъект(соотКлассов.Получить("Роль"),"Администратор");
струРоль.Вставить("УстанавливатьДляНовыхОбъектов",Истина);
струРоль.Вставить("УстанавливатьДляРеквизитовИТабЧастейПоУмолчанию",Истина);
струРоль.Вставить("НезависимыеПраваПодчиненныхОбъектов",Ложь);
струРоль.Вставить("Права",Новый Структура("ThinClient,SaveUserData,Output",Истина,Истина,Истина));
струРоль.Вставить("ЕстьНаполнение",(струРоль.Права.Количество()>0));
струРоль.Вставить("ИмяРасширения",рИмяРасширения); // нужно для прав по роли
мОбъектов.Добавить(струРоль);
рТекстМодуля="
|Процедура ВызываюСервер() Экспорт
| // поём мантры
| // прочищаем чакры
| // осваиваем сутры
| // сервер откликается на наш зов!
|КонецПроцедуры
|
|Процедура СлепоКопируемАвторитетов(Источник, ОбъектКопирования) Экспорт
| // надо жить своим умом...
|
|КонецПроцедуры
|";
струОбщийМодуль=ИнициироватьОбъект(соотКлассов.Получить("ОбщийМодуль"),"МедитацияВызовСервера");
струОбщийМодуль.Вставить("ВнешнееСоединение",Истина);
струОбщийМодуль.Вставить("ВызовСервера",Истина);
струОбщийМодуль.Вставить("Глобальный",Ложь);
струОбщийМодуль.Вставить("КлиентОбычноеПриложение",Ложь);
струОбщийМодуль.Вставить("КлиентУправляемоеПриложение",Истина);
струОбщийМодуль.Вставить("Модуль",рТекстМодуля);
струОбщийМодуль.Вставить("ПовторноеИспользование",Метаданные.СвойстваОбъектов.ПовторноеИспользованиеВозвращаемыхЗначений.НеИспользовать);
струОбщийМодуль.Вставить("Привилегированный",Ложь);
струОбщийМодуль.Вставить("Сервер",Истина);
струОбщийМодуль.Вставить("ЕстьНаполнение",Не ПустаяСтрока(струОбщийМодуль.Модуль));
мОбъектов.Добавить(струОбщийМодуль);
струПараметрСеанса=ИнициироватьОбъект(соотКлассов.Получить("ПараметрСеанса"),"Просветлённость");
струПараметрСеанса.Вставить("ОписаниеТипов",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(12,3,ДопустимыйЗнак.Любой)));
мОбъектов.Добавить(струПараметрСеанса);
струПодписка=ИнициироватьОбъект(соотКлассов.Получить("ПодпискаНаСобытие"),"ПриКопированииАвторитета");
струПодписка.Вставить("Источник","cfg:CatalogObject"); // поскольку тип или описание типов такого рода платформа не умеет
струПодписка.Вставить("Событие","OnCopy"); // англоязычные имена событий - строго как в СП для соответствующих классов объектов
струПодписка.Вставить("Обработчик",рПрефикс+"МедитацияВызовСервера.СлепоКопируемАвторитетов");
мОбъектов.Добавить(струПодписка);
рТекстМодуля="
|&НаКлиенте
|Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
| // здесь вам надо самостоятельно достичь просветления:
|
|КонецПроцедуры
|";
струОбщаяКоманда=ИнициироватьОбъект(соотКлассов.Получить("ОбщаяКоманда"),"Медитировать");
струОбщаяКоманда.Вставить("Группа",СтандартнаяГруппаКоманд.ПанельДействийСервис);
струОбщаяКоманда.Вставить("Отображение",ОтображениеКнопки.Текст);
струОбщаяКоманда.Вставить("Подсказка","Расслабиться и медитировать...");
струОбщаяКоманда.Вставить("ВключатьСправкуВСодержание",Ложь);
струОбщаяКоманда.Вставить("ТипПараметраКоманды",Неопределено); // а вообще это сериализованное ОписаниеТипов
струОбщаяКоманда.Вставить("РежимИспользованияПараметра",Неопределено);
струОбщаяКоманда.Вставить("ИзменяетДанные",Ложь);
струОбщаяКоманда.Вставить("МодульКоманды",рТекстМодуля);
струОбщаяКоманда.Вставить("СправочнаяИнформация","И вам станет <b>значительно</b> легче)))");
мОбъектов.Добавить(струОбщаяКоманда);
струГруппаКоманд=ИнициироватьОбъект(соотКлассов.Получить("ГруппаКоманд"),"Паломничество");
струГруппаКоманд.Вставить("Отображение",ОтображениеКнопки.Текст);
струГруппаКоманд.Вставить("Подсказка","Дорога начинается с первого шага!");
струГруппаКоманд.Вставить("Категория",КатегорияГруппыКоманд.ПанельДействий);
мОбъектов.Добавить(струГруппаКоманд);
струПодсистема=ИнициироватьОбъект(соотКлассов.Получить("Подсистема"),"ИнтеграцияСАстралом", "Интеграция с астралом");
струПодсистема.Вставить("ВключатьСправкуВСодержание",Ложь);
струПодсистема.Вставить("Описание","Это удивительное чувство, когда чувствуешь удивительное!");
мСоставПодсистемы=Новый Массив;
Для каждого рОбъект Из мОбъектов Цикл
Если рОбъект.КлассОбъекта=рКлассЯзык Тогда Продолжить КонецЕсли; // он не входит в подсистемы
мСоставПодсистемы.Добавить(рОбъект.КлассОбъекта+"."+рПрефикс+рОбъект.Имя);
КонецЦикла;
струПодсистема.Вставить("Состав",мСоставПодсистемы);
струПодсистема.Вставить("СправочнаяИнформация","Разработано по заказу ЗАО ""Архат"", все права защищены.");
мОбъектов.Добавить(струПодсистема);
струРасширение=ИнициироватьОбъект("", рИмяРасширения, "Расширение сознания");
струРасширение.Вставить("Назначение",Метаданные.СвойстваОбъектов.НазначениеРасширенияКонфигурации.Дополнение);
струРасширение.Вставить("ПоддерживатьСоответствиеПоИД",Ложь);
струРасширение.Вставить("Префикс",рПрефикс);
струРасширение.Вставить("РежимСовместимости",Метаданные.СвойстваОбъектов.РежимСовместимости.Версия8_3_14);
струРасширение.Вставить("ИмяОсновнойРоли",рПрефикс+струРоль.Имя);
струРасширение.Вставить("Поставщик","ОМ Ltd.");
струРасширение.Вставить("Версия","1.0");
струРасширение.Вставить("КраткаяИнформация","6.6.6");
струРасширение.Вставить("ПодробнаяИнформация","Медитируй это!");
струРасширение.Вставить("АвторскиеПрава","");
струРасширение.Вставить("АдресИнформацииОПоставщике","");
струРасширение.Вставить("АдресИнформацииОКонфигурации","");
струРасширение.Вставить("РежимСовместимостиИнтерфейса",Метаданные.СвойстваОбъектов.РежимСовместимостиИнтерфейса.Такси);
// и все его объекты
струРасширение.Вставить("Объекты",мОбъектов);
струРасширение.Вставить("МодульПриложения","
|&После(""ПередНачаломРаботыСистемы"")
|Процедура Дзен_ПередНачаломРаботыСистемы(Отказ)
| //
|КонецПроцедуры
|");
// для модуля сеанса важно учесть подключение расширения - безопасный режим должен быть выключен
струРасширение.Вставить("МодульСеанса","
|&После(""УстановкаПараметровСеанса"")
|Процедура Дзен_УстановкаПараметровСеанса(ТребуемыеПараметры)
| //
|КонецПроцедуры
|");
струРасширение.Вставить("МодульВнешнегоСоединения","
|&После(""ПриНачалеРаботыСистемы"")
|Процедура Дзен_ПриНачалеРаботыСистемы()
| //
|КонецПроцедуры
|");
Для каждого рОбъект Из мОбъектов Цикл
Если рОбъект.КлассОбъекта=рКлассЯзык Тогда Продолжить КонецЕсли;
Если не СтрНачинаетсяС(рОбъект.Имя,рПрефикс) Тогда
рОбъект.Вставить("Имя",рПрефикс+рОбъект.Имя);
КонецЕсли;
КонецЦикла;
#КонецОбласти
рПуть=СокрЛП(ПутьПостроения);
Если не СтрЗаканчиваетсяНа(рПуть,"\") Тогда рПуть=рПуть+"\" КонецЕсли;
// очистим всё, что было в этой папке ранее
УдалитьФайлы(рПуть,"*.*");
#Область СозданиеОбщихФайлов
хмлОбъекта=ПостроитьХМЛ_ConfigDumpInfo(струРасширение);
Если ПустаяСтрока(хмлОбъекта) Тогда Возврат Ложь КонецЕсли;
рИмяФайла=рПуть+"ConfigDumpInfo.xml";
т=Новый ТекстовыйДокумент;
т.УстановитьТекст(хмлОбъекта);
т.Записать(рИмяФайла,КодировкаТекста.UTF8);
хмлОбъекта=ПостроитьХМЛ_Configuration(струРасширение);
Если ПустаяСтрока(хмлОбъекта) Тогда Возврат Ложь КонецЕсли;
рИмяФайла=рПуть+"Configuration.xml";
т=Новый ТекстовыйДокумент;
т.УстановитьТекст(хмлОбъекта);
т.Записать(рИмяФайла,КодировкаТекста.UTF8);
Если не ПустаяСтрока(струРасширение.МодульПриложения) Тогда
рПутьНаполнения=рПуть+"\Ext\";
СоздатьКаталог(рПутьНаполнения);
т=Новый ТекстовыйДокумент;
т.УстановитьТекст(струРасширение.МодульПриложения);
т.Записать(рПутьНаполнения+"ManagedApplicationModule.bsl",КодировкаТекста.UTF8);
КонецЕсли;
Если не ПустаяСтрока(струРасширение.МодульСеанса) Тогда
рПутьНаполнения=рПуть+"\Ext\";
СоздатьКаталог(рПутьНаполнения);
т=Новый ТекстовыйДокумент;
т.УстановитьТекст(струРасширение.МодульСеанса);
т.Записать(рПутьНаполнения+"SessionModule.bsl",КодировкаТекста.UTF8);
КонецЕсли;
Если не ПустаяСтрока(струРасширение.МодульВнешнегоСоединения) Тогда
рПутьНаполнения=рПуть+"\Ext\";
СоздатьКаталог(рПутьНаполнения);
т=Новый ТекстовыйДокумент;
т.УстановитьТекст(струРасширение.МодульВнешнегоСоединения);
т.Записать(рПутьНаполнения+"ExternalConnectionModule.bsl",КодировкаТекста.UTF8);
КонецЕсли;
хмлОбъекта=ПостроитьХМЛ_Подсистема(струПодсистема);
Если ПустаяСтрока(хмлОбъекта) Тогда Возврат Ложь КонецЕсли;
рПутьПодсистем=рПуть+"Subsystems\";
СоздатьКаталог(рПутьПодсистем);
рИмяФайла=рПутьПодсистем+СокрЛП(струПодсистема.Имя)+".xml";
т=Новый ТекстовыйДокумент;
т.УстановитьТекст(хмлОбъекта);
т.Записать(рИмяФайла,КодировкаТекста.UTF8);
//
Если не ПустаяСтрока(струПодсистема.СправочнаяИнформация) Тогда
рПутьНаполнения=рПутьПодсистем+СокрЛП(струПодсистема.Имя)+"\Ext\";
СоздатьКаталог(рПутьНаполнения);
т=Новый ТекстовыйДокумент;
т.УстановитьТекст(ПостроитьХМЛ_ОбъявлениеСправки(струПодсистема));
т.Записать(рПутьНаполнения+"help.xml",КодировкаТекста.UTF8);
//
рПутьНаполнения=рПутьПодсистем+СокрЛП(струПодсистема.Имя)+"\Ext\Help\";
СоздатьКаталог(рПутьНаполнения);
т=Новый ТекстовыйДокумент;
т.ДобавитьСтроку("<html><head><meta http-equiv=""Content-Type"" content=""text/html; charset=utf-8""><link rel=""stylesheet"" type=""text/css"" href=""v8help://service_book/service_style""></head>");
т.ДобавитьСтроку("<body>");
т.ДобавитьСтроку(струПодсистема.СправочнаяИнформация); // сам текст, если имеет разметку хтмл, должен быть БЕЗ тегов заголовка и тела!
т.ДобавитьСтроку("</body></html>");
т.Записать(рПутьНаполнения+"ru.html",КодировкаТекста.UTF8);
//
КонецЕсли;
#КонецОбласти
#Область СозданиеФайловКлассовОбъектов
Для каждого киз Из соотКлассов Цикл
мНужных=ПолучитьОбъектыПоКлассу(мОбъектов, киз.Значение);
Если киз.Ключ="Роль" Тогда
рУспешно=ОбработатьРоли(рПуть, мНужных);
//
ИначеЕсли киз.Ключ="Язык" Тогда
рУспешно=ОбработатьЯзыки(рПуть, мНужных);
//
ИначеЕсли киз.Ключ="ОбщийМодуль" Тогда
рУспешно=ОбработатьОбщиеМодули(рПуть, мНужных);
//
ИначеЕсли киз.Ключ="ОбщаяКоманда" Тогда
рУспешно=ОбработатьОбщиеКоманды(рПуть, мНужных);
//
ИначеЕсли киз.Ключ="ГруппаКоманд" Тогда
рУспешно=ОбработатьГруппыОбщихКоманд(рПуть, мНужных);
//
ИначеЕсли киз.Ключ="ПараметрСеанса" Тогда
рУспешно=ОбработатьПараметрыСеанса(рПуть, мНужных);
//
ИначеЕсли киз.Ключ="ПодпискаНаСобытие" Тогда
рУспешно=ОбработатьПодпискиНаСобытия(рПуть, мНужных);
//
КонецЕсли;
Если не рУспешно Тогда
Сообщить("Ошибка при обработке класса """+киз.Ключ+""", построение прервано!"); Прервать;
КонецЕсли;
КонецЦикла;
#КонецОбласти
Возврат Истина;
КонецФункции
И собственно вызов, с указанием каталога, в котором будут созданы файлы расширения:
Успешность=СозданиеФайловРасширения(ПутьПостроения);
Далее можно загрузить эти файлы в расширение конкретной или пустой базы. Можно, например, организовать отдельную пустую базу для программной сборки расширений, не имеющих прикладных объектов. Разумеется, для подписок на события наличие прикладных тоже может быть критично.
Далее можно вручную или программно "собрать" расширение.
Напомню, программно это пакетная команда запуска конфигуратора, командная строка, где следует указать /LoadConfigFromFiles
и путь построения (каталог, где находятся файлы), и ключ -format Hierarchical
Сам не делал, желающие могут попробовать. Также, не знаю, как себя ведёт платформа при ключе -AllExtensions.
После загрузки задача сведётся к работе с объектом "РасширениеКонфигурации" и манипуляциям с его данными и свойствами.
Например, из cfe-файла можно создать новое расширение:
ДвоичДанные=Новый ДвоичныеДанные(<ИмяФайлаРасширения>);
НовоеРасширение=РасширенияКонфигурации.Создать();
НовоеРасширение.Записать(ДвоичДанные);
и далее настроить его свойства.
Тестировалось на 8.3.18.1363, и это принципиально важно, т.к. внутренний формат данных меняется от релиза к релизу. Версию актуального формата можно узнать, сделав маленькое расширение и выгрузив его в файлы. В данной публикации используется версия 2.11
Чисто теоретически, можно попробовать сделать прямо в Предприятии свой маленький Конфигуратор для расширений.
Пакетные действия реализованы, например, в Vanessa-runner.
Кому пригодится, будет хорошо.