From 855c0fe827a2eb687e31c4c8298763f824daae69 Mon Sep 17 00:00:00 2001 From: "aleksey.koryakin" Date: Thu, 25 Apr 2019 17:57:37 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=B0=D0=BD=D0=BE=20=D1=87=D1=82=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B9=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3=D1=83=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20*=20=D0=9F=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=87=D1=82=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=84?= =?UTF-8?q?=D0=BE=D1=80=D0=BC=D0=B0=D1=82=D0=B0=20EDT=20*=20=D0=98=D0=B7?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=20=D0=B4=D0=BE=D1=81=D1=82=D1=83?= =?UTF-8?q?=D0=BF=20=D0=BA=20API=20-=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=84=D0=B0?= =?UTF-8?q?=D0=B1=D1=80=D0=B8=D0=BA=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D1=81?= =?UTF-8?q?=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=B0=D1=80?= =?UTF-8?q?=D1=81=D0=B5=D1=80=D0=B0,=20=D0=BF=D0=B0=D1=80=D1=81=D0=B5?= =?UTF-8?q?=D1=80=20-=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=20*=20=D0=9F?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B8=D0=BC=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D1=8B,=20=D0=BD=D0=B5=D0=BA=D0=BE=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D1=8B=D0=B5=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D0=B8=20*=20?= =?UTF-8?q?=D0=94=D1=80=D0=BE=D0=B1=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=BD=D0=BE=D0=BB=D0=B8=D1=82=D0=BD=D1=8B=D1=85=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B4=D1=83=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 6 + .vscode/launch.json | 19 + LICENSE | 21 + installlocalhost.bat | 12 + lib.config | 6 - packagedef | 17 +- readme.md | 8 + src/core/Модули/ТипМодуля.os | 125 -- src/Классы/РазборКонфигурации1С.os | 624 ++++++ src/Классы/СтруктураКаталоговКонфигурации.os | 426 ++++ src/Макеты/ОбъектыКонфигурации.md | 51 + src/Модули/ПараметрыПродукта.os | 77 + src/Модули/ПарсерBSL.os | 37 + src/Модули/СтруктурыОписаний.os | 263 +++ src/Модули/ТипыОбъектовКонфигурации.os | 105 + src/Модули/Утилиты.os | 66 + src/Модули/ЧтениеОписанийEDT.os | 246 +++ src/Модули/ЧтениеОписанийБазовый.os | 109 + src/Модули/ЧтениеОписанийКонфигуратор.os | 372 ++++ src/РазборСтруктурыКонфигурации.os | 1865 ----------------- .../Модули/ТипБлоковМодуля.os | 0 src/ЧтениеМодулей/Модули/ТипМодуля.os | 126 ++ .../Модули/ТипОбласти.os | 5 +- src/ЧтениеМодулей/Модули/ЧтениеМодулей.os | 819 ++++++++ 24 files changed, 3404 insertions(+), 2001 deletions(-) create mode 100644 .gitignore create mode 100644 .vscode/launch.json create mode 100644 LICENSE create mode 100644 installlocalhost.bat delete mode 100644 lib.config delete mode 100644 src/core/Модули/ТипМодуля.os create mode 100644 src/Классы/РазборКонфигурации1С.os create mode 100644 src/Классы/СтруктураКаталоговКонфигурации.os create mode 100644 src/Макеты/ОбъектыКонфигурации.md create mode 100644 src/Модули/ПараметрыПродукта.os create mode 100644 src/Модули/ПарсерBSL.os create mode 100644 src/Модули/СтруктурыОписаний.os create mode 100644 src/Модули/ТипыОбъектовКонфигурации.os create mode 100644 src/Модули/Утилиты.os create mode 100644 src/Модули/ЧтениеОписанийEDT.os create mode 100644 src/Модули/ЧтениеОписанийБазовый.os create mode 100644 src/Модули/ЧтениеОписанийКонфигуратор.os delete mode 100644 src/РазборСтруктурыКонфигурации.os rename src/{core => ЧтениеМодулей}/Модули/ТипБлоковМодуля.os (100%) create mode 100644 src/ЧтениеМодулей/Модули/ТипМодуля.os rename src/{core => ЧтениеМодулей}/Модули/ТипОбласти.os (86%) create mode 100644 src/ЧтениеМодулей/Модули/ЧтениеМодулей.os 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 По КоличествоБлоков Цикл + + Блок = БлокиМодуля[КоличествоБлоков - Ит]; + Если Блок.ТипБлока = ТипБлоковМодуля.ОкончаниеПроцедуры + ИЛИ Блок.ТипБлока = ТипБлоковМодуля.ОкончаниеФункции + ИЛИ Блок.ТипБлока = ТипБлоковМодуля.КонецОбласти + ИЛИ Блок.ТипБлока = ТипБлоковМодуля.Описание + ИЛИ Блок.ТипБлока = ТипБлоковМодуля.ПустаяСтрока Тогда + + БлокиМодуля.Удалить(Блок); + + КонецЕсли; + + КонецЦикла; + + Модуль.ОписаниеМодуля = ОписаниеМодуля; + +КонецПроцедуры + +Функция ПолучитьСодержимоеБлока(Текст, НачальнаяСтрока, КонечнаяСтрока) + + СодержимоеБлока = ""; + Для Ит = НачальнаяСтрока По КонечнаяСтрока Цикл + + СтрокаМодуля = Текст.ПолучитьСтроку(Ит); + СодержимоеБлока = СодержимоеБлока + ?(ПустаяСтрока(СодержимоеБлока), "", Символы.ПС) + СтрокаМодуля; + + КонецЦикла; + + Возврат СодержимоеБлока; + +КонецФункции