diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..d4918cf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+bdd-log.xml
+*.ospx
+*.orig
+exec.log
+ignore/**
+tests.xml
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..97ce1d1
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,19 @@
+{
+ // Используйте IntelliSense, чтобы узнать о возможных атрибутах.
+ // Наведите указатель мыши, чтобы просмотреть описания существующих атрибутов.
+ // Для получения дополнительной информации посетите: https://go.microsoft.com/fwlink/?linkid=830387
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Отладка 1Script",
+ "type": "oscript",
+ "request": "launch",
+ "program": "${workspaceRoot}/tests/РазборконфигурацииEDT.os",
+ "args": [],
+ "cwd": "${workspaceRoot}",
+ "runtimeExecutable": null,
+ "debugPort": 2801,
+ "protocol": "internal"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..fe1311c
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2019 BIA Technologies, LLC
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/installlocalhost.bat b/installlocalhost.bat
new file mode 100644
index 0000000..12a4e29
--- /dev/null
+++ b/installlocalhost.bat
@@ -0,0 +1,12 @@
+@echo off
+call del "*.ospx"
+
+for /f %%i in ('"oscript -version"') do set result=%%i
+
+if %result%==1.0.19.105 (
+ call opm build . -mf ./packagedef -out .
+) else (
+ call opm build -m ./packagedef -o .
+)
+
+call opm install -f *.ospx
\ No newline at end of file
diff --git a/lib.config b/lib.config
deleted file mode 100644
index 2e8de7b..0000000
--- a/lib.config
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/packagedef b/packagedef
index 7486013..505e3e8 100644
--- a/packagedef
+++ b/packagedef
@@ -1,5 +1,14 @@
-
-Описание.Имя("parserbia")
- .Версия("1.0.2")
+ПутьКСценариюПараметров = ОбъединитьПути(ТекущийСценарий().Каталог, "src", "Модули", "ПараметрыПродукта.os");
+ПараметрыСистемы_ЛокальнаяВерсия = ЗагрузитьСценарий(ПутьКСценариюПараметров);
+
+ИмяПродукта = НРег(ПараметрыСистемы_ЛокальнаяВерсия.ИмяПродукта());
+
+Описание.Имя(ИмяПродукта)
+ .ВерсияСреды("1.0.21")
+ .Версия(ПараметрыСистемы_ЛокальнаяВерсия.ВерсияПродукта())
+ .ЗависитОт("logos", "1.2.1")
+ .ЗависитОт("fs", "1.0.0")
.ВключитьФайл("src")
- .ВключитьФайл("lib.config");
\ No newline at end of file
+ .ВключитьФайл("lib.config");
+ .ВключитьФайл("readme.md");
+ .ВключитьФайл("LICENSE");
\ No newline at end of file
diff --git a/readme.md b/readme.md
index 08db4fc..9697cf2 100644
--- a/readme.md
+++ b/readme.md
@@ -8,3 +8,11 @@
`#Использовать "parser-bia"`
`Парсер = Новый РазборСтруктурыКонфигурации();`
+
+## Описание API
+
+ПолучитьОписаниеМодуляПоИмениФайла
+ПрочитатьСодержимоеМодуля
+ПрочитатьДеревоКонфигурации
+НайтиМодулиКонфигурации
+ПолноеИмяОбъекта
\ No newline at end of file
diff --git a/src/core/Модули/ТипМодуля.os b/src/core/Модули/ТипМодуля.os
deleted file mode 100644
index d53ffc4..0000000
--- a/src/core/Модули/ТипМодуля.os
+++ /dev/null
@@ -1,125 +0,0 @@
-Перем ОбщийМодуль Экспорт;
-
-Перем МодульОбъекта Экспорт;
-Перем МодульМенеджера Экспорт;
-
-Перем МодульОбычнойФормы Экспорт;
-Перем МодульУправляемойФормы Экспорт;
-
-Перем МодульКоманды Экспорт;
-
-Перем МодульСеанса Экспорт;
-Перем МодульОбычногоПриложения Экспорт;
-Перем МодульУправляемогоПриложения Экспорт;
-Перем МодульВнешнегоСоединения Экспорт;
-
-///////////////////////////////////////////////////////////////////////////////////////////////
-
-Функция ТипМодуляПоИмениФайла(ПолноеИмяФайла)Экспорт
-
- Файл = Новый Файл(ПолноеИмяФайла);
- ИмяБезРасширения = Файл.ИмяБезРасширения;
- Расширение = Файл.Расширение;
-
- ТипЭтогоМодуля = "";
-
- Если ИмяБезРасширения = "CommandModule" Тогда
-
- ТипЭтогоМодуля = МодульКоманды;
-
- ИначеЕсли ИмяБезРасширения = "ManagedApplicationModule" Тогда
-
- ТипЭтогоМодуля = МодульУправляемогоПриложения;
-
- ИначеЕсли ИмяБезРасширения = "OrdinaryApplicationModule" Тогда
-
- ТипЭтогоМодуля = МодульОбычногоПриложения;
-
- ИначеЕсли ИмяБезРасширения = "SessionModule" Тогда
-
- ТипЭтогоМодуля = МодульСеанса;
-
- ИначеЕсли ИмяБезРасширения = "ExternalConnectionModule" Тогда
-
- ТипЭтогоМодуля = МодульВнешнегоСоединения;
-
- ИначеЕсли ИмяБезРасширения = "ManagerModule"
- ИЛИ ИмяБезРасширения = "ValueManagerModule" Тогда
-
- ТипЭтогоМодуля = МодульМенеджера;
-
- ИначеЕсли ИмяБезРасширения = "ObjectModule"
- ИЛИ ИмяБезРасширения = "RecordSetModule" Тогда
-
- ТипЭтогоМодуля = МодульОбъекта;
-
- ИначеЕсли ИмяБезРасширения = "module" И ПустаяСтрока(Расширение) Тогда
-
- ТипЭтогоМодуля = МодульОбычнойФормы;
-
- ИначеЕсли ИмяБезРасширения = "Module" Тогда
-
- МассивЧастейИмени = СтрРазделить(ПолноеИмяФайла, "\");
- Если МассивЧастейИмени.Количество() > 3 Тогда
-
- Родитель = МассивЧастейИмени[МассивЧастейИмени.Количество() - 2];
- Если Родитель = "Ext" Тогда
-
- Родитель = МассивЧастейИмени[МассивЧастейИмени.Количество() - 4];
- Если Родитель = "CommonModules" Тогда
-
- ТипЭтогоМодуля = ОбщийМодуль;
-
- ИначеЕсли Родитель = "WebServices" Тогда
-
- ТипЭтогоМодуля = МодульОбъекта;
-
- КонецЕсли;
-
- ИначеЕсли Родитель = "Form" Тогда
-
- ТипЭтогоМодуля = МодульУправляемойФормы;
-
- Иначе
-
- Родитель = МассивЧастейИмени[МассивЧастейИмени.Количество() - 3];
- Если Родитель = "CommonModule" Тогда
-
- ТипЭтогоМодуля = ОбщийМодуль;
-
- ИначеЕсли Родитель = "WebService" Тогда
-
- ТипЭтогоМодуля = МодульОбъекта;
-
- КонецЕсли;
-
- КонецЕсли;
-
- Иначе
-
- ВызватьИсключение "Ошибочная структура имени файла: " + ПолноеИмяФайла;
-
- КонецЕсли;
-
- КонецЕсли;
-
- Возврат ТипЭтогоМодуля;
-
-КонецФункции
-
-///////////////////////////////////////////////////////////////////////////////////////////////
-
-ОбщийМодуль = "ОбщийМодуль";
-
-МодульОбъекта = "МодульОбъекта";
-МодульМенеджера = "МодульМенеджера";
-
-МодульОбычнойФормы = "МодульОбычнойФормы";
-МодульУправляемойФормы = "МодульУправляемойФормы";
-
-МодульКоманды = "МодульКоманды";
-
-МодульСеанса = "МодульСеанса";
-МодульОбычногоПриложения = "МодульОбычногоПриложения";
-МодульУправляемогоПриложения = "МодульУправляемогоПриложения";
-МодульВнешнегоСоединения = "МодульВнешнегоСоединения";
\ No newline at end of file
diff --git a/src/Классы/РазборКонфигурации1С.os b/src/Классы/РазборКонфигурации1С.os
new file mode 100644
index 0000000..22056cd
--- /dev/null
+++ b/src/Классы/РазборКонфигурации1С.os
@@ -0,0 +1,624 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// Модуль разбора файлов конфигурации
+//
+// (с) BIA Technologies, LLC
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#Использовать fs
+#Использовать "../ЧтениеМодулей"
+
+///////////////////////////////////////////////////////////////////////////////
+
+Перем СтруктураКаталогов;
+Перем ЧитательОписаний;
+Перем ОписаниеКонфигурации;
+Перем ДанныеКонфигурации;
+
+///////////////////////////////////////////////////////////////////////////////
+// ПРОГРАММНЫЙ ИНТЕРФЕЙС
+///////////////////////////////////////////////////////////////////////////////
+
+Процедура ПрочитатьСтруктуруКонфигурации() Экспорт
+
+ ОписаниеКонфигурации = ПрочитатьОписаниеКонфигурации();
+
+ ЗаполнитьПодсистемыОбъектовКонфигурации();
+
+ ЗаполнитьИменаФайлов();
+
+КонецПроцедуры
+
+Функция НайтиМодулиКонфигурации()Экспорт
+
+ МодулиКонфигурации = СтруктурыОписаний.ТаблицаОписанияМодулей();
+
+ // todo сделать чтение форм
+ ФормыКонфигурации = Новый ТаблицаЗначений;
+ ФормыКонфигурации.Колонки.Добавить("Родитель");
+ ФормыКонфигурации.Колонки.Добавить("ЭтоУправляемаяФорма");
+ ФормыКонфигурации.Колонки.Добавить("Наименование");
+
+ // todo сделать чтение команд
+ КомандыКонфигурации = Новый ТаблицаЗначений;
+ КомандыКонфигурации.Колонки.Добавить("Родитель");
+ КомандыКонфигурации.Колонки.Добавить("Наименование");
+
+ ОписаниеКонфигурации.Вставить("ФормыКонфигурации", ФормыКонфигурации);
+ ОписаниеКонфигурации.Вставить("КомандыКонфигурации", КомандыКонфигурации);
+ ОписаниеКонфигурации.Вставить("МодулиКонфигурации", МодулиКонфигурации);
+
+ Для Каждого ОбъектКонфигурации Из ОписаниеКонфигурации.ОбъектыКонфигурации Цикл
+
+ ФайлыМодулей = СтруктураКаталогов.НайтиМодулиОбъекта(ОбъектКонфигурации.Наименование, ОбъектКонфигурации.Тип, Истина);
+
+ Для Каждого ИмяФайлаМодуля Из ФайлыМодулей Цикл
+
+ ПолучитьОписаниеМодуляПоИмениФайла(ИмяФайлаМодуля, ОбъектКонфигурации, ОписаниеКонфигурации);
+
+ КонецЦикла;
+
+ КонецЦикла;
+
+ МодулиКонфигурации.Сортировать("ПутьКФайлу");
+ Возврат ОписаниеКонфигурации;
+
+КонецФункции
+
+Функция ОписаниеКонфигурации() Экспорт
+
+ Возврат ОписаниеКонфигурации;
+
+КонецФункции
+
+Функция ПрочитатьОписаниеКонстант()Экспорт
+
+ Фильтр = Новый Структура("Тип", "Constant");
+
+ СтрокиКонстант = ОписаниеКонфигурации.ОбъектыКонфигурации.НайтиСтроки(Фильтр);
+
+ МассивОписанийКонстант = Новый Массив;
+
+ Для Каждого Объект Из СтрокиКонстант Цикл
+
+ ОписаниеИзXML = ПолучитьОписаниеКонстанты(Объект.ПутьКФайлуСОписанием);
+
+ ОписаниеКонстанты = Новый Структура("Имя, Тип, Описание, Подсистема, ПодсистемаПредставление");
+
+ ОписаниеКонстанты.Имя = Объект.Наименование;
+ ОписаниеКонстанты.Тип = ЧтениеОписанийБазовый.ПреобразоватьТип(ОписаниеИзXML.ТипКонстанты);
+ ОписаниеКонстанты.Описание = ОписаниеИзXML.ТекстОписания;
+
+ Если ЗначениеЗаполнено(Объект.Подсистемы) Тогда
+ ОписаниеКонстанты.Подсистема = Объект.Подсистемы[0].Имя;
+ ОписаниеКонстанты.ПодсистемаПредставление = Объект.Подсистемы[0].ПредставлениеКратко;
+ КонецЕсли;
+
+ МассивОписанийКонстант.Добавить(ОписаниеКонстанты);
+
+ КонецЦикла;
+
+ Возврат МассивОписанийКонстант;
+
+КонецФункции
+
+Процедура ПрочитатьСодержимоеМодуля(СтрокаМодуль)Экспорт
+
+ Файл = Новый ТекстовыйДокумент;
+ Файл.Прочитать(СтрокаМодуль.ПутьКФайлу, КодировкаТекста.UTF8NoBOM);
+
+ СодержимоеМодуля = ЧтениеМодулей.ПрочитатьМодуль(Файл);
+ СтрокаМодуль.Содержимое = СодержимоеМодуля.Содержимое;
+
+ ЧтениеМодулей.ДополнитьБлокиМодуля(СодержимоеМодуля.БлокиМодуля, Файл, СтрокаМодуль);
+ СтрокаМодуль.НаборБлоков = СодержимоеМодуля.БлокиМодуля;
+
+ Если СтрокаМодуль.ТипМодуля = ТипМодуля.ОбщийМодуль Тогда
+
+ Текст = Новый ТекстовыйДокумент;
+ Текст.Прочитать(СтрокаМодуль.Родитель.ПутьКФайлуСОписанием);
+ Если СтрНайти(Текст.ПолучитьТекст(), "true") Тогда
+
+ СтрокаМодуль.ОписаниеМодуля.Вставить("Глобальный", Истина);
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура УдалитьОбъектыВнеПодсистем() Экспорт
+
+ Количество = ОписаниеКонфигурации.ОбъектыКонфигурации.Количество();
+
+ Для Инд = 1 По Количество Цикл
+
+ Если ОписаниеКонфигурации.ОбъектыКонфигурации[Количество - Инд].Подсистемы.Количество() = 0 Тогда
+
+ ОписаниеКонфигурации.ОбъектыКонфигурации.Удалить(Количество - Инд);
+
+ КонецЕсли;
+
+ КонецЦикла
+
+КонецПроцедуры
+
+Функция ПолноеИмяМодуля(СтрокаМодуль) Экспорт
+
+ Возврат ЧтениеОписанийБазовый.ПолноеИмяМодуля(СтрокаМодуль);
+
+КонецФункции
+
+Функция ПолноеИмяОбъекта(СтрокаМодуль, ДобавлятьПрефиксДляОбщихМодулей = ИСТИНА) Экспорт
+
+ Возврат ЧтениеОписанийБазовый.ПолноеИмяОбъекта(СтрокаМодуль, ДобавлятьПрефиксДляОбщихМодулей);
+
+КонецФункции
+
+///////////////////////////////////////////////////////////////////////////////
+// УСТАРЕВШИЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС
+///////////////////////////////////////////////////////////////////////////////
+
+Функция ПрочитатьДеревоКонфигурации() Экспорт
+
+ ПрочитатьСтруктуруКонфигурации();
+
+ Возврат ОписаниеКонфигурации;
+
+КонецФункции
+
+Функция СформироватьОписаниеОбъекта(КореньОписания)
+
+ ОписаниеОбъекта = Новый Структура;
+ ВеткаСвойства = КореньОписания.Найти("Properties", "Имя");
+ Если ВеткаСвойства <> Неопределено Тогда
+
+ КонецЕсли;
+
+ ВеткаПодчиненныеОбъекты = КореньОписания.Найти("ChildObjects", "Имя");
+ Если ВеткаПодчиненныеОбъекты <> Неопределено И ТипЗнч(ВеткаПодчиненныеОбъекты.Значение) = Тип("ТаблицаЗначений") Тогда
+
+ Формы = СформироватьОписаниеОбъектаФормы(ВеткаПодчиненныеОбъекты.Значение);
+ Если Формы <> Неопределено Тогда
+
+ ОписаниеОбъекта.Вставить("Формы", Формы);
+
+ КонецЕсли;
+
+ Реквизиты = СформироватьОписаниеОбъектаРеквизиты(ВеткаПодчиненныеОбъекты.Значение);
+ Если Реквизиты <> Неопределено Тогда
+
+ ОписаниеОбъекта.Вставить("Реквизиты", Реквизиты);
+
+ КонецЕсли;
+
+ ТЧ = СформироватьОписаниеОбъектаТабличныеЧасти(ВеткаПодчиненныеОбъекты.Значение);
+ Если ТЧ <> Неопределено Тогда
+
+ ОписаниеОбъекта.Вставить("ТабличныеЧасти", ТЧ);
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Возврат ОписаниеОбъекта;
+
+КонецФункции
+
+Функция СформироватьОписаниеОбъектаФормы(ПодчиненныеОбъекты)
+
+ СтрФормы = ПодчиненныеОбъекты.НайтиСтроки(Новый Структура("Имя", "Form"));
+ Если СтрФормы.Количество() Тогда
+
+ Формы = Новый Массив;
+ Для Каждого СтрФорма Из СтрФормы Цикл
+
+ Формы.ДобавитЬ(СтрФорма.Значение);
+
+ КонецЦикла;
+
+ Возврат Формы;
+
+ КонецЕсли;
+
+ Возврат Неопределено;
+
+КонецФункции
+
+Функция СформироватьОписаниеОбъектаРеквизиты(ПодчиненныеОбъекты)
+
+ СтрАтрибуты = ПодчиненныеОбъекты.НайтиСтроки(Новый Структура("Имя", "Attribute"));
+ Если СтрАтрибуты.Количество() Тогда
+
+ Реквизиты = Новый ТаблицаЗначений;
+ Реквизиты.Колонки.Добавить("Имя");
+ Для Каждого СтрАтрибут Из СтрАтрибуты Цикл
+
+ ОписаниеАтрибута = СтрАтрибут.Значение.Найти("Properties", "Имя");
+ Если ОписаниеАтрибута = Неопределено Тогда
+
+ Продолжить;
+
+ КонецЕсли;
+
+ СтрНаименования = ОписаниеАтрибута.Значение.Найти("Name", "Имя");
+ Если СтрНаименования = Неопределено Тогда
+
+ Продолжить;
+
+ КонецЕсли;
+
+ НовыйРеквизит = Реквизиты.Добавить();
+ НовыйРеквизит.Имя = СтрНаименования.Значение;
+ Для Каждого ЭлОписания Из ОписаниеАтрибута.Значение Цикл
+
+ Если ЭлОписания.Имя = "Name" Тогда
+
+ Продолжить;
+
+ КонецЕсли;
+
+ Если Реквизиты.Колонки.Найти(ЭлОписания.Имя) = Неопределено Тогда
+
+ Попытка
+
+ Реквизиты.Колонки.Добавить(ЭлОписания.Имя);
+
+ Исключение
+
+ Продолжить;
+
+ КонецПопытки;
+
+ КонецЕсли;
+
+ НовыйРеквизит[ЭлОписания.Имя] = ЭлОписания.Значение;
+
+ КонецЦикла
+
+ КонецЦикла;
+
+ Возврат Реквизиты;
+
+ КонецЕсли;
+
+ Возврат Неопределено;
+
+КонецФункции
+
+Функция СформироватьОписаниеОбъектаТабличныеЧасти(ПодчиненныеОбъекты)
+
+ СтрТЧ = ПодчиненныеОбъекты.НайтиСтроки(Новый Структура("Имя", "TabularSection"));
+ Если СтрТЧ.Количество() Тогда
+
+ ТЧ = Новый ТаблицаЗначений;
+ ТЧ.Колонки.Добавить("Имя");
+ ТЧ.Колонки.Добавить("Описание");
+ ТЧ.Колонки.Добавить("Реквизиты");
+ Для Каждого Стр Из СтрТЧ Цикл
+
+ СтрОписание = СформироватьОписаниеОбъекта(Стр.Значение);
+ Если СтрОписание.Свойство("Описание") Тогда
+
+ СтрНаименования = СтрОписание.Описание.Найти("Name", "Имя");
+ Если СтрНаименования <> Неопределено Тогда
+
+ НоваяТЧ = ТЧ.Добавить();
+ НоваяТЧ.Имя = СтрНаименования.Значение;
+ НоваяТЧ.Описание = СтрОписание.Описание;
+
+ Если СтрОписание.Свойство("Реквизиты") Тогда
+
+ НоваяТЧ.Реквизиты = СтрОписание.Реквизиты;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Возврат ТЧ;
+
+ КонецЕсли;
+
+ Возврат Неопределено;
+
+КонецФункции
+
+//////////////////////////////////////////////////////////////////////////////
+// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
+///////////////////////////////////////////////////////////////////////////////
+
+Функция ПрочитатьОписаниеКонфигурации()
+
+ ФайлКонфигурации = СтруктураКаталогов.ИмяФайлаОписанияКонфигурации();
+
+ Если Не ФС.ФайлСуществует(ФайлКонфигурации) Тогда
+
+ ВызватьИсключение СтрШаблон("Файл описания конфигурации ""%1"" не обнаружен", ФайлКонфигурации);
+
+ КонецЕсли;
+
+ ОписаниеКонфигурации = ЧитательОписаний.ПрочитатьОписаниеКонфигурации(ФайлКонфигурации);
+
+ СвойстваКонфигурации = ОписаниеКонфигурации.СвойстваКонфигурации;
+ ОбъектыКонфигурации = ОписаниеКонфигурации.ОбъектыКонфигурации;
+
+ // добавим руками объект "Configuration" для модулей приложения
+ ПустаяСтрокаОбъектКонфигурации = СтруктурыОписаний.ОписаниеОбъектаКонфигурацииЗначенияПоУмолчанию();
+ НовСтрока = ОбъектыКонфигурации.Добавить();
+ ЗаполнитьЗначенияСвойств(НовСтрока, ПустаяСтрокаОбъектКонфигурации);
+ НовСтрока.Тип = "Configuration";
+ НовСтрока.Наименование = "Configuration";
+ НовСтрока.ПутьКФайлуСОписанием = ФайлКонфигурации;
+
+ Возврат Новый Структура("СвойстваКонфигурации, ОбъектыКонфигурации", СвойстваКонфигурации, ОбъектыКонфигурации);
+
+КонецФункции
+
+Процедура ЗаполнитьПодсистемыОбъектовКонфигурации()
+
+ // дополним объекты информацией о подсистемах
+ ПодсистемыКонфигурации = ПрочитатьПодсистемыКонфигурации();
+
+ ОписаниеКонфигурации.Вставить("ПодсистемыКонфигурации", ПодсистемыКонфигурации);
+
+ Для Каждого ОбъектКонфигурации Из ОписаниеКонфигурации.ОбъектыКонфигурации Цикл
+
+ Подсистемы = ПодсистемыКонфигурации.НайтиСтроки(Новый Структура("ОбъектМетаданных", ОбъектКонфигурации.Тип + "." + ОбъектКонфигурации.Наименование));
+
+ Если Подсистемы.Количество() Тогда
+
+ // ставим первую
+ ОбъектКонфигурации.Подсистемы = Подсистемы;
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Функция ПолучитьОписаниеМодуляПоИмениФайла(Знач ИмяФайлаМодуля, ОбъектКонфигурации, ОписаниеКонфигурации)Экспорт
+
+ НовыйМодульКонфигурации = Неопределено;
+
+ ПустаяСтрокаМодульКонфигурации = Новый Структура(
+ "ПутьКФайлу, ТипМодуля, ОписаниеМодуля, Родитель, РодительФорма, РодительКоманда, НаборБлоков, Содержимое",
+ "", "", Новый Структура, Неопределено, Неопределено, Неопределено, Неопределено, Неопределено);
+
+ ТипЭтогоМодуля = ТипМодуля.ТипМодуляПоИмениФайла(ИмяФайлаМодуля);
+
+ Если Не ПустаяСтрока(ТипЭтогоМодуля) Тогда
+
+ ФормаОбъекта = Неопределено;
+ КомандаОбъекта = Неопределено;
+
+ Если ТипЭтогоМодуля = ТипМодуля.МодульОбъекта
+ ИЛИ ТипЭтогоМодуля = ТипМодуля.МодульМенеджера
+ ИЛИ ТипЭтогоМодуля = ТипМодуля.ОбщийМодуль
+ ИЛИ ТипЭтогоМодуля = ТипМодуля.МодульУправляемогоПриложения
+ ИЛИ ТипЭтогоМодуля = ТипМодуля.МодульСеанса
+ ИЛИ ТипЭтогоМодуля = ТипМодуля.МодульВнешнегоСоединения
+ ИЛИ ТипЭтогоМодуля = ТипМодуля.МодульОбычногоПриложения Тогда
+
+ ИначеЕсли ТипМодуля.ЭтоМодульФормы(ТипЭтогоМодуля) Тогда
+
+ ФормаОбъекта = ОписаниеКонфигурации.ФормыКонфигурации.Добавить();
+ ФормаОбъекта.Родитель = ОбъектКонфигурации;
+ ФормаОбъекта.ЭтоУправляемаяФорма = ТипЭтогоМодуля = ТипМодуля.МодульУправляемойФормы;
+ ФормаОбъекта.Наименование = ПолучитьИмяФормыИзИмениФайлаМодуля(ИмяФайлаМодуля);
+
+ ИначеЕсли ТипЭтогоМодуля = ТипМодуля.МодульКоманды Тогда
+
+ КомандаОбъекта = ОписаниеКонфигурации.КомандыКонфигурации.Добавить();
+ КомандаОбъекта.Родитель = ОбъектКонфигурации;
+ КомандаОбъекта.Наименование = ПолучитьИмяКомандыИзИмениФайлаМодуля(ИмяФайлаМодуля);
+
+ Иначе
+
+ ВызватьИсключение "Тип модуля: " + ТипЭтогоМодуля + " не имеет алгоритма разбора";
+
+ КонецЕсли;
+
+ НовыйМодульКонфигурации = ОписаниеКонфигурации.МодулиКонфигурации.Добавить();
+ ЗаполнитьЗначенияСвойств(НовыйМодульКонфигурации, ПустаяСтрокаМодульКонфигурации);
+ НовыйМодульКонфигурации.ТипМодуля = ТипЭтогоМодуля;
+ НовыйМодульКонфигурации.ПутьКФайлу = ИмяФайлаМодуля;
+ НовыйМодульКонфигурации.Родитель = ОбъектКонфигурации;
+ НовыйМодульКонфигурации.РодительФорма = ФормаОбъекта;
+ НовыйМодульКонфигурации.РодительКоманда = КомандаОбъекта;
+
+ КонецЕсли;
+
+ Если НовыйМодульКонфигурации <> Неопределено Тогда
+
+ ЗаполнитьЗначенияСвойств(ПустаяСтрокаМодульКонфигурации, НовыйМодульКонфигурации);
+
+ КонецЕсли;
+
+ Возврат ПустаяСтрокаМодульКонфигурации;
+
+КонецФункции
+
+///////////////////////////////////////////////////////////////////
+
+Функция ПолучитьОписаниеКонстанты(ПутьКФайлу)
+
+ ПараметрыОписанияКонстанты = СтруктурыОписаний.ОписаниеКонстанты();
+
+ Описание = ЧитательОписаний.ПрочитатьСвойстваИзФайла(ПутьКФайлу, ПараметрыОписанияКонстанты);
+
+ РезультатПоиска = Новый Структура("ТипКонстанты, ТекстОписания", Описание.Тип , Описание.Пояснение);
+
+ Возврат РезультатПоиска;
+
+КонецФункции
+
+///////////////////////////////////////////////////////////////////
+
+Процедура ЗаполнитьИменаФайлов()
+
+ Для Каждого СтрокаОбъектКонфигурации Из ОписаниеКонфигурации.ОбъектыКонфигурации Цикл
+
+ СтрокаОбъектКонфигурации.ПутьКФайлуСОписанием = СтруктураКаталогов.ИмяФайлаОписанияОбъекта(СтрокаОбъектКонфигурации.Наименование, СтрокаОбъектКонфигурации.Тип);
+
+ КонецЦикла
+
+КонецПроцедуры
+
+///////////////////////////////////////////////////////////////////
+
+Функция ПолучитьИмяФормыИзИмениФайлаМодуля(ПолноеИмяФайла)
+
+ МассивЧастейИмени = СтрРазделить(ПолноеИмяФайла, "\");
+ Если МассивЧастейИмени.Количество() > 3 Тогда
+
+ Номер = 2;
+ Родитель = МассивЧастейИмени[МассивЧастейИмени.Количество() - Номер];
+ Если Родитель = "Form" Тогда
+
+ Номер = Номер + 1;
+ Родитель = МассивЧастейИмени[МассивЧастейИмени.Количество() - Номер];
+
+ КонецЕсли;
+
+ Если Родитель = "Ext" Тогда
+
+ Номер = Номер + 1;
+ Родитель = МассивЧастейИмени[МассивЧастейИмени.Количество() - Номер];
+
+ КонецЕсли;
+
+ Возврат Родитель;
+
+ Иначе
+
+ ВызватьИсключение "Ошибочная структура имени файла: " + ПолноеИмяФайла;
+
+ КонецЕсли;
+
+ Возврат "";
+
+КонецФункции
+
+Функция ПолучитьИмяКомандыИзИмениФайлаМодуля(ПолноеИмяФайла)
+
+ МассивЧастейИмени = СтрРазделить(ПолноеИмяФайла, "\");
+ Если МассивЧастейИмени.Количество() > 3 Тогда
+
+ Номер = 2;
+ Родитель = МассивЧастейИмени[МассивЧастейИмени.Количество() - Номер];
+
+ Если Родитель = "Ext" Тогда
+
+ Номер = Номер + 1;
+ Родитель = МассивЧастейИмени[МассивЧастейИмени.Количество() - Номер];
+
+ КонецЕсли;
+
+ Возврат Родитель;
+
+ Иначе
+
+ ВызватьИсключение "Ошибочная структура имени файла: " + ПолноеИмяФайла;
+
+ КонецЕсли;
+
+ Возврат "";
+
+КонецФункции
+
+///////////////////////////////////////////////////////////////////
+
+Функция ПрочитатьПодсистемыКонфигурации()
+
+ ОписаниеПодсистем = СтруктурыОписаний.ТаблицаОписанияПодсистем();
+
+ Для Каждого ФайлыПодсистемы Из СтруктураКаталогов.НайтиФайлыПодсистем() Цикл
+
+ ПрочитатьПодсистему(ФайлыПодсистемы, ОписаниеПодсистем, "", "", Неопределено, Неопределено);
+
+ КонецЦикла;
+
+ Возврат ОписаниеПодсистем;
+
+КонецФункции
+
+Процедура ПрочитатьПодсистему(ФайлыПодсистемы, ОписаниеПодсистем, Знач ПодсистемаИмя, Знач ПодсистемаПредставление, Знач Визуальная, Знач Родитель)
+
+ СвойстваОписания = ЧитательОписаний.ПрочитатьСвойстваИзФайла(ФайлыПодсистемы.ФайлОписания, СтруктурыОписаний.ОписаниеПодсистемы());
+
+ ВКомандномИнтерфейсе = СвойстваОписания.ВключатьВКомандныйИнтерфейс = "true";
+
+ Визуальная = ?(Визуальная = Неопределено, ВКомандномИнтерфейсе, Мин(Визуальная, ВКомандномИнтерфейсе));
+ ПодсистемаИмя = ПодсистемаИмя + ?(ПустаяСтрока(ПодсистемаИмя), "", ".") + СвойстваОписания.Наименование;
+ ПодсистемаПредставление = ПодсистемаПредставление + ?(ПустаяСтрока(ПодсистемаПредставление), "", "/") + СвойстваОписания.Синоним;
+
+ Если Родитель <> Неопределено Тогда // В списке объектов конфигурации подсистемы только первого уровня
+
+ СтрОбъект = ОписаниеКонфигурации.ОбъектыКонфигурации.Добавить();
+ ЗаполнитьЗначенияСвойств(СтрОбъект, СтруктурыОписаний.ОписаниеОбъектаКонфигурацииЗначенияПоУмолчанию());
+ СтрОбъект.Тип = "Subsystem";
+ СтрОбъект.Наименование = ПодсистемаИмя;
+ СтрОбъект.ПутьКФайлуСОписанием = ФайлыПодсистемы.ФайлОписания;
+ СтрОбъект.ПутьККаталогу = ФайлыПодсистемы.КаталогОписания;
+ СтрОбъект.Описание = СвойстваОписания;
+ СтрОбъект.Родитель = ОписаниеКонфигурации.ОбъектыКонфигурации.Найти(Родитель.Имя, "Наименование");
+
+ КонецЕсли;
+
+ Если СвойстваОписания.Состав.Количество() Тогда
+
+ Для Каждого ОбъектМетаданных Из СвойстваОписания.Состав Цикл
+
+ ЭтаПодсистема = ОписаниеПодсистем.Добавить();
+ ЭтаПодсистема.Имя = ПодсистемаИмя;
+ ЭтаПодсистема.ИмяКратко = СвойстваОписания.Наименование;
+ ЭтаПодсистема.Представление = ПодсистемаПредставление;
+ ЭтаПодсистема.ПредставлениеКратко = СвойстваОписания.Синоним;
+ ЭтаПодсистема.ПодсистемаОписание = СвойстваОписания.Комментарий;
+ ЭтаПодсистема.ОбъектМетаданных = ОбъектМетаданных;
+ ЭтаПодсистема.Визуальная = Визуальная;
+ ЭтаПодсистема.Родитель = Родитель;
+
+ КонецЦикла;
+
+ Иначе
+
+ ЭтаПодсистема = ОписаниеПодсистем.Добавить();
+ ЭтаПодсистема.Имя = ПодсистемаИмя;
+ ЭтаПодсистема.ИмяКратко = СвойстваОписания.Наименование;
+ ЭтаПодсистема.Представление = ПодсистемаПредставление;
+ ЭтаПодсистема.ПредставлениеКратко = СвойстваОписания.Синоним;
+ ЭтаПодсистема.ПодсистемаОписание = СвойстваОписания.Комментарий;
+ ЭтаПодсистема.Визуальная = Визуальная;
+ ЭтаПодсистема.Родитель = Родитель;
+
+ КонецЕсли;
+
+ Для Каждого ФайлыВложеннойПодсистемы Из ФайлыПодсистемы.Вложенные Цикл
+
+ ПрочитатьПодсистему(ФайлыВложеннойПодсистемы, ОписаниеПодсистем, ПодсистемаИмя, ПодсистемаПредставление, Визуальная, ЭтаПодсистема)
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура ПриСозданииОбъекта(КаталогИсходников)
+
+ СтруктураКаталогов = Новый СтруктураКаталоговКонфигурации(КаталогИсходников, "Авто");
+
+ Если СтруктураКаталогов.ФорматВыгрузки() = "EDT" Тогда
+
+ ЧитательОписаний = ЧтениеОписанийEDT;
+
+ Иначе
+
+ ЧитательОписаний = ЧтениеОписанийКонфигуратор;
+
+ КонецЕсли;
+
+КонецПроцедуры
\ No newline at end of file
diff --git a/src/Классы/СтруктураКаталоговКонфигурации.os b/src/Классы/СтруктураКаталоговКонфигурации.os
new file mode 100644
index 0000000..3e5b93c
--- /dev/null
+++ b/src/Классы/СтруктураКаталоговКонфигурации.os
@@ -0,0 +1,426 @@
+///////////////////////////////////////////////////////////////////
+//
+// Класс-помощник, предоставляет информацию об иерархии каталогов
+// выгрузки исходников 1с
+//
+// (с) BIA Technologies, LLC
+//
+///////////////////////////////////////////////////////////////////
+
+#Использовать fs
+
+///////////////////////////////////////////////////////////////////
+
+Перем КаталогИсходников;
+Перем ФорматВыгрузки;
+Перем СоздаватьКаталоги;
+Перем РасширениеФайловОписания;
+Перем РасширениеФайловМодулей;
+Перем ЭтоФорматEDT;
+Перем ИерархическийФормат;
+
+///////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////
+// Программный интерфейс
+///////////////////////////////////////////////////////////////////
+
+// Путь к корневому каталогу выгрузки
+//
+// Возвращаемое значение:
+// Строка - Путь к корневому каталогу выгрузки
+//
+Функция КорневойКаталог() Экспорт
+
+ Возврат КаталогИсходников;
+
+КонецФункции
+
+// Возвращает путь к каталогу файлов описания объекта
+//
+// Параметры:
+// ИмяОбъекта - Строка - Имя объекта
+// ВидОбъекта - Строка - Вид объекта метаданных, англ. в единственном числе
+//
+// Возвращаемое значение:
+// Строка - Путь к каталогу
+//
+Функция КаталогФайловОбъекта(ИмяОбъекта, ВидОбъекта) Экспорт
+
+ Если ИмяОбъекта = "Configuration" ИЛИ ВидОбъекта = "Configuration" Тогда
+
+ Если ЭтоФорматEDT Тогда
+
+ Каталог = ОбъединитьПути(КаталогИсходников, ВидОбъекта);
+
+ Иначе
+
+ Каталог = КаталогИсходников;
+
+ КонецЕсли;
+
+ ИначеЕсли ВидОбъекта = ТипыОбъектовКонфигурации.ИмяТипаПодсистемы() И СтрНайти(ИмяОбъекта, ".") Тогда
+
+ Каталог = КаталогИсходников;
+ Для Каждого Часть Из СтрРазделить(ИмяОбъекта, ".") Цикл
+
+ Каталог = ОбъединитьПути(Каталог, ИмяКаталогВидаОбъекта(ВидОбъекта), Часть);
+
+ КонецЦикла;
+
+ Иначе
+
+ Каталог = ОбъединитьПути(КаталогИсходников, ИмяКаталогВидаОбъекта(ВидОбъекта), ИмяОбъекта);
+
+ КонецЕсли;
+
+ Если СоздаватьКаталоги Тогда
+
+ СоздатьКаталог(Каталог);
+
+ КонецЕсли;
+
+ Возврат Каталог;
+
+КонецФункции
+
+// Возвращает путь к каталогу дополнительных файлов объекта (модули, справка и т.д.)
+//
+// Параметры:
+// ИмяОбъекта - Строка - Имя объекта
+// ВидОбъекта - Строка - Вид объекта метаданных, англ. в единственном числе
+//
+// Возвращаемое значение:
+// Строка - Путь к каталогу
+//
+Функция КаталогДополнительныхФайловОбъекта(ИмяОбъекта, ВидОбъекта) Экспорт
+
+ Если ЭтоФорматEDT Тогда
+
+ Каталог = КаталогФайловОбъекта(ИмяОбъекта, ВидОбъекта);
+
+ Иначе
+
+ Каталог = ОбъединитьПути(КаталогФайловОбъекта(ИмяОбъекта, ВидОбъекта), "Ext");
+
+ КонецЕсли;
+
+ Если СоздаватьКаталоги Тогда
+
+ СоздатьКаталог(Каталог);
+
+ КонецЕсли;
+
+ Возврат Каталог;
+
+КонецФункции
+
+// Возвращает путь к каталогу модулей объекта, на всякий случай
+//
+// Параметры:
+// ИмяОбъекта - Строка - Имя объекта
+// ВидОбъекта - Строка - Вид объекта метаданных, англ., в единственном числе
+//
+// Возвращаемое значение:
+// Строка - Путь к каталогу
+//
+Функция КаталогМодулиОбъекта(ИмяОбъекта, ВидОбъекта) Экспорт
+
+ Каталог = КаталогДополнительныхФайловОбъекта(ИмяОбъекта, ВидОбъекта);
+
+ Если СоздаватьКаталоги Тогда
+
+ СоздатьКаталог(Каталог);
+
+ КонецЕсли;
+
+ Возврат Каталог;
+
+КонецФункции
+
+// Возвращает путь к каталогу, в котором хранятся описания всех объектов одного вида
+//
+// Параметры:
+// ВидОбъекта - Строка - Вид объекта метаданных, англ., в единственном числе
+//
+// Возвращаемое значение:
+// Строка - Путь к каталогу
+//
+Функция КаталогВидаОбъекта(ВидОбъекта) Экспорт
+
+ Если СтрСравнить(ВидОбъекта, "Configuration") = 0 Тогда
+
+ Если ЭтоФорматEDT Тогда
+
+ Каталог = ОбъединитьПути(КаталогИсходников, ВидОбъекта);
+
+ Иначе
+
+ Каталог = КаталогИсходников;
+
+ КонецЕсли;
+
+ Иначе
+
+ Каталог = ОбъединитьПути(КаталогИсходников, ИмяКаталогВидаОбъекта(ВидОбъекта));
+
+ КонецЕсли;
+
+ Если СоздаватьКаталоги Тогда
+
+ СоздатьКаталог(Каталог);
+
+ КонецЕсли;
+
+ Возврат Каталог;
+
+КонецФункции
+
+// Путь к файлу описания конфигурации
+//
+// Возвращаемое значение:
+// Строка - Путь к файлу
+//
+Функция ИмяФайлаОписанияКонфигурации() Экспорт
+
+ Если ЭтоФорматEDT Тогда
+
+ Возврат ОбъединитьПути(КаталогИсходников, "Configuration", "Configuration." + РасширениеФайловОписания);
+
+ Иначе
+
+ Возврат ОбъединитьПути(КаталогИсходников, "Configuration." + РасширениеФайловОписания);
+
+ КонецЕсли;
+
+КонецФункции
+
+// Путь к файлу описания объекта
+//
+// Параметры:
+// ИмяОбъекта - Строка - Имя объекта
+// ВидОбъекта - Строка - Вид объекта метаданных, англ., в единственном числе
+//
+// Возвращаемое значение:
+// Строка - Путь к файлу
+//
+Функция ИмяФайлаОписанияОбъекта(ИмяОбъекта, ВидОбъекта) Экспорт
+
+ Если ЭтоФорматEDT Тогда
+
+ КаталогОписаний = КаталогФайловОбъекта(ИмяОбъекта, ВидОбъекта);
+
+ ИначеЕсли ВидОбъекта = ТипыОбъектовКонфигурации.ИмяТипаПодсистемы() И СтрНайти(ИмяОбъекта, ".") Тогда
+
+ КаталогОписаний = КаталогФайловОбъекта(ИмяОбъекта, ВидОбъекта);
+
+ Возврат КаталогОписаний + "." + РасширениеФайловОписания;
+
+ Иначе
+
+ КаталогОписаний = КаталогВидаОбъекта(ВидОбъекта);
+
+ КонецЕсли;
+
+ Возврат ОбъединитьПути(КаталогОписаний, СтрШаблон("%1.%2", ИмяОбъекта, РасширениеФайловОписания));
+
+КонецФункции
+
+// Путь к файлу модуля
+//
+// Параметры:
+// ИмяОбъекта - Строка - Имя объекта
+// ВидОбъекта - Строка - Вид объекта метаданных, англ., в единственном числе
+// ИмяМодуля - Строка - Имя модуля без расширения
+//
+// Возвращаемое значение:
+// Строка - Путь к файлу
+//
+Функция ИмяФайлаМодуля(ИмяОбъекта, ВидОбъекта, ИмяМодуля = "Module") Экспорт
+
+ Каталог = КаталогМодулиОбъекта(ИмяОбъекта, ВидОбъекта);
+
+ Возврат ОбъединитьПути(Каталог, ИмяМодуля + ".bsl");
+
+КонецФункции
+
+Функция ИмяВложенногоФайла(ИмяФайла) Экспорт
+
+ Возврат ОбъединитьПути(КорневойКаталог(), ИмяФайла);
+
+КонецФункции
+
+Функция ИерархическийФормат() Экспорт
+
+ Возврат ИерархическийФормат;
+
+КонецФункции
+
+Функция ФорматВыгрузки() Экспорт
+
+ Возврат ФорматВыгрузки;
+
+КонецФункции
+
+Функция НайтиФайлыПодсистем() Экспорт
+
+ Подсистемы = Новый Массив();
+
+ НайтиПодсистемы(КорневойКаталог(), Подсистемы);
+
+ Возврат Подсистемы;
+
+КонецФункции
+
+Процедура СообщитьОбОтсутствующихКаталогах(Путь) Экспорт
+
+ ЧастиПути = СтрРазделить(СтрЗаменить(Путь, КорневойКаталог(), ""), ПолучитьРазделительПути());
+
+ ПодПуть = "";
+ Для Каждого ЧастьПути Из ЧастиПути Цикл
+
+ ОбъединитьПути(ПодПуть, ЧастьПути);
+
+ Если НЕ ФС.Существует(ОбъединитьПути(КорневойКаталог(), ПодПуть)) Тогда
+
+ Сообщить("Не существует каталог " + ПодПуть);
+
+ КонецЕсли;
+
+ КонецЦикла
+
+КонецПроцедуры
+
+Функция НайтиМодулиОбъекта(ИмяОбъекта, ВидОбъекта, МодулиПодчиненныхОбъектов = Ложь) Экспорт
+
+ Результат = Новый Массив();
+
+ РасширениеФайлов = "." + РасширениеФайловМодулей;
+
+ Если МодулиПодчиненныхОбъектов И НЕ ЭтоФорматEDT И ВидОбъекта <> "Configuration" Тогда
+
+ КаталогМодулей = КаталогФайловОбъекта(ИмяОбъекта, ВидОбъекта);
+
+ Иначе
+
+ КаталогМодулей = КаталогМодулиОбъекта(ИмяОбъекта, ВидОбъекта);
+
+ КонецЕсли;
+
+ Для Каждого Файл Из НайтиФайлы(КаталогМодулей, "*", МодулиПодчиненныхОбъектов) Цикл
+
+ Если Файл.ЭтоКаталог() Тогда
+
+ Продолжить;
+
+ КонецЕсли;
+
+ Если НЕ (Файл.Расширение = "" ИЛИ СтрСравнить(РасширениеФайлов, Файл.Расширение) = 0) Тогда
+
+ Продолжить;
+
+ КонецЕсли;
+
+ Результат.Добавить(Файл.ПолноеИмя);
+
+ КонецЦикла;
+
+ Возврат Результат;
+
+КонецФункции
+
+///////////////////////////////////////////////////////////////////
+// Служебный функционал
+///////////////////////////////////////////////////////////////////
+
+Функция ИмяКаталогВидаОбъекта(ВидОбъекта)
+
+ Возврат ТипыОбъектовКонфигурации.ОписаниеТипаПоИмени(ВидОбъекта).НаименованиеКоллекцииEng;
+
+КонецФункции
+
+Процедура НайтиПодсистемы(Знач КаталогПоиска, Подсистемы)
+
+ КаталогПоиска = ОбъединитьПути(КаталогПоиска, "Subsystems");
+
+ Если ЭтоФорматEDT Тогда
+
+ Для Каждого Файл Из НайтиФайлы(КаталогПоиска, "*", Ложь) Цикл
+
+ Если НЕ Файл.ЭтоКаталог() Тогда
+ Продолжить;
+ КонецЕсли;
+
+ ИмяФайлаОписания = ОбъединитьПути(Файл.ПолноеИмя, СтрШаблон("%1.%2", Файл.Имя, РасширениеФайловОписания));
+
+ Если НЕ (Новый Файл(ИмяФайлаОписания)).Существует() Тогда
+
+ Продолжить;
+
+ КонецЕсли;
+
+ ОписаниеПодсистемы = Новый Структура("КаталогОписания, ФайлОписания, Вложенные", Файл.ПолноеИмя, ИмяФайлаОписания, Новый Массив);
+ Подсистемы.Добавить(ОписаниеПодсистемы);
+
+ НайтиПодсистемы(Файл.ПолноеИмя, ОписаниеПодсистемы.Вложенные);
+
+ КонецЦикла;
+
+ Иначе
+
+ Для Каждого Файл Из НайтиФайлы(КаталогПоиска, "*.xml", Ложь) Цикл
+
+ КаталогДополнительныхФайлов = ОбъединитьПути(Файл.Путь, Файл.ИмяБезРасширения);
+
+ ОписаниеПодсистемы = Новый Структура("КаталогОписания, ФайлОписания, Вложенные", КаталогДополнительныхФайлов, Файл.ПолноеИмя, Новый Массив);
+
+ Подсистемы.Добавить(ОписаниеПодсистемы);
+
+ НайтиПодсистемы(КаталогДополнительныхФайлов, ОписаниеПодсистемы.Вложенные);
+
+ КонецЦикла;
+
+ КонецЕсли
+
+КонецПроцедуры
+
+Процедура ПриСозданииОбъекта(пКаталогИсходников, пФорматВыгрузки = "Авто", пСоздаватьКаталоги = Ложь)
+
+ КаталогИсходников = пКаталогИсходников;
+ ФорматВыгрузки = пФорматВыгрузки;
+ СоздаватьКаталоги = пСоздаватьКаталоги = Истина;
+
+ Если ПустаяСтрока(ФорматВыгрузки) ИЛИ СтрСравнить(ФорматВыгрузки, "Авто") = 0 Тогда
+
+ Если ФС.ФайлСуществует(ОбъединитьПути(КаталогИсходников, "Configuration", "Configuration.mdo")) Тогда
+
+ ФорматВыгрузки = "EDT";
+
+ Иначе
+
+ ФорматВыгрузки = "Designer";
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ // определим иерархию
+ // схема определения проста, если есть каталог "Languages" то иерархия в формате 8.3.8
+ КаталогЯзыки = КаталогВидаОбъекта("Language");
+ ИерархическийФормат = ФС.Существует(КаталогЯзыки);
+
+ ЭтоФорматEDT = ФорматВыгрузки = "EDT";
+
+ Если ЭтоФорматEDT Тогда
+
+ РасширениеФайловОписания = "mdo";
+
+ Иначе
+
+ РасширениеФайловОписания = "xml";
+
+ КонецЕсли;
+
+ РасширениеФайловМодулей = ?(ИерархическийФормат ИЛИ ЭтоФорматEDT, "bsl", "txt");
+
+КонецПроцедуры
diff --git a/src/Макеты/ОбъектыКонфигурации.md b/src/Макеты/ОбъектыКонфигурации.md
new file mode 100644
index 0000000..2103c57
--- /dev/null
+++ b/src/Макеты/ОбъектыКонфигурации.md
@@ -0,0 +1,51 @@
+# Объекты конфигурации
+
+## Имена
+
+| Наименование | Наименование коллекции | Name | Collection name |
+| --------------------------- | ---------------------------- | -------------------------- | --------------------------- |
+| HTTPСервис | HTTPСервисы | HTTPService | HTTPServices |
+| WebСервис | WebСервисы | WebService | WebServices |
+| WSСсылка | WSСсылки | WSReference | WSReferences |
+| БизнесПроцесс | БизнесПроцессы | BusinessProcess | BusinessProcesses |
+| ВнешнийИсточникиДанных | ВнешниеИсточникиДанных | ExternalDataSource | ExternalDataSources |
+| ГруппаКоманд | ГруппыКоманд | CommandGroup | CommandGroups |
+| Документ | Документы | Document | Documents |
+| ЖурналДокументов | ЖурналыДокументов | DocumentJournal | DocumentJournals |
+| Задача | Задачи | Task | Tasks |
+| Интерфейс | Интерфейсы | Interface | Interfaces |
+| Константа | Константы | Constant | Constants |
+| КритерийОтбора | КритерииОтбора | FilterCriterion | FilterCriteria |
+| НумераторДокументов | НумераторыДокументов | DocumentNumerator | DocumentNumerators |
+| Обработка | Обработки | DataProcessor | DataProcessors |
+| ОбщаяКартинка | ОбщиеКартинки | CommonPicture | CommonPictures |
+| ОбщаяКоманда | ОбщиеКоманды | CommonCommand | CommonCommands |
+| ОбщийМакет | ОбщиеМакеты | CommonTemplate | CommonTemplates |
+| ОбщийМодуль | ОбщиеМодули | CommonModule | CommonModules |
+| ОбщийРеквизит | ОбщиеРеквизиты | CommonAttribute | CommonAttributes |
+| ОбщаяФорм | ОбщиеФормы | CommonForm | CommonForms |
+| ОпределяемыйТип | ОпределяемыеТипы | DefinedType | DefinedTypes |
+| Отчет | Отчеты | Report | Reports |
+| ПакетXDTO | ПакетыXDTO | XDTOPackage | XDTOPackages |
+| ПараметрСеанса | ПараметрыСеанса | SessionParameter | SessionParameters |
+| ПараметрФункциональныхОпций | ПараметрыФункциональныхОпций | FunctionalOptionsParameter | FunctionalOptionsParameters |
+| Перечисление | Перечисления | Enum | Enums |
+| ПланВидовРасчета | ПланыВидовРасчета | ChartOfCalculationTypes | ChartsOfCalculationTypes |
+| ПланВидовХарактеристик | ПланыВидовХарактеристик | ChartOfCharacteristicTypes | ChartsOfCharacteristicTypes |
+| ПланОбмена | ПланыОбмена | ExchangePlan | ExchangePlans |
+| ПланСчетов | ПланыСчетов | ChartOfAccounts | ChartsOfAccounts |
+| ПодпискаНаСобытия | ПодпискиНаСобытия | EventSubscription | EventSubscriptions |
+| Подсистема | Подсистемы | Subsystem | Subsystems |
+| Последовательность | Последовательности | Sequence | Sequences |
+| РегистрБухгалтерии | РегистрыБухгалтерии | AccountingRegister | AccountingRegisters |
+| РегистрНакопления | РегистрыНакопления | AccumulationRegister | AccumulationRegisters |
+| РегистрРасчета | РегистрыРасчета | CalculationRegister | CalculationRegisters |
+| РегистрСведений | РегистрыСведений | InformationRegister | InformationRegisters |
+| РегламентноеЗадание | РегламентныеЗадания | ScheduledJob | ScheduledJobs |
+| Роль | Роли | Role | Roles |
+| Справочник | Справочники | Catalog | Catalogs |
+| Стиль | Стили | Style | Styles |
+| ФункциональнаяОпция | ФункциональныеОпции | FunctionalOption | FunctionalOptions |
+| ХранилищеНастроек | ХранилищаНастроек | SettingsStorage | SettingsStorages |
+| ЭлементСтиля | ЭлементыСтиля | StyleItem | StyleItems |
+| Язык | Языки | Language | Languages |
diff --git a/src/Модули/ПараметрыПродукта.os b/src/Модули/ПараметрыПродукта.os
new file mode 100644
index 0000000..0ed694a
--- /dev/null
+++ b/src/Модули/ПараметрыПродукта.os
@@ -0,0 +1,77 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// Служебный модуль с набором служебных параметров библиотеки
+//
+// При создании новой библиотеки обязательно внести изменение
+// в ф-ии ИмяПродукта, указав имя вашей библиотеки.
+//
+// При выпуске новой версии обязательно изменить ее значение
+// в ф-ии ВерсияПродукта
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#Использовать logos
+
+Перем Лог;
+
+// ИмяПродукта
+// Возвращает имя продукта
+//
+// Возвращаемое значение:
+// Строка - Значение имени продукта
+//
+Функция ИмяПродукта()
+
+ Возврат "bsl-parser";
+
+КонецФункции
+
+// Возвращает текущую версию продукта
+//
+// Возвращаемое значение:
+// Строка - Значение текущей версии продукта
+//
+Функция ВерсияПродукта()
+
+ Возврат "2.0.1";
+
+КонецФункции
+
+// Возвращает идентификатор лога библиотеки
+//
+// Возвращаемое значение:
+// Строка - Значение идентификатора лога библиотеки
+//
+Функция ИмяЛогаСистемы() Экспорт
+
+ Возврат "oscript.lib." + ИмяПродукта();
+
+КонецФункции // ИмяЛогаСистемы
+
+// Форматирование логов
+// См. описание метода "УстановитьРаскладку" библиотеки logos
+//
+Функция Форматировать(Знач Уровень, Знач Сообщение) Экспорт
+
+ Возврат СтрШаблон("%1: %2 - %3", ТекущаяДата(), УровниЛога.НаименованиеУровня(Уровень), Сообщение);
+
+КонецФункции
+
+// Возвращает лог продукта
+//
+// Возвращаемое значение:
+// Лог - Лог продукта
+//
+Функция ПолучитьЛог() Экспорт
+
+ Если Лог = Неопределено Тогда
+
+ Лог = Логирование.ПолучитьЛог(ИмяЛогаСистемы());
+ Лог.УстановитьРаскладку(ЭтотОбъект);
+ Лог.УстановитьУровень(УровниЛога.Отладка);
+
+ КонецЕсли;
+
+ Возврат Лог;
+
+КонецФункции
\ No newline at end of file
diff --git a/src/Модули/ПарсерBSL.os b/src/Модули/ПарсерBSL.os
new file mode 100644
index 0000000..68b48fe
--- /dev/null
+++ b/src/Модули/ПарсерBSL.os
@@ -0,0 +1,37 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// Модуль-фабрика для создания и инициализации парсеров
+//
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+// ПРОГРАММНЫЙ ИНТЕРФЕЙС
+///////////////////////////////////////////////////////////////////////////////
+
+Функция ПарсерКонфигурации(КаталогИсходников) Экспорт
+
+ Возврат Новый РазборКонфигурации1С(КаталогИсходников);
+
+КонецФункции
+
+Функция ПарсерРасширения(КаталогИсходников) Экспорт
+
+ ВызватьИсключение "Не реализованно";
+
+КонецФункции
+
+Функция ПарсерВнешнейОбработки(КаталогИсходников) Экспорт
+
+ ВызватьИсключение "Не реализованно";
+
+КонецФункции
+
+Функция ПарсерМодуля(ИмяФайлаМодуля) Экспорт
+
+ ВызватьИсключение "Не реализованно";
+
+КонецФункции
+
+///////////////////////////////////////////////////////////////////////////////
+// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
+///////////////////////////////////////////////////////////////////////////////
diff --git a/src/Модули/СтруктурыОписаний.os b/src/Модули/СтруктурыОписаний.os
new file mode 100644
index 0000000..f66de15
--- /dev/null
+++ b/src/Модули/СтруктурыОписаний.os
@@ -0,0 +1,263 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// Содержит НСИ для разбора конфигураций
+//
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+// ПРОГРАММНЫЙ ИНТЕРФЕЙС
+///////////////////////////////////////////////////////////////////////////////
+
+#Область КоллекцииОбъектов
+
+Функция ТаблицаОписанияОбъектовКонфигурации() Экспорт
+
+ ОбъектыКонфигурации = Новый ТаблицаЗначений;
+ ОбъектыКонфигурации.Колонки.Добавить("Наименование");
+ ОбъектыКонфигурации.Колонки.Добавить("Тип");
+ ОбъектыКонфигурации.Колонки.Добавить("ПутьКФайлуСОписанием");
+ ОбъектыКонфигурации.Колонки.Добавить("ПутьККаталогу");
+ ОбъектыКонфигурации.Колонки.Добавить("Подсистемы");
+ ОбъектыКонфигурации.Колонки.Добавить("Описание");
+ ОбъектыКонфигурации.Колонки.Добавить("Родитель");
+
+ Возврат ОбъектыКонфигурации;
+
+КонецФункции
+
+Функция ТаблицаОписанияМодулей() Экспорт
+
+ МодулиКонфигурации = Новый ТаблицаЗначений;
+ МодулиКонфигурации.Колонки.Добавить("ТипМодуля");
+ МодулиКонфигурации.Колонки.Добавить("Родитель");
+ МодулиКонфигурации.Колонки.Добавить("ПутьКФайлу");
+ МодулиКонфигурации.Колонки.Добавить("НаборБлоков");
+ МодулиКонфигурации.Колонки.Добавить("Содержимое");
+ МодулиКонфигурации.Колонки.Добавить("РодительФорма");
+ МодулиКонфигурации.Колонки.Добавить("РодительКоманда");
+ МодулиКонфигурации.Колонки.Добавить("ОписаниеМодуля");
+
+ Возврат МодулиКонфигурации;
+
+КонецФункции
+
+Функция ТаблицаОписанияПодсистем() Экспорт
+
+ ОписаниеПодсистем = Новый ТаблицаЗначений;
+ ОписаниеПодсистем.Колонки.Добавить("ОбъектМетаданных");
+ ОписаниеПодсистем.Колонки.Добавить("Имя");
+ ОписаниеПодсистем.Колонки.Добавить("Представление");
+ ОписаниеПодсистем.Колонки.Добавить("ПодсистемаОписание");
+ ОписаниеПодсистем.Колонки.Добавить("Визуальная");
+ ОписаниеПодсистем.Колонки.Добавить("Родитель");
+ ОписаниеПодсистем.Колонки.Добавить("ПредставлениеКратко");
+ ОписаниеПодсистем.Колонки.Добавить("ИмяКратко");
+
+ Возврат ОписаниеПодсистем;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область ОписанияОбъектовКонфигурации
+
+Функция ОписаниеКонстанты() Экспорт
+
+ ДанныеОписания = БазовоеОписание();
+ ДобавитьВОписание(ДанныеОписания, "Тип", "type", , "ПолучитьТип");
+ ДобавитьВОписание(ДанныеОписания, "Пояснение", "Explanation", Истина);
+
+ Возврат ДанныеОписания;
+
+КонецФункции
+
+Функция ОписаниеКонфигурации() Экспорт
+
+ ДанныеОписания = БазовоеОписание();
+ ДобавитьВОписание(ДанныеОписания, "АвторскиеПрава", "Copyright", Истина);
+ ДобавитьВОписание(ДанныеОписания, "АдресИнформацииОКонфигурации", "ConfigurationInformationAddress", Истина);
+ ДобавитьВОписание(ДанныеОписания, "АдресИнформацииОПоставщике", "VendorInformationAddress", Истина);
+ ДобавитьВОписание(ДанныеОписания, "АдресКаталогаОбновлений", "UpdateCatalogAddress");
+ ДобавитьВОписание(ДанныеОписания, "ВариантВстроенногоЯзыка", "ScriptVariant");
+ ДобавитьВОписание(ДанныеОписания, "Версия", "Version");
+ ДобавитьВОписание(ДанныеОписания, "ВключатьСправкуВСодержание", "IncludeHelpInContents");
+ ДобавитьВОписание(ДанныеОписания, "ДополнительнаяФормаКонстант", "AuxiliaryConstantsForm");
+ ДобавитьВОписание(ДанныеОписания, "ДополнительныеСловариПолнотекстовогоПоиска", "AdditionalFullTextSearchDictionaries");
+ ДобавитьВОписание(ДанныеОписания, "Заставка", "Splash");
+ ДобавитьВОписание(ДанныеОписания, "ИнтерфейсКлиентскогоПриложения", "ClientApplicationInterface");
+ ДобавитьВОписание(ДанныеОписания, "ИспользоватьОбычныеФормыВУправляемомПриложении", "UseOrdinaryFormInManagedApplication");
+ ДобавитьВОписание(ДанныеОписания, "ИспользоватьУправляемыеФормыВОбычномПриложении", "UseManagedFormInOrdinaryApplication");
+ ДобавитьВОписание(ДанныеОписания, "КартинкаОсновногоРаздела", "MainSectionPicture");
+ ДобавитьВОписание(ДанныеОписания, "КомандныйИнтерфейс", "CommandInterface");
+ ДобавитьВОписание(ДанныеОписания, "КомандныйИнтерфейсОсновногоРаздела", "MainSectionCommandInterface");
+ ДобавитьВОписание(ДанныеОписания, "КраткаяИнформация", "BriefInformation", Истина);
+ ДобавитьВОписание(ДанныеОписания, "Логотип", "Logo");
+ ДобавитьВОписание(ДанныеОписания, "МодульВнешнегоСоединения", "ExternalConnectionModule");
+ ДобавитьВОписание(ДанныеОписания, "МодульОбычногоПриложения", "OrdinaryApplicationModule");
+ ДобавитьВОписание(ДанныеОписания, "МодульСеанса", "SessionModule");
+ ДобавитьВОписание(ДанныеОписания, "МодульУправляемогоПриложения", "ManagedApplicationModule");
+ ДобавитьВОписание(ДанныеОписания, "НазначениеРасширенияКонфигурации", "ConfigurationExtensionPurpose");
+ ДобавитьВОписание(ДанныеОписания, "НазначенияИспользования", "UsePurposes");
+ ДобавитьВОписание(ДанныеОписания, "ОсновнаяФормаВариантаОтчета", "DefaultReportVariantForm");
+ ДобавитьВОписание(ДанныеОписания, "ОсновнаяФормаКонстант", "DefaultConstantsForm");
+ ДобавитьВОписание(ДанныеОписания, "ОсновнаяФормаНастроекДинамическогоСписка", "DefaultDynamicListSettingsForm");
+ ДобавитьВОписание(ДанныеОписания, "ОсновнаяФормаНастроекОтчета", "DefaultReportSettingsForm");
+ ДобавитьВОписание(ДанныеОписания, "ОсновнаяФормаОтчета", "DefaultReportForm");
+ ДобавитьВОписание(ДанныеОписания, "ОсновнаяФормаПоиска", "DefaultSearchForm");
+ ДобавитьВОписание(ДанныеОписания, "ОсновнойИнтерфейс", "DefaultInterface");
+ ДобавитьВОписание(ДанныеОписания, "ОсновнойРежимЗапуска", "DefaultRunMode");
+ ДобавитьВОписание(ДанныеОписания, "ОсновнойСтиль", "DefaultStyle");
+ ДобавитьВОписание(ДанныеОписания, "ОсновнойЯзык", "DefaultLanguage");
+ ДобавитьВОписание(ДанныеОписания, "ОсновныеРоли", "DefaultRoles");
+ ДобавитьВОписание(ДанныеОписания, "ПодробнаяИнформация", "DetailedInformation", Истина);
+ ДобавитьВОписание(ДанныеОписания, "Поставщик", "Vendor");
+ ДобавитьВОписание(ДанныеОписания, "ПрефиксИмен", "NamePrefix");
+ ДобавитьВОписание(ДанныеОписания, "ПринадлежностьОбъекта", "ObjectBelonging");
+ ДобавитьВОписание(ДанныеОписания, "РабочаяОбластьНачальнойСтраницы", "HomePageWorkArea");
+ ДобавитьВОписание(ДанныеОписания, "РежимАвтонумерацииОбъектов", "ObjectAutonumerationMode");
+ ДобавитьВОписание(ДанныеОписания, "РежимИспользованияМодальности", "ModalityUseMode");
+ ДобавитьВОписание(ДанныеОписания, "РежимИспользованияСинхронныхВызововРасширенийПлатформыИВнешнихКомпонент", "SynchronousPlatformExtensionAndAddInCallUseMode");
+ ДобавитьВОписание(ДанныеОписания, "РежимОсновногоОкнаКлиентскогоПриложения", "MainClientApplicationWindowMode");
+ ДобавитьВОписание(ДанныеОписания, "РежимСовместимости", "CompatibilityMode");
+ ДобавитьВОписание(ДанныеОписания, "РежимСовместимостиИнтерфейса", "InterfaceCompatibilityMode");
+ ДобавитьВОписание(ДанныеОписания, "РежимСовместимостиРасширенияКонфигурации", "ConfigurationExtensionCompatibilityMode");
+ ДобавитьВОписание(ДанныеОписания, "РежимУправленияБлокировкойДанных", "DataLockControlMode");
+ ДобавитьВОписание(ДанныеОписания, "РодительскиеКонфигурации", "ParentConfigurations");
+ ДобавитьВОписание(ДанныеОписания, "Справка", "Help");
+ ДобавитьВОписание(ДанныеОписания, "ТребуемыеРазрешенияМобильногоПриложения", "RequiredMobileApplicationPermissions");
+ ДобавитьВОписание(ДанныеОписания, "ФрагментКомандногоИнтерфейса", "CommandInterfaceFragment");
+ ДобавитьВОписание(ДанныеОписания, "ХранилищеВариантовОтчетов", "ReportsVariantsStorage");
+ ДобавитьВОписание(ДанныеОписания, "ХранилищеНастроекДанныхФорм", "FormDataSettingsStorage");
+ ДобавитьВОписание(ДанныеОписания, "ХранилищеОбщихНастроек", "CommonSettingsStorage");
+ ДобавитьВОписание(ДанныеОписания, "ХранилищеПользовательскихНастроекДинамическихСписков", "DynamicListsUserSettingsStorage");
+ ДобавитьВОписание(ДанныеОписания, "ХранилищеПользовательскихНастроекОтчетов", "ReportsUserSettingsStorage");
+
+ ДобавитьВОписание(ДанныеОписания, "HTTPСервисы", "HTTPServices", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "WebСервисы", "WebServices", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "WSСсылки", "WSReferences", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "БизнесПроцессы", "businessProcesses", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "ВнешниеИсточникиДанных", "ExternalDataSources", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "ГруппыКоманд", "CommandGroups", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "Документы", "Documents", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "ЖурналыДокументов", "DocumentJournals", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "Задачи", "Tasks", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "Интерфейсы", "Interfaces", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "Константы", "Constants", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "КритерииОтбора", "FilterCriteria", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "НумераторыДокументов", "DocumentNumerators", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "Обработки", "DataProcessors", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "ОбщиеКартинки", "CommonPictures", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "ОбщиеКоманды", "CommonCommands", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "ОбщиеМакеты", "CommonTemplates", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "ОбщиеМодули", "CommonModules", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "ОбщиеРеквизиты", "CommonAttributes", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "ОбщиеФормы", "CommonForms", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "ОпределяемыеТипы", "DefinedTypes", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "Отчеты", "Reports", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "ПакетыXDTO", "XDTOPackages", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "ПараметрыСеанса", "SessionParameters", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "ПараметрыФункциональныхОпций", "FunctionalOptionsParameters", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "Перечисления", "Enums", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "ПланыВидовРасчета", "ChartsOfCalculationTypes", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "ПланыВидовХарактеристик", "ChartsOfCharacteristicTypes", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "ПланыОбмена", "ExchangePlans", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "ПланыСчетов", "ChartsOfAccounts", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "ПодпискиНаСобытия", "EventSubscriptions", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "Подсистемы", "Subsystems", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "Последовательности", "Sequences", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "РегистрыБухгалтерии", "AccountingRegisters", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "РегистрыНакопления", "AccumulationRegisters", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "РегистрыРасчета", "CalculationRegisters", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "РегистрыСведений", "InformationRegisters", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "РегламентныеЗадания", "ScheduledJobs", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "Роли", "Roles", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "Справочники", "Catalogs", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "Стили", "Styles", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "ФункциональныеОпции", "FunctionalOptions", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "ХранилищаНастроек", "SettingsStorages", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "ЭлементыСтиля", "StyleItems", , , Истина);
+ ДобавитьВОписание(ДанныеОписания, "Языки", "Languages", , , Истина);
+
+ Возврат ДанныеОписания;
+
+КонецФункции
+
+Функция ОписаниеПодсистемы() Экспорт
+
+ ДанныеОписания = БазовоеОписание();
+
+ ДобавитьВОписание(ДанныеОписания, "ВключатьВКомандныйИнтерфейс", "IncludeInCommandInterface");
+ ДобавитьВОписание(ДанныеОписания, "ВключатьВСодержимоеСправки", "IncludeHelpInContents");
+ ДобавитьВОписание(ДанныеОписания, "Пояснение", "Explanation", Истина);
+ ДобавитьВОписание(ДанныеОписания, "Картинка", "Picture");
+ ДобавитьВОписание(ДанныеОписания, "Состав", "Content", , "ПрочитатьСостав", Истина);
+
+ Возврат ДанныеОписания;
+
+КонецФункции
+
+Функция БазовоеОписание()
+
+ ДанныеОписания = Новый Структура();
+ ДобавитьВОписание(ДанныеОписания, "Наименование", "Name");
+ ДобавитьВОписание(ДанныеОписания, "Синоним", "Synonym", Истина);
+ ДобавитьВОписание(ДанныеОписания, "Комментарий", "Comment");
+
+ Возврат ДанныеОписания;
+
+КонецФункции
+
+#КонецОбласти
+
+Функция ИменаТиповМетаданных() Экспорт
+
+ Возврат
+ "languages,
+ |subsystems,
+ |commonPictures,
+ |sessionParameters,
+ |roles,
+ |commonTemplates,
+ |filterCriteria,
+ |commonModules,
+ |commonAttributes,
+ |exchangePlans,
+ |xDTOPackages,
+ |webServices,
+ |httpServices,
+ |eventSubscriptions,
+ |scheduledJobs,
+ |functionalOptions,
+ |functionalOptionsParameters,
+ |definedTypes,
+ |commonCommands,
+ |commandGroups,
+ |constants,
+ |commonForms,
+ |catalogs,
+ |enums,
+ |reports,
+ |dataProcessors,
+ |informationRegisters,
+ |chartsOfCharacteristicTypes";
+
+КонецФункции
+
+Функция ОписаниеОбъектаКонфигурацииЗначенияПоУмолчанию() Экспорт
+
+ Возврат Новый Структура(
+ "Наименование, Тип, ПутьКФайлуСОписанием, ПутьККаталогу, Подсистемы, Описание, Родитель",
+ "", "", "", "", Новый Массив);
+
+КонецФункции
+
+
+///////////////////////////////////////////////////////////////////////////////
+// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
+///////////////////////////////////////////////////////////////////////////////
+
+Процедура ДобавитьВОписание(Описание, Имя, ИмяПоля, Многоязычный = Ложь, ФункцияПреобразования = Неопределено, Коллекция = Ложь)
+
+ Описание.Вставить(Имя, Новый Структура("Поле, Многоязычный, ФункцияПреобразования, Коллекция", ИмяПоля, Многоязычный, ФункцияПреобразования, Коллекция));
+
+КонецПроцедуры
\ No newline at end of file
diff --git a/src/Модули/ТипыОбъектовКонфигурации.os b/src/Модули/ТипыОбъектовКонфигурации.os
new file mode 100644
index 0000000..b0da382
--- /dev/null
+++ b/src/Модули/ТипыОбъектовКонфигурации.os
@@ -0,0 +1,105 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// Информация о типах конфигурации
+//
+///////////////////////////////////////////////////////////////////////////////
+
+Перем ОбъектыКонфигурации;
+Перем ХэшПоиска;
+
+///////////////////////////////////////////////////////////////////////////////
+// ПРОГРАММНЫЙ ИНТЕРФЕЙС
+///////////////////////////////////////////////////////////////////////////////
+
+Функция ОписаниеТипаПоИмени(ИмяТипаОбъектаКонфигурации) Экспорт
+
+ Возврат ХэшПоиска[ВРег(ИмяТипаОбъектаКонфигурации)];
+
+КонецФункции
+
+Функция НормализоватьИмя(ИмяТипаОбъектаКонфигурации) Экспорт
+
+ Описание = ХэшПоиска[ВРег(ИмяТипаОбъектаКонфигурации)];
+
+ Если Описание = Неопределено Тогда
+ Возврат ИмяТипаОбъектаКонфигурации;
+ Иначе
+ Возврат Описание.НаименованиеEng;
+ КонецЕсли;
+
+КонецФункции
+
+Функция ИмяТипаПодсистемы() Экспорт
+
+ Возврат НормализоватьИмя("Подсистемы");
+
+КонецФункции
+///////////////////////////////////////////////////////////////////////////////
+// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
+///////////////////////////////////////////////////////////////////////////////
+
+Процедура ЗагрузитьОписаниеТиповОбъектовКонфигурации()
+
+ ОбъектыКонфигурации = Новый Массив();
+ ХэшПоиска = Новый Соответствие();
+
+ ФайлОписаний = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "Макеты", "ОбъектыКонфигурации.md");
+
+ Чтение = Новый ЧтениеТекста();
+ Чтение.Открыть(ФайлОписаний, КодировкаТекста.UTF8);
+
+ Пока Истина Цикл // Позиционируемся на нужную строку
+
+ Строка = Чтение.ПрочитатьСтроку();
+
+ Если Строка = Неопределено Тогда
+
+ Прервать;
+
+ КонецЕсли;
+
+ Если Строка = "## Имена" Тогда
+
+ Чтение.ПрочитатьСтроку(); // Пропускаем пустую строку
+ Чтение.ПрочитатьСтроку(); // Пропускаем заголовок таблицы
+ Чтение.ПрочитатьСтроку(); // Пропускаем заголовок таблицы
+
+ Прервать;
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Пока Истина Цикл
+
+ Строка = Чтение.ПрочитатьСтроку();
+
+ Если Строка = Неопределено Тогда
+
+ Прервать;
+
+ КонецЕсли;
+
+ Если НЕ СтрНачинаетсяС(Строка, "|") Тогда
+
+ Прервать;
+ КонецЕсли;
+
+ ЧастиСтроки = СтрРазделить(Строка, "|");
+
+ Описание = Новый Структура("Наименование, НаименованиеКоллекции, НаименованиеEng, НаименованиеКоллекцииEng",
+ СокрЛП(ЧастиСтроки[1]), СокрЛП(ЧастиСтроки[2]), СокрЛП(ЧастиСтроки[3]), СокрЛП(ЧастиСтроки[4]));
+
+ ОбъектыКонфигурации.Добавить(Описание);
+ ХэшПоиска.Вставить(ВРег(Описание.Наименование), Описание);
+ ХэшПоиска.Вставить(ВРег(Описание.НаименованиеКоллекции), Описание);
+ ХэшПоиска.Вставить(ВРег(Описание.НаименованиеEng), Описание);
+ ХэшПоиска.Вставить(ВРег(Описание.НаименованиеКоллекцииEng), Описание);
+
+ КонецЦикла;
+
+ Чтение.Закрыть();
+
+КонецПроцедуры
+
+ЗагрузитьОписаниеТиповОбъектовКонфигурации();
\ No newline at end of file
diff --git a/src/Модули/Утилиты.os b/src/Модули/Утилиты.os
new file mode 100644
index 0000000..ec0c806
--- /dev/null
+++ b/src/Модули/Утилиты.os
@@ -0,0 +1,66 @@
+///////////////////////////////////////////////////////////////////
+//
+// Служебный модуль, содержащий различные вспомогательные методы
+//
+// (с) BIA Technologies, LLC
+//
+///////////////////////////////////////////////////////////////////
+
+
+///////////////////////////////////////////////////////////////////
+// Программный интерфейс
+///////////////////////////////////////////////////////////////////
+
+// Читает текст из файла
+//
+// Параметры:
+// ИмяФайла - Строка - Путь к файлу
+//
+// Возвращаемое значение:
+// Строка - Содержимое файла
+//
+Функция ПрочитатьФайл(ИмяФайла) Экспорт
+
+ ТекстовыйДокумент = Новый ТекстовыйДокумент();
+ ТекстовыйДокумент.Прочитать(ИмяФайла, КодировкаТекста.UTF8NoBOM);
+ СодержимоеФайла = ТекстовыйДокумент.ПолучитьТекст();
+
+ Возврат СодержимоеФайла;
+
+КонецФункции
+
+// Создает все необходимы каталоги по пути
+//
+// Параметры:
+// Путь - Строка - Путь к каталогу
+//
+Процедура СоздатьРекурсивноКаталоги(Путь) Экспорт
+
+ Файл = Новый Файл(Путь);
+
+ Если НЕ Файл.Существует() Тогда
+
+ СоздатьРекурсивноКаталоги(Файл.Путь);
+ СоздатьКаталог(Путь);
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Функция СтрРазделитьСОбрезкойПробелов(Строка, Разделитель) Экспорт
+
+ Результат = Новый Массив();
+
+ Для Каждого Стр Из СтрРазделить(Строка, Разделитель) Цикл
+
+ Результат.Добавить(СокрЛП(Стр));
+
+ КонецЦикла;
+
+ Возврат Результат;
+
+КонецФункции
+
+///////////////////////////////////////////////////////////////////
+// Служебный функционал
+///////////////////////////////////////////////////////////////////
diff --git a/src/Модули/ЧтениеОписанийEDT.os b/src/Модули/ЧтениеОписанийEDT.os
new file mode 100644
index 0000000..b39783d
--- /dev/null
+++ b/src/Модули/ЧтениеОписанийEDT.os
@@ -0,0 +1,246 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// Модуль для чтения описаний метаданных 1с из EDT выгрузки
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#Использовать reflector
+
+///////////////////////////////////////////////////////////////////////////////
+
+Перем Рефлектор;
+Перем РегулярныеВыражения;
+
+///////////////////////////////////////////////////////////////////////////////
+// ПРОГРАММНЫЙ ИНТЕРФЕЙС
+///////////////////////////////////////////////////////////////////////////////
+
+Функция ПолучитьСвойства(ТекстОписания, ПараметрыЧтения = Неопределено) Экспорт
+
+ СвойстваОписания = Новый Структура();
+
+ НайденныеСовпадения = РегулярныеВыражения.СвойстваОписания.НайтиСовпадения(ТекстОписания);
+
+ Для Каждого Совпадение Из НайденныеСовпадения Цикл
+
+ Имя = Совпадение.Группы[1].Значение;
+ Значение = Совпадение.Группы[2].Значение;
+
+ Если СвойстваОписания.Свойство(Имя) Тогда
+
+ Если ТипЗнч(СвойстваОписания[Имя]) = Тип("Массив") Тогда
+
+ СвойстваОписания[Имя].Добавить(Значение);
+
+ Иначе
+
+ КоллекцияЗначений = Новый Массив();
+ КоллекцияЗначений.Добавить(СвойстваОписания[Имя]);
+ КоллекцияЗначений.Добавить(Значение);
+
+ СвойстваОписания.Вставить(Имя, КоллекцияЗначений);
+
+ КонецЕсли;
+
+ Иначе
+
+ СвойстваОписания.Вставить(Имя, Значение);
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Если ПараметрыЧтения <> Неопределено Тогда
+
+ СвойстваОписания = ВыполнитьОбработкуПрочитанныхСвойств(СвойстваОписания, ПараметрыЧтения, ЭтотОбъект);
+
+ КонецЕсли;
+
+ Возврат СвойстваОписания;
+
+КонецФункции
+
+Функция ПрочитатьСвойстваИзФайла(ИмяФайла, ПараметрыЧтения = Неопределено) Экспорт
+
+ ТекстОписания = Утилиты.ПрочитатьФайл(ИмяФайла);
+
+ Возврат ПолучитьСвойства(ТекстОписания, ПараметрыЧтения);
+
+КонецФункции
+
+Функция ПрочитатьОписаниеКонфигурации(ПутьКФайлуОписания) Экспорт
+
+ СвойстваКонфигурации = Новый Структура;
+ ОбъектыКонфигурации = СтруктурыОписаний.ТаблицаОписанияОбъектовКонфигурации();
+
+ ПараметрыЧтения = СтруктурыОписаний.ОписаниеКонфигурации();
+
+ ЗначенияПоУмолчанию = СтруктурыОписаний.ОписаниеОбъектаКонфигурацииЗначенияПоУмолчанию();
+
+ СвойстваОписания = ПолучитьСвойства(Утилиты.ПрочитатьФайл(ПутьКФайлуОписания), ПараметрыЧтения);
+
+ Для Каждого Параметр Из ПараметрыЧтения Цикл
+
+ Если Параметр.Ключ = "Языки" Тогда // Шлак какой-то там
+
+ Продолжить;
+
+ КонецЕсли;
+
+ Значение = СвойстваОписания[Параметр.Ключ];
+
+ Если Параметр.Значение.Коллекция Тогда
+
+ Для Каждого ПолноеИмяОбъекта Из Значение Цикл
+
+ СтрокаОбъекта = ОбъектыКонфигурации.Добавить();
+ ЗаполнитьЗначенияСвойств(СтрокаОбъекта, ЗначенияПоУмолчанию);
+
+ ЧастиСтроки = СтрРазделить(ПолноеИмяОбъекта, ".");
+ СтрокаОбъекта.Тип = ТипыОбъектовКонфигурации.НормализоватьИмя(ЧастиСтроки[0]);
+ СтрокаОбъекта.Наименование = ЧастиСтроки[1];
+
+ КонецЦикла;
+
+ Иначе
+
+ СвойстваКонфигурации.Вставить(Параметр.Ключ, Значение);
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Возврат Новый Структура("СвойстваКонфигурации, ОбъектыКонфигурации", СвойстваКонфигурации , ОбъектыКонфигурации);
+
+КонецФункции
+
+///////////////////////////////////////////////////////////////////////////////
+// СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС
+///////////////////////////////////////////////////////////////////////////////
+
+Функция МногоЯзыковаяСтрока(Знач Значение) Экспорт
+
+ Регулярка = РегулярныеВыражения.МногоЯзыковаяСтрока;
+ Совпадения = Регулярка.НайтиСовпадения(Значение);
+
+ Если Совпадения.Количество() Тогда
+
+ Значение = Совпадения[0].Группы[1].Значение;
+
+ Иначе
+
+ Значение = "";
+
+ КонецЕсли;
+
+ Возврат Значение;
+
+КонецФункции
+
+Функция ПолучитьТип(Знач Значение) Экспорт
+
+ Регулярка = РегулярныеВыражения.ПолучитьТип;
+ Совпадения = Регулярка.НайтиСовпадения(Значение);
+
+ Если Совпадения.Количество() Тогда
+
+ Значение = Совпадения[0].Группы[1].Значение;
+
+ Иначе
+
+ Значение = "";
+
+ КонецЕсли;
+
+ Возврат Значение;
+
+КонецФункции
+
+Функция ПрочитатьСостав(Знач Значение) Экспорт
+
+ Возврат Значение;
+
+КонецФункции
+
+///////////////////////////////////////////////////////////////////////////////
+// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
+///////////////////////////////////////////////////////////////////////////////
+
+Функция ВыполнитьОбработкуПрочитанныхСвойств(СырыеДанные, ПараметрыЧтения, ОбъектПреобразователь)
+
+ СвойстваОписания = Новый Структура();
+
+ Для Каждого Параметр Из ПараметрыЧтения Цикл
+
+ Значение = Неопределено;
+
+ Если НЕ СырыеДанные.Свойство(Параметр.Значение.Поле, Значение) Тогда
+
+ Значение = "";
+
+ КонецЕсли;
+
+ Значение = ОбработатьСвойство(Значение, Параметр.Значение, ОбъектПреобразователь);
+
+ СвойстваОписания.Вставить(Параметр.Ключ, Значение);
+
+ КонецЦикла;
+
+ Возврат СвойстваОписания;
+
+КонецФункции
+
+Функция ОбработатьСвойство(Значение, Параметр, ОбъектПреобразователь)
+
+ Если ПустаяСтрока(Значение) И Параметр.Коллекция Тогда
+
+ Возврат Новый Массив();
+
+ ИначеЕсли ПустаяСтрока(Значение) Тогда
+
+ Возврат Значение;
+
+ КонецЕсли;
+
+ Если ТипЗнч(Значение) = Тип("Массив") И ПустаяСтрока(Параметр.ФункцияПреобразования) И НЕ Параметр.Многоязычный Тогда
+
+ Возврат Значение;
+
+ КонецЕсли;
+
+ ФункцияПреобразования = Параметр.ФункцияПреобразования;
+
+ Если НЕ ЗначениеЗаполнено(ФункцияПреобразования) И Параметр.Многоязычный Тогда
+
+ ФункцияПреобразования = "МногоЯзыковаяСтрока";
+
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(ФункцияПреобразования) Тогда
+
+ ЗначениеВМассиве = Новый Массив();
+ ЗначениеВМассиве.Добавить(Значение);
+
+ Значение = Рефлектор.ВызватьМетод(ОбъектПреобразователь, ФункцияПреобразования, ЗначениеВМассиве);
+
+ КонецЕсли;
+
+ Если Параметр.Коллекция И ТипЗнч(Значение) <> Тип("Массив") Тогда
+
+ Результат = Новый Массив();
+ Результат.Добавить(Значение);
+ Значение = Результат;
+
+ КонецЕсли;
+
+ Возврат Значение;
+
+КонецФункции
+
+Рефлектор = Новый Рефлектор;
+
+
+РегулярныеВыражения = Новый Структура();
+РегулярныеВыражения.Вставить("СвойстваОписания", Новый РегулярноеВыражение("<([a-zA-Z]+)\b[^>]*>([\s\S]*?)<\/\1>"));
+РегулярныеВыражения.Вставить("МногоЯзыковаяСтрока", Новый РегулярноеВыражение("([\s\S]*)<\/value>"));
+РегулярныеВыражения.Вставить("ПолучитьТип", Новый РегулярноеВыражение("([\s\S]*)<\/types>"));
\ No newline at end of file
diff --git a/src/Модули/ЧтениеОписанийБазовый.os b/src/Модули/ЧтениеОписанийБазовый.os
new file mode 100644
index 0000000..4d127f9
--- /dev/null
+++ b/src/Модули/ЧтениеОписанийБазовый.os
@@ -0,0 +1,109 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// Общие методы чтения файлов описаний
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#Использовать reflector
+#Использовать "../ЧтениеМодулей"
+
+///////////////////////////////////////////////////////////////////////////////
+
+Перем Рефлектор;
+
+///////////////////////////////////////////////////////////////////////////////
+// ПРОГРАММНЫЙ ИНТЕРФЕЙС
+///////////////////////////////////////////////////////////////////////////////
+
+Функция ПреобразоватьТип(ТипИзXML) Экспорт
+
+ СоответствиеТипов = Новый Соответствие;
+
+ СоответствиеТипов.Вставить("xs:boolean", "Булево");
+ СоответствиеТипов.Вставить("xs:decimal", "Число");
+ СоответствиеТипов.Вставить("xs:string", "Строка");
+ СоответствиеТипов.Вставить("xs:dateTime", "Дата");
+ СоответствиеТипов.Вставить("v8:ValueStorage", "Хранилище Значений");
+ СоответствиеТипов.Вставить("v8:UUID", "UUID");
+ СоответствиеТипов.Вставить("v8:Null", "Null");
+
+ Если СтрНачинаетсяС(ТипИзXML, "xs") Или СтрНачинаетсяС(ТипИзXML, "v8") Тогда
+
+ ПреобразованныйТип = СоответствиеТипов[ТипИзXML];
+
+ ИначеЕсли СтрНачинаетсяС(ТипИзXML, "cfg:") Тогда
+
+ ТипИзXML = СтрЗаменить(ТипИзXML, "cfg:", "");
+ ЧастиТипа = СтрРазделить(ТипИзXML, ".");
+ ТипОбъекта = СтрЗаменить(ЧастиТипа[0], "Ref", "");
+
+ ПреобразованныйТип = ПолучитьИмяТипаНаРусском(ТипОбъекта) + "." + ЧастиТипа[1];
+
+ Иначе
+
+ ПреобразованныйТип = ТипИзXML;
+
+ КонецЕсли;
+
+ Возврат ПреобразованныйТип;
+
+КонецФункции
+
+Функция ПолучитьИмяТипаНаРусском(ИмяТипа) Экспорт
+
+ ОписаниеТипа = ТипыОбъектовКонфигурации.ОписаниеТипаПоИмени(ИмяТипа);
+
+ Возврат ?(ОписаниеТипа = Неопределено, ИмяТипа, ОписаниеТипа.Наименование);
+
+КонецФункции
+
+Функция ПолноеИмяОбъекта(СтрокаМодуль, ДобавлятьПрефиксДляОбщихМодулей = ИСТИНА) Экспорт
+
+ Если СтрокаМодуль.ТипМодуля <> ТипМодуля.ОбщийМодуль
+ ИЛИ ДобавлятьПрефиксДляОбщихМодулей Тогда
+
+ Возврат ПолучитьИмяТипаНаРусском(СтрокаМодуль.Родитель.Тип) + "." + СтрокаМодуль.Родитель.Наименование;
+
+ Иначе
+
+ Возврат СтрокаМодуль.Родитель.Наименование;
+
+ КонецЕсли;
+
+КонецФункции
+
+Функция ПолноеИмяМодуля(СтрокаМодуль) Экспорт
+
+ ПолноеИмя = ПолноеИмяОбъекта(СтрокаМодуль);
+ Если СтрокаМодуль.ТипМодуля = ТипМодуля.ОбщийМодуль Тогда
+
+ // не надо дописывать
+
+ ИначеЕсли СтрокаМодуль.ТипМодуля = ТипМодуля.МодульМенеджера
+ ИЛИ СтрокаМодуль.ТипМодуля = ТипМодуля.МодульОбъекта Тогда
+
+ ПолноеИмя = ПолноеИмя + "." + СтрокаМодуль.ТипМодуля;
+
+ ИначеЕсли СтрокаМодуль.ТипМодуля = ТипМодуля.МодульУправляемойФормы Тогда
+
+ ПолноеИмя = ПолноеИмя + ".Форма." + СтрокаМодуль.РодительФорма.Наименование + ".МодульФормы";
+
+ ИначеЕсли СтрокаМодуль.ТипМодуля = ТипМодуля.МодульКоманды Тогда
+
+ ПолноеИмя = ПолноеИмя + ".Команда." + СтрокаМодуль.РодительКоманда.Наименование + ".МодульКоманды";
+
+ Иначе
+
+ ПолноеИмя = ПолноеИмя + "." + СтрокаМодуль.ТипМодуля;
+
+ КонецЕсли;
+
+ Возврат ПолноеИмя;
+
+КонецФункции
+
+///////////////////////////////////////////////////////////////////////////////
+// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
+///////////////////////////////////////////////////////////////////////////////
+
+Рефлектор = Новый Рефлектор;
diff --git a/src/Модули/ЧтениеОписанийКонфигуратор.os b/src/Модули/ЧтениеОписанийКонфигуратор.os
new file mode 100644
index 0000000..cacae4d
--- /dev/null
+++ b/src/Модули/ЧтениеОписанийКонфигуратор.os
@@ -0,0 +1,372 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// Модуль для чтения описаний метаданных 1с из XML выгрузки
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#Использовать reflector
+
+///////////////////////////////////////////////////////////////////////////////
+
+Перем Рефлектор;
+
+///////////////////////////////////////////////////////////////////////////////
+// ПРОГРАММНЫЙ ИНТЕРФЕЙС
+///////////////////////////////////////////////////////////////////////////////
+
+Функция ПолучитьСвойства(ТекстОписания, ПараметрыЧтения = Неопределено) Экспорт
+
+ СвойстваОписания = Новый Структура();
+
+ ЧтениеXML = Новый ЧтениеXML;
+ ЧтениеXML.УстановитьСтроку(ТекстОписания);
+
+ ПрочитатьСвойстваXML(ЧтениеXML, СвойстваОписания, ПараметрыЧтения);
+
+ ЧтениеXML.Закрыть();
+
+ Если ПараметрыЧтения <> Неопределено Тогда
+
+ СвойстваОписания = ВыполнитьОбработкуПрочитанныхСвойств(СвойстваОписания, ПараметрыЧтения);
+
+ КонецЕсли;
+
+ Возврат СвойстваОписания;
+
+КонецФункции
+
+Функция ПрочитатьСвойстваИзФайла(ИмяФайла, ПараметрыЧтения = Неопределено) Экспорт
+
+ СвойстваОписания = Новый Структура();
+
+ ЧтениеXML = Новый ЧтениеXML;
+ ЧтениеXML.ОткрытьФайл(ИмяФайла);
+
+ ПрочитатьСвойстваXML(ЧтениеXML, СвойстваОписания, ПараметрыЧтения);
+
+ ЧтениеXML.Закрыть();
+
+ Если ПараметрыЧтения <> Неопределено Тогда
+
+ СвойстваОписания = ВыполнитьОбработкуПрочитанныхСвойств(СвойстваОписания, ПараметрыЧтения);
+
+ КонецЕсли;
+
+ Возврат СвойстваОписания;
+
+КонецФункции
+
+Функция ПрочитатьОписаниеКонфигурации(ПутьКФайлуОписания) Экспорт
+
+ СвойстваКонфигурации = Новый Структура;
+
+ ОбъектыКонфигурации = СтруктурыОписаний.ТаблицаОписанияОбъектовКонфигурации();
+
+ ПустаяСтрокаОбъектКонфигурации = СтруктурыОписаний.ОписаниеОбъектаКонфигурацииЗначенияПоУмолчанию();
+
+ ЧтениеXML = Новый ЧтениеXML;
+ ЧтениеXML.ОткрытьФайл(ПутьКФайлуОписания);
+
+ Пока ЧтениеXML.Прочитать() Цикл
+
+ Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "Properties" Тогда
+
+ // Настройки
+ Пока НЕ (ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя = "Properties") Цикл
+
+ ЧтениеXML.Прочитать();
+ КлючСвойства = "";
+ Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
+
+ Если ЧтениеXML.Имя = "RequiredMobileApplicationPermissions" Тогда // атрибуты мобильного приложения
+
+ Пока НЕ (ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя = "RequiredMobileApplicationPermissions") Цикл
+
+ ЧтениеXML.Прочитать();
+
+ КонецЦикла;
+
+ Иначе
+
+ КлючСвойства = ЧтениеXML.Имя;
+ ЧтениеXML.Прочитать();
+
+ Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда // вложенный элемент
+
+ Если ЧтениеXML.Имя = "v8:item" Тогда // надо найти элемент с именем v8:content
+
+ Пока ЧтениеXML.Имя <> "v8:content" Цикл
+
+ ЧтениеXML.Прочитать();
+
+ КонецЦикла;
+ ЧтениеXML.Прочитать();
+
+ Иначе // просто ищем значение
+
+ Пока ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Цикл
+
+ ЧтениеXML.Прочитать();
+
+ КонецЦикла;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ СвойстваКонфигурации.Вставить(КлючСвойства, ЧтениеXML.Значение);
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "ChildObjects" Тогда
+
+ ЧтениеXML.Прочитать();
+ // подчиненные элементы (первый уровень)
+ Пока ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Цикл
+
+ НовСтрока = ОбъектыКонфигурации.Добавить();
+ ЗаполнитьЗначенияСвойств(НовСтрока, ПустаяСтрокаОбъектКонфигурации);
+ НовСтрока.Тип = ТипыОбъектовКонфигурации.НормализоватьИмя(ЧтениеXML.Имя);
+ ЧтениеXML.Прочитать();
+ НовСтрока.Наименование = ЧтениеXML.Значение;
+ ЧтениеXML.Прочитать();
+ ЧтениеXML.Прочитать();
+
+ КонецЦикла
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ ЧтениеXML.Закрыть();
+
+ Возврат Новый Структура("СвойстваКонфигурации, ОбъектыКонфигурации" ,СвойстваКонфигурации , ОбъектыКонфигурации);
+
+КонецФункции
+
+///////////////////////////////////////////////////////////////////////////////
+// СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС
+///////////////////////////////////////////////////////////////////////////////
+
+Функция МногоЯзыковаяСтрока(Знач ЧтениеXML) Экспорт
+
+ Имя = ЧтениеXML.Имя;
+
+ Пока ЧтениеXML.Имя <> "v8:content" Цикл
+
+ Если ЧтениеXML.Имя = Имя И ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
+
+ Возврат "";
+
+ КонецЕсли;
+
+ ЧтениеXML.Прочитать();
+
+ КонецЦикла;
+
+ ЧтениеXML.Прочитать();
+ Значение = ЧтениеXML.Значение;
+
+ ЧтениеXML.Прочитать();
+
+ Возврат Значение;
+
+КонецФункции
+
+Функция ПолучитьТип(Знач ЧтениеXML) Экспорт
+
+ Пока ЧтениеXML.Имя <> "v8:Type" Цикл
+
+ ЧтениеXML.Прочитать();
+
+ КонецЦикла;
+
+ ЧтениеXML.Прочитать();
+ Значение = ЧтениеXML.Значение;
+
+ Пока ЧтениеXML.Имя <> "Type" Цикл
+
+ ЧтениеXML.Прочитать();
+
+ КонецЦикла;
+
+ Возврат Значение;
+
+КонецФункции
+
+Функция ПрочитатьСостав(Знач ЧтениеXML) Экспорт
+
+ Значение = Новый Массив();
+
+ Пока ЧтениеXML.Прочитать() И НЕ (ЧтениеXML.Имя = "Content" И ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента) Цикл
+
+ Если ЧтениеXML.ИмеетЗначение Тогда
+
+ Строка = ЧтениеXML.Значение;
+
+ Позиция = СтрНайти(Строка, ".");
+
+ Если Позиция > 0 Тогда
+
+ Значение.Добавить(ТипыОбъектовКонфигурации.НормализоватьИмя(Лев(Строка, Позиция - 1)) + Сред(Строка, Позиция));
+
+ Иначе
+
+ Значение.Добавить(ЧтениеXML.Значение);
+
+ КонецЕсли
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Возврат Значение;
+
+КонецФункции
+
+///////////////////////////////////////////////////////////////////////////////
+// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
+///////////////////////////////////////////////////////////////////////////////
+
+Функция ВыполнитьОбработкуПрочитанныхСвойств(СырыеДанные, ПараметрыЧтения)
+
+ СвойстваОписания = Новый Структура();
+
+ Для Каждого Параметр Из ПараметрыЧтения Цикл
+
+ Значение = Неопределено;
+
+ Если НЕ СырыеДанные.Свойство(Параметр.Значение.Поле, Значение) Тогда
+
+ Значение = "";
+
+ КонецЕсли;
+
+ Значение = ОбработатьСвойство(Значение, Параметр.Значение);
+
+ СвойстваОписания.Вставить(Параметр.Ключ, Значение);
+
+ КонецЦикла;
+
+ Возврат СвойстваОписания;
+
+КонецФункции
+
+Функция ОбработатьСвойство(Значение, Параметр)
+
+ Если ПустаяСтрока(Значение) И Параметр.Коллекция Тогда
+
+ Возврат Новый Массив();
+
+ ИначеЕсли ПустаяСтрока(Значение) Тогда
+
+ Возврат Значение;
+
+ ИначеЕсли Параметр.Коллекция И ТипЗнч(Значение) <> Тип("Массив") Тогда
+
+ Результат = Новый Массив();
+ Результат.Добавить(Значение);
+ Значение = Результат;
+
+ КонецЕсли;
+
+ Возврат Значение;
+
+КонецФункции
+
+Функция ПрочитатьСвойстваXML(ЧтениеXML, Данные, ПараметрыЧтения)
+
+ ОбработчикиПолей = Новый Структура();
+
+ Если ПараметрыЧтения <> Неопределено Тогда
+
+ Для Каждого Элемент Из ПараметрыЧтения Цикл
+
+ Параметр = Элемент.Значение;
+ Если ПустаяСтрока(Параметр.ФункцияПреобразования) И Параметр.Многоязычный Тогда
+
+ ОбработчикиПолей.Вставить(ВРег(Параметр.Поле), "МногоЯзыковаяСтрока");
+
+ ИначеЕсли НЕ ПустаяСтрока(Параметр.ФункцияПреобразования) Тогда
+
+ ОбработчикиПолей.Вставить(ВРег(Параметр.Поле), Параметр.ФункцияПреобразования);
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ КонецЕсли;
+
+ Пока ЧтениеXML.Прочитать() Цикл
+
+ Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "Properties" Тогда
+
+ Уровень = ЧтениеXML.КонтекстПространствИмен.Глубина;
+ // Настройки
+ Пока НЕ (ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя = "Properties") Цикл
+
+ ЧтениеXML.Прочитать();
+ КлючСвойства = "";
+ Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
+
+ Если ЧтениеXML.Имя = "RequiredMobileApplicationPermissions" Тогда // атрибуты мобильного приложения
+
+ Пока НЕ (ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя = "RequiredMobileApplicationPermissions") Цикл
+
+ ЧтениеXML.Прочитать();
+
+ КонецЦикла;
+
+ Иначе
+
+ КлючСвойства = ЧтениеXML.ЛокальноеИмя;
+
+ Если ОбработчикиПолей.Свойство(ВРег(КлючСвойства)) Тогда
+
+ ЗначениеВМассиве = Новый Массив();
+ ЗначениеВМассиве.Добавить(ЧтениеXML);
+
+ Значение = Рефлектор.ВызватьМетод(ЭтотОбъект, ОбработчикиПолей[КлючСвойства], ЗначениеВМассиве);
+
+ Иначе
+
+ ЧтениеXML.Прочитать();
+
+ Уровень = ЧтениеXML.КонтекстПространствИмен.Глубина;
+ Пока ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Цикл
+
+ ЧтениеXML.Прочитать();
+
+ КонецЦикла;
+
+ Значение = ЧтениеXML.Значение;
+
+ Пока Уровень < ЧтениеXML.КонтекстПространствИмен.Глубина Цикл
+
+ ЧтениеXML.Прочитать();
+
+ КонецЦикла;
+
+ КонецЕсли;
+
+ Данные.Вставить(КлючСвойства, Значение);
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Возврат Данные;
+
+КонецФункции
+
+Рефлектор = Новый Рефлектор();
\ No newline at end of file
diff --git a/src/РазборСтруктурыКонфигурации.os b/src/РазборСтруктурыКонфигурации.os
deleted file mode 100644
index ead3d14..0000000
--- a/src/РазборСтруктурыКонфигурации.os
+++ /dev/null
@@ -1,1865 +0,0 @@
-///////////////////////////////////////////////////////////////////
-//
-// Модуль разбора файлов конфигурации
-//
-// (с) BIA Technologies, LLC
-//
-///////////////////////////////////////////////////////////////////
-
-//#Использовать xml-bia
-
-Функция ПрочитатьДеревоКонфигурации(КаталогИсходников)Экспорт
-
- ОписаниеКонфигурации = ПрочитатьОписаниеКонфигурации(КаталогИсходников);
-
- // определим иерархию
- // схема определения проста, если есть каталог "Languages" то иерархия в формате 8.3.8
- КаталогЯзыки = ОбъединитьПути(КаталогИсходников, "Languages");
- ФайлКаталогЯзыки = Новый Файл(КаталогЯзыки);
- ИерархическийФормат = ФайлКаталогЯзыки.Существует();
- ОписаниеКонфигурации.СвойстваКонфигурации.Вставить("ИерархическийФормат", ИерархическийФормат);
-
- ЗаполнитьИменаФайлов(ОписаниеКонфигурации.ОбъектыКонфигурации, КаталогИсходников, ИерархическийФормат);
-
- Возврат ОписаниеКонфигурации;
-
-КонецФункции
-
-Функция ПрочитатьМодулиКонфигурации(КаталогИсходников, ОписаниеКонфигурации)Экспорт
-
- МодулиКонфигурации = ОписаниеТаблицыМодулей();
-
- // todo сделать чтение форм
- ФормыКонфигурации = Новый ТаблицаЗначений;
- ФормыКонфигурации.Колонки.Добавить("Родитель");
- ФормыКонфигурации.Колонки.Добавить("ЭтоУправляемаяФорма");
- ФормыКонфигурации.Колонки.Добавить("Наименование");
-
- // todo сделать чтение команд
- КомандыКонфигурации = Новый ТаблицаЗначений;
- КомандыКонфигурации.Колонки.Добавить("Родитель");
- КомандыКонфигурации.Колонки.Добавить("Наименование");
-
- ФильтрФайлов = ?(ОписаниеКонфигурации.СвойстваКонфигурации.ИерархическийФормат, "*.bsl", "*.txt");
- Для Каждого ОбъектКонфигурации Из ОписаниеКонфигурации.ОбъектыКонфигурации Цикл
-
- Если ПустаяСтрока(ОбъектКонфигурации.ПутьККаталогу) Тогда
-
- Продолжить;
-
- КонецЕсли;
-
- НайденныеФайлы = НайтиФайлы(ОбъектКонфигурации.ПутьККаталогу, "*", ИСТИНА);
- Для Каждого НайденныйФайл Из НайденныеФайлы Цикл
-
- Если НайденныйФайл.ЭтоКаталог() Тогда
-
- Продолжить;
-
- КонецЕсли;
-
- Если НЕ (НайденныйФайл.Расширение = "" ИЛИ СтрНайти(ФильтрФайлов, "*" + НайденныйФайл.Расширение)) Тогда
-
- Продолжить;
-
- КонецЕсли;
-
- ПолучитьОписаниеМодуляПоИмениФайла(НайденныйФайл, ОбъектКонфигурации, МодулиКонфигурации, ФормыКонфигурации, КомандыКонфигурации);
-
- КонецЦикла;
-
- КонецЦикла;
-
- ОписаниеКонфигурации.Вставить("ФормыКонфигурации", ФормыКонфигурации);
- ОписаниеКонфигурации.Вставить("КомандыКонфигурации", КомандыКонфигурации);
- ОписаниеКонфигурации.Вставить("МодулиКонфигурации", МодулиКонфигурации);
-
- Возврат ОписаниеКонфигурации;
-
-КонецФункции
-
-Процедура ПрочитатьСодержимоеМодуля(СтрокаМодуль)Экспорт
-
- Файл = Новый ТекстовыйДокумент;
- Файл.Прочитать(СтрокаМодуль.ПутьКФайлу);
-
- СодержимоеМодуля = ПрочитатьМодуль(Файл);
- СтрокаМодуль.Содержимое = СодержимоеМодуля.Содержимое;
-
- ДополнитьБлокиМодуля(СодержимоеМодуля.БлокиМодуля, Файл, СтрокаМодуль);
- СтрокаМодуль.НаборБлоков = СодержимоеМодуля.БлокиМодуля;
-
- Если Не ПустаяСтрока(СтрокаМодуль.Родитель.ПутьКФайлуСОписанием) Тогда
-
- Текст = Новый ТекстовыйДокумент;
- Текст.Прочитать(СтрокаМодуль.Родитель.ПутьКФайлуСОписанием);
- Если СтрНайти(Текст.ПолучитьТекст(), "true") Тогда
-
- СтрокаМодуль.ОписаниеМодуля.Вставить("Глобальный", Истина);
-
- КонецЕсли;
-
- КонецЕсли;
-
-КонецПроцедуры
-
-Функция ПолноеИмяМодуля(СтрокаМодуль) Экспорт
-
- ПолноеИмя = ПолноеИмяОбъекта(СтрокаМодуль);
- Если СтрокаМодуль.ТипМодуля = ТипМодуля.ОбщийМодуль Тогда
-
- // не надо дописывать
-
- ИначеЕсли СтрокаМодуль.ТипМодуля = ТипМодуля.МодульМенеджера
- ИЛИ СтрокаМодуль.ТипМодуля = ТипМодуля.МодульОбъекта Тогда
-
- ПолноеИмя = ПолноеИмя + "." + СтрокаМодуль.ТипМодуля;
-
- ИначеЕсли СтрокаМодуль.ТипМодуля = ТипМодуля.МодульУправляемойФормы Тогда
-
- ПолноеИмя = ПолноеИмя + ".Форма." + СтрокаМодуль.РодительФорма.Наименование + ".МодульФормы";
-
- ИначеЕсли СтрокаМодуль.ТипМодуля = ТипМодуля.МодульКоманды Тогда
-
- ПолноеИмя = ПолноеИмя + ".Команда." + СтрокаМодуль.РодительКоманда.Наименование + ".МодульКоманды";
-
- Иначе
-
- ПолноеИмя = ПолноеИмя + "." + СтрокаМодуль.ТипМодуля;
-
- КонецЕсли;
-
- Возврат ПолноеИмя;
-
-КонецФункции
-
-Функция ПолноеИмяОбъекта(СтрокаМодуль, ДобавлятьПрефиксДляОбщихМодулей = ИСТИНА) Экспорт
-
- Если СтрокаМодуль.ТипМодуля <> ТипМодуля.ОбщийМодуль
- ИЛИ ДобавлятьПрефиксДляОбщихМодулей Тогда
-
- Возврат ПолучитьИмяТипаНаРусском(СтрокаМодуль.Родитель.Тип) + "." + СтрокаМодуль.Родитель.Наименование;
-
- Иначе
-
- Возврат СтрокаМодуль.Родитель.Наименование;
-
- КонецЕсли;
-
-КонецФункции
-
-Функция ПолучитьОписаниеМодуляПоИмениФайла(Знач НайденныйФайл, ОбъектКонфигурации = Неопределено, МодулиКонфигурации = Неопределено, ФормыКонфигурации = Неопределено, КомандыКонфигурации = Неопределено)Экспорт
-
- НовыйМодульКонфигурации = Неопределено;
-
- Если МодулиКонфигурации = Неопределено Тогда
-
- МодулиКонфигурации = ОписаниеТаблицыМодулей();
- ФормыКонфигурации = Новый ТаблицаЗначений;
- КомандыКонфигурации = Новый ТаблицаЗначений;
- ОбъектКонфигурации = Новый Структура("Наименование, Тип, ПутьКФайлуСОписанием, ПутьККаталогу, Подсистемы"); // заглушка
-
- КонецЕсли;
-
- ПустаяСтрокаМодульКонфигурации = Новый Структура(
- "ПутьКФайлу, ТипМодуля, ОписаниеМодуля, Родитель, РодительФорма, РодительКоманда, НаборБлоков, Содержимое",
- "", "", Новый Структура, Неопределено, Неопределено, Неопределено, Неопределено, Неопределено);
-
- ТипЭтогоМодуля = ТипМодуля.ТипМодуляПоИмениФайла(НайденныйФайл.ПолноеИмя);
- Если Не ПустаяСтрока(ТипЭтогоМодуля) Тогда
-
- Если ТипЭтогоМодуля = ТипМодуля.МодульОбъекта
- ИЛИ ТипЭтогоМодуля = ТипМодуля.МодульМенеджера
- ИЛИ ТипЭтогоМодуля = ТипМодуля.ОбщийМодуль
- ИЛИ ТипЭтогоМодуля = ТипМодуля.МодульУправляемогоПриложения
- ИЛИ ТипЭтогоМодуля = ТипМодуля.МодульСеанса
- ИЛИ ТипЭтогоМодуля = ТипМодуля.МодульВнешнегоСоединения
- ИЛИ ТипЭтогоМодуля = ТипМодуля.МодульОбычногоПриложения Тогда
-
- НовыйМодульКонфигурации = МодулиКонфигурации.Добавить();
- ЗаполнитьЗначенияСвойств(НовыйМодульКонфигурации, ПустаяСтрокаМодульКонфигурации);
- НовыйМодульКонфигурации.ТипМодуля = ТипЭтогоМодуля;
- НовыйМодульКонфигурации.ПутьКФайлу = НайденныйФайл.ПолноеИмя;
- НовыйМодульКонфигурации.Родитель = ОбъектКонфигурации;
-
- ИначеЕсли ТипЭтогоМодуля = ТипМодуля.МодульУправляемойФормы
- ИЛИ ТипЭтогоМодуля = ТипМодуля.МодульОбычнойФормы Тогда
-
- ФормаОбъекта = ФормыКонфигурации.Добавить();
- ФормаОбъекта.Родитель = ОбъектКонфигурации;
- ФормаОбъекта.ЭтоУправляемаяФорма = ТипЭтогоМодуля = ТипМодуля.МодульУправляемойФормы;
- ФормаОбъекта.Наименование = ПолучитьИмяФормыИзИмениФайлаМодуля(НайденныйФайл.ПолноеИмя);
-
- НовыйМодульКонфигурации = МодулиКонфигурации.Добавить();
- ЗаполнитьЗначенияСвойств(НовыйМодульКонфигурации, ПустаяСтрокаМодульКонфигурации);
- НовыйМодульКонфигурации.ТипМодуля = ТипЭтогоМодуля;
- НовыйМодульКонфигурации.ПутьКФайлу = НайденныйФайл.ПолноеИмя;
- НовыйМодульКонфигурации.Родитель = ОбъектКонфигурации;
- НовыйМодульКонфигурации.РодительФорма = ФормаОбъекта;
-
- ИначеЕсли ТипЭтогоМодуля = ТипМодуля.МодульКоманды Тогда
-
- КомандаОбъекта = КомандыКонфигурации.Добавить();
- КомандаОбъекта.Родитель = ОбъектКонфигурации;
- КомандаОбъекта.Наименование = ПолучитьИмяКомандыИзИмениФайлаМодуля(НайденныйФайл.ПолноеИмя);
-
- НовыйМодульКонфигурации = МодулиКонфигурации.Добавить();
- ЗаполнитьЗначенияСвойств(НовыйМодульКонфигурации, ПустаяСтрокаМодульКонфигурации);
- НовыйМодульКонфигурации.ТипМодуля = ТипЭтогоМодуля;
- НовыйМодульКонфигурации.ПутьКФайлу = НайденныйФайл.ПолноеИмя;
- НовыйМодульКонфигурации.Родитель = ОбъектКонфигурации;
- НовыйМодульКонфигурации.РодительКоманда = КомандаОбъекта;
-
- Иначе
-
- ВызватьИсключение "Тип модуля: " + ТипЭтогоМодуля + " не имеет алгоритма разбора";
-
- КонецЕсли;
-
- КонецЕсли;
-
- Если НовыйМодульКонфигурации <> Неопределено Тогда
-
- ЗаполнитьЗначенияСвойств(ПустаяСтрокаМодульКонфигурации, НовыйМодульКонфигурации);
-
- КонецЕсли;
-
- Возврат ПустаяСтрокаМодульКонфигурации;
-
-КонецФункции
-
-Функция СформироватьОписаниеОбъекта(КореньОписания)
-
- ОписаниеОбъекта = Новый Структура;
- ВеткаСвойства = КореньОписания.Найти("Properties", "Имя");
- Если ВеткаСвойства <> Неопределено Тогда
-
- КонецЕсли;
-
- ВеткаПодчиненныеОбъекты = КореньОписания.Найти("ChildObjects", "Имя");
- Если ВеткаПодчиненныеОбъекты <> Неопределено И ТипЗнч(ВеткаПодчиненныеОбъекты.Значение) = Тип("ТаблицаЗначений") Тогда
-
- Формы = СформироватьОписаниеОбъектаФормы(ВеткаПодчиненныеОбъекты.Значение);
- Если Формы <> Неопределено Тогда
-
- ОписаниеОбъекта.Вставить("Формы", Формы);
-
- КонецЕсли;
-
- Реквизиты = СформироватьОписаниеОбъектаРеквизиты(ВеткаПодчиненныеОбъекты.Значение);
- Если Реквизиты <> Неопределено Тогда
-
- ОписаниеОбъекта.Вставить("Реквизиты", Реквизиты);
-
- КонецЕсли;
-
- ТЧ = СформироватьОписаниеОбъектаТабличныеЧасти(ВеткаПодчиненныеОбъекты.Значение);
- Если ТЧ <> Неопределено Тогда
-
- ОписаниеОбъекта.Вставить("ТабличныеЧасти", ТЧ);
-
- КонецЕсли;
-
- КонецЕсли;
-
- Возврат ОписаниеОбъекта;
-
-КонецФункции
-
-Функция СформироватьОписаниеОбъектаФормы(ПодчиненныеОбъекты)
-
- СтрФормы = ПодчиненныеОбъекты.НайтиСтроки(Новый Структура("Имя", "Form"));
- Если СтрФормы.Количество() Тогда
-
- Формы = Новый Массив;
- Для Каждого СтрФорма Из СтрФормы Цикл
-
- Формы.ДобавитЬ(СтрФорма.Значение);
-
- КонецЦикла;
-
- Возврат Формы;
-
- КонецЕсли;
-
- Возврат Неопределено;
-
-КонецФункции
-
-Функция СформироватьОписаниеОбъектаРеквизиты(ПодчиненныеОбъекты)
-
- СтрАтрибуты = ПодчиненныеОбъекты.НайтиСтроки(Новый Структура("Имя", "Attribute"));
- Если СтрАтрибуты.Количество() Тогда
-
- Реквизиты = Новый ТаблицаЗначений;
- Реквизиты.Колонки.Добавить("Имя");
- Для Каждого СтрАтрибут Из СтрАтрибуты Цикл
-
- ОписаниеАтрибута = СтрАтрибут.Значение.Найти("Properties", "Имя");
- Если ОписаниеАтрибута = Неопределено Тогда
-
- Продолжить;
-
- КонецЕсли;
-
- СтрНаименования = ОписаниеАтрибута.Значение.Найти("Name", "Имя");
- Если СтрНаименования = Неопределено Тогда
-
- Продолжить;
-
- КонецЕсли;
-
- НовыйРеквизит = Реквизиты.Добавить();
- НовыйРеквизит.Имя = СтрНаименования.Значение;
- Для Каждого ЭлОписания Из ОписаниеАтрибута.Значение Цикл
-
- Если ЭлОписания.Имя = "Name" Тогда
-
- Продолжить;
-
- КонецЕсли;
-
- Если Реквизиты.Колонки.Найти(ЭлОписания.Имя) = Неопределено Тогда
-
- Попытка
-
- Реквизиты.Колонки.Добавить(ЭлОписания.Имя);
-
- Исключение
-
- Продолжить;
-
- КонецПопытки;
-
- КонецЕсли;
-
- НовыйРеквизит[ЭлОписания.Имя] = ЭлОписания.Значение;
-
- КонецЦикла
-
- КонецЦикла;
-
- Возврат Реквизиты;
-
- КонецЕсли;
-
- Возврат Неопределено;
-
-КонецФункции
-
-Функция СформироватьОписаниеОбъектаТабличныеЧасти(ПодчиненныеОбъекты)
-
- СтрТЧ = ПодчиненныеОбъекты.НайтиСтроки(Новый Структура("Имя", "TabularSection"));
- Если СтрТЧ.Количество() Тогда
-
- ТЧ = Новый ТаблицаЗначений;
- ТЧ.Колонки.Добавить("Имя");
- ТЧ.Колонки.Добавить("Описание");
- ТЧ.Колонки.Добавить("Реквизиты");
- Для Каждого Стр Из СтрТЧ Цикл
-
- СтрОписание = СформироватьОписаниеОбъекта(Стр.Значение);
- Если СтрОписание.Свойство("Описание") Тогда
-
- СтрНаименования = СтрОписание.Описание.Найти("Name", "Имя");
- Если СтрНаименования <> Неопределено Тогда
-
- НоваяТЧ = ТЧ.Добавить();
- НоваяТЧ.Имя = СтрНаименования.Значение;
- НоваяТЧ.Описание = СтрОписание.Описание;
-
- Если СтрОписание.Свойство("Реквизиты") Тогда
-
- НоваяТЧ.Реквизиты = СтрОписание.Реквизиты;
-
- КонецЕсли;
-
- КонецЕсли;
-
- КонецЕсли;
-
- КонецЦикла;
-
- Возврат ТЧ;
-
- КонецЕсли;
-
- Возврат Неопределено;
-
-КонецФункции
-
-///////////////////////////////////////////////////////////////////
-
-Функция ОписаниеТаблицыМодулей()
-
- МодулиКонфигурации = Новый ТаблицаЗначений;
- МодулиКонфигурации.Колонки.Добавить("ТипМодуля");
- МодулиКонфигурации.Колонки.Добавить("Родитель");
- МодулиКонфигурации.Колонки.Добавить("ПутьКФайлу");
- МодулиКонфигурации.Колонки.Добавить("НаборБлоков");
- МодулиКонфигурации.Колонки.Добавить("Содержимое");
- МодулиКонфигурации.Колонки.Добавить("РодительФорма");
- МодулиКонфигурации.Колонки.Добавить("РодительКоманда");
- МодулиКонфигурации.Колонки.Добавить("ОписаниеМодуля");
-
- Возврат МодулиКонфигурации;
-
-КонецФункции
-
-Функция ПрочитатьОписаниеКонфигурации(КаталогИсходников)
-
- ФайлКонфигурации = ОбъединитьПути(КаталогИсходников, "Configuration.xml");
- Файл = Новый Файл(ФайлКонфигурации);
- Если Не Файл.Существует() Тогда
-
- ВызватьИсключение "Файл описания конфигурации не обнаружен";
-
- КонецЕсли;
-
- СвойстваКонфигурации = Новый Структура;
- ОбъектыКонфигурации = Новый ТаблицаЗначений;
- ОбъектыКонфигурации.Колонки.Добавить("Наименование");
- ОбъектыКонфигурации.Колонки.Добавить("Тип");
- ОбъектыКонфигурации.Колонки.Добавить("ПутьКФайлуСОписанием");
- ОбъектыКонфигурации.Колонки.Добавить("ПутьККаталогу");
- ОбъектыКонфигурации.Колонки.Добавить("Подсистемы");
-
- ПустаяСтрокаОбъектКонфигурации = Новый Структура(
- "Наименование, Тип, ПутьКФайлуСОписанием, ПутьККаталогу, Подсистема",
- "", "", "", "", Новый Массив);
-
- ЧтениеXML = Новый ЧтениеXML;
- ЧтениеXML.ОткрытьФайл(ФайлКонфигурации);
- Пока ЧтениеXML.Прочитать() Цикл
-
- Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "Properties" Тогда
-
- // Настройки
- Пока НЕ (ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя = "Properties") Цикл
-
- ЧтениеXML.Прочитать();
- КлючСвойства = "";
- Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
-
- Если ЧтениеXML.Имя = "RequiredMobileApplicationPermissions" Тогда // атрибуты мобильного приложения
-
- Пока НЕ (ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя = "RequiredMobileApplicationPermissions") Цикл
-
- ЧтениеXML.Прочитать();
-
- КонецЦикла;
-
- Иначе
-
- КлючСвойства = ЧтениеXML.Имя;
- ЧтениеXML.Прочитать();
-
- Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда // вложенный элемент
-
- Если ЧтениеXML.Имя = "v8:item" Тогда // надо найти элемент с именем v8:content
-
- Пока ЧтениеXML.Имя <> "v8:content" Цикл
-
- ЧтениеXML.Прочитать();
-
- КонецЦикла;
- ЧтениеXML.Прочитать();
-
- Иначе // просто ищем значение
-
- Пока ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Цикл
-
- ЧтениеXML.Прочитать();
-
- КонецЦикла;
-
- КонецЕсли;
-
- КонецЕсли;
- СвойстваКонфигурации.Вставить(КлючСвойства, ЧтениеXML.Значение);
-
- КонецЕсли;
-
- КонецЕсли;
-
- КонецЦикла;
-
- ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "ChildObjects" Тогда
-
- ЧтениеXML.Прочитать();
- // подчиненные элементы (первый уровень)
- Пока ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Цикл
-
- НовСтрока = ОбъектыКонфигурации.Добавить();
- ЗаполнитьЗначенияСвойств(НовСтрока, ПустаяСтрокаОбъектКонфигурации);
- НовСтрока.Тип = ЧтениеXML.Имя;
- ЧтениеXML.Прочитать();
- НовСтрока.Наименование = ЧтениеXML.Значение;
- ЧтениеXML.Прочитать();
- ЧтениеXML.Прочитать();
-
- КонецЦикла
-
- КонецЕсли;
-
- КонецЦикла;
-
- ЧтениеXML.Закрыть();
-
- // добавим руками объект "Configuration" для модулей приложения
- НовСтрока = ОбъектыКонфигурации.Добавить();
- ЗаполнитьЗначенияСвойств(НовСтрока, ПустаяСтрокаОбъектКонфигурации);
- НовСтрока.Тип = "Configuration";
- НовСтрока.Наименование = "";
-
- // дополним объекты информацией о подсистемах
- ПодсистемыКонфигурации = ПрочитатьПодсистемыКонфигурации(КаталогИсходников);
- Для Каждого ОбъектКонфигурации Из ОбъектыКонфигурации Цикл
-
- Подсистемы = ПодсистемыКонфигурации.НайтиСтроки(Новый Структура("ОбъектМетаданных", ОбъектКонфигурации.Тип + "." + ОбъектКонфигурации.Наименование));
- Если Подсистемы.Количество() Тогда
-
- // ставим первую
- ОбъектКонфигурации.Подсистемы = Подсистемы;
-
- КонецЕсли;
-
- КонецЦикла;
-
- Возврат Новый Структура("СвойстваКонфигурации, ОбъектыКонфигурации, ПодсистемыКонфигурации", СвойстваКонфигурации, ОбъектыКонфигурации, ПодсистемыКонфигурации);
-
-КонецФункции
-
-///////////////////////////////////////////////////////////////////
-
-Процедура ЗаполнитьИменаФайлов(ОбъектыКонфигурации, КаталогИсходников, ИерархическийФормат)
-
- Переименования = Неопределено;
-
- Для Каждого СтрокаОбъектКонфигурации Из ОбъектыКонфигурации Цикл
-
- ИмяТипа = СтрокаОбъектКонфигурации.Тип;
- Если ИерархическийФормат И СтрокаОбъектКонфигурации.Тип = "FilterCriterion" Тогда
-
- ИмяТипа = "FilterCriteria";
-
- ИначеЕсли ИерархическийФормат И СтрокаОбъектКонфигурации.Тип = "ChartOfCharacteristicTypes" Тогда
-
- ИмяТипа = "ChartsOfCharacteristicTypes";
-
- ИначеЕсли СтрокаОбъектКонфигурации.Тип = "Configuration" Тогда
-
- ИмяТипа = ?(ИерархическийФормат, "Ext", СтрокаОбъектКонфигурации.Тип);
-
- Иначе
-
- ИмяТипа = ?(ИерархическийФормат, СтрокаОбъектКонфигурации.Тип + "s", СтрокаОбъектКонфигурации.Тип);
-
- КонецЕсли;
-
- КаталогРодителя = ОбъединитьПути(КаталогИсходников, ИмяТипа);
- ФайлКаталог = Новый Файл(КаталогРодителя);
- Если НЕ ФайлКаталог.Существует() Тогда
-
- Сообщить("Не найден каталог для типа " + СтрокаОбъектКонфигурации.Тип);
- Продолжить;
-
- КонецЕсли;
-
- КаталогОбъекта = ОбъединитьПути(КаталогРодителя, СтрокаОбъектКонфигурации.Наименование);
- ФайлКаталог = Новый Файл(КаталогОбъекта);
-
- Если НЕ ФайлКаталог.Существует() Тогда
-
- Если Не ИерархическийФормат Тогда
-
- Сообщить("Не найден каталог для объекта метаданных " + ИмяТипа + "." + СтрокаОбъектКонфигурации.Наименование);
- Продолжить;
-
- КонецЕсли;
-
- Иначе
-
- СтрокаОбъектКонфигурации.ПутьККаталогу = КаталогОбъекта;
-
- КонецЕсли;
-
- Если НЕ СтрокаОбъектКонфигурации.Тип = "Configuration" Тогда
-
- Если ИерархическийФормат Тогда
-
- ФайлСОписанием = ОбъединитьПути(КаталогРодителя, СтрокаОбъектКонфигурации.Наименование + ".xml");
-
- Иначе
-
- ФайлСОписанием = ОбъединитьПути(КаталогОбъекта, СтрокаОбъектКонфигурации.Наименование + ".xml");
-
- КонецЕсли;
-
- ФайлФайлСОписанием = Новый Файл(ФайлСОписанием);
- Если НЕ ФайлФайлСОписанием.Существует() Тогда
-
- Если Переименования = Неопределено Тогда
-
- Переименования = Новый Соответствие;
- ФайлПереименований = ОбъединитьПути(КаталогИсходников, "renames.txt");
- Текст = Новый ТекстовыйДокумент;
- Текст.Прочитать(ФайлПереименований);
-
- Для Ит = 1 По Текст.КоличествоСтрок() Цикл
-
- ОписаниеПереименования = СтрРазделить(Текст.ПолучитьСтроку(Ит), "-->");
- Переименования.Вставить(ОписаниеПереименования[0], ОписаниеПереименования[1]);
-
- КонецЦикла;
-
- КонецЕсли;
-
- ФайлСОписанием = СтрЗаменить(ФайлСОписанием, КаталогИсходников, "");
- ОписаниеФайлОписание = СтрРазделить(ФайлСОписанием, "\");
- Если ОписаниеФайлОписание[ОписаниеФайлОписание.Количество() - 1] = ОписаниеФайлОписание[ОписаниеФайлОписание.Количество() - 2] + ".xml" Тогда
-
- ОписаниеФайлОписание.Удалить(ОписаниеФайлОписание.Количество() - 2);
-
- КонецЕсли;
-
- ФайлСОписанием = СтрСоединить(ОписаниеФайлОписание, ".");
- ФайлСОписанием = Переименования.Получить(СтрЗаменить(ФайлСОписанием, КаталогИсходников, ""));
- ФайлСОписанием = ОбъединитьПути(КаталогИсходников, ФайлСОписанием);
- ФайлФайлСОписанием = Новый Файл(ФайлСОписанием);
- Если НЕ ФайлФайлСОписанием.Существует() Тогда
-
- Сообщить("Не найден файл с описание объекта метаданных " + ИмяТипа + "." + СтрокаОбъектКонфигурации.Наименование);
- Продолжить;
-
- КонецЕсли;
-
- КонецЕсли;
-
- СтрокаОбъектКонфигурации.ПутьКФайлуСОписанием = ФайлСОписанием;
-
- Иначе
-
- СтрокаОбъектКонфигурации.ПутьКФайлуСОписанием = "";
-
- КонецЕсли;
-
- КонецЦикла
-
-КонецПроцедуры
-
-///////////////////////////////////////////////////////////////////
-
-Функция ПолучитьИмяФормыИзИмениФайлаМодуля(ПолноеИмяФайла)
-
- МассивЧастейИмени = СтрРазделить(ПолноеИмяФайла, "\");
- Если МассивЧастейИмени.Количество() > 3 Тогда
-
- Номер = 2;
- Родитель = МассивЧастейИмени[МассивЧастейИмени.Количество() - Номер];
- Если Родитель = "Form" Тогда
-
- Номер = Номер + 1;
- Родитель = МассивЧастейИмени[МассивЧастейИмени.Количество() - Номер];
-
- КонецЕсли;
-
- Если Родитель = "Ext" Тогда
-
- Номер = Номер + 1;
- Родитель = МассивЧастейИмени[МассивЧастейИмени.Количество() - Номер];
-
- КонецЕсли;
-
- Возврат Родитель;
-
- Иначе
-
- ВызватьИсключение "Ошибочная структура имени файла: " + ПолноеИмяФайла;
-
- КонецЕсли;
-
- Возврат "";
-
-КонецФункции
-
-Функция ПолучитьИмяКомандыИзИмениФайлаМодуля(ПолноеИмяФайла)
-
- МассивЧастейИмени = СтрРазделить(ПолноеИмяФайла, "\");
- Если МассивЧастейИмени.Количество() > 3 Тогда
-
- Номер = 2;
- Родитель = МассивЧастейИмени[МассивЧастейИмени.Количество() - Номер];
-
- Если Родитель = "Ext" Тогда
-
- Номер = Номер + 1;
- Родитель = МассивЧастейИмени[МассивЧастейИмени.Количество() - Номер];
-
- КонецЕсли;
-
- Возврат Родитель;
-
- Иначе
-
- ВызватьИсключение "Ошибочная структура имени файла: " + ПолноеИмяФайла;
-
- КонецЕсли;
-
- Возврат "";
-
-КонецФункции
-
-Функция ПолучитьИмяТипаНаРусском(ИмяТипа)
-
- ИмяТипаРус = ИмяТипа;
- Если ИмяТипа = "Language" Тогда
-
- ИмяТипаРус = "Язык";
-
- ИначеЕсли ИмяТипа = "Subsystem" Тогда
-
- ИмяТипаРус = "Подсистема";
-
- ИначеЕсли ИмяТипа = "CommonPicture" Тогда
-
- ИмяТипаРус = "ОбщаяКартинка";
-
- ИначеЕсли ИмяТипа = "SessionParameter" Тогда
-
- ИмяТипаРус = "ПараметрСеанса";
-
- ИначеЕсли ИмяТипа = "Role" Тогда
-
- ИмяТипаРус = "Роль";
-
- ИначеЕсли ИмяТипа = "CommonTemplate" Тогда
-
- ИмяТипаРус = "ОбщийМакет";
-
- ИначеЕсли ИмяТипа = "FilterCriterion" Тогда
-
- ИмяТипаРус = "КритерийОтбора";
-
- ИначеЕсли ИмяТипа = "CommonModule" Тогда
-
- ИмяТипаРус = "ОбщийМодуль";
-
- ИначеЕсли ИмяТипа = "CommonAttribute" Тогда
-
- ИмяТипаРус = "ОбщийРеквизит";
-
- ИначеЕсли ИмяТипа = "ExchangePlan" Тогда
-
- ИмяТипаРус = "ПланОбмена";
-
- ИначеЕсли ИмяТипа = "XDTOPackage" Тогда
-
- ИмяТипаРус = "XDTOПакет";
-
- ИначеЕсли ИмяТипа = "WebService" Тогда
-
- ИмяТипаРус = "WebСервис";
-
- ИначеЕсли ИмяТипа = "EventSubscription" Тогда
-
- ИмяТипаРус = "ПодпискаНаСобытие";
-
- ИначеЕсли ИмяТипа = "ScheduledJob" Тогда
-
- ИмяТипаРус = "РегламентноеЗадание";
-
- ИначеЕсли ИмяТипа = "FunctionalOption" Тогда
-
- ИмяТипаРус = "ФункциональнаяОпция";
-
- ИначеЕсли ИмяТипа = "DefinedType" Тогда
-
- ИмяТипаРус = "ОпределяемыйТип";
-
- ИначеЕсли ИмяТипа = "CommonCommand" Тогда
-
- ИмяТипаРус = "ОбщаяКоманда";
-
- ИначеЕсли ИмяТипа = "Constant" Тогда
-
- ИмяТипаРус = "Константа";
-
- ИначеЕсли ИмяТипа = "CommonForm" Тогда
-
- ИмяТипаРус = "ОбщаяФорма";
-
- ИначеЕсли ИмяТипа = "Catalog" Тогда
-
- ИмяТипаРус = "Справочник";
-
- ИначеЕсли ИмяТипа = "Document" Тогда
-
- ИмяТипаРус = "Документ";
-
- ИначеЕсли ИмяТипа = "Enum" Тогда
-
- ИмяТипаРус = "Перечисление";
-
- ИначеЕсли ИмяТипа = "Report" Тогда
-
- ИмяТипаРус = "Отчет";
-
- ИначеЕсли ИмяТипа = "DataProcessor" Тогда
-
- ИмяТипаРус = "Обработка";
-
- ИначеЕсли ИмяТипа = "InformationRegister" Тогда
-
- ИмяТипаРус = "РегистрСведений";
-
- ИначеЕсли ИмяТипа = "ChartOfCharacteristicTypes" Тогда
-
- ИмяТипаРус = "ПланВидовХарактеристик";
-
- ИначеЕсли ИмяТипа = "Task" Тогда
-
- ИмяТипаРус = "Задача";
-
- ИначеЕсли ИмяТипа = "BusinessProcess" Тогда
-
- ИмяТипаРус = "БизнесПроцесс";
-
- КонецЕсли;
-
- Возврат ИмяТипаРус;
-
-КонецФункции
-
-///////////////////////////////////////////////////////////////////
-
-Функция ПрочитатьПодсистемыКонфигурации(КаталогИсходников)
-
- ОписаниеПодсистем = Новый ТаблицаЗначений;
- ОписаниеПодсистем.Колонки.Добавить("ОбъектМетаданных");
- ОписаниеПодсистем.Колонки.Добавить("ПодсистемаИмя");
- ОписаниеПодсистем.Колонки.Добавить("ПодсистемаПредставление");
- ОписаниеПодсистем.Колонки.Добавить("ПодсистемаОписание");
- ОписаниеПодсистем.Колонки.Добавить("Визуальная");
- ОписаниеПодсистем.Колонки.Добавить("Родитель");
- ОписаниеПодсистем.Колонки.Добавить("ПодсистемаПредставлениеКратко");
- ОписаниеПодсистем.Колонки.Добавить("ПодсистемаИмяКратко");
-
- ИмяКаталогаПодсистем = "Subsystem";
- ИерархическийФормат = ЛОЖЬ;
- КаталогПодсистем = ОбъединитьПути(КаталогИсходников, ИмяКаталогаПодсистем);
- ФайлКаталога = Новый Файл(КаталогПодсистем);
- Если Не ФайлКаталога.Существует() Тогда
-
- ИмяКаталогаПодсистем = "Subsystems";
- ИерархическийФормат = ИСТИНА;
- КаталогПодсистем = ОбъединитьПути(КаталогИсходников, ИмяКаталогаПодсистем);
- ФайлКаталога = Новый Файл(КаталогПодсистем);
-
- Если Не ФайлКаталога.Существует() Тогда
-
- Возврат ОписаниеПодсистем;
-
- КонецЕсли;
-
- КонецЕсли;
-
- ФайлыПодсистем = НайтиФайлы(КаталогПодсистем, "*");
- Для Каждого НайденныйФайл Из ФайлыПодсистем Цикл
-
- ПрочитатьПодсистему(НайденныйФайл, ОписаниеПодсистем, ИерархическийФормат, ИмяКаталогаПодсистем, "", "", Неопределено, Неопределено)
-
- КонецЦикла;
-
- Возврат ОписаниеПодсистем;
-
-КонецФункции
-
-Процедура ПрочитатьПодсистему(Знач НайденныйФайл, ОписаниеПодсистем, Знач ИерархическийФормат, ИмяКаталогаПодсистем, Знач ПодсистемаИмя, Знач ПодсистемаПредставление, Знач Визуальная, Знач Родитель)
-
- Если НайденныйФайл.ЭтоКаталог() Тогда
-
- Если ИерархическийФормат Тогда
-
- Возврат;
-
- КонецЕсли;
-
- Если НайденныйФайл.ИмяБезРасширения = ИмяКаталогаПодсистем Тогда
-
- Возврат;
-
- КонецЕсли;
-
- ПолноеИмяФайла = ОбъединитьПути(НайденныйФайл.ПолноеИмя, НайденныйФайл.ИмяБезРасширения + ".xml");
- НайденныйФайл = Новый Файл(ПолноеИмяФайла);
-
- КонецЕсли;
-
- Если НайденныйФайл.Расширение <> ".xml" Тогда
-
- Возврат;
-
- КонецЕсли;
-
- ПодсистемаОписание = "";
- ПодсистемаИмяКратко = "";
- ПодсистемаПредставлениеКратко = "";
-
- ЧтениеXML = Новый ЧтениеXML;
- ЧтениеXML.ОткрытьФайл(НайденныйФайл.ПолноеИмя);
- ЭтаПодсистема = Неопределено;
- Пока ЧтениеXML.Прочитать() Цикл
-
- Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "Properties" Тогда
-
- Пока ЧтениеXML.Прочитать() Цикл
-
- Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "Name" Тогда
-
- ЧтениеXML.Прочитать();
- ПодсистемаИмяКратко = ЧтениеXML.Значение;
- ПодсистемаИмя = ПодсистемаИмя + ?(ПустаяСтрока(ПодсистемаИмя), "", ".") + ПодсистемаИмяКратко;
- ЧтениеXML.Пропустить();
-
- ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "Synonym" Тогда
-
- ЧтениеXML.Прочитать();
- Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда // вложенный элемент
-
- Если ЧтениеXML.Имя = "v8:item" Тогда // надо найти элемент с именем v8:content
-
- Пока ЧтениеXML.Имя <> "v8:content" Цикл
-
- ЧтениеXML.Прочитать();
-
- КонецЦикла;
- ЧтениеXML.Прочитать();
-
- Иначе // просто ищем значение
-
- Пока ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Цикл
-
- ЧтениеXML.Прочитать();
-
- КонецЦикла;
-
- КонецЕсли;
-
- КонецЕсли;
-
- ПодсистемаПредставлениеКратко = ЧтениеXML.Значение;
- ПодсистемаПредставление = ПодсистемаПредставление + ?(ПустаяСтрока(ПодсистемаПредставление), "", "/") + ПодсистемаПредставлениеКратко;
- ЧтениеXML.Пропустить();
-
- ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "IncludeInCommandInterface" Тогда
-
- ЧтениеXML.Прочитать();
- Визуальная = ?(Визуальная = Неопределено, ЧтениеXML.Значение, Мин(Визуальная, ЧтениеXML.Значение));
- ЧтениеXML.Пропустить();
-
- ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "Explanation" Тогда
-
- ЧтениеXML.Прочитать();
- Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда // вложенный элемент
-
- Если ЧтениеXML.Имя = "v8:item" Тогда // надо найти элемент с именем v8:content
-
- Пока ЧтениеXML.Имя <> "v8:content" Цикл
-
- ЧтениеXML.Прочитать();
-
- КонецЦикла;
- ЧтениеXML.Прочитать();
-
- Иначе // просто ищем значение
-
- Пока ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Цикл
-
- ЧтениеXML.Прочитать();
-
- КонецЦикла;
-
- КонецЕсли;
-
- КонецЕсли;
-
- ПодсистемаОписание = ЧтениеXML.Значение;
-
- ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "Content" Тогда
-
- Пока ЧтениеXML.Прочитать() Цикл
-
- Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И СтрЗаканчиваетсяНа(ЧтениеXML.Имя, "Item") Тогда
-
- ЧтениеXML.Прочитать();
-
- ЭтаПодсистема = ОписаниеПодсистем.Добавить();
- ЭтаПодсистема.ПодсистемаИмя = ПодсистемаИмя;
- ЭтаПодсистема.ПодсистемаПредставление = ПодсистемаПредставление;
- ЭтаПодсистема.ПодсистемаИмяКратко = ПодсистемаИмяКратко;
- ЭтаПодсистема.ПодсистемаПредставлениеКратко = ПодсистемаПредставлениеКратко;
- ЭтаПодсистема.ПодсистемаОписание = ПодсистемаОписание;
- ЭтаПодсистема.ОбъектМетаданных = ЧтениеXML.Значение;
- ЭтаПодсистема.Визуальная = Визуальная;
- ЭтаПодсистема.Родитель = Родитель;
-
- ЧтениеXML.Пропустить();
-
- КонецЕсли;
-
- КонецЦикла;
-
- КонецЕсли;
-
- КонецЦикла;
-
- КонецЕсли;
-
- КонецЦикла;
-
- ЧтениеXML.Закрыть();
-
- Если ЭтаПодсистема = Неопределено Тогда
-
- ЭтаПодсистема = ОписаниеПодсистем.Добавить();
- ЭтаПодсистема.ПодсистемаИмя = ПодсистемаИмя;
- ЭтаПодсистема.ПодсистемаПредставление = ПодсистемаПредставление;
- ЭтаПодсистема.ПодсистемаИмяКратко = ПодсистемаИмяКратко;
- ЭтаПодсистема.ПодсистемаПредставлениеКратко = ПодсистемаПредставлениеКратко;
- ЭтаПодсистема.ПодсистемаОписание = ПодсистемаОписание;
- ЭтаПодсистема.Визуальная = Визуальная;
- ЭтаПодсистема.Родитель = Родитель;
-
- КонецЕсли;
-
- Если ИерархическийФормат Тогда
-
- КаталогОписанияПодсистемы = ОбъединитьПути(ОбъединитьПути(НайденныйФайл.Путь, НайденныйФайл.ИмяБезРасширения), ИмяКаталогаПодсистем);
-
- Иначе
-
- КаталогОписанияПодсистемы = ОбъединитьПути(НайденныйФайл.Путь, ИмяКаталогаПодсистем);
-
- КонецЕсли;
-
- ФайлКаталога = Новый Файл(КаталогОписанияПодсистемы);
- Если ФайлКаталога.Существует() Тогда
-
- ФайлыПодсистем = НайтиФайлы(КаталогОписанияПодсистемы, "*");
- Для Каждого НайденныйФайл Из ФайлыПодсистем Цикл
-
- ПрочитатьПодсистему(НайденныйФайл, ОписаниеПодсистем, ИСТИНА, ИмяКаталогаПодсистем, ПодсистемаИмя, ПодсистемаПредставление, Визуальная, ЭтаПодсистема)
-
- КонецЦикла;
-
- КонецЕсли;
-
-КонецПроцедуры
-
-Функция ПрочитатьМодуль(Файл)
-
- БлокиМодуля = Новый ТаблицаЗначений;
- БлокиМодуля.Колонки.Добавить("ТипБлока");
- БлокиМодуля.Колонки.Добавить("НачальнаяСтрока");
- БлокиМодуля.Колонки.Добавить("КонечнаяСтрока");
- БлокиМодуля.Колонки.Добавить("Содержимое");
- БлокиМодуля.Колонки.Добавить("ОписаниеБлока");
-
- КоличествоСтрокМодуля = Файл.КоличествоСтрок();
-
- ТекущийБлок = Неопределено;
- ЭтоКонецБлока = ИСТИНА;
-
- НачальнаяСтрока = 1;
- КонечнаяСтрока = 1;
-
- Для НомерСтроки = 1 По КоличествоСтрокМодуля Цикл
-
- СтрокаМодуля = ВРег(СокрЛП(Файл.ПолучитьСтроку(НомерСтроки)));
-
- Если НЕ ЭтоКонецБлока Тогда
-
- НовыйБлок = ТекущийБлок;
- Если НовыйБлок = ТипБлоковМодуля.ОписаниеПеременной Тогда
-
- УдалитьКомментарийИзСтроки(СтрокаМодуля);
- ЭтоКонецБлока = СтрНайти(СтрокаМодуля, ";") > 0;
-
- ИначеЕсли НовыйБлок = ТипБлоковМодуля.ЗаголовокПроцедуры
- ИЛИ НовыйБлок = ТипБлоковМодуля.ЗаголовокФункции Тогда
-
- УдалитьКомментарийИзСтроки(СтрокаМодуля);
- ПозицияСкобки = СтрНайти(СтрокаМодуля, ")") > 0;
- ЭтоКонецБлока = ПозицияСкобки > 0;
-
- Иначе
-
- ЭтоКонецБлока = Истина;
-
- КонецЕсли;
-
- ИначеЕсли СтрНачинаетсяС(СтрокаМодуля, "#ОБЛАСТЬ")
- ИЛИ СтрНачинаетсяС(СтрокаМодуля, "// #ОБЛАСТЬ") Тогда
-
- НовыйБлок = ТипБлоковМодуля.НачалоОбласти;
- ЭтоКонецБлока = Истина;
-
- Если СтрНачинаетсяС(СтрокаМодуля, "//") Тогда
-
- СтрокаМодуля = Сред(СтрокаМодуля, 4);
-
- КонецЕсли;
-
- ИначеЕсли СтрНачинаетсяС(СтрокаМодуля, "#КОНЕЦОБЛАСТИ")
- ИЛИ СтрНачинаетсяС(СтрокаМодуля, "// #КОНЕЦОБЛАСТИ") Тогда
-
- НовыйБлок = ТипБлоковМодуля.КонецОбласти;
- ЭтоКонецБлока = Истина;
-
- Если СтрНачинаетсяС(СтрокаМодуля, "//") Тогда
-
- СтрокаМодуля = Сред(СтрокаМодуля, 4);
-
- КонецЕсли;
-
- ИначеЕсли СтрНачинаетсяС(СтрокаМодуля, "//") Тогда
-
- НовыйБлок = ТипБлоковМодуля.Комментарий;
- ЭтоКонецБлока = Истина;
-
- ИначеЕсли СтрНачинаетсяС(СтрокаМодуля, "&") Тогда
-
- НовыйБлок = ТипБлоковМодуля.ДирективаКомпиляции;
- ЭтоКонецБлока = Истина;
-
- ИначеЕсли СтрНачинаетсяС(СтрокаМодуля, "ПЕРЕМ") Тогда
-
- НовыйБлок = ТипБлоковМодуля.ОписаниеПеременной;
- УдалитьКомментарийИзСтроки(СтрокаМодуля);
- ЭтоКонецБлока = СтрНайти(СтрокаМодуля, ";") > 0;
-
- ИначеЕсли СтрНачинаетсяС(СтрокаМодуля, "ПРОЦЕДУРА")
- ИЛИ СтрНачинаетсяС(СтрокаМодуля, "ФУНКЦИЯ")
- ИЛИ СтрНачинаетсяС(СтрокаМодуля, "FUNCTION") Тогда
-
- НовыйБлок = ?(СтрНачинаетсяС(СтрокаМодуля, "ПРОЦЕДУРА"), ТипБлоковМодуля.ЗаголовокПроцедуры, ТипБлоковМодуля.ЗаголовокФункции);
-
- УдалитьКомментарийИзСтроки(СтрокаМодуля);
- ПозицияСкобки = СтрНайти(СтрокаМодуля, ")");
- ЭтоКонецБлока = ПозицияСкобки > 0;
-
- ИначеЕсли СтрНачинаетсяС(СтрокаМодуля, "КОНЕЦПРОЦЕДУРЫ")
- ИЛИ СтрНачинаетсяС(СтрокаМодуля, "КОНЕЦФУНКЦИИ")
- ИЛИ СтрНачинаетсяС(СтрокаМодуля, "ENDFUNCTION") Тогда
-
- НовыйБлок = ?(СтрНачинаетсяС(СтрокаМодуля, "КОНЕЦПРОЦЕДУРЫ"), ТипБлоковМодуля.ОкончаниеПроцедуры, ТипБлоковМодуля.ОкончаниеФункции);
- ЭтоКонецБлока = Истина;
- УдалитьКомментарийИзСтроки(СтрокаМодуля);
-
- ИначеЕсли ПустаяСтрока(СтрокаМодуля) И ТекущийБлок <> ТипБлоковМодуля.Операторы Тогда
-
- НовыйБлок = ТипБлоковМодуля.ПустаяСтрока;
- ЭтоКонецБлока = Истина;
-
- Иначе
-
- НовыйБлок = ТипБлоковМодуля.Операторы;
- ЭтоКонецБлока = Истина;
-
- КонецЕсли;
-
- Если НовыйБлок = ТекущийБлок Тогда
-
- КонечнаяСтрока = КонечнаяСтрока + 1;
-
- Иначе
-
- Если ЗначениеЗаполнено(ТекущийБлок) Тогда
-
- НоваяЗаписьОБлоке = БлокиМодуля.Добавить();
- НоваяЗаписьОБлоке.ТипБлока = ТекущийБлок;
- НоваяЗаписьОБлоке.НачальнаяСтрока = НачальнаяСтрока;
- НоваяЗаписьОБлоке.КонечнаяСтрока = КонечнаяСтрока;
- НоваяЗаписьОБлоке.ОписаниеБлока = Новый Структура;
-
- Для ИтБлок = НачальнаяСтрока По КонечнаяСтрока Цикл
-
- НоваяЗаписьОБлоке.Содержимое = Строка(НоваяЗаписьОБлоке.Содержимое)
- + ?(ПустаяСтрока(НоваяЗаписьОБлоке.Содержимое), "", Символы.ПС)
- + Файл.ПолучитьСтроку(ИтБлок);
-
- КонецЦикла;
-
- КонецЕсли;
-
- НачальнаяСтрока = НомерСтроки;
- КонечнаяСтрока = НомерСтроки;
- ТекущийБлок = НовыйБлок;
-
- КонецЕсли;
-
- Если НомерСтроки = КоличествоСтрокМодуля Тогда
-
- НоваяЗаписьОБлоке = БлокиМодуля.Добавить();
- НоваяЗаписьОБлоке.ТипБлока = ТекущийБлок;
- НоваяЗаписьОБлоке.НачальнаяСтрока = НачальнаяСтрока;
- НоваяЗаписьОБлоке.КонечнаяСтрока = КонечнаяСтрока;
- НоваяЗаписьОБлоке.ОписаниеБлока = Новый Структура;
-
- Для ИтБлок = НачальнаяСтрока По КонечнаяСтрока Цикл
-
- НоваяЗаписьОБлоке.Содержимое = Строка(НоваяЗаписьОБлоке.Содержимое)
- + ?(ПустаяСтрока(НоваяЗаписьОБлоке.Содержимое), "", Символы.ПС)
- + Файл.ПолучитьСтроку(ИтБлок);
-
- КонецЦикла;
-
- КонецЕсли;
-
- КонецЦикла;
-
- Возврат Новый Структура("Содержимое, БлокиМодуля", Файл.ПолучитьТекст(), БлокиМодуля);
-
-КонецФункции
-
-Процедура ДополнитьБлокиМодуля(БлокиМодуля, Файл, Модуль)
-
- ОписаниеМодуля = Новый Структура(
- "Глобальный, ЕстьНазначениеМодуля, Назначение, Разделы",
- ЛОЖЬ, ЛОЖЬ, "", Новый Массив);
-
- НазначениеМодуляПрошли = ЛОЖЬ;
- РазделОткрыт = ЛОЖЬ;
- ЛокальнаяОбластьОткрыта = ЛОЖЬ;
- МетодОткрыт = ЛОЖЬ;
-
- Области = Новый Массив;
-
- ТекущийРаздел = "";
- ПоследнийБлокКомментария = Неопределено;
- ПоследнийБлокМетода = Неопределено;
-
- БлокиДляУдаления = Новый Массив;
-
- Для Каждого Блок Из БлокиМодуля Цикл
-
- Блок.ОписаниеБлока.Вставить("ЭтоРаздел", ЛОЖЬ);
- Блок.ОписаниеБлока.Вставить("ИмяРаздела", "");
- Блок.ОписаниеБлока.Вставить("ИмяОбласти", "");
- Блок.ОписаниеБлока.Вставить("НазначениеРаздела", "");
- Блок.ОписаниеБлока.Вставить("ИмяМетода", "");
- Блок.ОписаниеБлока.Вставить("ПараметрыМетода", Неопределено);
- Блок.ОписаниеБлока.Вставить("Назначение", "");
- Блок.ОписаниеБлока.Вставить("Экспортный", ЛОЖЬ);
- Блок.ОписаниеБлока.Вставить("ТипВозвращаемогоЗначения", "");
- Блок.ОписаниеБлока.Вставить("ОписаниеВозвращаемогоЗначения", "");
- Блок.ОписаниеБлока.Вставить("Примеры", Новый Массив);
- Блок.ОписаниеБлока.Вставить("Тело", "");
-
- Если МетодОткрыт Тогда
-
- БлокиДляУдаления.Добавить(Блок);
-
- КонецЕсли;
-
- Если Блок.ТипБлока = ТипБлоковМодуля.ПустаяСтрока Тогда
-
- Продолжить;
-
- КонецЕсли;
-
- Если Блок.ТипБлока <> ТипБлоковМодуля.Комментарий Тогда
-
- // если коммент не первый, значит уже и нет смысла искать описания
- НазначениеМодуляПрошли = ИСТИНА;
-
- КонецЕсли;
-
- Если Блок.ТипБлока = ТипБлоковМодуля.Комментарий Тогда
-
- Если НЕ НазначениеМодуляПрошли Тогда
-
- // первый каммент считаем описанием модуля
- НазначениеМодуляПрошли = ИСТИНА;
- Назначение = ПолучитьНазначениеБлока(Файл, Блок.НачальнаяСтрока, Блок.КонечнаяСтрока);
-
- Блок.ТипБлока = ТипБлоковМодуля.Описание;
- ОписаниеМодуля.ЕстьНазначениеМодуля = НЕ ПустаяСтрока(Назначение);
- ОписаниеМодуля.Назначение = Назначение;
-
- Иначе
-
- ПоследнийБлокКомментария = Блок;
-
- КонецЕсли;
-
- ИначеЕсли Блок.ТипБлока = ТипБлоковМодуля.НачалоОбласти Тогда
-
- СтрокаМодуля = СокрЛП(Файл.ПолучитьСтроку(Блок.НачальнаяСтрока));
- ИмяОбласти = СокрЛП(Сред(СтрокаМодуля, СтрДлина("#Область") + 1));
-
- ЭтоРаздел = ЛОЖЬ;
- Если Модуль.ТипМодуля = ТипМодуля.ОбщийМодуль Тогда
-
- ЭтоРаздел = ТипОбласти.РазделыОбщегоМодуля.Найти(ИмяОбласти) <> Неопределено;
-
- ИначеЕсли Модуль.ТипМодуля = ТипМодуля.МодульМенеджера Тогда
-
- ЭтоРаздел = ТипОбласти.РазделыМодуляМенеджера.Найти(ИмяОбласти) <> Неопределено;
-
- КонецЕсли;
-
- Если ЭтоРаздел И (РазделОткрыт ИЛИ ЛокальнаяОбластьОткрыта ИЛИ МетодОткрыт) Тогда
-
- // кривая структура модуля
- ЭтоРаздел = ЛОЖЬ;
-
- КонецЕсли;
-
- ТекущаяОбласть = "";
- Если Области.Количество() Тогда
-
- ТекущаяОбласть = Области[Области.ВГраница()];
-
- КонецЕсли;
-
- Блок.ОписаниеБлока.Вставить("ЭтоРаздел", ЭтоРаздел);
- Блок.ОписаниеБлока.Вставить("ИмяРаздела", ТекущийРаздел);
- Блок.ОписаниеБлока.Вставить("ИмяОбласти", ТекущаяОбласть);
- Блок.ОписаниеБлока.Вставить("НазначениеРаздела", "");
-
- Если ЭтоРаздел Тогда
-
- РазделОткрыт = ИСТИНА;
- ТекущийРаздел = ИмяОбласти;
-
- ОписаниеМодуля.Разделы.Добавить(ТекущийРаздел);
-
- // заполним описание раздела
- Если ПоследнийБлокКомментария <> Неопределено Тогда
-
- Назначение = ПолучитьНазначениеБлока(Файл, ПоследнийБлокКомментария.НачальнаяСтрока, ПоследнийБлокКомментария.КонечнаяСтрока, ИмяОбласти);
- Блок.ОписаниеБлока.Вставить("НазначениеРаздела", Назначение);
- Если НЕ ПустаяСтрока(Назначение) Тогда
-
- ПоследнийБлокКомментария.ТипБлока = ТипБлоковМодуля.Описание;
-
- КонецЕсли;
-
- ПоследнийБлокКомментария = Неопределено;
-
- КонецЕсли;
-
- Иначе
-
- ЛокальнаяОбластьОткрыта = ИСТИНА;
- Области.Добавить(ИмяОбласти);
-
- КонецЕсли;
-
- ИначеЕсли Блок.ТипБлока = ТипБлоковМодуля.КонецОбласти Тогда
-
- ПоследнийБлокКомментария = Неопределено;
-
- Если ЛокальнаяОбластьОткрыта Тогда
-
- Области.Удалить(Области.ВГраница());
- ЛокальнаяОбластьОткрыта = Области.Количество();
-
- ИначеЕсли РазделОткрыт Тогда
-
- РазделОткрыт = ЛОЖЬ;
- ТекущийРаздел = "";
-
- Иначе
-
- // ошибка, пока не обрабатываю
-
- КонецЕсли;
-
- ИначеЕсли Блок.ТипБлока = ТипБлоковМодуля.ЗаголовокПроцедуры
- ИЛИ Блок.ТипБлока = ТипБлоковМодуля.ЗаголовокФункции Тогда
-
- Блок.ОписаниеБлока.Вставить("ИмяРаздела", ТекущийРаздел);
- Если Области.Количество() Тогда
-
- Блок.ОписаниеБлока.Вставить("ИмяОбласти", Области[Области.ВГраница()]);
-
- Иначе
-
- Блок.ОписаниеБлока.Вставить("ИмяОбласти", "");
-
- КонецЕсли;
-
- МетодОткрыт = ИСТИНА;
- ПоследнийБлокМетода = Блок;
-
- // получим имя метода
- Заголовок = СтрЗаменить(Блок.Содержимое, Символы.ПС, " ");
- Заголовок = СокрЛП(СтрЗаменить(Заголовок, Символы.Таб, " "));
- Если Блок.ТипБлока = ТипБлоковМодуля.ЗаголовокПроцедуры Тогда
-
- Заголовок = СокрЛП(Сред(Заголовок, СтрДлина("Процедура") + 1))
-
- Иначе
-
- Если СтрНачинаетсяС("Заголовок", "Функция") Тогда
-
- Заголовок = СокрЛП(Сред(Заголовок, СтрДлина("Функция") + 1))
-
- Иначе
-
- Заголовок = СокрЛП(Сред(Заголовок, СтрДлина("Function") + 1))
-
- КонецЕсли;
-
- КонецЕсли;
-
- // получим параметры метода
- ПозицияСкобки = СтрНайти(Заголовок, "(");
- ИмяМетода = Лев(Заголовок, ПозицияСкобки - 1);
- СтрокаПараметров = СокрЛП(Сред(Заголовок, ПозицияСкобки + 1));
- ПозицияСкобки = СтрНайти(СтрокаПараметров, ")", НаправлениеПоиска.СКонца);
- СтрокаПараметров = СокрЛП(Лев(СтрокаПараметров, ПозицияСкобки - 1));
- Заголовок = СокрЛП(Сред(Заголовок, СтрНайти(Заголовок, ")", НаправлениеПоиска.СКонца) + 1));
- Блок.ОписаниеБлока.Вставить("ИмяМетода", ИмяМетода);
- Блок.ОписаниеБлока.Вставить("ПараметрыМетода", ПолучитьПараметрыМетода(СтрокаПараметров));
- Блок.ОписаниеБлока.Вставить("Назначение", "");
- Блок.ОписаниеБлока.Вставить("Экспортный", СтрЗаканчиваетсяНа(ВРег(Заголовок), "ЭКСПОРТ"));
- Блок.ОписаниеБлока.Вставить("ТипВозвращаемогоЗначения", "");
- Блок.ОписаниеБлока.Вставить("ОписаниеВозвращаемогоЗначения", "");
- Блок.ОписаниеБлока.Вставить("Примеры", Новый Массив);
-
- // получим описание метода
- Если ПоследнийБлокКомментария <> Неопределено Тогда
-
- СтрокаКомментария = Файл.ПолучитьСтроку(ПоследнийБлокКомментария.НачальнаяСтрока);
- СтрокаКомментария = СокрЛП(Сред(СтрокаКомментария, 3));
- Если СтрокаКомментария = ИмяМетода Тогда
-
- ПоследнийБлокКомментария.ТипБлока = ТипБлоковМодуля.Описание;
- Назначение = "";
- НомерСтрокиПараметры = Неопределено;
- НомерСтрокиВозвращаемоеЗначение = Неопределено;
- НомерСтрокиПример = Неопределено;
- НомерСтроки = Неопределено;
- Для Ит = ПоследнийБлокКомментария.НачальнаяСтрока + 1 По ПоследнийБлокКомментария.КонечнаяСтрока Цикл
-
- СтрокаКомментария = Файл.ПолучитьСтроку(Ит);
- СтрокаКомментария = СокрЛП(Сред(СтрокаКомментария, 3));
- Если СтрНачинаетсяС(СтрокаКомментария, "Параметры:") Тогда
-
- НомерСтрокиПараметры = Ит;
- Прервать;
-
- ИначеЕсли СтрНачинаетсяС(СтрокаКомментария, "Возвращаемое значение:") Тогда
-
- НомерСтрокиВозвращаемоеЗначение = Ит;
- Прервать;
-
- ИначеЕсли СтрНачинаетсяС(СтрокаКомментария, "Пример") Тогда
-
- НомерСтрокиПример = Ит;
- Прервать;
-
- Иначе
-
- Назначение = Назначение + ?(ПустаяСтрока(Назначение), "", Символы.ПС) + СтрокаКомментария;
-
- КонецЕсли;
-
- КонецЦикла;
-
- Если НомерСтрокиПараметры <> Неопределено Тогда
-
- ИмяПараметра = Неопределено;
- ОписаниеПараметра = "";
- ТипПараметра = "";
- Для Ит = НомерСтрокиПараметры + 1 По ПоследнийБлокКомментария.КонечнаяСтрока Цикл
-
- СтрокаКомментария = Файл.ПолучитьСтроку(Ит);
- СтрокаКомментария = СокрЛП(Сред(СтрокаКомментария, 3));
- Если СтрНачинаетсяС(СтрокаКомментария, "Возвращаемое значение:") Тогда
-
- НомерСтрокиВозвращаемоеЗначение = Ит;
- Прервать;
-
- ИначеЕсли СтрНачинаетсяС(СтрокаКомментария, "Пример") Тогда
-
- НомерСтрокиПример = Ит;
- Прервать;
-
- Иначе
-
- // шаблон параметра
- // 'Имя' - 'Тип' - 'Описаание'
- // 'продолжение описания'
-
- СоставСтрокиКомментария = СтрРазделить(СтрокаКомментария, "-");
- Если СоставСтрокиКомментария.Количество() >= 3 Тогда
-
- Если ИмяПараметра <> Неопределено Тогда
-
- СтрокаПараметраМетода = Блок.ОписаниеБлока.ПараметрыМетода.Найти(ИмяПараметра, "Имя");
- Если СтрокаПараметраМетода <> Неопределено Тогда
-
- СтрокаПараметраМетода.ТипПараметра = ТипПараметра;
- СтрокаПараметраМетода.ОписаниеПараметра = ОписаниеПараметра;
-
- КонецЕсли;
-
- КонецЕсли;
-
- // это описание параметра
- ИмяПараметра = СокрЛП(СоставСтрокиКомментария[0]);
- ТипПараметра = СокрЛП(СоставСтрокиКомментария[1]);
-
- ПозицияДефис = СтрНайти(СтрокаКомментария, "-");
- ПозицияДефис = СтрНайти(СтрокаКомментария, "-",, ПозицияДефис + 1);
- ОписаниеПараметра = СокрЛП(Сред(СтрокаКомментария, ПозицияДефис + 1));
-
- Иначе
-
- // продолжение описания параметра либо косячное описание
- ОписаниеПараметра = ОписаниеПараметра + ?(ПустаяСтрока(ОписаниеПараметра), "", Символы.ПС) + СтрокаКомментария;
-
- КонецЕсли;
-
- КонецЕсли;
-
- КонецЦикла;
-
- Если ИмяПараметра <> Неопределено Тогда
-
- СтрокаПараметраМетода = Блок.ОписаниеБлока.ПараметрыМетода.Найти(ИмяПараметра, "Имя");
- Если СтрокаПараметраМетода <> Неопределено Тогда
-
- СтрокаПараметраМетода.ТипПараметра = ТипПараметра;
- СтрокаПараметраМетода.ОписаниеПараметра = ОписаниеПараметра;
-
- КонецЕсли;
-
- КонецЕсли;
-
- КонецЕсли;
-
- Если НомерСтрокиВозвращаемоеЗначение <> Неопределено Тогда
-
- ОписаниеПараметра = "";
- ТипПараметра = "";
- Для Ит = НомерСтрокиВозвращаемоеЗначение + 1 По ПоследнийБлокКомментария.КонечнаяСтрока Цикл
-
- СтрокаКомментария = Файл.ПолучитьСтроку(Ит);
- СтрокаКомментария = СокрЛП(Сред(СтрокаКомментария, 3));
-
- Если СтрНачинаетсяС(СтрокаКомментария, "Пример") Тогда
-
- НомерСтрокиПример = Ит;
- Прервать;
-
- Иначе
-
- // шаблон параметра
- // 'Тип' - 'Описаание'
- // 'продолжение описания'
-
- СоставСтрокиКомментария = СтрРазделить(СтрокаКомментария, "-");
- Если ТипПараметра = "" И СоставСтрокиКомментария.Количество() >= 2 Тогда
-
- // это описание параметра
- ТипПараметра = СокрЛП(СоставСтрокиКомментария[0]);
-
- ПозицияДефис = СтрНайти(СтрокаКомментария, "-");
- ОписаниеПараметра = СокрЛП(Сред(СтрокаКомментария, ПозицияДефис + 1));
-
- Иначе
-
- // продолжение описания параметра либо косячное описание
- ОписаниеПараметра = ОписаниеПараметра + ?(ПустаяСтрока(ОписаниеПараметра), "", Символы.ПС) + СтрокаКомментария;
-
- КонецЕсли;
-
- КонецЕсли;
-
- КонецЦикла;
-
- Если ТипПараметра <> "" Тогда
-
- Блок.ОписаниеБлока.Вставить("ТипВозвращаемогоЗначения", ТипПараметра);
- Блок.ОписаниеБлока.Вставить("ОписаниеВозвращаемогоЗначения", ОписаниеПараметра);
-
- КонецЕсли;
-
- КонецЕсли;
-
- Если НомерСтрокиПример <> Неопределено Тогда
-
- Примеры = Новый Массив;
- СтрокаПример = "";
- Для Ит = НомерСтрокиПример + 1 По ПоследнийБлокКомментария.КонечнаяСтрока Цикл
-
- СтрокаКомментария = Файл.ПолучитьСтроку(Ит);
- СтрокаКомментария = СокрЛП(Сред(СтрокаКомментария, 3));
-
- Если СтрНачинаетсяС(СтрокаКомментария, "Пример") Тогда
-
- Примеры.Добавить(СтрокаПример);
- СтрокаПример = "";
- Продолжить;
-
- ИначеЕсли Не ПустаяСтрока(СтрокаКомментария) Тогда
-
- СтрокаПример = СтрокаПример + ?(ПустаяСтрока(СтрокаПример), "", Символы.ПС)
- + СтрокаКомментария;
-
- КонецЕсли;
-
- КонецЦикла;
-
- Если СтрокаПример <> "" Тогда
-
- Примеры.Добавить(СтрокаПример);
-
- КонецЕсли;
-
- Если Примеры.Количество() Тогда
-
- Блок.ОписаниеБлока.Вставить("Примеры", Примеры);
-
- КонецЕсли;
-
- КонецЕсли;
-
- Блок.ОписаниеБлока.Вставить("Назначение", Назначение);
-
- Иначе
-
- // кривое описание либо ХЗ что это
-
- КонецЕсли;
-
- ПоследнийБлокКомментария = Неопределено;
-
- КонецЕсли;
-
- ИначеЕсли Блок.ТипБлока = ТипБлоковМодуля.ОкончаниеПроцедуры
- ИЛИ Блок.ТипБлока = ТипБлоковМодуля.ОкончаниеФункции Тогда
-
- МетодОткрыт = ЛОЖЬ;
- ПоследнийБлокКомментария = Неопределено;
-
- СодержимоеМетода = "";
- Для Ит = ПоследнийБлокМетода.КонечнаяСтрока + 1 По Блок.НачальнаяСтрока - 1 Цикл
-
- СтрокаМодуля = Файл.ПолучитьСтроку(Ит);
- СодержимоеМетода = СодержимоеМетода + ?(ПустаяСтрока(СодержимоеМетода), "", Символы.ПС) + СтрокаМодуля;
-
- КонецЦикла;
-
- ПоследнийБлокМетода.ОписаниеБлока.Тело = СодержимоеМетода;
- ПоследнийБлокМетода = Неопределено;
-
- Иначе
-
- // забываем последний каммент-блок
- ПоследнийБлокКомментария = Неопределено;
-
- КонецЕсли;
-
- КонецЦикла;
-
- // // удалим служебные блоки
- // Для Каждого Блок Из БлокиДляУдаления Цикл
-
- // БлокиМодуля.Удалить(Блок);
-
- // КонецЦикла;
-
- КоличествоБлоков = БлокиМодуля.Количество() - 1;
- Для Ит = 0 По КоличествоБлоков Цикл
-
- Блок = БлокиМодуля[КоличествоБлоков - Ит];
- Если Блок.ТипБлока = ТипБлоковМодуля.ОкончаниеПроцедуры
- ИЛИ Блок.ТипБлока = ТипБлоковМодуля.ОкончаниеФункции
- ИЛИ Блок.ТипБлока = ТипБлоковМодуля.КонецОбласти
- ИЛИ Блок.ТипБлока = ТипБлоковМодуля.Описание
- ИЛИ Блок.ТипБлока = ТипБлоковМодуля.ПустаяСтрока Тогда
-
- БлокиМодуля.Удалить(Блок);
-
- КонецЕсли;
-
- КонецЦикла;
-
- Модуль.ОписаниеМодуля = ОписаниеМодуля;
-
-КонецПроцедуры
-
-Процедура УдалитьКомментарийИзСтроки(СтрокаМодуля)
-
- ПозицияКомментария = СтрНайти(СтрокаМодуля, "//");
- Если ПозицияКомментария > 0 Тогда
-
- СтрокаМодуля = СокрП(Лев(СтрокаМодуля, ПозицияКомментария - 1));
-
- КонецЕсли;
-
-КонецПроцедуры
-
-Функция ПолучитьНазначениеБлока(Файл, Знач НачальнаяСтрока, Знач КонечнаяСтрока, ИмяБлока = "")
-
- Назначение = "";
- Если НачальнаяСтрока + 1 < КонечнаяСтрока Тогда
-
- СтрокаМодуляНач = СокрЛП(Файл.ПолучитьСтроку(НачальнаяСтрока));
- СтрокаМодуляКон = СокрЛП(Файл.ПолучитьСтроку(КонечнаяСтрока));
- Если СтрНачинаетсяС(СтрокаМодуляНач, "////")
- И СтрНачинаетсяС(СтрокаМодуляКон, "////") Тогда // да, это описание
-
- Если Не ПустаяСтрока(ИмяБлока) Тогда
-
- СтрокаМодуля2 = СокрЛП(Файл.ПолучитьСтроку(НачальнаяСтрока + 1));
- Если СтрНачинаетсяС(СтрокаМодуля2, "// " + ИмяБлока) Тогда
-
- НачальнаяСтрока = НачальнаяСтрока + 1;
-
- Иначе
-
- // имени блока нет, пропускаем
- НачальнаяСтрока = КонечнаяСтрока;
-
- КонецЕсли;
-
- КонецЕсли;
-
- Для Ит = НачальнаяСтрока + 1 По КонечнаяСтрока - 1 Цикл
-
- СтрокаМодуля = СокрЛП(Сред(Файл.ПолучитьСтроку(Ит), 3));
- Назначение = Назначение + ?(ПустаяСтрока(Назначение), "", Символы.ПС) + СтрокаМодуля;
-
- КонецЦикла;
-
- КонецЕсли;
-
- КонецЕсли;
-
- Возврат Назначение;
-
-КонецФункции
-
-Функция ПолучитьПараметрыМетода(СтрокаПараметров)
-
- ПараметрыМетода = Новый ТаблицаЗначений;
- ПараметрыМетода.Колонки.Добавить("Имя");
- ПараметрыМетода.Колонки.Добавить("Знач");
- ПараметрыМетода.Колонки.Добавить("ЗначениеПоУмолчанию");
- ПараметрыМетода.Колонки.Добавить("ТипПараметра");
- ПараметрыМетода.Колонки.Добавить("ОписаниеПараметра");
-
- ДлинаСтроки = СтрДлина(СтрокаПараметров);
-
- Пока Истина Цикл
-
- Если ПустаяСтрока(СтрокаПараметров) Тогда
-
- Прервать;
-
- КонецЕсли;
-
- СтрокаПараметров = СокрЛП(СтрокаПараметров);
- ПараметрМетода = ПараметрыМетода.Добавить();
- ЗаполнитьЗначенияСвойств(ПараметрМетода, Новый Структура("ЗНАЧ, Имя, ЗначениеПоУмолчанию, ТипПараметра, ОписаниеПараметра", ЛОЖЬ, "", Неопределено, "", ""));
-
- // отделим ЗНАЧ
- Если СтрНачинаетсяС(ВРег(СтрокаПараметров), "ЗНАЧ ") Тогда
-
- ПараметрМетода.ЗНАЧ = ИСТИНА;
- СтрокаПараметров = СокрЛП(Сред(СтрокаПараметров, 5));
-
- КонецЕсли;
-
- // отделим имя
- ПозицияРавно = СтрНайти(СтрокаПараметров, "=");
- ПозицияЗапятая = СтрНайти(СтрокаПараметров, ",");
-
- Если ПозицияЗапятая + ПозицияРавно = 0 Тогда
-
- // вся строка параметр
- ПараметрМетода.Имя = СокрЛП(СтрокаПараметров);
- СтрокаПараметров = "";
-
- ИначеЕсли ПозицияРавно = 0 ИЛИ ПозицияРавно > ПозицияЗапятая И ПозицияЗапятая > 0 Тогда
-
- // значения по умолчанию нет
- ПараметрМетода.Имя = СокрЛП(Лев(СтрокаПараметров, ПозицияЗапятая - 1));
- СтрокаПараметров = СокрЛП(Сред(СтрокаПараметров, ПозицияЗапятая + 1));
-
- Иначе // есть значение по умолчанию
-
- ПараметрМетода.Имя = СокрЛП(Лев(СтрокаПараметров, ПозицияРавно - 1));
- СтрокаПараметров = СокрЛП(Сред(СтрокаПараметров, ПозицияРавно + 1));
- ПозицияЗапятая = СтрНайти(СтрокаПараметров, ",");
- Если ПозицияЗапятая = 0 Тогда
-
- // до конца строки - это значение по умолчанию
- ПараметрМетода.ЗначениеПоУмолчанию = СтрокаПараметров;
- СтрокаПараметров = "";
-
- Иначе
-
- // надо отделить значение по умолчанию от следующего параметра
- // варианты значения - число, строка, булево, Неопределено
- ПозицияКавычки = СтрНайти(СтрокаПараметров, """");
- Если ПозицияКавычки = 0 ИЛИ ПозицияКавычки > ПозицияЗапятая Тогда
-
- // текущее значение по умолчанию не строковое
- ПараметрМетода.ЗначениеПоУмолчанию = СокрЛП(Лев(СтрокаПараметров, ПозицияЗапятая - 1));
- СтрокаПараметров = СокрЛП(Сред(СтрокаПараметров, ПозицияЗапятая + 1));
-
- Иначе
-
- ЗначениеПараметра = "";
- КавычкаОткрыта = ИСТИНА;
- Пока Истина Цикл
-
- ПозицияКавычки = СтрНайти(СтрокаПараметров, """",, 2);
- КавычкаОткрыта = НЕ КавычкаОткрыта;
- ЗначениеПараметра = ЗначениеПараметра + Лев(СтрокаПараметров, ПозицияКавычки);
- СтрокаПараметров = Сред(СтрокаПараметров, ПозицияКавычки + 1);
-
- Если ПустаяСтрока(СтрокаПараметров) Тогда
-
- Прервать;
-
- Иначе
-
- ПозицияЗапятая = СтрНайти(СтрокаПараметров, ",");
- ПозицияКавычки = СтрНайти(СтрокаПараметров, """",, 2);
-
- Если ПозицияКавычки = 0 ИЛИ ПозицияКавычки > ПозицияЗапятая ИЛИ НЕ КавычкаОткрыта Тогда
-
-
- ЗначениеПараметра = СокрЛП(ЗначениеПараметра + Лев(СтрокаПараметров, ПозицияЗапятая - 1));
- СтрокаПараметров = СокрЛП(Сред(СтрокаПараметров, ПозицияЗапятая + 1));
- Прервать;
-
- КонецЕсли;
-
- КонецЕсли;
-
- КонецЦикла;
-
- ПараметрМетода.ЗначениеПоУмолчанию = ЗначениеПараметра;
-
- КонецЕсли;
-
- КонецЕсли;
-
- КонецЕсли;
-
- КонецЦикла;
-
- Возврат ПараметрыМетода;
-
-КонецФункции
diff --git a/src/core/Модули/ТипБлоковМодуля.os b/src/ЧтениеМодулей/Модули/ТипБлоковМодуля.os
similarity index 100%
rename from src/core/Модули/ТипБлоковМодуля.os
rename to src/ЧтениеМодулей/Модули/ТипБлоковМодуля.os
diff --git a/src/ЧтениеМодулей/Модули/ТипМодуля.os b/src/ЧтениеМодулей/Модули/ТипМодуля.os
new file mode 100644
index 0000000..715ad2c
--- /dev/null
+++ b/src/ЧтениеМодулей/Модули/ТипМодуля.os
@@ -0,0 +1,126 @@
+Перем ОбщийМодуль Экспорт;
+
+Перем МодульОбъекта Экспорт;
+Перем МодульМенеджера Экспорт;
+
+Перем МодульОбычнойФормы Экспорт;
+Перем МодульУправляемойФормы Экспорт;
+
+Перем МодульКоманды Экспорт;
+
+Перем МодульСеанса Экспорт;
+Перем МодульОбычногоПриложения Экспорт;
+Перем МодульУправляемогоПриложения Экспорт;
+Перем МодульВнешнегоСоединения Экспорт;
+
+Перем СоответствиеИмениФайлаИТИпаМодуля;
+Перем СоответствиеИмениРодителяИТИпаМодуля;
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+
+Функция ТипМодуляПоИмениФайла(ПолноеИмяФайла)Экспорт
+
+ Файл = Новый Файл(ПолноеИмяФайла);
+ ИмяБезРасширения = Файл.ИмяБезРасширения;
+ Расширение = Файл.Расширение;
+
+ ТипЭтогоМодуля = Неопределено;
+
+ Если ИмяБезРасширения = "module" И ПустаяСтрока(Расширение) Тогда
+
+ ТипЭтогоМодуля = МодульОбычнойФормы;
+
+ ИначеЕсли ИмяБезРасширения = "Module" Тогда
+
+ МассивЧастейИмени = СтрРазделить(ПолноеИмяФайла, "\");
+
+ Если МассивЧастейИмени.Количество() > 3 Тогда
+
+ Родитель = МассивЧастейИмени[МассивЧастейИмени.Количество() - 2];
+
+ Если Родитель = "Ext" Тогда
+
+ Родитель = МассивЧастейИмени[МассивЧастейИмени.Количество() - 4];
+
+ Иначе
+
+ Родитель = МассивЧастейИмени[МассивЧастейИмени.Количество() - 3];
+
+ Если Родитель = "Ext" Тогда // Общие формы
+
+ Родитель = МассивЧастейИмени[МассивЧастейИмени.Количество() - 5];
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ ТипЭтогоМодуля = СоответствиеИмениРодителяИТИпаМодуля[Родитель];
+
+ Иначе
+
+ ВызватьИсключение "Ошибочная структура имени файла: " + ПолноеИмяФайла;
+
+ КонецЕсли;
+
+
+ Иначе
+
+ ТипЭтогоМодуля = СоответствиеИмениФайлаИТИпаМодуля[ИмяБезРасширения];
+
+ КонецЕсли;
+
+ Если ПустаяСтрока(ТипЭтогоМодуля) Тогда
+
+ Сообщить("Не смогли определить тип модуля. " + ПолноеИмяФайла);
+
+ КонецЕсли;
+
+ Возврат ТипЭтогоМодуля;
+
+КонецФункции
+
+Функция ЭтоМодульФормы(ТипПереданногоМодуля) Экспорт
+
+ Возврат ТипПереданногоМодуля = ТипМодуля.МодульУправляемойФормы ИЛИ ТипПереданногоМодуля = ТипМодуля.МодульОбычнойФормы;
+
+КонецФункции
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+
+ОбщийМодуль = "ОбщийМодуль";
+
+МодульОбъекта = "МодульОбъекта";
+МодульМенеджера = "МодульМенеджера";
+
+МодульОбычнойФормы = "МодульОбычнойФормы";
+МодульУправляемойФормы = "МодульУправляемойФормы";
+
+МодульКоманды = "МодульКоманды";
+
+МодульСеанса = "МодульСеанса";
+МодульОбычногоПриложения = "МодульОбычногоПриложения";
+МодульУправляемогоПриложения = "МодульУправляемогоПриложения";
+МодульВнешнегоСоединения = "МодульВнешнегоСоединения";
+
+СоответствиеИмениФайлаИТИпаМодуля = Новый Соответствие();
+СоответствиеИмениФайлаИТИпаМодуля.Вставить("CommandModule", МодульКоманды);
+СоответствиеИмениФайлаИТИпаМодуля.Вставить("ManagedApplicationModule", МодульУправляемогоПриложения);
+СоответствиеИмениФайлаИТИпаМодуля.Вставить("OrdinaryApplicationModule", МодульОбычногоПриложения);
+СоответствиеИмениФайлаИТИпаМодуля.Вставить("SessionModule", МодульСеанса);
+СоответствиеИмениФайлаИТИпаМодуля.Вставить("ExternalConnectionModule", МодульВнешнегоСоединения);
+СоответствиеИмениФайлаИТИпаМодуля.Вставить("ManagerModule", МодульМенеджера);
+СоответствиеИмениФайлаИТИпаМодуля.Вставить("ValueManagerModule", МодульМенеджера);
+СоответствиеИмениФайлаИТИпаМодуля.Вставить("ObjectModule", МодульОбъекта);
+СоответствиеИмениФайлаИТИпаМодуля.Вставить("RecordSetModule", МодульОбъекта);
+
+СоответствиеИмениРодителяИТИпаМодуля = Новый Соответствие();
+СоответствиеИмениРодителяИТИпаМодуля.Вставить("CommonModules", ОбщийМодуль);
+СоответствиеИмениРодителяИТИпаМодуля.Вставить("CommonModule", ОбщийМодуль);
+СоответствиеИмениРодителяИТИпаМодуля.Вставить("WebServices", МодульОбъекта);
+СоответствиеИмениРодителяИТИпаМодуля.Вставить("WebService", МодульОбъекта);
+СоответствиеИмениРодителяИТИпаМодуля.Вставить("HTTPServices", МодульОбъекта);
+СоответствиеИмениРодителяИТИпаМодуля.Вставить("HTTPService", МодульОбъекта);
+СоответствиеИмениРодителяИТИпаМодуля.Вставить("Forms", МодульУправляемойФормы);
+СоответствиеИмениРодителяИТИпаМодуля.Вставить("Form", МодульУправляемойФормы);
+СоответствиеИмениРодителяИТИпаМодуля.Вставить("CommonForms", МодульУправляемойФормы);
+СоответствиеИмениРодителяИТИпаМодуля.Вставить("CommonForm", МодульУправляемойФормы);
diff --git a/src/core/Модули/ТипОбласти.os b/src/ЧтениеМодулей/Модули/ТипОбласти.os
similarity index 86%
rename from src/core/Модули/ТипОбласти.os
rename to src/ЧтениеМодулей/Модули/ТипОбласти.os
index 7bbf77c..6711afc 100644
--- a/src/core/Модули/ТипОбласти.os
+++ b/src/ЧтениеМодулей/Модули/ТипОбласти.os
@@ -4,12 +4,14 @@
Перем РазделПрограммныйИнтерфейс Экспорт;
Перем РазделСлужебныйПрограммныйИнтерфейс Экспорт;
Перем РазделСлужебныеПроцедурыИФункции Экспорт;
+Перем РазделОбработчикиСобытий Экспорт;
///////////////////////////////////////////////////////////////////////////////////////////////
РазделПрограммныйИнтерфейс = "ПрограммныйИнтерфейс";
РазделСлужебныйПрограммныйИнтерфейс = "СлужебныйПрограммныйИнтерфейс";
РазделСлужебныеПроцедурыИФункции = "СлужебныеПроцедурыИФункции";
+РазделОбработчикиСобытий = "ОбработчикиСобытий";
РазделыОбщегоМодуля = Новый Массив;
РазделыОбщегоМодуля.Добавить(РазделПрограммныйИнтерфейс);
@@ -19,4 +21,5 @@
РазделыМодуляМенеджера = Новый Массив;
РазделыМодуляМенеджера.Добавить(РазделПрограммныйИнтерфейс);
РазделыМодуляМенеджера.Добавить(РазделСлужебныйПрограммныйИнтерфейс);
-РазделыМодуляМенеджера.Добавить(РазделСлужебныеПроцедурыИФункции);
\ No newline at end of file
+РазделыМодуляМенеджера.Добавить(РазделСлужебныеПроцедурыИФункции);
+РазделыМодуляМенеджера.Добавить(РазделОбработчикиСобытий);
\ No newline at end of file
diff --git a/src/ЧтениеМодулей/Модули/ЧтениеМодулей.os b/src/ЧтениеМодулей/Модули/ЧтениеМодулей.os
new file mode 100644
index 0000000..735292e
--- /dev/null
+++ b/src/ЧтениеМодулей/Модули/ЧтениеМодулей.os
@@ -0,0 +1,819 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// Методы разбора исходных модулей 1с
+//
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+// ПРОГРАММНЫЙ ИНТЕРФЕЙС
+///////////////////////////////////////////////////////////////////////////////
+
+Функция ПрочитатьМодуль(СодержимоеФайла) Экспорт
+
+ БлокиМодуля = Новый ТаблицаЗначений;
+ БлокиМодуля.Колонки.Добавить("ТипБлока");
+ БлокиМодуля.Колонки.Добавить("НачальнаяСтрока");
+ БлокиМодуля.Колонки.Добавить("КонечнаяСтрока");
+ БлокиМодуля.Колонки.Добавить("Содержимое");
+ БлокиМодуля.Колонки.Добавить("ОписаниеБлока");
+
+ КоличествоСтрокМодуля = СодержимоеФайла.КоличествоСтрок();
+
+ ТекущийБлок = Неопределено;
+ ЭтоКонецБлока = Истина;
+
+ НачальнаяСтрока = 1;
+ КонечнаяСтрока = 1;
+
+ Для НомерСтроки = 1 По КоличествоСтрокМодуля Цикл
+
+ СтрокаМодуля = ВРег(СокрЛП(СодержимоеФайла.ПолучитьСтроку(НомерСтроки)));
+
+ Если НЕ ЭтоКонецБлока Тогда
+
+ НовыйБлок = ТекущийБлок;
+ Если НовыйБлок = ТипБлоковМодуля.ОписаниеПеременной Тогда
+
+ УдалитьКомментарийИзСтроки(СтрокаМодуля);
+ ЭтоКонецБлока = СтрНайти(СтрокаМодуля, ";") > 0;
+
+ ИначеЕсли НовыйБлок = ТипБлоковМодуля.ЗаголовокПроцедуры
+ ИЛИ НовыйБлок = ТипБлоковМодуля.ЗаголовокФункции Тогда
+
+ УдалитьКомментарийИзСтроки(СтрокаМодуля);
+ ПозицияСкобки = СтрНайти(СтрокаМодуля, ")") > 0;
+ ЭтоКонецБлока = ПозицияСкобки > 0;
+
+ Иначе
+
+ ЭтоКонецБлока = Истина;
+
+ КонецЕсли;
+
+ ИначеЕсли СтрНачинаетсяС(СтрокаМодуля, "#ОБЛАСТЬ")
+ ИЛИ СтрНачинаетсяС(СтрокаМодуля, "// #ОБЛАСТЬ") Тогда
+
+ НовыйБлок = ТипБлоковМодуля.НачалоОбласти;
+ ЭтоКонецБлока = Истина;
+
+ Если СтрНачинаетсяС(СтрокаМодуля, "//") Тогда
+
+ СтрокаМодуля = Сред(СтрокаМодуля, 4);
+
+ КонецЕсли;
+
+ ИначеЕсли СтрНачинаетсяС(СтрокаМодуля, "#КОНЕЦОБЛАСТИ")
+ ИЛИ СтрНачинаетсяС(СтрокаМодуля, "// #КОНЕЦОБЛАСТИ") Тогда
+
+ НовыйБлок = ТипБлоковМодуля.КонецОбласти;
+ ЭтоКонецБлока = Истина;
+
+ Если СтрНачинаетсяС(СтрокаМодуля, "//") Тогда
+
+ СтрокаМодуля = Сред(СтрокаМодуля, 4);
+
+ КонецЕсли;
+
+ ИначеЕсли СтрНачинаетсяС(СтрокаМодуля, "//") Тогда
+
+ НовыйБлок = ТипБлоковМодуля.Комментарий;
+ ЭтоКонецБлока = Истина;
+
+ ИначеЕсли СтрНачинаетсяС(СтрокаМодуля, "&") Тогда
+
+ НовыйБлок = ТипБлоковМодуля.ДирективаКомпиляции;
+ ЭтоКонецБлока = Истина;
+
+ ИначеЕсли СтрНачинаетсяС(СтрокаМодуля, "ПЕРЕМ") Тогда
+
+ НовыйБлок = ТипБлоковМодуля.ОписаниеПеременной;
+ УдалитьКомментарийИзСтроки(СтрокаМодуля);
+ ЭтоКонецБлока = СтрНайти(СтрокаМодуля, ";") > 0;
+
+ ИначеЕсли СтрНачинаетсяС(СтрокаМодуля, "ПРОЦЕДУРА")
+ ИЛИ СтрНачинаетсяС(СтрокаМодуля, "ФУНКЦИЯ")
+ ИЛИ СтрНачинаетсяС(СтрокаМодуля, "FUNCTION")
+ ИЛИ СтрНачинаетсяС(СтрокаМодуля, "ПРОЦЕДУРА")
+ ИЛИ СтрНачинаетсяС(СтрокаМодуля, "ФУНКЦИЯ")
+ ИЛИ СтрНачинаетсяС(СтрокаМодуля, "FUNCTION") Тогда
+
+ НовыйБлок = ?(СтрНачинаетсяС(СтрокаМодуля, "ПРОЦЕДУРА"), ТипБлоковМодуля.ЗаголовокПроцедуры, ТипБлоковМодуля.ЗаголовокФункции);
+
+ УдалитьКомментарийИзСтроки(СтрокаМодуля);
+ ПозицияСкобки = СтрНайти(СтрокаМодуля, ")");
+ ЭтоКонецБлока = ПозицияСкобки > 0;
+
+ ИначеЕсли СтрНачинаетсяС(СтрокаМодуля, "КОНЕЦПРОЦЕДУРЫ")
+ ИЛИ СтрНачинаетсяС(СтрокаМодуля, "КОНЕЦФУНКЦИИ")
+ ИЛИ СтрНачинаетсяС(СтрокаМодуля, "ENDFUNCTION") Тогда
+
+ НовыйБлок = ?(СтрНачинаетсяС(СтрокаМодуля, "КОНЕЦПРОЦЕДУРЫ"), ТипБлоковМодуля.ОкончаниеПроцедуры, ТипБлоковМодуля.ОкончаниеФункции);
+ ЭтоКонецБлока = Истина;
+ УдалитьКомментарийИзСтроки(СтрокаМодуля);
+
+ ИначеЕсли ПустаяСтрока(СтрокаМодуля) И ТекущийБлок <> ТипБлоковМодуля.Операторы Тогда
+
+ НовыйБлок = ТипБлоковМодуля.ПустаяСтрока;
+ ЭтоКонецБлока = Истина;
+
+ Иначе
+
+ НовыйБлок = ТипБлоковМодуля.Операторы;
+ ЭтоКонецБлока = Истина;
+
+ КонецЕсли;
+
+ Если НовыйБлок = ТекущийБлок Тогда
+
+ КонечнаяСтрока = КонечнаяСтрока + 1;
+
+ Иначе
+
+ Если ЗначениеЗаполнено(ТекущийБлок) Тогда
+
+ НоваяЗаписьОБлоке = БлокиМодуля.Добавить();
+ НоваяЗаписьОБлоке.ТипБлока = ТекущийБлок;
+ НоваяЗаписьОБлоке.НачальнаяСтрока = НачальнаяСтрока;
+ НоваяЗаписьОБлоке.КонечнаяСтрока = КонечнаяСтрока;
+ НоваяЗаписьОБлоке.ОписаниеБлока = Новый Структура;
+
+ НоваяЗаписьОБлоке.Содержимое = ПолучитьСодержимоеБлока(СодержимоеФайла, НачальнаяСтрока, КонечнаяСтрока);
+
+ КонецЕсли;
+
+ НачальнаяСтрока = НомерСтроки;
+ КонечнаяСтрока = НомерСтроки;
+ ТекущийБлок = НовыйБлок;
+
+ КонецЕсли;
+
+ Если НомерСтроки = КоличествоСтрокМодуля Тогда
+
+ НоваяЗаписьОБлоке = БлокиМодуля.Добавить();
+ НоваяЗаписьОБлоке.ТипБлока = ТекущийБлок;
+ НоваяЗаписьОБлоке.НачальнаяСтрока = НачальнаяСтрока;
+ НоваяЗаписьОБлоке.КонечнаяСтрока = КонечнаяСтрока;
+ НоваяЗаписьОБлоке.ОписаниеБлока = Новый Структура;
+
+ НоваяЗаписьОБлоке.Содержимое = ПолучитьСодержимоеБлока(СодержимоеФайла, НачальнаяСтрока, КонечнаяСтрока);
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ СодержимоеМодуля = Новый Структура("Содержимое, БлокиМодуля", СодержимоеФайла.ПолучитьТекст(), БлокиМодуля);
+
+ Возврат СодержимоеМодуля;
+
+КонецФункции
+
+///////////////////////////////////////////////////////////////////////////////
+// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
+///////////////////////////////////////////////////////////////////////////////
+
+Процедура УдалитьКомментарийИзСтроки(СтрокаМодуля)
+
+ ПозицияКомментария = СтрНайти(СтрокаМодуля, "//");
+ Если ПозицияКомментария > 0 Тогда
+
+ СтрокаМодуля = СокрП(Лев(СтрокаМодуля, ПозицияКомментария - 1));
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Функция ПолучитьНазначениеБлока(Файл, Знач НачальнаяСтрока, Знач КонечнаяСтрока, ИмяБлока = "")
+
+ Назначение = "";
+ Если НачальнаяСтрока + 1 < КонечнаяСтрока Тогда
+
+ СтрокаМодуляНач = СокрЛП(Файл.ПолучитьСтроку(НачальнаяСтрока));
+ СтрокаМодуляКон = СокрЛП(Файл.ПолучитьСтроку(КонечнаяСтрока));
+ Если СтрНачинаетсяС(СтрокаМодуляНач, "////")
+ И СтрНачинаетсяС(СтрокаМодуляКон, "////") Тогда // да, это описание
+
+ Если Не ПустаяСтрока(ИмяБлока) Тогда
+
+ СтрокаМодуля2 = СокрЛП(Файл.ПолучитьСтроку(НачальнаяСтрока + 1));
+ Если СтрНачинаетсяС(СтрокаМодуля2, "// " + ИмяБлока) Тогда
+
+ НачальнаяСтрока = НачальнаяСтрока + 1;
+
+ Иначе
+
+ // имени блока нет, пропускаем
+ НачальнаяСтрока = КонечнаяСтрока;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Для Ит = НачальнаяСтрока + 1 По КонечнаяСтрока - 1 Цикл
+
+ СтрокаМодуля = СокрЛП(Сред(Файл.ПолучитьСтроку(Ит), 3));
+ Назначение = Назначение + ?(ПустаяСтрока(Назначение), "", Символы.ПС) + СтрокаМодуля;
+
+ КонецЦикла;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Возврат Назначение;
+
+КонецФункции
+
+Функция ПолучитьПараметрыМетода(СтрокаПараметров)
+
+ ПараметрыМетода = Новый ТаблицаЗначений;
+ ПараметрыМетода.Колонки.Добавить("Имя");
+ ПараметрыМетода.Колонки.Добавить("Знач");
+ ПараметрыМетода.Колонки.Добавить("ЗначениеПоУмолчанию");
+ ПараметрыМетода.Колонки.Добавить("ТипПараметра");
+ ПараметрыМетода.Колонки.Добавить("ОписаниеПараметра");
+
+ ДлинаСтроки = СтрДлина(СтрокаПараметров);
+
+ Пока Истина Цикл
+
+ Если ПустаяСтрока(СтрокаПараметров) Тогда
+
+ Прервать;
+
+ КонецЕсли;
+
+ СтрокаПараметров = СокрЛП(СтрокаПараметров);
+ ПараметрМетода = ПараметрыМетода.Добавить();
+ ЗаполнитьЗначенияСвойств(ПараметрМетода, Новый Структура("ЗНАЧ, Имя, ЗначениеПоУмолчанию, ТипПараметра, ОписаниеПараметра", Ложь, "", Неопределено, "", ""));
+
+ // отделим ЗНАЧ
+ Если СтрНачинаетсяС(ВРег(СтрокаПараметров), "ЗНАЧ ") Тогда
+
+ ПараметрМетода.ЗНАЧ = Истина;
+ СтрокаПараметров = СокрЛП(Сред(СтрокаПараметров, 5));
+
+ КонецЕсли;
+
+ // отделим имя
+ ПозицияРавно = СтрНайти(СтрокаПараметров, "=");
+ ПозицияЗапятая = СтрНайти(СтрокаПараметров, ",");
+
+ Если ПозицияЗапятая + ПозицияРавно = 0 Тогда
+
+ // вся строка параметр
+ ПараметрМетода.Имя = СокрЛП(СтрокаПараметров);
+ СтрокаПараметров = "";
+
+ ИначеЕсли ПозицияРавно = 0 ИЛИ ПозицияРавно > ПозицияЗапятая И ПозицияЗапятая > 0 Тогда
+
+ // значения по умолчанию нет
+ ПараметрМетода.Имя = СокрЛП(Лев(СтрокаПараметров, ПозицияЗапятая - 1));
+ СтрокаПараметров = СокрЛП(Сред(СтрокаПараметров, ПозицияЗапятая + 1));
+
+ Иначе // есть значение по умолчанию
+
+ ПараметрМетода.Имя = СокрЛП(Лев(СтрокаПараметров, ПозицияРавно - 1));
+ СтрокаПараметров = СокрЛП(Сред(СтрокаПараметров, ПозицияРавно + 1));
+ ПозицияЗапятая = СтрНайти(СтрокаПараметров, ",");
+ Если ПозицияЗапятая = 0 Тогда
+
+ // до конца строки - это значение по умолчанию
+ ПараметрМетода.ЗначениеПоУмолчанию = СтрокаПараметров;
+ СтрокаПараметров = "";
+
+ Иначе
+
+ // надо отделить значение по умолчанию от следующего параметра
+ // варианты значения - число, строка, булево, Неопределено
+ ПозицияКавычки = СтрНайти(СтрокаПараметров, """");
+ Если ПозицияКавычки = 0 ИЛИ ПозицияКавычки > ПозицияЗапятая Тогда
+
+ // текущее значение по умолчанию не строковое
+ ПараметрМетода.ЗначениеПоУмолчанию = СокрЛП(Лев(СтрокаПараметров, ПозицияЗапятая - 1));
+ СтрокаПараметров = СокрЛП(Сред(СтрокаПараметров, ПозицияЗапятая + 1));
+
+ Иначе
+
+ ЗначениеПараметра = "";
+ КавычкаОткрыта = Истина;
+ Пока Истина Цикл
+
+ ПозицияКавычки = СтрНайти(СтрокаПараметров, """", , 2);
+ КавычкаОткрыта = НЕ КавычкаОткрыта;
+ ЗначениеПараметра = ЗначениеПараметра + Лев(СтрокаПараметров, ПозицияКавычки);
+ СтрокаПараметров = Сред(СтрокаПараметров, ПозицияКавычки + 1);
+
+ Если ПустаяСтрока(СтрокаПараметров) Тогда
+
+ Прервать;
+
+ Иначе
+
+ ПозицияЗапятая = СтрНайти(СтрокаПараметров, ",");
+ ПозицияКавычки = СтрНайти(СтрокаПараметров, """", , 2);
+
+ Если ПозицияКавычки = 0 ИЛИ ПозицияКавычки > ПозицияЗапятая ИЛИ НЕ КавычкаОткрыта Тогда
+
+
+ ЗначениеПараметра = СокрЛП(ЗначениеПараметра + Лев(СтрокаПараметров, ПозицияЗапятая - 1));
+ СтрокаПараметров = СокрЛП(Сред(СтрокаПараметров, ПозицияЗапятая + 1));
+ Прервать;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ ПараметрМетода.ЗначениеПоУмолчанию = ЗначениеПараметра;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Возврат ПараметрыМетода;
+
+КонецФункции
+
+Процедура ДополнитьБлокиМодуля(БлокиМодуля, Файл, Модуль) Экспорт
+
+ ОписаниеМодуля = Новый Структура(
+ "Глобальный, ЕстьНазначениеМодуля, Назначение, Разделы",
+ Ложь, Ложь, "", Новый Массив);
+
+ НазначениеМодуляПрошли = Ложь;
+ РазделОткрыт = Ложь;
+ ЛокальнаяОбластьОткрыта = Ложь;
+ МетодОткрыт = Ложь;
+
+ Области = Новый Массив;
+
+ ТекущийРаздел = "";
+ ПоследнийБлокКомментария = Неопределено;
+ ПоследнийБлокМетода = Неопределено;
+
+ БлокиДляУдаления = Новый Массив;
+
+ Для Каждого Блок Из БлокиМодуля Цикл
+
+ Блок.ОписаниеБлока.Вставить("ЭтоРаздел", Ложь);
+ Блок.ОписаниеБлока.Вставить("ИмяРаздела", "");
+ Блок.ОписаниеБлока.Вставить("ИмяОбласти", "");
+ Блок.ОписаниеБлока.Вставить("НазначениеРаздела", "");
+ Блок.ОписаниеБлока.Вставить("ИмяМетода", "");
+ Блок.ОписаниеБлока.Вставить("ПараметрыМетода", Неопределено);
+ Блок.ОписаниеБлока.Вставить("Назначение", "");
+ Блок.ОписаниеБлока.Вставить("Экспортный", Ложь);
+ Блок.ОписаниеБлока.Вставить("ТипВозвращаемогоЗначения", "");
+ Блок.ОписаниеБлока.Вставить("ОписаниеВозвращаемогоЗначения", "");
+ Блок.ОписаниеБлока.Вставить("Примеры", Новый Массив);
+ Блок.ОписаниеБлока.Вставить("Тело", "");
+
+ Если МетодОткрыт Тогда
+
+ БлокиДляУдаления.Добавить(Блок);
+
+ КонецЕсли;
+
+ Если Блок.ТипБлока = ТипБлоковМодуля.ПустаяСтрока Тогда
+
+ Продолжить;
+
+ КонецЕсли;
+
+ Если Блок.ТипБлока <> ТипБлоковМодуля.Комментарий Тогда
+
+ // если коммент не первый, значит уже и нет смысла искать описания
+ НазначениеМодуляПрошли = Истина;
+
+ КонецЕсли;
+
+ Если Блок.ТипБлока = ТипБлоковМодуля.Комментарий Тогда
+
+ Если НЕ НазначениеМодуляПрошли Тогда
+
+ // первый каммент считаем описанием модуля
+ НазначениеМодуляПрошли = Истина;
+ Назначение = ПолучитьНазначениеБлока(Файл, Блок.НачальнаяСтрока, Блок.КонечнаяСтрока);
+
+ Блок.ТипБлока = ТипБлоковМодуля.Описание;
+ ОписаниеМодуля.ЕстьНазначениеМодуля = НЕ ПустаяСтрока(Назначение);
+ ОписаниеМодуля.Назначение = Назначение;
+
+ Иначе
+
+ ПоследнийБлокКомментария = Блок;
+
+ КонецЕсли;
+
+ ИначеЕсли Блок.ТипБлока = ТипБлоковМодуля.НачалоОбласти Тогда
+
+ СтрокаМодуля = СокрЛП(Файл.ПолучитьСтроку(Блок.НачальнаяСтрока));
+ ИмяОбласти = СокрЛП(Сред(СтрокаМодуля, СтрДлина("#Область") + 1));
+
+ ЭтоРаздел = Ложь;
+ Если Модуль.ТипМодуля = ТипМодуля.ОбщийМодуль Тогда
+
+ ЭтоРаздел = ТипОбласти.РазделыОбщегоМодуля.Найти(ИмяОбласти) <> Неопределено;
+
+ ИначеЕсли Модуль.ТипМодуля = ТипМодуля.МодульМенеджера Тогда
+
+ ЭтоРаздел = ТипОбласти.РазделыМодуляМенеджера.Найти(ИмяОбласти) <> Неопределено;
+
+ КонецЕсли;
+
+ Если ЭтоРаздел И (РазделОткрыт ИЛИ ЛокальнаяОбластьОткрыта ИЛИ МетодОткрыт) Тогда
+
+ // кривая структура модуля
+ ЭтоРаздел = Ложь;
+
+ КонецЕсли;
+
+ ТекущаяОбласть = "";
+ Если Области.Количество() Тогда
+
+ ТекущаяОбласть = Области[Области.ВГраница()];
+
+ КонецЕсли;
+
+ Блок.ОписаниеБлока.Вставить("ЭтоРаздел", ЭтоРаздел);
+ Блок.ОписаниеБлока.Вставить("ИмяРаздела", ТекущийРаздел);
+ Блок.ОписаниеБлока.Вставить("ИмяОбласти", ТекущаяОбласть);
+ Блок.ОписаниеБлока.Вставить("НазначениеРаздела", "");
+
+ Если ЭтоРаздел Тогда
+
+ РазделОткрыт = Истина;
+ ТекущийРаздел = ИмяОбласти;
+
+ ОписаниеМодуля.Разделы.Добавить(ТекущийРаздел);
+
+ // заполним описание раздела
+ Если ПоследнийБлокКомментария <> Неопределено Тогда
+
+ Назначение = ПолучитьНазначениеБлока(Файл, ПоследнийБлокКомментария.НачальнаяСтрока, ПоследнийБлокКомментария.КонечнаяСтрока, ИмяОбласти);
+ Блок.ОписаниеБлока.Вставить("НазначениеРаздела", Назначение);
+ Если НЕ ПустаяСтрока(Назначение) Тогда
+
+ ПоследнийБлокКомментария.ТипБлока = ТипБлоковМодуля.Описание;
+
+ КонецЕсли;
+
+ ПоследнийБлокКомментария = Неопределено;
+
+ КонецЕсли;
+
+ Иначе
+
+ ЛокальнаяОбластьОткрыта = Истина;
+ Области.Добавить(ИмяОбласти);
+
+ КонецЕсли;
+
+ ИначеЕсли Блок.ТипБлока = ТипБлоковМодуля.КонецОбласти Тогда
+
+ ПоследнийБлокКомментария = Неопределено;
+
+ Если ЛокальнаяОбластьОткрыта Тогда
+
+ Области.Удалить(Области.ВГраница());
+ ЛокальнаяОбластьОткрыта = Области.Количество();
+
+ ИначеЕсли РазделОткрыт Тогда
+
+ РазделОткрыт = Ложь;
+ ТекущийРаздел = "";
+
+ Иначе
+
+ // ошибка, пока не обрабатываю
+
+ КонецЕсли;
+
+ ИначеЕсли Блок.ТипБлока = ТипБлоковМодуля.ЗаголовокПроцедуры
+ ИЛИ Блок.ТипБлока = ТипБлоковМодуля.ЗаголовокФункции Тогда
+
+ Блок.ОписаниеБлока.Вставить("ИмяРаздела", ТекущийРаздел);
+ Если Области.Количество() Тогда
+
+ Блок.ОписаниеБлока.Вставить("ИмяОбласти", Области[Области.ВГраница()]);
+
+ Иначе
+
+ Блок.ОписаниеБлока.Вставить("ИмяОбласти", "");
+
+ КонецЕсли;
+
+ МетодОткрыт = Истина;
+ ПоследнийБлокМетода = Блок;
+
+ // получим имя метода
+ Заголовок = СтрЗаменить(Блок.Содержимое, Символы.ПС, " ");
+ Заголовок = СокрЛП(СтрЗаменить(Заголовок, Символы.Таб, " "));
+ Если Блок.ТипБлока = ТипБлоковМодуля.ЗаголовокПроцедуры Тогда
+
+ Заголовок = СокрЛП(Сред(Заголовок, СтрДлина("Процедура") + 1))
+
+ Иначе
+
+ Если СтрНачинаетсяС(Заголовок, "Функция") Тогда
+
+ Заголовок = СокрЛП(Сред(Заголовок, СтрДлина("Функция") + 1))
+
+ Иначе
+
+ Заголовок = СокрЛП(Сред(Заголовок, СтрДлина("Function") + 1))
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ // получим параметры метода
+ ПозицияСкобки = СтрНайти(Заголовок, "(");
+ ИмяМетода = Лев(Заголовок, ПозицияСкобки - 1);
+ СтрокаПараметров = СокрЛП(Сред(Заголовок, ПозицияСкобки + 1));
+ ПозицияСкобки = СтрНайти(СтрокаПараметров, ")", НаправлениеПоиска.СКонца);
+ СтрокаПараметров = СокрЛП(Лев(СтрокаПараметров, ПозицияСкобки - 1));
+ Заголовок = СокрЛП(Сред(Заголовок, СтрНайти(Заголовок, ")", НаправлениеПоиска.СКонца) + 1));
+ Блок.ОписаниеБлока.Вставить("ИмяМетода", ИмяМетода);
+ Блок.ОписаниеБлока.Вставить("ПараметрыМетода", ПолучитьПараметрыМетода(СтрокаПараметров));
+ Блок.ОписаниеБлока.Вставить("Назначение", "");
+ Блок.ОписаниеБлока.Вставить("Экспортный", СтрЗаканчиваетсяНа(ВРег(Заголовок), "ЭКСПОРТ"));
+ Блок.ОписаниеБлока.Вставить("ТипВозвращаемогоЗначения", "");
+ Блок.ОписаниеБлока.Вставить("ОписаниеВозвращаемогоЗначения", "");
+ Блок.ОписаниеБлока.Вставить("Примеры", Новый Массив);
+
+ // получим описание метода
+ Если ПоследнийБлокКомментария <> Неопределено Тогда
+
+ СтрокаКомментария = Файл.ПолучитьСтроку(ПоследнийБлокКомментария.НачальнаяСтрока);
+ СтрокаКомментария = СокрЛП(Сред(СтрокаКомментария, 3));
+ Если СтрНайти(СтрокаКомментария, ИмяМетода) Тогда
+
+ ПоследнийБлокКомментария.ТипБлока = ТипБлоковМодуля.Описание;
+ Назначение = "";
+ НомерСтрокиПараметры = Неопределено;
+ НомерСтрокиВозвращаемоеЗначение = Неопределено;
+ НомерСтрокиПример = Неопределено;
+ НомерСтроки = Неопределено;
+ Для Ит = ПоследнийБлокКомментария.НачальнаяСтрока + 1 По ПоследнийБлокКомментария.КонечнаяСтрока Цикл
+
+ СтрокаКомментария = Файл.ПолучитьСтроку(Ит);
+ СтрокаКомментария = СокрЛП(Сред(СтрокаКомментария, 3));
+ Если СтрНачинаетсяС(СтрокаКомментария, "Параметры:") Тогда
+
+ НомерСтрокиПараметры = Ит;
+ Прервать;
+
+ ИначеЕсли СтрНачинаетсяС(СтрокаКомментария, "Возвращаемое значение:") Тогда
+
+ НомерСтрокиВозвращаемоеЗначение = Ит;
+ Прервать;
+
+ ИначеЕсли СтрНачинаетсяС(СтрокаКомментария, "Пример") Тогда
+
+ НомерСтрокиПример = Ит;
+ Прервать;
+
+ Иначе
+
+ Назначение = Назначение + ?(ПустаяСтрока(Назначение), "", Символы.ПС) + СтрокаКомментария;
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Если НомерСтрокиПараметры <> Неопределено Тогда
+
+ ИмяПараметра = Неопределено;
+ ОписаниеПараметра = "";
+ ТипПараметра = "";
+ Для Ит = НомерСтрокиПараметры + 1 По ПоследнийБлокКомментария.КонечнаяСтрока Цикл
+
+ СтрокаКомментария = Файл.ПолучитьСтроку(Ит);
+ СтрокаКомментария = СокрЛП(Сред(СтрокаКомментария, 3));
+ Если СтрНачинаетсяС(СтрокаКомментария, "Возвращаемое значение:") Тогда
+
+ НомерСтрокиВозвращаемоеЗначение = Ит;
+ Прервать;
+
+ ИначеЕсли СтрНачинаетсяС(СтрокаКомментария, "Пример") Тогда
+
+ НомерСтрокиПример = Ит;
+ Прервать;
+
+ Иначе
+
+ // шаблон параметра
+ // 'Имя' - 'Тип' - 'Описаание'
+ // 'продолжение описания'
+
+ СоставСтрокиКомментария = СтрРазделить(СтрокаКомментария, "-");
+ Если СоставСтрокиКомментария.Количество() >= 3 Тогда
+
+ Если ИмяПараметра <> Неопределено Тогда
+
+ СтрокаПараметраМетода = Блок.ОписаниеБлока.ПараметрыМетода.Найти(ИмяПараметра, "Имя");
+ Если СтрокаПараметраМетода <> Неопределено Тогда
+
+ СтрокаПараметраМетода.ТипПараметра = ТипПараметра;
+ СтрокаПараметраМетода.ОписаниеПараметра = ОписаниеПараметра;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ // это описание параметра
+ ИмяПараметра = СокрЛП(СоставСтрокиКомментария[0]);
+ ТипПараметра = СокрЛП(СоставСтрокиКомментария[1]);
+
+ ПозицияДефис = СтрНайти(СтрокаКомментария, "-");
+ ПозицияДефис = СтрНайти(СтрокаКомментария, "-",, ПозицияДефис + 1);
+ ОписаниеПараметра = СокрЛП(Сред(СтрокаКомментария, ПозицияДефис + 1));
+
+ Иначе
+
+ // продолжение описания параметра либо косячное описание
+ ОписаниеПараметра = ОписаниеПараметра + ?(ПустаяСтрока(ОписаниеПараметра), "", Символы.ПС) + СтрокаКомментария;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Если ИмяПараметра <> Неопределено Тогда
+
+ СтрокаПараметраМетода = Блок.ОписаниеБлока.ПараметрыМетода.Найти(ИмяПараметра, "Имя");
+ Если СтрокаПараметраМетода <> Неопределено Тогда
+
+ СтрокаПараметраМетода.ТипПараметра = ТипПараметра;
+ СтрокаПараметраМетода.ОписаниеПараметра = ОписаниеПараметра;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Если НомерСтрокиВозвращаемоеЗначение <> Неопределено Тогда
+
+ ОписаниеПараметра = "";
+ ТипПараметра = "";
+ Для Ит = НомерСтрокиВозвращаемоеЗначение + 1 По ПоследнийБлокКомментария.КонечнаяСтрока Цикл
+
+ СтрокаКомментария = Файл.ПолучитьСтроку(Ит);
+ СтрокаКомментария = СокрЛП(Сред(СтрокаКомментария, 3));
+
+ Если СтрНачинаетсяС(СтрокаКомментария, "Пример") Тогда
+
+ НомерСтрокиПример = Ит;
+ Прервать;
+
+ Иначе
+
+ // шаблон параметра
+ // 'Тип' - 'Описаание'
+ // 'продолжение описания'
+
+ СоставСтрокиКомментария = СтрРазделить(СтрокаКомментария, "-");
+ Если ТипПараметра = "" И СоставСтрокиКомментария.Количество() >= 2 Тогда
+
+ // это описание параметра
+ ТипПараметра = СокрЛП(СоставСтрокиКомментария[0]);
+
+ ПозицияДефис = СтрНайти(СтрокаКомментария, "-");
+ ОписаниеПараметра = СокрЛП(Сред(СтрокаКомментария, ПозицияДефис + 1));
+
+ Иначе
+
+ // продолжение описания параметра либо косячное описание
+ ОписаниеПараметра = ОписаниеПараметра + ?(ПустаяСтрока(ОписаниеПараметра), "", Символы.ПС) + СтрокаКомментария;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Если ТипПараметра <> "" Тогда
+
+ Блок.ОписаниеБлока.Вставить("ТипВозвращаемогоЗначения", ТипПараметра);
+ Блок.ОписаниеБлока.Вставить("ОписаниеВозвращаемогоЗначения", ОписаниеПараметра);
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Если НомерСтрокиПример <> Неопределено Тогда
+
+ Примеры = Новый Массив;
+ СтрокаПример = "";
+ Для Ит = НомерСтрокиПример + 1 По ПоследнийБлокКомментария.КонечнаяСтрока Цикл
+
+ СтрокаКомментария = Файл.ПолучитьСтроку(Ит);
+ СтрокаКомментария = СокрЛП(Сред(СтрокаКомментария, 3));
+
+ Если СтрНачинаетсяС(СтрокаКомментария, "Пример") Тогда
+
+ Примеры.Добавить(СтрокаПример);
+ СтрокаПример = "";
+ Продолжить;
+
+ ИначеЕсли Не ПустаяСтрока(СтрокаКомментария) Тогда
+
+ СтрокаПример = СтрокаПример + ?(ПустаяСтрока(СтрокаПример), "", Символы.ПС)
+ + СтрокаКомментария;
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Если СтрокаПример <> "" Тогда
+
+ Примеры.Добавить(СтрокаПример);
+
+ КонецЕсли;
+
+ Если Примеры.Количество() Тогда
+
+ Блок.ОписаниеБлока.Вставить("Примеры", Примеры);
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Блок.ОписаниеБлока.Вставить("Назначение", Назначение);
+
+ Иначе
+
+ // кривое описание либо ХЗ что это
+
+ КонецЕсли;
+
+ ПоследнийБлокКомментария = Неопределено;
+
+ КонецЕсли;
+
+ ИначеЕсли Блок.ТипБлока = ТипБлоковМодуля.ОкончаниеПроцедуры
+ ИЛИ Блок.ТипБлока = ТипБлоковМодуля.ОкончаниеФункции Тогда
+
+ МетодОткрыт = Ложь;
+ ПоследнийБлокКомментария = Неопределено;
+
+ ПоследнийБлокМетода.ОписаниеБлока.Тело = ПолучитьСодержимоеБлока(Файл, ПоследнийБлокМетода.КонечнаяСтрока + 1, Блок.НачальнаяСтрока - 1);
+ ПоследнийБлокМетода = Неопределено;
+
+ Иначе
+
+ // забываем последний каммент-блок
+ ПоследнийБлокКомментария = Неопределено;
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ // // удалим служебные блоки
+ // Для Каждого Блок Из БлокиДляУдаления Цикл
+
+ // БлокиМодуля.Удалить(Блок);
+
+ // КонецЦикла;
+
+ КоличествоБлоков = БлокиМодуля.Количество() - 1;
+ Для Ит = 0 По КоличествоБлоков Цикл
+
+ Блок = БлокиМодуля[КоличествоБлоков - Ит];
+ Если Блок.ТипБлока = ТипБлоковМодуля.ОкончаниеПроцедуры
+ ИЛИ Блок.ТипБлока = ТипБлоковМодуля.ОкончаниеФункции
+ ИЛИ Блок.ТипБлока = ТипБлоковМодуля.КонецОбласти
+ ИЛИ Блок.ТипБлока = ТипБлоковМодуля.Описание
+ ИЛИ Блок.ТипБлока = ТипБлоковМодуля.ПустаяСтрока Тогда
+
+ БлокиМодуля.Удалить(Блок);
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Модуль.ОписаниеМодуля = ОписаниеМодуля;
+
+КонецПроцедуры
+
+Функция ПолучитьСодержимоеБлока(Текст, НачальнаяСтрока, КонечнаяСтрока)
+
+ СодержимоеБлока = "";
+ Для Ит = НачальнаяСтрока По КонечнаяСтрока Цикл
+
+ СтрокаМодуля = Текст.ПолучитьСтроку(Ит);
+ СодержимоеБлока = СодержимоеБлока + ?(ПустаяСтрока(СодержимоеБлока), "", Символы.ПС) + СтрокаМодуля;
+
+ КонецЦикла;
+
+ Возврат СодержимоеБлока;
+
+КонецФункции