1
0
mirror of https://github.com/bia-technologies/bsl-parser.git synced 2024-11-24 08:12:17 +02:00

Переработано чтение описаний конфигурации

* Поддержка чтения формата EDT
* Изменен доступ к API - использование фабрики для создания парсера, парсер - объект
* Переименованы, некоторые модули
* Дробление монолитных модулей
This commit is contained in:
aleksey.koryakin 2019-04-25 17:57:37 +03:00
parent a1e78c27ac
commit 855c0fe827
24 changed files with 3404 additions and 2001 deletions

6
.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
bdd-log.xml
*.ospx
*.orig
exec.log
ignore/**
tests.xml

19
.vscode/launch.json vendored Normal file
View File

@ -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"
}
]
}

21
LICENSE Normal file
View File

@ -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.

12
installlocalhost.bat Normal file
View File

@ -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

View File

@ -1,6 +0,0 @@
<package-def>
<class name="РазборСтруктурыКонфигурации" file="src/РазборСтруктурыКонфигурации.os"/>
<module name="ТипБлоковМодуля" file="src/Core/Модули/ТипБлоковМодуля.os"/>
<module name="ТипМодуля" file="src/Core/Модули/ТипМодуля.os"/>
<module name="ТипОбласти" file="src/Core/Модули/ТипОбласти.os"/>
</package-def>

View File

@ -1,5 +1,14 @@

Описание.Имя("parserbia")
.Версия("1.0.2")
ПутьКСценариюПараметров = ОбъединитьПути(ТекущийСценарий().Каталог, "src", "Модули", "ПараметрыПродукта.os");
ПараметрыСистемы_ЛокальнаяВерсия = ЗагрузитьСценарий(ПутьКСценариюПараметров);
ИмяПродукта = НРег(ПараметрыСистемы_ЛокальнаяВерсия.ИмяПродукта());
Описание.Имя(ИмяПродукта)
.ВерсияСреды("1.0.21")
.Версия(ПараметрыСистемы_ЛокальнаяВерсия.ВерсияПродукта())
.ЗависитОт("logos", "1.2.1")
.ЗависитОт("fs", "1.0.0")
.ВключитьФайл("src")
.ВключитьФайл("lib.config");
.ВключитьФайл("lib.config");
.ВключитьФайл("readme.md");
.ВключитьФайл("LICENSE");

View File

@ -8,3 +8,11 @@
`#Использовать "parser-bia"`
`Парсер = Новый РазборСтруктурыКонфигурации();`
## Описание API
ПолучитьОписаниеМодуляПоИмениФайла
ПрочитатьСодержимоеМодуля
ПрочитатьДеревоКонфигурации
НайтиМодулиКонфигурации
ПолноеИмяОбъекта

View File

@ -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" Тогда
ТипЭтогоМодуля = МодульОбъекта;
КонецЕсли;
КонецЕсли;
Иначе
ВызватьИсключение "Ошибочная структура имени файла: " + ПолноеИмяФайла;
КонецЕсли;
КонецЕсли;
Возврат ТипЭтогоМодуля;
КонецФункции
///////////////////////////////////////////////////////////////////////////////////////////////
ОбщийМодуль = "ОбщийМодуль";
МодульОбъекта = "МодульОбъекта";
МодульМенеджера = "МодульМенеджера";
МодульОбычнойФормы = "МодульОбычнойФормы";
МодульУправляемойФормы = "МодульУправляемойФормы";
МодульКоманды = "МодульКоманды";
МодульСеанса = "МодульСеанса";
МодульОбычногоПриложения = "МодульОбычногоПриложения";
МодульУправляемогоПриложения = "МодульУправляемогоПриложения";
МодульВнешнегоСоединения = "МодульВнешнегоСоединения";

View File

@ -0,0 +1,624 @@
///////////////////////////////////////////////////////////////////////////////
//
// Модуль разбора файлов конфигурации
//
// (с) BIA Technologies, LLC
//
///////////////////////////////////////////////////////////////////////////////
#Использовать fs
#Использовать "../ЧтениеМодулей"
///////////////////////////////////////////////////////////////////////////////
Перем СтруктураКаталогов;
Перем ЧитательОписаний;
Перем ОписаниеКонфигурации;
Перем ДанныеКонфигурации;
///////////////////////////////////////////////////////////////////////////////
// ПРОГРАММНЫЙ ИНТЕРФЕЙС
///////////////////////////////////////////////////////////////////////////////
Процедура ПрочитатьСтруктуруКонфигурации() Экспорт
ОписаниеКонфигурации = ПрочитатьОписаниеКонфигурации();
ЗаполнитьПодсистемыОбъектовКонфигурации();
ЗаполнитьИменаФайлов();
КонецПроцедуры
Функция НайтиМодулиКонфигурации()Экспорт
МодулиКонфигурации = СтруктурыОписаний.ТаблицаОписанияМодулей();
// todo сделать чтение форм
ФормыКонфигурации = Новый ТаблицаЗначений;
ФормыКонфигурации.Колонки.Добавить("Родитель");
ФормыКонфигурации.Колонки.Добавить("ЭтоУправляемаяФорма");
ФормыКонфигурации.Колонки.Добавить("Наименование");
// todo сделать чтение команд
КомандыКонфигурации = Новый ТаблицаЗначений;
КомандыКонфигурации.Колонки.Добавить("Родитель");
КомандыКонфигурации.Колонки.Добавить("Наименование");
ОписаниеКонфигурации.Вставить("ФормыКонфигурации", ФормыКонфигурации);
ОписаниеКонфигурации.Вставить("КомандыКонфигурации", КомандыКонфигурации);
ОписаниеКонфигурации.Вставить("МодулиКонфигурации", МодулиКонфигурации);
Для Каждого ОбъектКонфигурации Из ОписаниеКонфигурации.ОбъектыКонфигурации Цикл
ФайлыМодулей = СтруктураКаталогов.НайтиМодулиОбъекта(ОбъектКонфигурации.Наименование, ОбъектКонфигурации.Тип, Истина);
Для Каждого ИмяФайлаМодуля Из ФайлыМодулей Цикл
ПолучитьОписаниеМодуляПоИмениФайла(ИмяФайлаМодуля, ОбъектКонфигурации, ОписаниеКонфигурации);
КонецЦикла;
КонецЦикла;
МодулиКонфигурации.Сортировать("ПутьКФайлу");
Возврат ОписаниеКонфигурации;
КонецФункции
Функция ОписаниеКонфигурации() Экспорт
Возврат ОписаниеКонфигурации;
КонецФункции
Функция ПрочитатьОписаниеКонстант()Экспорт
Фильтр = Новый Структура("Тип", "Constant");
СтрокиКонстант = ОписаниеКонфигурации.ОбъектыКонфигурации.НайтиСтроки(Фильтр);
МассивОписанийКонстант = Новый Массив;
Для Каждого Объект Из СтрокиКонстант Цикл
ОписаниеИзXML = ПолучитьОписаниеКонстанты(Объект.ПутьКФайлуСОписанием);
ОписаниеКонстанты = Новый Структура("Имя, Тип, Описание, Подсистема, ПодсистемаПредставление");
ОписаниеКонстанты.Имя = Объект.Наименование;
ОписаниеКонстанты.Тип = ЧтениеОписанийБазовый.ПреобразоватьТип(ОписаниеИзXML.ТипКонстанты);
ОписаниеКонстанты.Описание = ОписаниеИзXML.ТекстОписания;
Если ЗначениеЗаполнено(Объект.Подсистемы) Тогда
ОписаниеКонстанты.Подсистема = Объект.Подсистемы[0].Имя;
ОписаниеКонстанты.ПодсистемаПредставление = Объект.Подсистемы[0].ПредставлениеКратко;
КонецЕсли;
МассивОписанийКонстант.Добавить(ОписаниеКонстанты);
КонецЦикла;
Возврат МассивОписанийКонстант;
КонецФункции
Процедура ПрочитатьСодержимоеМодуля(СтрокаМодуль)Экспорт
Файл = Новый ТекстовыйДокумент;
Файл.Прочитать(СтрокаМодуль.ПутьКФайлу, КодировкаТекста.UTF8NoBOM);
СодержимоеМодуля = ЧтениеМодулей.ПрочитатьМодуль(Файл);
СтрокаМодуль.Содержимое = СодержимоеМодуля.Содержимое;
ЧтениеМодулей.ДополнитьБлокиМодуля(СодержимоеМодуля.БлокиМодуля, Файл, СтрокаМодуль);
СтрокаМодуль.НаборБлоков = СодержимоеМодуля.БлокиМодуля;
Если СтрокаМодуль.ТипМодуля = ТипМодуля.ОбщийМодуль Тогда
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать(СтрокаМодуль.Родитель.ПутьКФайлуСОписанием);
Если СтрНайти(Текст.ПолучитьТекст(), "<Global>true</Global>") Тогда
СтрокаМодуль.ОписаниеМодуля.Вставить("Глобальный", Истина);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура УдалитьОбъектыВнеПодсистем() Экспорт
Количество = ОписаниеКонфигурации.ОбъектыКонфигурации.Количество();
Для Инд = 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;
Иначе
ЧитательОписаний = ЧтениеОписанийКонфигуратор;
КонецЕсли;
КонецПроцедуры

View File

@ -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");
КонецПроцедуры

View File

@ -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 |

View File

@ -0,0 +1,77 @@
///////////////////////////////////////////////////////////////////////////////
//
// Служебный модуль с набором служебных параметров библиотеки
//
// При создании новой библиотеки обязательно внести изменение
// в ф-ии ИмяПродукта, указав имя вашей библиотеки.
//
// При выпуске новой версии обязательно изменить ее значение
// в ф-ии ВерсияПродукта
//
///////////////////////////////////////////////////////////////////////////////
#Использовать logos
Перем Лог;
// ИмяПродукта
// Возвращает имя продукта
//
// Возвращаемое значение:
// Строка - Значение имени продукта
//
Функция ИмяПродукта()
Возврат "bsl-parser";
КонецФункции
// Возвращает текущую версию продукта
//
// Возвращаемое значение:
// Строка - Значение текущей версии продукта
//
Функция ВерсияПродукта()
Возврат "2.0.1";
КонецФункции
// Возвращает идентификатор лога библиотеки
//
// Возвращаемое значение:
// Строка - Значение идентификатора лога библиотеки
//
Функция ИмяЛогаСистемы() Экспорт
Возврат "oscript.lib." + ИмяПродукта();
КонецФункции // ИмяЛогаСистемы
// Форматирование логов
// См. описание метода "УстановитьРаскладку" библиотеки logos
//
Функция Форматировать(Знач Уровень, Знач Сообщение) Экспорт
Возврат СтрШаблон("%1: %2 - %3", ТекущаяДата(), УровниЛога.НаименованиеУровня(Уровень), Сообщение);
КонецФункции
// Возвращает лог продукта
//
// Возвращаемое значение:
// Лог - Лог продукта
//
Функция ПолучитьЛог() Экспорт
Если Лог = Неопределено Тогда
Лог = Логирование.ПолучитьЛог(ИмяЛогаСистемы());
Лог.УстановитьРаскладку(ЭтотОбъект);
Лог.УстановитьУровень(УровниЛога.Отладка);
КонецЕсли;
Возврат Лог;
КонецФункции

View File

@ -0,0 +1,37 @@
///////////////////////////////////////////////////////////////////////////////
//
// Модуль-фабрика для создания и инициализации парсеров
//
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// ПРОГРАММНЫЙ ИНТЕРФЕЙС
///////////////////////////////////////////////////////////////////////////////
Функция ПарсерКонфигурации(КаталогИсходников) Экспорт
Возврат Новый РазборКонфигурации1С(КаталогИсходников);
КонецФункции
Функция ПарсерРасширения(КаталогИсходников) Экспорт
ВызватьИсключение "Не реализованно";
КонецФункции
Функция ПарсерВнешнейОбработки(КаталогИсходников) Экспорт
ВызватьИсключение "Не реализованно";
КонецФункции
Функция ПарсерМодуля(ИмяФайлаМодуля) Экспорт
ВызватьИсключение "Не реализованно";
КонецФункции
///////////////////////////////////////////////////////////////////////////////
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
///////////////////////////////////////////////////////////////////////////////

View File

@ -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";
КонецФункции
Функция ОписаниеОбъектаКонфигурацииЗначенияПоУмолчанию() Экспорт
Возврат Новый Структура(
"Наименование, Тип, ПутьКФайлуСОписанием, ПутьККаталогу, Подсистемы, Описание, Родитель",
"", "", "", "", Новый Массив);
КонецФункции
///////////////////////////////////////////////////////////////////////////////
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
///////////////////////////////////////////////////////////////////////////////
Процедура ДобавитьВОписание(Описание, Имя, ИмяПоля, Многоязычный = Ложь, ФункцияПреобразования = Неопределено, Коллекция = Ложь)
Описание.Вставить(Имя, Новый Структура("Поле, Многоязычный, ФункцияПреобразования, Коллекция", ИмяПоля, Многоязычный, ФункцияПреобразования, Коллекция));
КонецПроцедуры

View File

@ -0,0 +1,105 @@
///////////////////////////////////////////////////////////////////////////////
//
// Информация о типах конфигурации
//
///////////////////////////////////////////////////////////////////////////////
Перем ОбъектыКонфигурации;
Перем ХэшПоиска;
///////////////////////////////////////////////////////////////////////////////
// ПРОГРАММНЫЙ ИНТЕРФЕЙС
///////////////////////////////////////////////////////////////////////////////
Функция ОписаниеТипаПоИмени(ИмяТипаОбъектаКонфигурации) Экспорт
Возврат ХэшПоиска[ВРег(ИмяТипаОбъектаКонфигурации)];
КонецФункции
Функция НормализоватьИмя(ИмяТипаОбъектаКонфигурации) Экспорт
Описание = ХэшПоиска[ВРег(ИмяТипаОбъектаКонфигурации)];
Если Описание = Неопределено Тогда
Возврат ИмяТипаОбъектаКонфигурации;
Иначе
Возврат Описание.НаименованиеEng;
КонецЕсли;
КонецФункции
Функция ИмяТипаПодсистемы() Экспорт
Возврат НормализоватьИмя("Подсистемы");
КонецФункции
///////////////////////////////////////////////////////////////////////////////
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
///////////////////////////////////////////////////////////////////////////////
Процедура ЗагрузитьОписаниеТиповОбъектовКонфигурации()
ОбъектыКонфигурации = Новый Массив();
ХэшПоиска = Новый Соответствие();
ФайлОписаний = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "Макеты", "ОбъектыКонфигурации.md");
Чтение = Новый ЧтениеТекста();
Чтение.Открыть(ФайлОписаний, КодировкаТекста.UTF8);
Пока Истина Цикл // Позиционируемся на нужную строку
Строка = Чтение.ПрочитатьСтроку();
Если Строка = Неопределено Тогда
Прервать;
КонецЕсли;
Если Строка = "## Имена" Тогда
Чтение.ПрочитатьСтроку(); // Пропускаем пустую строку
Чтение.ПрочитатьСтроку(); // Пропускаем заголовок таблицы
Чтение.ПрочитатьСтроку(); // Пропускаем заголовок таблицы
Прервать;
КонецЕсли;
КонецЦикла;
Пока Истина Цикл
Строка = Чтение.ПрочитатьСтроку();
Если Строка = Неопределено Тогда
Прервать;
КонецЕсли;
Если НЕ СтрНачинаетсяС(Строка, "|") Тогда
Прервать;
КонецЕсли;
ЧастиСтроки = СтрРазделить(Строка, "|");
Описание = Новый Структура("Наименование, НаименованиеКоллекции, НаименованиеEng, НаименованиеКоллекцииEng",
СокрЛП(ЧастиСтроки[1]), СокрЛП(ЧастиСтроки[2]), СокрЛП(ЧастиСтроки[3]), СокрЛП(ЧастиСтроки[4]));
ОбъектыКонфигурации.Добавить(Описание);
ХэшПоиска.Вставить(ВРег(Описание.Наименование), Описание);
ХэшПоиска.Вставить(ВРег(Описание.НаименованиеКоллекции), Описание);
ХэшПоиска.Вставить(ВРег(Описание.НаименованиеEng), Описание);
ХэшПоиска.Вставить(ВРег(Описание.НаименованиеКоллекцииEng), Описание);
КонецЦикла;
Чтение.Закрыть();
КонецПроцедуры
ЗагрузитьОписаниеТиповОбъектовКонфигурации();

View File

@ -0,0 +1,66 @@
///////////////////////////////////////////////////////////////////
//
// Служебный модуль, содержащий различные вспомогательные методы
//
// (с) BIA Technologies, LLC
//
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
// Программный интерфейс
///////////////////////////////////////////////////////////////////
// Читает текст из файла
//
// Параметры:
// ИмяФайла - Строка - Путь к файлу
//
// Возвращаемое значение:
// Строка - Содержимое файла
//
Функция ПрочитатьФайл(ИмяФайла) Экспорт
ТекстовыйДокумент = Новый ТекстовыйДокумент();
ТекстовыйДокумент.Прочитать(ИмяФайла, КодировкаТекста.UTF8NoBOM);
СодержимоеФайла = ТекстовыйДокумент.ПолучитьТекст();
Возврат СодержимоеФайла;
КонецФункции
// Создает все необходимы каталоги по пути
//
// Параметры:
// Путь - Строка - Путь к каталогу
//
Процедура СоздатьРекурсивноКаталоги(Путь) Экспорт
Файл = Новый Файл(Путь);
Если НЕ Файл.Существует() Тогда
СоздатьРекурсивноКаталоги(Файл.Путь);
СоздатьКаталог(Путь);
КонецЕсли;
КонецПроцедуры
Функция СтрРазделитьСОбрезкойПробелов(Строка, Разделитель) Экспорт
Результат = Новый Массив();
Для Каждого Стр Из СтрРазделить(Строка, Разделитель) Цикл
Результат.Добавить(СокрЛП(Стр));
КонецЦикла;
Возврат Результат;
КонецФункции
///////////////////////////////////////////////////////////////////
// Служебный функционал
///////////////////////////////////////////////////////////////////

View File

@ -0,0 +1,246 @@
///////////////////////////////////////////////////////////////////////////////
//
// Модуль для чтения описаний метаданных 1с из EDT выгрузки
//
///////////////////////////////////////////////////////////////////////////////
#Использовать reflector
///////////////////////////////////////////////////////////////////////////////
Перем Рефлектор;
Перем РегулярныеВыражения;
///////////////////////////////////////////////////////////////////////////////
// ПРОГРАММНЫЙ ИНТЕРФЕЙС
///////////////////////////////////////////////////////////////////////////////
Функция ПолучитьСвойства(ТекстОписания, ПараметрыЧтения = Неопределено) Экспорт
СвойстваОписания = Новый Структура();
НайденныеСовпадения = РегулярныеВыражения.СвойстваОписания.НайтиСовпадения(ТекстОписания);
Для Каждого Совпадение Из НайденныеСовпадения Цикл
Имя = Совпадение.Группы[1].Значение;
Значение = Совпадение.Группы[2].Значение;
Если СвойстваОписания.Свойство(Имя) Тогда
Если ТипЗнч(СвойстваОписания[Имя]) = Тип("Массив") Тогда
СвойстваОписания[Имя].Добавить(Значение);
Иначе
КоллекцияЗначений = Новый Массив();
КоллекцияЗначений.Добавить(СвойстваОписания[Имя]);
КоллекцияЗначений.Добавить(Значение);
СвойстваОписания.Вставить(Имя, КоллекцияЗначений);
КонецЕсли;
Иначе
СвойстваОписания.Вставить(Имя, Значение);
КонецЕсли;
КонецЦикла;
Если ПараметрыЧтения <> Неопределено Тогда
СвойстваОписания = ВыполнитьОбработкуПрочитанныхСвойств(СвойстваОписания, ПараметрыЧтения, ЭтотОбъект);
КонецЕсли;
Возврат СвойстваОписания;
КонецФункции
Функция ПрочитатьСвойстваИзФайла(ИмяФайла, ПараметрыЧтения = Неопределено) Экспорт
ТекстОписания = Утилиты.ПрочитатьФайл(ИмяФайла);
Возврат ПолучитьСвойства(ТекстОписания, ПараметрыЧтения);
КонецФункции
Функция ПрочитатьОписаниеКонфигурации(ПутьКФайлуОписания) Экспорт
СвойстваКонфигурации = Новый Структура;
ОбъектыКонфигурации = СтруктурыОписаний.ТаблицаОписанияОбъектовКонфигурации();
ПараметрыЧтения = СтруктурыОписаний.ОписаниеКонфигурации();
ЗначенияПоУмолчанию = СтруктурыОписаний.ОписаниеОбъектаКонфигурацииЗначенияПоУмолчанию();
СвойстваОписания = ПолучитьСвойства(Утилиты.ПрочитатьФайл(ПутьКФайлуОписания), ПараметрыЧтения);
Для Каждого Параметр Из ПараметрыЧтения Цикл
Если Параметр.Ключ = "Языки" Тогда // Шлак какой-то там
Продолжить;
КонецЕсли;
Значение = СвойстваОписания[Параметр.Ключ];
Если Параметр.Значение.Коллекция Тогда
Для Каждого ПолноеИмяОбъекта Из Значение Цикл
СтрокаОбъекта = ОбъектыКонфигурации.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаОбъекта, ЗначенияПоУмолчанию);
ЧастиСтроки = СтрРазделить(ПолноеИмяОбъекта, ".");
СтрокаОбъекта.Тип = ТипыОбъектовКонфигурации.НормализоватьИмя(ЧастиСтроки[0]);
СтрокаОбъекта.Наименование = ЧастиСтроки[1];
КонецЦикла;
Иначе
СвойстваКонфигурации.Вставить(Параметр.Ключ, Значение);
КонецЕсли;
КонецЦикла;
Возврат Новый Структура("СвойстваКонфигурации, ОбъектыКонфигурации", СвойстваКонфигурации , ОбъектыКонфигурации);
КонецФункции
///////////////////////////////////////////////////////////////////////////////
// СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС
///////////////////////////////////////////////////////////////////////////////
Функция МногоЯзыковаяСтрока(Знач Значение) Экспорт
Регулярка = РегулярныеВыражения.МногоЯзыковаяСтрока;
Совпадения = Регулярка.НайтиСовпадения(Значение);
Если Совпадения.Количество() Тогда
Значение = Совпадения[0].Группы[1].Значение;
Иначе
Значение = "";
КонецЕсли;
Возврат Значение;
КонецФункции
Функция ПолучитьТип(Знач Значение) Экспорт
Регулярка = РегулярныеВыражения.ПолучитьТип;
Совпадения = Регулярка.НайтиСовпадения(Значение);
Если Совпадения.Количество() Тогда
Значение = Совпадения[0].Группы[1].Значение;
Иначе
Значение = "";
КонецЕсли;
Возврат Значение;
КонецФункции
Функция ПрочитатьСостав(Знач Значение) Экспорт
Возврат Значение;
КонецФункции
///////////////////////////////////////////////////////////////////////////////
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
///////////////////////////////////////////////////////////////////////////////
Функция ВыполнитьОбработкуПрочитанныхСвойств(СырыеДанные, ПараметрыЧтения, ОбъектПреобразователь)
СвойстваОписания = Новый Структура();
Для Каждого Параметр Из ПараметрыЧтения Цикл
Значение = Неопределено;
Если НЕ СырыеДанные.Свойство(Параметр.Значение.Поле, Значение) Тогда
Значение = "";
КонецЕсли;
Значение = ОбработатьСвойство(Значение, Параметр.Значение, ОбъектПреобразователь);
СвойстваОписания.Вставить(Параметр.Ключ, Значение);
КонецЦикла;
Возврат СвойстваОписания;
КонецФункции
Функция ОбработатьСвойство(Значение, Параметр, ОбъектПреобразователь)
Если ПустаяСтрока(Значение) И Параметр.Коллекция Тогда
Возврат Новый Массив();
ИначеЕсли ПустаяСтрока(Значение) Тогда
Возврат Значение;
КонецЕсли;
Если ТипЗнч(Значение) = Тип("Массив") И ПустаяСтрока(Параметр.ФункцияПреобразования) И НЕ Параметр.Многоязычный Тогда
Возврат Значение;
КонецЕсли;
ФункцияПреобразования = Параметр.ФункцияПреобразования;
Если НЕ ЗначениеЗаполнено(ФункцияПреобразования) И Параметр.Многоязычный Тогда
ФункцияПреобразования = "МногоЯзыковаяСтрока";
КонецЕсли;
Если ЗначениеЗаполнено(ФункцияПреобразования) Тогда
ЗначениеВМассиве = Новый Массив();
ЗначениеВМассиве.Добавить(Значение);
Значение = Рефлектор.ВызватьМетод(ОбъектПреобразователь, ФункцияПреобразования, ЗначениеВМассиве);
КонецЕсли;
Если Параметр.Коллекция И ТипЗнч(Значение) <> Тип("Массив") Тогда
Результат = Новый Массив();
Результат.Добавить(Значение);
Значение = Результат;
КонецЕсли;
Возврат Значение;
КонецФункции
Рефлектор = Новый Рефлектор;
РегулярныеВыражения = Новый Структура();
РегулярныеВыражения.Вставить("СвойстваОписания", Новый РегулярноеВыражение("<([a-zA-Z]+)\b[^>]*>([\s\S]*?)<\/\1>"));
РегулярныеВыражения.Вставить("МногоЯзыковаяСтрока", Новый РегулярноеВыражение("<value>([\s\S]*)<\/value>"));
РегулярныеВыражения.Вставить("ПолучитьТип", Новый РегулярноеВыражение("<types>([\s\S]*)<\/types>"));

View File

@ -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;
КонецЕсли;
Возврат ПреобразованныйТип;
КонецФункции
Функция ПолучитьИмяТипаНаРусском(ИмяТипа) Экспорт
ОписаниеТипа = ТипыОбъектовКонфигурации.ОписаниеТипаПоИмени(ИмяТипа);
Возврат ?(ОписаниеТипа = Неопределено, ИмяТипа, ОписаниеТипа.Наименование);
КонецФункции
Функция ПолноеИмяОбъекта(СтрокаМодуль, ДобавлятьПрефиксДляОбщихМодулей = ИСТИНА) Экспорт
Если СтрокаМодуль.ТипМодуля <> ТипМодуля.ОбщийМодуль
ИЛИ ДобавлятьПрефиксДляОбщихМодулей Тогда
Возврат ПолучитьИмяТипаНаРусском(СтрокаМодуль.Родитель.Тип) + "." + СтрокаМодуль.Родитель.Наименование;
Иначе
Возврат СтрокаМодуль.Родитель.Наименование;
КонецЕсли;
КонецФункции
Функция ПолноеИмяМодуля(СтрокаМодуль) Экспорт
ПолноеИмя = ПолноеИмяОбъекта(СтрокаМодуль);
Если СтрокаМодуль.ТипМодуля = ТипМодуля.ОбщийМодуль Тогда
// не надо дописывать
ИначеЕсли СтрокаМодуль.ТипМодуля = ТипМодуля.МодульМенеджера
ИЛИ СтрокаМодуль.ТипМодуля = ТипМодуля.МодульОбъекта Тогда
ПолноеИмя = ПолноеИмя + "." + СтрокаМодуль.ТипМодуля;
ИначеЕсли СтрокаМодуль.ТипМодуля = ТипМодуля.МодульУправляемойФормы Тогда
ПолноеИмя = ПолноеИмя + ".Форма." + СтрокаМодуль.РодительФорма.Наименование + ".МодульФормы";
ИначеЕсли СтрокаМодуль.ТипМодуля = ТипМодуля.МодульКоманды Тогда
ПолноеИмя = ПолноеИмя + ".Команда." + СтрокаМодуль.РодительКоманда.Наименование + ".МодульКоманды";
Иначе
ПолноеИмя = ПолноеИмя + "." + СтрокаМодуль.ТипМодуля;
КонецЕсли;
Возврат ПолноеИмя;
КонецФункции
///////////////////////////////////////////////////////////////////////////////
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
///////////////////////////////////////////////////////////////////////////////
Рефлектор = Новый Рефлектор;

View File

@ -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.Прочитать();
КонецЦикла;
КонецЕсли;
Данные.Вставить(КлючСвойства, Значение);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Возврат Данные;
КонецФункции
Рефлектор = Новый Рефлектор();

File diff suppressed because it is too large Load Diff

View File

@ -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", МодульУправляемойФормы);

View File

@ -4,12 +4,14 @@
Перем РазделПрограммныйИнтерфейс Экспорт;
Перем РазделСлужебныйПрограммныйИнтерфейс Экспорт;
Перем РазделСлужебныеПроцедурыИФункции Экспорт;
Перем РазделОбработчикиСобытий Экспорт;
///////////////////////////////////////////////////////////////////////////////////////////////
РазделПрограммныйИнтерфейс = "ПрограммныйИнтерфейс";
РазделСлужебныйПрограммныйИнтерфейс = "СлужебныйПрограммныйИнтерфейс";
РазделСлужебныеПроцедурыИФункции = "СлужебныеПроцедурыИФункции";
РазделОбработчикиСобытий = "ОбработчикиСобытий";
РазделыОбщегоМодуля = Новый Массив;
РазделыОбщегоМодуля.Добавить(РазделПрограммныйИнтерфейс);
@ -19,4 +21,5 @@
РазделыМодуляМенеджера = Новый Массив;
РазделыМодуляМенеджера.Добавить(РазделПрограммныйИнтерфейс);
РазделыМодуляМенеджера.Добавить(РазделСлужебныйПрограммныйИнтерфейс);
РазделыМодуляМенеджера.Добавить(РазделСлужебныеПроцедурыИФункции);
РазделыМодуляМенеджера.Добавить(РазделСлужебныеПроцедурыИФункции);
РазделыМодуляМенеджера.Добавить(РазделОбработчикиСобытий);

View File

@ -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 По КоличествоБлоков Цикл
Блок = БлокиМодуля[КоличествоБлоков - Ит];
Если Блок.ТипБлока = ТипБлоковМодуля.ОкончаниеПроцедуры
ИЛИ Блок.ТипБлока = ТипБлоковМодуля.ОкончаниеФункции
ИЛИ Блок.ТипБлока = ТипБлоковМодуля.КонецОбласти
ИЛИ Блок.ТипБлока = ТипБлоковМодуля.Описание
ИЛИ Блок.ТипБлока = ТипБлоковМодуля.ПустаяСтрока Тогда
БлокиМодуля.Удалить(Блок);
КонецЕсли;
КонецЦикла;
Модуль.ОписаниеМодуля = ОписаниеМодуля;
КонецПроцедуры
Функция ПолучитьСодержимоеБлока(Текст, НачальнаяСтрока, КонечнаяСтрока)
СодержимоеБлока = "";
Для Ит = НачальнаяСтрока По КонечнаяСтрока Цикл
СтрокаМодуля = Текст.ПолучитьСтроку(Ит);
СодержимоеБлока = СодержимоеБлока + ?(ПустаяСтрока(СодержимоеБлока), "", Символы.ПС) + СтрокаМодуля;
КонецЦикла;
Возврат СодержимоеБлока;
КонецФункции