From e9770a9d960af9749205e1f3d7fdd8071bbcd795 Mon Sep 17 00:00:00 2001 From: Maximov Valery Date: Wed, 24 May 2023 15:03:43 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA?= =?UTF-8?q?=20=D1=87=D1=82=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - чтение модулей поддерживает какноническое описание возвращаемых значений - чтение подсистем учитывает мультиязычность синонима --- LICENSE | 2 +- .../ЧтениеОписаний/Модули/ЧтениеКонфигурации.os | 95 +- .../ЧтениеОписаний/Модули/ЧтениеМодулей.os | 1150 ++++++++--------- src/Перечисления/Модули/ТипыБлоковМодуля.os | 30 + 4 files changed, 639 insertions(+), 638 deletions(-) diff --git a/LICENSE b/LICENSE index 91810f9..c52a727 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2019-2021 BIA Technologies, LLC +Copyright (c) 2019-2023 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 diff --git a/src/Внутренние/ЧтениеОписаний/Модули/ЧтениеКонфигурации.os b/src/Внутренние/ЧтениеОписаний/Модули/ЧтениеКонфигурации.os index ad121e0..b332085 100644 --- a/src/Внутренние/ЧтениеОписаний/Модули/ЧтениеКонфигурации.os +++ b/src/Внутренние/ЧтениеОписаний/Модули/ЧтениеКонфигурации.os @@ -15,7 +15,7 @@ ПараметрыЧтения.Вставить("ОписаниеКонфигурации", Конфигурация.ОписаниеКонфигурации()); ПараметрыЧтения.Вставить("СтруктураКаталогов", Конфигурация.СтруктураКаталогов()); ПараметрыЧтения.Вставить("ТипКорневогоЭлемента", ТипКорневогоЭлемента); - ПараметрыЧтения.Вставить("ФорматВыгрузки", ПараметрыЧтения.СтруктураКаталогов.ФорматВыгрузки()); + ПараметрыЧтения.Вставить("ФорматВыгрузки", ПараметрыЧтения.СтруктураКаталогов.ФорматВыгрузки()); Если ПараметрыЧтения.ФорматВыгрузки = ФорматыВыгрузки.EDT Тогда ЧитательОписаний = ЧтениеОписанийEDT; @@ -44,12 +44,15 @@ // Читает описание объекта конфигурации // // Параметры: -// ОбъектКонфигурации - СтрокаТаблицыЗначений - Описание объекта конфигурации. См. СтруктурыОписаний.ТаблицаОписанияОбъектовКонфигурации +// ОбъектКонфигурации - СтрокаТаблицыЗначений - Описание объекта конфигурации. +// См. СтруктурыОписаний.ТаблицаОписанияОбъектовКонфигурации // Процедура ПрочитатьОписание(ОбъектКонфигурации) Экспорт ПараметрыЧтения = ОбъектКонфигурации.Конфигурация.ПараметрыЧтения(); - ОбъектКонфигурации.Описание = ПрочитатьФайлОписанияОбъекта(ПараметрыЧтения, ОбъектКонфигурации.ПутьКФайлу, ОбъектКонфигурации.Тип); + ОбъектКонфигурации.Описание = ПрочитатьФайлОписанияОбъекта( + ПараметрыЧтения, ОбъектКонфигурации.ПутьКФайлу, ОбъектКонфигурации.Тип + ); КонецПроцедуры @@ -63,8 +66,8 @@ ПараметрыЧтения.ОписаниеКонфигурации.ПодсистемыКонфигурации = ПодсистемыКонфигурации; Для Каждого ОбъектКонфигурации Из ПараметрыЧтения.ОписаниеКонфигурации.ОбъектыКонфигурации Цикл - - Подсистемы = ПодсистемыКонфигурации.НайтиСтроки(Новый Структура("ОбъектМетаданных", ОбъектКонфигурации.Тип + "." + ОбъектКонфигурации.Наименование)); + Отбор = Новый Структура("ОбъектМетаданных", ОбъектКонфигурации.Тип + "." + ОбъектКонфигурации.Наименование); + Подсистемы = ПодсистемыКонфигурации.НайтиСтроки(Отбор); Если Подсистемы.Количество() Тогда @@ -93,7 +96,7 @@ ПолучитьОписаниеМодуляПоИмениФайла(ИмяФайлаМодуля, ОбъектКонфигурации, ОписаниеКонфигурации); - КонецЦикла; + КонецЦикла; КонецЦикла; @@ -112,20 +115,17 @@ СтрокаМодуль.Содержимое = СодержимоеМодуля.Содержимое; СтрокаМодуль.НаборБлоков = СодержимоеМодуля.БлокиМодуля; - Если СтрокаМодуль.ТипМодуля = ТипыМодуля.ОбщийМодуль Тогда - - Если СтрокаМодуль.Родитель <> Неопределено Тогда + Если СтрокаМодуль.ТипМодуля = ТипыМодуля.ОбщийМодуль + И СтрокаМодуль.Родитель <> Неопределено Тогда - Если СтрокаМодуль.Родитель.Описание = Неопределено Тогда + Если СтрокаМодуль.Родитель.Описание = Неопределено Тогда - ПрочитатьОписание(СтрокаМодуль.Родитель); - - КонецЕсли; - - СтрокаМодуль.ОписаниеМодуля.Вставить("Глобальный", СтрокаМодуль.Родитель.Описание.Глобальный); + ПрочитатьОписание(СтрокаМодуль.Родитель); КонецЕсли; - + + СтрокаМодуль.ОписаниеМодуля.Вставить("Глобальный", СтрокаМодуль.Родитель.Описание.Глобальный); + КонецЕсли; КонецПроцедуры @@ -134,7 +134,7 @@ // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ /////////////////////////////////////////////////////////////////////////////// -Функция ПрочитатьОписаниеКонфигурации(ПараметрыЧтения) +Процедура ПрочитатьОписаниеКонфигурации(ПараметрыЧтения) // Выполняет чтение объектов первого уровня, вложенные объекты не читаются @@ -149,10 +149,14 @@ КонецЕсли; - ДанныеКонфигурации = ПрочитатьФайлОписанияОбъекта(ПараметрыЧтения, ФайлКонфигурации, ПараметрыЧтения.ТипКорневогоЭлемента); + ДанныеКонфигурации = ПрочитатьФайлОписанияОбъекта( + ПараметрыЧтения, ФайлКонфигурации, ПараметрыЧтения.ТипКорневогоЭлемента + ); // добавим руками объект "Configuration" для модулей приложения - НовСтрока = РедакторКонфигурации.ЗарегистрироватьОбъектКонфигурации(ОписаниеКонфигурации, ПараметрыЧтения.ТипКорневогоЭлемента, ДанныеКонфигурации); + НовСтрока = РедакторКонфигурации.ЗарегистрироватьОбъектКонфигурации( + ОписаниеКонфигурации, ПараметрыЧтения.ТипКорневогоЭлемента, ДанныеКонфигурации + ); НовСтрока.ПутьКФайлу = ФайлКонфигурации; Для Каждого Подчиненный Из ДанныеКонфигурации.Подчиненные Цикл @@ -167,7 +171,7 @@ ОписаниеКонфигурации.СвойстваКонфигурации = ДанныеКонфигурации; -КонецФункции +КонецПроцедуры Функция ПрочитатьФайлОписанияОбъекта(ПараметрыЧтения, ПутьКФайлу, ТипОбъекта) @@ -191,16 +195,15 @@ ФормаОбъекта = Неопределено; КомандаОбъекта = Неопределено; - - Если ТипЭтогоМодуля = ТипыМодуля.МодульОбъекта - ИЛИ ТипЭтогоМодуля = ТипыМодуля.МодульМенеджера - ИЛИ ТипЭтогоМодуля = ТипыМодуля.ОбщийМодуль - ИЛИ ТипЭтогоМодуля = ТипыМодуля.МодульУправляемогоПриложения - ИЛИ ТипЭтогоМодуля = ТипыМодуля.МодульСеанса - ИЛИ ТипЭтогоМодуля = ТипыМодуля.МодульВнешнегоСоединения - ИЛИ ТипЭтогоМодуля = ТипыМодуля.МодульОбычногоПриложения Тогда + ПропускаемыйТип = ТипЭтогоМодуля = ТипыМодуля.МодульОбъекта + ИЛИ ТипЭтогоМодуля = ТипыМодуля.МодульМенеджера + ИЛИ ТипЭтогоМодуля = ТипыМодуля.ОбщийМодуль + ИЛИ ТипЭтогоМодуля = ТипыМодуля.МодульУправляемогоПриложения + ИЛИ ТипЭтогоМодуля = ТипыМодуля.МодульСеанса + ИЛИ ТипЭтогоМодуля = ТипыМодуля.МодульВнешнегоСоединения + ИЛИ ТипЭтогоМодуля = ТипыМодуля.МодульОбычногоПриложения; - ИначеЕсли ТипыМодуля.ЭтоМодульФормы(ТипЭтогоМодуля) Тогда + Если ТипыМодуля.ЭтоМодульФормы(ТипЭтогоМодуля) Тогда ФормаОбъекта = ОписаниеКонфигурации.ФормыКонфигурации.Добавить(); ФормаОбъекта.Родитель = ОбъектКонфигурации; @@ -214,9 +217,9 @@ КомандаОбъекта.Наименование = ПолучитьИмяКомандыИзИмениФайлаМодуля(ИмяФайлаМодуля); Иначе - - ВызватьИсключение "Тип модуля: " + ТипЭтогоМодуля + " не имеет алгоритма разбора"; - + Если НЕ ПропускаемыйТип Тогда + ВызватьИсключение "Тип модуля: " + ТипЭтогоМодуля + " не имеет алгоритма разбора"; + КонецЕсли; КонецЕсли; НовыйМодульКонфигурации = ОписаниеКонфигурации.Модули.Добавить(); @@ -309,20 +312,35 @@ КонецФункции -Процедура ПрочитатьПодсистему(ПараметрыЧтения, ОписаниеПодсистем, ОбъектКонфигурации, Знач Визуальная, Знач Родитель, РодительскаяПодсистема) +Процедура ПрочитатьПодсистему(ПараметрыЧтения, ОписаниеПодсистем, ОбъектКонфигурации, Знач Визуальная, + Знач Родитель, РодительскаяПодсистема) ТипПодсистема = ТипыОбъектовКонфигурации.ИмяТипаПодсистема(); - ИмяФайлаОписание = ПараметрыЧтения.СтруктураКаталогов.ИмяФайлаОписанияОбъекта(ОбъектКонфигурации.Наименование, ОбъектКонфигурации.Тип); + ИмяФайлаОписание = ПараметрыЧтения.СтруктураКаталогов.ИмяФайлаОписанияОбъекта( + ОбъектКонфигурации.Наименование, ОбъектКонфигурации.Тип + ); СвойстваОписания = ПрочитатьФайлОписанияОбъекта(ПараметрыЧтения, ИмяФайлаОписание, ТипПодсистема); ОбъектКонфигурации.Описание = СвойстваОписания; ОбъектКонфигурации.ПутьКФайлу = ИмяФайлаОписание; - ОбъектКонфигурации.ПутьККаталогу = ПараметрыЧтения.СтруктураКаталогов.КаталогФайловОбъекта(ОбъектКонфигурации.Наименование, ОбъектКонфигурации.Тип); + ОбъектКонфигурации.ПутьККаталогу = ПараметрыЧтения.СтруктураКаталогов.КаталогФайловОбъекта( + ОбъектКонфигурации.Наименование, ОбъектКонфигурации.Тип); Визуальная = Визуальная И СвойстваОписания.ВключатьВКомандныйИнтерфейс; - ПредставлениеПодсистемы = ?(РодительскаяПодсистема = Неопределено, СвойстваОписания.Синоним, РодительскаяПодсистема.Представление + "/" + СвойстваОписания.Синоним); + Если СвойстваОписания.Синоним.Свойство("ru") Тогда + СинонимПодсистемы = СвойстваОписания.Синоним.ru; + ИначеЕсли СвойстваОписания.Синоним.Свойство("en") Тогда + СинонимПодсистемы = СвойстваОписания.Синоним.en; + Иначе + СинонимПодсистемы = СвойстваОписания.Имя; + КонецЕсли; + + ПредставлениеПодсистемы = ?(РодительскаяПодсистема = Неопределено, + СинонимПодсистемы, + РодительскаяПодсистема.Представление + "/" + СинонимПодсистемы + ); Если СвойстваОписания.Состав.Количество() Тогда Состав = СвойстваОписания.Состав; @@ -337,7 +355,7 @@ ЭтаПодсистема.Имя = ОбъектКонфигурации.Наименование; ЭтаПодсистема.ИмяКратко = СвойстваОписания.Наименование; ЭтаПодсистема.Представление = ПредставлениеПодсистемы; - ЭтаПодсистема.ПредставлениеКратко = СвойстваОписания.Синоним; + ЭтаПодсистема.ПредставлениеКратко = СинонимПодсистемы; ЭтаПодсистема.ОбъектМетаданных = ОбъектМетаданных; ЭтаПодсистема.Визуальная = Визуальная; ЭтаПодсистема.Родитель = РодительскаяПодсистема; @@ -368,7 +386,8 @@ ВложеннаяПодсистема.ПолноеНаименование = СтрШаблон("%1.%2", ТипПодсистема, ИмяПодсистемы); ВложеннаяПодсистема.Родитель = ОбъектКонфигурации; - ПрочитатьПодсистему(ПараметрыЧтения, ОписаниеПодсистем, ВложеннаяПодсистема, Визуальная, ОбъектКонфигурации, ЭтаПодсистема) + ПрочитатьПодсистему(ПараметрыЧтения, ОписаниеПодсистем, ВложеннаяПодсистема, Визуальная, + ОбъектКонфигурации, ЭтаПодсистема); КонецЦикла; diff --git a/src/Внутренние/ЧтениеОписаний/Модули/ЧтениеМодулей.os b/src/Внутренние/ЧтениеОписаний/Модули/ЧтениеМодулей.os index 50678a2..de50b6f 100644 --- a/src/Внутренние/ЧтениеОписаний/Модули/ЧтениеМодулей.os +++ b/src/Внутренние/ЧтениеОписаний/Модули/ЧтениеМодулей.os @@ -22,10 +22,10 @@ Функция ПрочитатьМодуль(ПутьКФайлу, СтрокаМодуль) Экспорт СодержимоеФайла = Новый ТекстовыйДокумент; - СодержимоеФайла.Прочитать(ПутьКФайлу, КодировкаТекста.UTF8NoBOM); + СодержимоеФайла.Прочитать(ПутьКФайлу, КодировкаТекста.UTF8NoBOM); БлокиМодуля = Новый ТаблицаЗначений; - БлокиМодуля.Колонки.Добавить("ТипБлока"); + БлокиМодуля.Колонки.Добавить("ТипБлока"); БлокиМодуля.Колонки.Добавить("НачальнаяСтрока"); БлокиМодуля.Колонки.Добавить("КонечнаяСтрока"); БлокиМодуля.Колонки.Добавить("Содержимое"); @@ -35,6 +35,7 @@ ТекущийБлок = Неопределено; ЭтоКонецБлока = Истина; + НовыйБлок = Неопределено; НачальнаяСтрока = 1; КонечнаяСтрока = 1; @@ -43,99 +44,8 @@ СтрокаМодуля = ВРег(СокрЛП(СодержимоеФайла.ПолучитьСтроку(НомерСтроки))); - Если НЕ ЭтоКонецБлока Тогда - - НовыйБлок = ТекущийБлок; - Если НовыйБлок = ТипыБлоковМодуля.ОписаниеПеременной Тогда - - УдалитьКомментарийИзСтроки(СтрокаМодуля); - ЭтоКонецБлока = СтрНайти(СтрокаМодуля, ";") > 0; - - ИначеЕсли НовыйБлок = ТипыБлоковМодуля.ЗаголовокПроцедуры - ИЛИ НовыйБлок = ТипыБлоковМодуля.ЗаголовокФункции Тогда - - УдалитьКомментарийИзСтроки(СтрокаМодуля); - ПозицияСкобки = СтрНайти(СтрокаМодуля, ")") > 0; - ЭтоКонецБлока = ПозицияСкобки > 0; - - Иначе - - ЭтоКонецБлока = Истина; - - КонецЕсли; - - ИначеЕсли СтрНачинаетсяС(СтрокаМодуля, "#ОБЛАСТЬ") - ИЛИ СтрНачинаетсяС(СтрокаМодуля, "// #ОБЛАСТЬ") Тогда - - НовыйБлок = ТипыБлоковМодуля.НачалоОбласти; - ЭтоКонецБлока = Истина; + ПрочитатьСтрокуМодуля(СтрокаМодуля, НовыйБлок, ТекущийБлок, ЭтоКонецБлока); - Если СтрНачинаетсяС(СтрокаМодуля, "//") Тогда - - СтрокаМодуля = Сред(СтрокаМодуля, 4); - - КонецЕсли; - - ИначеЕсли СтрНачинаетсяС(СтрокаМодуля, "#КОНЕЦОБЛАСТИ") - ИЛИ СтрНачинаетсяС(СтрокаМодуля, "// #КОНЕЦОБЛАСТИ") Тогда - - НовыйБлок = ТипыБлоковМодуля.КонецОбласти; - ЭтоКонецБлока = Истина; - - Если СтрНачинаетсяС(СтрокаМодуля, "//") Тогда - - СтрокаМодуля = Сред(СтрокаМодуля, 4); - - КонецЕсли; - - ИначеЕсли СтрНачинаетсяС(СтрокаМодуля, "//") Тогда - - НовыйБлок = ТипыБлоковМодуля.Комментарий; - ЭтоКонецБлока = Истина; - - ИначеЕсли СтрНачинаетсяС(СтрокаМодуля, "&") Тогда - - НовыйБлок = ТипыБлоковМодуля.ДирективаКомпиляции; - ЭтоКонецБлока = Истина; - - ИначеЕсли СтрНачинаетсяС(СтрокаМодуля, "ПЕРЕМ") Тогда - - НовыйБлок = ТипыБлоковМодуля.ОписаниеПеременной; - УдалитьКомментарийИзСтроки(СтрокаМодуля); - ЭтоКонецБлока = СтрНайти(СтрокаМодуля, ";") > 0; - - ИначеЕсли СтрНачинаетсяС(СтрокаМодуля, "ПРОЦЕДУРА ") - ИЛИ СтрНачинаетсяС(СтрокаМодуля, "ФУНКЦИЯ ") - ИЛИ СтрНачинаетсяС(СтрокаМодуля, "FUNCTION ") - ИЛИ СтрНачинаетсяС(СтрокаМодуля, "PROCEDURE ") Тогда - - НовыйБлок = ?(СтрНачинаетсяС(СтрокаМодуля, "ПРОЦЕДУРА") ИЛИ СтрНачинаетсяС(СтрокаМодуля, "PROCEDURE"), ТипыБлоковМодуля.ЗаголовокПроцедуры, ТипыБлоковМодуля.ЗаголовокФункции); - - УдалитьКомментарийИзСтроки(СтрокаМодуля); - ПозицияСкобки = СтрНайти(СтрокаМодуля, ")"); - ЭтоКонецБлока = ПозицияСкобки > 0; - - ИначеЕсли СтрНачинаетсяС(СтрокаМодуля, "КОНЕЦПРОЦЕДУРЫ") - ИЛИ СтрНачинаетсяС(СтрокаМодуля, "КОНЕЦФУНКЦИИ") - ИЛИ СтрНачинаетсяС(СтрокаМодуля, "ENDFUNCTION") - ИЛИ СтрНачинаетсяС(СтрокаМодуля, "ENDPROCEDURE") Тогда - - НовыйБлок = ?(СтрНачинаетсяС(СтрокаМодуля, "КОНЕЦПРОЦЕДУРЫ") ИЛИ СтрНачинаетсяС(СтрокаМодуля, "ENDPROCEDURE"), ТипыБлоковМодуля.ОкончаниеПроцедуры, ТипыБлоковМодуля.ОкончаниеФункции); - ЭтоКонецБлока = Истина; - УдалитьКомментарийИзСтроки(СтрокаМодуля); - - ИначеЕсли ПустаяСтрока(СтрокаМодуля) И ТекущийБлок <> ТипыБлоковМодуля.Операторы Тогда - - НовыйБлок = ТипыБлоковМодуля.ПустаяСтрока; - ЭтоКонецБлока = Истина; - - Иначе - - НовыйБлок = ТипыБлоковМодуля.Операторы; - ЭтоКонецБлока = Истина; - - КонецЕсли; - Если НовыйБлок = ТекущийБлок Тогда КонечнаяСтрока = КонечнаяСтрока + 1; @@ -144,33 +54,19 @@ Если ЗначениеЗаполнено(ТекущийБлок) Тогда - НоваяЗаписьОБлоке = БлокиМодуля.Добавить(); - НоваяЗаписьОБлоке.ТипБлока = ТекущийБлок; - НоваяЗаписьОБлоке.НачальнаяСтрока = НачальнаяСтрока; - НоваяЗаписьОБлоке.КонечнаяСтрока = КонечнаяСтрока; - НоваяЗаписьОБлоке.ОписаниеБлока = Новый Структура; - - УдалятьКомментарии = ТекущийБлок = ТипыБлоковМодуля.ЗаголовокПроцедуры ИЛИ ТекущийБлок = ТипыБлоковМодуля.ЗаголовокФункции; - НоваяЗаписьОБлоке.Содержимое = ПолучитьСодержимоеБлока(СодержимоеФайла, НачальнаяСтрока, КонечнаяСтрока, УдалятьКомментарии); + ЗапомнитьНовыйБлок(БлокиМодуля, ТекущийБлок, НачальнаяСтрока, КонечнаяСтрока, СодержимоеФайла); КонецЕсли; НачальнаяСтрока = НомерСтроки; КонечнаяСтрока = НомерСтроки; - ТекущийБлок = НовыйБлок; + ТекущийБлок = НовыйБлок; КонецЕсли; Если НомерСтроки = КоличествоСтрокМодуля Тогда - НоваяЗаписьОБлоке = БлокиМодуля.Добавить(); - НоваяЗаписьОБлоке.ТипБлока = ТекущийБлок; - НоваяЗаписьОБлоке.НачальнаяСтрока = НачальнаяСтрока; - НоваяЗаписьОБлоке.КонечнаяСтрока = КонечнаяСтрока; - НоваяЗаписьОБлоке.ОписаниеБлока = Новый Структура; - - УдалятьКомментарии = ТекущийБлок = ТипыБлоковМодуля.ЗаголовокПроцедуры ИЛИ ТекущийБлок = ТипыБлоковМодуля.ЗаголовокФункции; - НоваяЗаписьОБлоке.Содержимое = ПолучитьСодержимоеБлока(СодержимоеФайла, НачальнаяСтрока, КонечнаяСтрока, УдалятьКомментарии); + ЗапомнитьНовыйБлок(БлокиМодуля, ТекущийБлок, НачальнаяСтрока, КонечнаяСтрока, СодержимоеФайла); КонецЕсли; @@ -188,6 +84,20 @@ // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ /////////////////////////////////////////////////////////////////////////////// +Функция ЭтоКонецБлокаСкобка(СтрокаМодуля) + Возврат СтрНайти(СтрокаМодуля, ")") > 0; +КонецФункции + +Функция ЭтоКонецБлокаТЗапятая(СтрокаМодуля) + Возврат СтрНайти(СтрокаМодуля, ";") > 0; +КонецФункции + +Процедура УдалитьКомментарийИзСтрокиСначала(СтрокаМодуля) + Если СтрНачинаетсяС(СтрокаМодуля, "//") Тогда + СтрокаМодуля = Сред(СтрокаМодуля, 4); + КонецЕсли; +КонецПроцедуры + Процедура УдалитьКомментарийИзСтроки(СтрокаМодуля) ПозицияКомментария = СтрНайти(СтрокаМодуля, "//"); @@ -199,41 +109,114 @@ КонецПроцедуры -Функция ПолучитьНазначениеБлока(Файл, Знач НачальнаяСтрока, Знач КонечнаяСтрока, ИмяБлока = "") +Процедура ПрочитатьСтрокуМодуля(СтрокаМодуля, НовыйБлок, ТекущийБлок, ЭтоКонецБлока) + Если НЕ ЭтоКонецБлока Тогда + НовыйБлок = ТекущийБлок; + Если НовыйБлок = ТипыБлоковМодуля.ОписаниеПеременной Тогда + УдалитьКомментарийИзСтроки(СтрокаМодуля); + ЭтоКонецБлока = ЭтоКонецБлокаТЗапятая(СтрокаМодуля); + ИначеЕсли НовыйБлок = ТипыБлоковМодуля.ЗаголовокПроцедуры + ИЛИ НовыйБлок = ТипыБлоковМодуля.ЗаголовокФункции Тогда + УдалитьКомментарийИзСтроки(СтрокаМодуля); + ЭтоКонецБлока = ЭтоКонецБлокаСкобка(СтрокаМодуля); + Иначе + ЭтоКонецБлока = Истина; + КонецЕсли; + ИначеЕсли ЭтоБлокОбласти(СтрокаМодуля, НовыйБлок) Тогда + ЭтоКонецБлока = Истина; + УдалитьКомментарийИзСтрокиСначала(СтрокаМодуля); + ИначеЕсли СтрНачинаетсяС(СтрокаМодуля, "//") Тогда + НовыйБлок = ТипыБлоковМодуля.Комментарий; + ЭтоКонецБлока = Истина; + ИначеЕсли СтрНачинаетсяС(СтрокаМодуля, "&") Тогда + НовыйБлок = ТипыБлоковМодуля.ДирективаКомпиляции; + ЭтоКонецБлока = Истина; + ИначеЕсли СтрНачинаетсяС(СтрокаМодуля, "ПЕРЕМ") Тогда + НовыйБлок = ТипыБлоковМодуля.ОписаниеПеременной; + УдалитьКомментарийИзСтроки(СтрокаМодуля); + ЭтоКонецБлока = ЭтоКонецБлокаТЗапятая(СтрокаМодуля); + ИначеЕсли ЭтоБлокНачалоМетода(СтрокаМодуля, НовыйБлок) Тогда + УдалитьКомментарийИзСтроки(СтрокаМодуля); + ЭтоКонецБлока = ЭтоКонецБлокаСкобка(СтрокаМодуля); + ИначеЕсли ЭтоБлокКонецМетода(СтрокаМодуля, НовыйБлок) Тогда + ЭтоКонецБлока = Истина; + УдалитьКомментарийИзСтроки(СтрокаМодуля); + ИначеЕсли ПустаяСтрока(СтрокаМодуля) И ТекущийБлок <> ТипыБлоковМодуля.Операторы Тогда + НовыйБлок = ТипыБлоковМодуля.ПустаяСтрока; + ЭтоКонецБлока = Истина; + Иначе + НовыйБлок = ТипыБлоковМодуля.Операторы; + ЭтоКонецБлока = Истина; + КонецЕсли; + +КонецПроцедуры + +Функция ЭтоБлокОбласти(СтрокаМодуля, НовыйБлок) + Если ТипыБлоковМодуля.ЭтоБлокНачалоОбласти(СтрокаМодуля) Тогда + НовыйБлок = ТипыБлоковМодуля.НачалоОбласти; + Возврат Истина; + ИначеЕсли ТипыБлоковМодуля.ЭтоБлокКонецОбласти(СтрокаМодуля) Тогда + НовыйБлок = ТипыБлоковМодуля.КонецОбласти; + Возврат Истина; + Иначе + Возврат Ложь; + КонецЕсли; +КонецФункции + +Функция ЭтоБлокНачалоМетода(СтрокаМодуля, НовыйБлок) + Если ТипыБлоковМодуля.ЭтоБлокНачалоПроцедуры(СтрокаМодуля) Тогда + НовыйБлок = ТипыБлоковМодуля.ЗаголовокПроцедуры; + Возврат Истина; + ИначеЕсли ТипыБлоковМодуля.ЭтоБлокНачалоФункции(СтрокаМодуля) Тогда + НовыйБлок = ТипыБлоковМодуля.ЗаголовокФункции; + Возврат Истина; + Иначе + Возврат Ложь; + КонецЕсли; +КонецФункции + +Функция ЭтоБлокКонецМетода(СтрокаМодуля, НовыйБлок) + Если ТипыБлоковМодуля.ЭтоБлокКонецПроцедуры(СтрокаМодуля) Тогда + НовыйБлок = ТипыБлоковМодуля.ОкончаниеПроцедуры; + Возврат Истина; + ИначеЕсли ТипыБлоковМодуля.ЭтоБлокКонецФункции(СтрокаМодуля) Тогда + НовыйБлок = ТипыБлоковМодуля.ОкончаниеФункции; + Возврат Истина; + Иначе + Возврат Ложь; + КонецЕсли; +КонецФункции + +Процедура ЗапомнитьНовыйБлок(БлокиМодуля, ТекущийБлок, НачальнаяСтрока, КонечнаяСтрока, СодержимоеФайла) + НоваяЗаписьОБлоке = БлокиМодуля.Добавить(); + НоваяЗаписьОБлоке.ТипБлока = ТекущийБлок; + НоваяЗаписьОБлоке.НачальнаяСтрока = НачальнаяСтрока; + НоваяЗаписьОБлоке.КонечнаяСтрока = КонечнаяСтрока; + НоваяЗаписьОБлоке.ОписаниеБлока = Новый Структура; + + УдалятьКомментарии = ТекущийБлок = ТипыБлоковМодуля.ЗаголовокПроцедуры + ИЛИ ТекущийБлок = ТипыБлоковМодуля.ЗаголовокФункции; + НоваяЗаписьОБлоке.Содержимое = ПолучитьСодержимоеБлока(СодержимоеФайла, НачальнаяСтрока, + КонечнаяСтрока, УдалятьКомментарии); +КонецПроцедуры + +Функция ПолучитьНазначениеБлока(Файл, Знач НачальнаяСтрока, Знач КонечнаяСтрока) Назначение = ""; - Если НачальнаяСтрока + 1 < КонечнаяСтрока Тогда - - СтрокаМодуляНач = СокрЛП(Файл.ПолучитьСтроку(НачальнаяСтрока)); - СтрокаМодуляКон = СокрЛП(Файл.ПолучитьСтроку(КонечнаяСтрока)); - Если СтрНачинаетсяС(СтрокаМодуляНач, "////") - И СтрНачинаетсяС(СтрокаМодуляКон, "////") Тогда // да, это описание - - Если Не ПустаяСтрока(ИмяБлока) Тогда - - СтрокаМодуля2 = СокрЛП(Файл.ПолучитьСтроку(НачальнаяСтрока + 1)); - Если СтрНачинаетсяС(СтрокаМодуля2, "// " + ИмяБлока) Тогда - - НачальнаяСтрока = НачальнаяСтрока + 1; - - Иначе - - // имени блока нет, пропускаем - НачальнаяСтрока = КонечнаяСтрока; - - КонецЕсли; - - КонецЕсли; - - Для Ит = НачальнаяСтрока + 1 По КонечнаяСтрока - 1 Цикл - - СтрокаМодуля = СокрЛП(Сред(Файл.ПолучитьСтроку(Ит), 3)); - Назначение = Назначение + ?(ПустаяСтрока(Назначение), "", Символы.ПС) + СтрокаМодуля; - - КонецЦикла; - - КонецЕсли; + Если НЕ (НачальнаяСтрока + 1 < КонечнаяСтрока) Тогда + Возврат Назначение; + КонецЕсли; + СтрокаМодуляНач = СокрЛП(Файл.ПолучитьСтроку(НачальнаяСтрока)); + СтрокаМодуляКон = СокрЛП(Файл.ПолучитьСтроку(КонечнаяСтрока)); + Если СтрНачинаетсяС(СтрокаМодуляНач, "////") + И СтрНачинаетсяС(СтрокаМодуляКон, "////") Тогда // да, это описание + + Для Ит = НачальнаяСтрока + 1 По КонечнаяСтрока - 1 Цикл + + СтрокаМодуля = СокрЛП(Сред(Файл.ПолучитьСтроку(Ит), 3)); + Назначение = Назначение + ?(ПустаяСтрока(Назначение), "", Символы.ПС) + СтрокаМодуля; + КонецЦикла; КонецЕсли; Возврат Назначение; @@ -259,96 +242,7 @@ КонецЕсли; - СтрокаПараметров = СокрЛП(СтрокаПараметров); - ПараметрМетода = ПараметрыМетода.Добавить(); - ЗаполнитьЗначенияСвойств(ПараметрМетода, Новый Структура("ЗНАЧ, Имя, ЗначениеПоУмолчанию, ТипПараметра, ОписаниеПараметра", Ложь, "", Неопределено, "", "")); - - // отделим ЗНАЧ - Если СтрНачинаетсяС(ВРег(СтрокаПараметров), "ЗНАЧ ") Тогда - - ПараметрМетода.ЗНАЧ = Истина; - СтрокаПараметров = СокрЛП(Сред(СтрокаПараметров, 5)); - - КонецЕсли; - - // отделим имя - ПозицияРавно = СтрНайти(СтрокаПараметров, "="); - ПозицияЗапятая = СтрНайти(СтрокаПараметров, ","); - - Если ПозицияЗапятая + ПозицияРавно = 0 Тогда - - // вся строка параметр - ПараметрМетода.Имя = СокрЛП(СтрокаПараметров); - СтрокаПараметров = ""; - - ИначеЕсли ПозицияРавно = 0 ИЛИ ПозицияРавно > ПозицияЗапятая И ПозицияЗапятая > 0 Тогда - - // значения по умолчанию нет - ПараметрМетода.Имя = СокрЛП(Лев(СтрокаПараметров, ПозицияЗапятая - 1)); - СтрокаПараметров = СокрЛП(Сред(СтрокаПараметров, ПозицияЗапятая + 1)); - - Иначе // есть значение по умолчанию - - ПараметрМетода.Имя = СокрЛП(Лев(СтрокаПараметров, ПозицияРавно - 1)); - СтрокаПараметров = СокрЛП(Сред(СтрокаПараметров, ПозицияРавно + 1)); - ПозицияЗапятая = СтрНайти(СтрокаПараметров, ","); - Если ПозицияЗапятая = 0 Тогда - - // до конца строки - это значение по умолчанию - ПараметрМетода.ЗначениеПоУмолчанию = СтрокаПараметров; - СтрокаПараметров = ""; - - Иначе - - // надо отделить значение по умолчанию от следующего параметра - // варианты значения - число, строка, булево, Неопределено - ПозицияКавычки = СтрНайти(СтрокаПараметров, """"); - Если ПозицияКавычки = 0 ИЛИ ПозицияКавычки > ПозицияЗапятая Тогда - - // текущее значение по умолчанию не строковое - ПараметрМетода.ЗначениеПоУмолчанию = СокрЛП(Лев(СтрокаПараметров, ПозицияЗапятая - 1)); - СтрокаПараметров = СокрЛП(Сред(СтрокаПараметров, ПозицияЗапятая + 1)); - - Иначе - - ЗначениеПараметра = ""; - КавычкаОткрыта = Истина; - Пока Истина Цикл - - ПозицияКавычки = СтрНайти(СтрокаПараметров, """", , 2); - КавычкаОткрыта = НЕ КавычкаОткрыта; - ЗначениеПараметра = ЗначениеПараметра + Лев(СтрокаПараметров, ПозицияКавычки); - СтрокаПараметров = Сред(СтрокаПараметров, ПозицияКавычки + 1); - - Если ПустаяСтрока(СтрокаПараметров) Тогда - - Прервать; - - Иначе - - ПозицияЗапятая = СтрНайти(СтрокаПараметров, ","); - ПозицияКавычки = СтрНайти(СтрокаПараметров, """", , 2); - - Если ПозицияКавычки = 0 ИЛИ ПозицияКавычки > ПозицияЗапятая ИЛИ НЕ КавычкаОткрыта Тогда - - - ЗначениеПараметра = СокрЛП(ЗначениеПараметра + Лев(СтрокаПараметров, ПозицияЗапятая - 1)); - СтрокаПараметров = СокрЛП(Сред(СтрокаПараметров, ПозицияЗапятая + 1)); - Прервать; - - КонецЕсли; - - КонецЕсли; - - КонецЦикла; - - ПараметрМетода.ЗначениеПоУмолчанию = ЗначениеПараметра; - - КонецЕсли; - - КонецЕсли; - - КонецЕсли; + РазобратьСтрокуПараметров(СтрокаПараметров, ПараметрыМетода); КонецЦикла; @@ -356,11 +250,99 @@ КонецФункции +Процедура РазобратьСтрокуПараметров(СтрокаПараметров, ПараметрыМетода) + СтрокаПараметров = СокрЛП(СтрокаПараметров); + ПараметрМетода = ПараметрыМетода.Добавить(); + ПараметрМетода.ЗНАЧ = Ложь; + ПараметрМетода.Имя = ""; + ПараметрМетода.ЗначениеПоУмолчанию = Неопределено; + ПараметрМетода.ТипПараметра = ""; + ПараметрМетода.ОписаниеПараметра = ""; + + // отделим ЗНАЧ + Если СтрНачинаетсяС(ВРег(СтрокаПараметров), "ЗНАЧ ") Тогда + + ПараметрМетода.ЗНАЧ = Истина; + СтрокаПараметров = СокрЛП(Сред(СтрокаПараметров, 5)); + + КонецЕсли; + + // отделим имя + ПозицияРавно = СтрНайти(СтрокаПараметров, "="); + ПозицияЗапятая = СтрНайти(СтрокаПараметров, ","); + + Если ПозицияЗапятая + ПозицияРавно = 0 Тогда + + // вся строка параметр + ПараметрМетода.Имя = СокрЛП(СтрокаПараметров); + СтрокаПараметров = ""; + + ИначеЕсли ПозицияРавно = 0 ИЛИ ПозицияРавно > ПозицияЗапятая И ПозицияЗапятая > 0 Тогда + + // значения по умолчанию нет + ПараметрМетода.Имя = СокрЛП(Лев(СтрокаПараметров, ПозицияЗапятая - 1)); + СтрокаПараметров = СокрЛП(Сред(СтрокаПараметров, ПозицияЗапятая + 1)); + + Иначе // есть значение по умолчанию + + ПараметрМетода.Имя = СокрЛП(Лев(СтрокаПараметров, ПозицияРавно - 1)); + СтрокаПараметров = СокрЛП(Сред(СтрокаПараметров, ПозицияРавно + 1)); + ПозицияЗапятая = СтрНайти(СтрокаПараметров, ","); + Если ПозицияЗапятая = 0 Тогда + + // до конца строки - это значение по умолчанию + ПараметрМетода.ЗначениеПоУмолчанию = СтрокаПараметров; + СтрокаПараметров = ""; + Возврат; + + КонецЕсли; + + // надо отделить значение по умолчанию от следующего параметра + // варианты значения - число, строка, булево, Неопределено + ПозицияКавычки = СтрНайти(СтрокаПараметров, """"); + Если ПозицияКавычки = 0 ИЛИ ПозицияКавычки > ПозицияЗапятая Тогда + + // текущее значение по умолчанию не строковое + ПараметрМетода.ЗначениеПоУмолчанию = СокрЛП(Лев(СтрокаПараметров, ПозицияЗапятая - 1)); + СтрокаПараметров = СокрЛП(Сред(СтрокаПараметров, ПозицияЗапятая + 1)); + Возврат; + + КонецЕсли; + + ПараметрМетода.ЗначениеПоУмолчанию = ПрочитатьЗначениепараметра(СтрокаПараметров); + + КонецЕсли; + +КонецПроцедуры + +Функция ПрочитатьЗначениепараметра(СтрокаПараметров) + ЗначениеПараметра = ""; + КавычкаОткрыта = Истина; + Пока Истина Цикл + + ПозицияКавычки = СтрНайти(СтрокаПараметров, """", , 2); + КавычкаОткрыта = НЕ КавычкаОткрыта; + ЗначениеПараметра = ЗначениеПараметра + Лев(СтрокаПараметров, ПозицияКавычки); + СтрокаПараметров = Сред(СтрокаПараметров, ПозицияКавычки + 1); + + ПозицияЗапятая = СтрНайти(СтрокаПараметров, ","); + ПозицияКавычки = СтрНайти(СтрокаПараметров, """", , 2); + + Если ПозицияКавычки = 0 ИЛИ ПозицияКавычки > ПозицияЗапятая ИЛИ НЕ КавычкаОткрыта Тогда + + ЗначениеПараметра = СокрЛП(ЗначениеПараметра + Лев(СтрокаПараметров, ПозицияЗапятая - 1)); + СтрокаПараметров = СокрЛП(Сред(СтрокаПараметров, ПозицияЗапятая + 1)); + Прервать; + + КонецЕсли; + + КонецЦикла; + Возврат ЗначениеПараметра; +КонецФункции + Процедура ДополнитьБлокиМодуля(БлокиМодуля, Файл, Модуль) - ОписаниеМодуля = Новый Структура( - "Глобальный, ЕстьНазначениеМодуля, Назначение, Разделы", - Ложь, Ложь, "", Новый Массив); + ОписаниеМодуля = НовыйОписаниеМодуля(); НазначениеМодуляПрошли = Ложь; РазделОткрыт = Ложь; @@ -373,8 +355,6 @@ ПоследнийБлокКомментария = Неопределено; ПоследнийБлокМетода = Неопределено; - БлокиДляУдаления = Новый Массив; - Для Каждого Блок Из БлокиМодуля Цикл Блок.ОписаниеБлока.Вставить("ЭтоРаздел", Ложь); @@ -387,168 +367,71 @@ Блок.ОписаниеБлока.Вставить("Экспортный", Ложь); Блок.ОписаниеБлока.Вставить("ТипВозвращаемогоЗначения", ""); Блок.ОписаниеБлока.Вставить("ОписаниеВозвращаемогоЗначения", ""); - Блок.ОписаниеБлока.Вставить("Примеры", Новый Массив); + Блок.ОписаниеБлока.Вставить("Примеры", Новый Массив); Блок.ОписаниеБлока.Вставить("Тело", ""); - Если МетодОткрыт Тогда - - БлокиДляУдаления.Добавить(Блок); - - КонецЕсли; - Если Блок.ТипБлока = ТипыБлоковМодуля.ПустаяСтрока Тогда Продолжить; КонецЕсли; - Если Блок.ТипБлока <> ТипыБлоковМодуля.Комментарий Тогда + Если Не НазначениеМодуляПрошли Тогда // если комментарий не первый, значит уже и нет смысла искать описания - НазначениеМодуляПрошли = Истина; + НазначениеМодуляПрошли = Блок.ТипБлока <> ТипыБлоковМодуля.Комментарий; КонецЕсли; Если Блок.ТипБлока = ТипыБлоковМодуля.Комментарий Тогда - Если НЕ НазначениеМодуляПрошли Тогда - - // первый комментарий считаем описанием модуля - НазначениеМодуляПрошли = Истина; - Назначение = ПолучитьНазначениеБлока(Файл, Блок.НачальнаяСтрока, Блок.КонечнаяСтрока); - - Блок.ТипБлока = ТипыБлоковМодуля.Описание; - ОписаниеМодуля.ЕстьНазначениеМодуля = НЕ ПустаяСтрока(Назначение); - ОписаниеМодуля.Назначение = Назначение; - - Иначе - - ПоследнийБлокКомментария = Блок; - - КонецЕсли; + ДополнитьИнформациейКомментария(Файл, Блок, ОписаниеМодуля, НазначениеМодуляПрошли, ПоследнийБлокКомментария); ИначеЕсли Блок.ТипБлока = ТипыБлоковМодуля.НачалоОбласти Тогда СтрокаМодуля = СокрЛП(Файл.ПолучитьСтроку(Блок.НачальнаяСтрока)); ИмяОбласти = СокрЛП(Сред(СтрокаМодуля, СтрДлина("#Область") + 1)); - ЭтоРаздел = Ложь; - Если Модуль.ТипМодуля = ТипыМодуля.ОбщийМодуль Тогда - - ЭтоРаздел = ТипыОбласти.РазделыОбщегоМодуля.Найти(ИмяОбласти) <> Неопределено; - - ИначеЕсли Модуль.ТипМодуля = ТипыМодуля.МодульМенеджера Тогда - - ЭтоРаздел = ТипыОбласти.РазделыМодуляМенеджера.Найти(ИмяОбласти) <> Неопределено; - - КонецЕсли; - - Если ЭтоРаздел И (РазделОткрыт ИЛИ ЛокальнаяОбластьОткрыта ИЛИ МетодОткрыт) Тогда - - // кривая структура модуля - ЭтоРаздел = Ложь; - - КонецЕсли; - - ТекущаяОбласть = ""; - Если Области.Количество() Тогда - - ТекущаяОбласть = Области[Области.ВГраница()]; - - КонецЕсли; + ЭтоРаздел = ЭтоРаздел(Модуль, ИмяОбласти, РазделОткрыт, ЛокальнаяОбластьОткрыта, МетодОткрыт); Блок.ОписаниеБлока.Вставить("ЭтоРаздел", ЭтоРаздел); Блок.ОписаниеБлока.Вставить("ИмяРаздела", ТекущийРаздел); - Блок.ОписаниеБлока.Вставить("ИмяОбласти", ТекущаяОбласть); + Блок.ОписаниеБлока.Вставить("ИмяОбласти", ТекущаяОбласть(Области)); Блок.ОписаниеБлока.Вставить("НазначениеРаздела", ""); Если ЭтоРаздел Тогда - РазделОткрыт = Истина; ТекущийРаздел = ИмяОбласти; ОписаниеМодуля.Разделы.Добавить(ТекущийРаздел); // заполним описание раздела - Если ПоследнийБлокКомментария <> Неопределено Тогда - - Назначение = ПолучитьНазначениеБлока(Файл, ПоследнийБлокКомментария.НачальнаяСтрока, ПоследнийБлокКомментария.КонечнаяСтрока, ИмяОбласти); - Блок.ОписаниеБлока.Вставить("НазначениеРаздела", Назначение); - Если НЕ ПустаяСтрока(Назначение) Тогда - - ПоследнийБлокКомментария.ТипБлока = ТипыБлоковМодуля.Описание; - - КонецЕсли; - - ПоследнийБлокКомментария = Неопределено; - - КонецЕсли; - + ДополнитьИнформациейРаздела(Файл, Блок, ПоследнийБлокКомментария); Иначе - ЛокальнаяОбластьОткрыта = Истина; - Области.Добавить(ИмяОбласти); - + Области.Добавить(ИмяОбласти); КонецЕсли; - ИначеЕсли Блок.ТипБлока = ТипыБлоковМодуля.КонецОбласти Тогда - + ИначеЕсли Блок.ТипБлока = ТипыБлоковМодуля.КонецОбласти И ЛокальнаяОбластьОткрыта Тогда ПоследнийБлокКомментария = Неопределено; - - Если ЛокальнаяОбластьОткрыта Тогда - - Области.Удалить(Области.ВГраница()); - ЛокальнаяОбластьОткрыта = Области.Количество(); - - ИначеЕсли РазделОткрыт Тогда - - РазделОткрыт = Ложь; - ТекущийРаздел = ""; - - Иначе - - // ошибка, пока не обрабатываю - - КонецЕсли; - + Области.Удалить(Области.ВГраница()); + ЛокальнаяОбластьОткрыта = Области.Количество(); + ИначеЕсли Блок.ТипБлока = ТипыБлоковМодуля.КонецОбласти И РазделОткрыт Тогда + ПоследнийБлокКомментария = Неопределено; + РазделОткрыт = Ложь; + ТекущийРаздел = ""; ИначеЕсли Блок.ТипБлока = ТипыБлоковМодуля.ЗаголовокПроцедуры ИЛИ Блок.ТипБлока = ТипыБлоковМодуля.ЗаголовокФункции Тогда Блок.ОписаниеБлока.Вставить("ИмяРаздела", ТекущийРаздел); - Если Области.Количество() Тогда - - Блок.ОписаниеБлока.Вставить("ИмяОбласти", Области[Области.ВГраница()]); - - Иначе - - Блок.ОписаниеБлока.Вставить("ИмяОбласти", ""); - - КонецЕсли; + Блок.ОписаниеБлока.Вставить("ИмяОбласти", ТекущаяОбласть(Области)); МетодОткрыт = Истина; ПоследнийБлокМетода = Блок; // получим имя метода - Заголовок = СтрЗаменить(Блок.Содержимое, Символы.ПС, " "); - Заголовок = СокрЛП(СтрЗаменить(Заголовок, Символы.Таб, " ")); - Если Блок.ТипБлока = ТипыБлоковМодуля.ЗаголовокПроцедуры Тогда - - Заголовок = СокрЛП(Сред(Заголовок, СтрДлина("Процедура") + 1)) - - Иначе - - Если СтрНачинаетсяС(Заголовок, "Функция") Тогда - - Заголовок = СокрЛП(Сред(Заголовок, СтрДлина("Функция") + 1)) - - Иначе - - Заголовок = СокрЛП(Сред(Заголовок, СтрДлина("Function") + 1)) - - КонецЕсли; - - КонецЕсли; - + Заголовок = ЗаголовокМетода(Блок); + // получим параметры метода ПозицияСкобки = СтрНайти(Заголовок, "("); ИмяМетода = Лев(Заголовок, ПозицияСкобки - 1); @@ -565,241 +448,34 @@ Блок.ОписаниеБлока.Вставить("Примеры", Новый Массив); // получим описание метода - Если ПоследнийБлокКомментария <> Неопределено Тогда - - СтрокаКомментария = Файл.ПолучитьСтроку(ПоследнийБлокКомментария.НачальнаяСтрока); - СтрокаКомментария = СокрЛП(Сред(СтрокаКомментария, 3)); - Если СтрНайти(СтрокаКомментария, ИмяМетода) Тогда - - ПоследнийБлокКомментария.ТипБлока = ТипыБлоковМодуля.Описание; - Назначение = ""; - НомерСтрокиПараметры = Неопределено; - НомерСтрокиВозвращаемоеЗначение = Неопределено; - НомерСтрокиПример = Неопределено; - НомерСтроки = Неопределено; - Для Ит = ПоследнийБлокКомментария.НачальнаяСтрока + 1 По ПоследнийБлокКомментария.КонечнаяСтрока Цикл - - СтрокаКомментария = Файл.ПолучитьСтроку(Ит); - СтрокаКомментария = СокрЛП(Сред(СтрокаКомментария, 3)); - Если СтрНачинаетсяС(СтрокаКомментария, "Параметры:") Тогда - - НомерСтрокиПараметры = Ит; - Прервать; - - ИначеЕсли СтрНачинаетсяС(СтрокаКомментария, "Возвращаемое значение:") Тогда - - НомерСтрокиВозвращаемоеЗначение = Ит; - Прервать; - - ИначеЕсли СтрНачинаетсяС(СтрокаКомментария, "Примеры:") ИЛИ СтрНачинаетсяС(СтрокаКомментария, "Пример:") Тогда - - НомерСтрокиПример = Ит; - Прервать; - - Иначе - - Назначение = Назначение + ?(ПустаяСтрока(Назначение), "", Символы.ПС) + СтрокаКомментария; - - КонецЕсли; - - КонецЦикла; - - Если НомерСтрокиПараметры <> Неопределено Тогда - - ИмяПараметра = Неопределено; - ОписаниеПараметра = ""; - ТипПараметра = ""; - Дочитывание = Ложь; - ПрошлаяСтрока = ""; - Для Ит = НомерСтрокиПараметры + 1 По ПоследнийБлокКомментария.КонечнаяСтрока Цикл - - СтрокаКомментария = Файл.ПолучитьСтроку(Ит); - СтрокаКомментария = СокрЛП(Сред(СтрокаКомментария, 3)); - Если СтрНачинаетсяС(СтрокаКомментария, "Возвращаемое значение:") Тогда - - НомерСтрокиВозвращаемоеЗначение = Ит; - Прервать; - - ИначеЕсли СтрНачинаетсяС(СтрокаКомментария, "Примеры:") ИЛИ СтрНачинаетсяС(СтрокаКомментария, "Пример:") Тогда - - НомерСтрокиПример = Ит; - Прервать; - - Иначе - - Если Дочитывание Тогда - СтрокаКомментария = ПрошлаяСтрока + СтрокаКомментария; - ПрошлаяСтрока = ""; - Дочитывание = Ложь; - КонецЕсли; - - // шаблон параметра - // 'Имя' - 'Тип' - 'Описание' - // 'продолжение описания' - СоставСтрокиКомментария = СтрРазделить(СтрокаКомментария, "-"); - Если СоставСтрокиКомментария.Количество() >= 3 Тогда - - Если ИмяПараметра <> Неопределено Тогда - - СтрокаПараметраМетода = Блок.ОписаниеБлока.ПараметрыМетода.Найти(ИмяПараметра, "Имя"); - Если СтрокаПараметраМетода <> Неопределено Тогда - - СтрокаПараметраМетода.ТипПараметра = ТипПараметра; - СтрокаПараметраМетода.ОписаниеПараметра = ОписаниеПараметра; - - КонецЕсли; - - КонецЕсли; - - // это описание параметра - ИмяПараметра = СокрЛП(СоставСтрокиКомментария[0]); - ТипПараметра = СокрЛП(СоставСтрокиКомментария[1]); - - ПозицияДефис = СтрНайти(СтрокаКомментария, "-"); - ПозицияДефис = СтрНайти(СтрокаКомментария, "-",, ПозицияДефис + 1); - ОписаниеПараметра = СокрЛП(Сред(СтрокаКомментария, ПозицияДефис + 1)); - - - ИначеЕсли СоставСтрокиКомментария.Количество() = 2 и СтрЗаканчиваетсяНа(СокрЛП(СоставСтрокиКомментария[1]), ",") Тогда - // шаблон параметра - // 'Имя' - 'Тип','Тип', - // 'Тип' - 'Описание' - // 'продолжение описания' - ПрошлаяСтрока = СтрокаКомментария; - Дочитывание = Истина; - Продолжить; - - Иначе - - // продолжение описания параметра либо косячное описание - ОписаниеПараметра = ОписаниеПараметра + ?(ПустаяСтрока(ОписаниеПараметра), "", Символы.ПС) + СтрокаКомментария; - - КонецЕсли; - - КонецЕсли; - - КонецЦикла; - - Если ИмяПараметра <> Неопределено Тогда - - СтрокаПараметраМетода = Блок.ОписаниеБлока.ПараметрыМетода.Найти(ИмяПараметра, "Имя"); - Если СтрокаПараметраМетода <> Неопределено Тогда - - СтрокаПараметраМетода.ТипПараметра = ТипПараметра; - СтрокаПараметраМетода.ОписаниеПараметра = ОписаниеПараметра; - - КонецЕсли; - - КонецЕсли; - - КонецЕсли; - - Если НомерСтрокиВозвращаемоеЗначение <> Неопределено Тогда - - ОписаниеПараметра = ""; - ТипПараметра = ""; - Для Ит = НомерСтрокиВозвращаемоеЗначение + 1 По ПоследнийБлокКомментария.КонечнаяСтрока Цикл - - СтрокаКомментария = Файл.ПолучитьСтроку(Ит); - СтрокаКомментария = СокрЛП(Сред(СтрокаКомментария, 3)); - - Если СтрНачинаетсяС(СтрокаКомментария, "Пример") Тогда - - НомерСтрокиПример = Ит; - Прервать; - - Иначе - - // шаблон параметра - // 'Тип' - 'Описание' - // 'продолжение описания' - - СоставСтрокиКомментария = СтрРазделить(СтрокаКомментария, "-"); - Если ТипПараметра = "" И СоставСтрокиКомментария.Количество() >= 2 Тогда - - // это описание параметра - ТипПараметра = СокрЛП(СоставСтрокиКомментария[0]); - - ПозицияДефис = СтрНайти(СтрокаКомментария, "-"); - ОписаниеПараметра = СокрЛП(Сред(СтрокаКомментария, ПозицияДефис + 1)); - - Иначе - - // продолжение описания параметра либо косячное описание - ОписаниеПараметра = ОписаниеПараметра + ?(ПустаяСтрока(ОписаниеПараметра), "", Символы.ПС) + СтрокаКомментария; - - КонецЕсли; - - КонецЕсли; - - КонецЦикла; - - Если ТипПараметра <> "" Тогда - - Блок.ОписаниеБлока.Вставить("ТипВозвращаемогоЗначения", ТипПараметра); - Блок.ОписаниеБлока.Вставить("ОписаниеВозвращаемогоЗначения", ОписаниеПараметра); - - КонецЕсли; - - КонецЕсли; - - Если НомерСтрокиПример <> Неопределено Тогда - - Примеры = Новый Массив; - СтрокаПример = ""; - Для Ит = НомерСтрокиПример + 1 По ПоследнийБлокКомментария.КонечнаяСтрока Цикл - - СтрокаКомментария = Файл.ПолучитьСтроку(Ит); - СтрокаКомментария = СокрЛП(Сред(СтрокаКомментария, 3)); - - Если СтрНачинаетсяС(СтрокаКомментария, "Пример") Тогда - - Примеры.Добавить(СтрокаПример); - СтрокаПример = ""; - Продолжить; - - ИначеЕсли Не ПустаяСтрока(СтрокаКомментария) Тогда - - СтрокаПример = СтрокаПример + ?(ПустаяСтрока(СтрокаПример), "", Символы.ПС) - + СтрокаКомментария; - - КонецЕсли; - - КонецЦикла; - - Если СтрокаПример <> "" Тогда - - Примеры.Добавить(СтрокаПример); - - КонецЕсли; - - Если Примеры.Количество() Тогда - - Блок.ОписаниеБлока.Вставить("Примеры", Примеры); - - КонецЕсли; - - КонецЕсли; - - Блок.ОписаниеБлока.Вставить("Назначение", Назначение); - - Иначе - - // кривое описание либо ХЗ что это - - КонецЕсли; - - ПоследнийБлокКомментария = Неопределено; - + Если ПоследнийБлокКомментария = Неопределено Тогда + Продолжить; КонецЕсли; + + СтрокаКомментария = Файл.ПолучитьСтроку(ПоследнийБлокКомментария.НачальнаяСтрока); + СтрокаКомментария = СокрЛП(Сред(СтрокаКомментария, 3)); + + ПоследнийБлокКомментария.ТипБлока = ТипыБлоковМодуля.Описание; + + Назначение = ""; + НомераСтрок = Новый Структура("НомерСтрокиПараметры, НомерСтрокиВозвращаемоеЗначение, НомерСтрокиПример"); + ОпределитьНомераСтрок(Файл, ПоследнийБлокКомментария, НомераСтрок, Назначение); + ПолучитьПараметры(Файл, Блок, НомераСтрок, ПоследнийБлокКомментария); + Блок.ОписаниеБлока.Вставить("ТипВозвращаемогоЗначения", ПолучитьВозвращаемоеЗначение(Файл, НомераСтрок, ПоследнийБлокКомментария)); + Блок.ОписаниеБлока.Вставить("Примеры", ПолучитьПримеры(Файл, ПоследнийБлокКомментария, НомераСтрок.НомерСтрокиПример)); + Блок.ОписаниеБлока.Вставить("Назначение", Назначение); + + ПоследнийБлокКомментария = Неопределено; + ИначеЕсли Блок.ТипБлока = ТипыБлоковМодуля.ОкончаниеПроцедуры ИЛИ Блок.ТипБлока = ТипыБлоковМодуля.ОкончаниеФункции Тогда МетодОткрыт = Ложь; ПоследнийБлокКомментария = Неопределено; - ПоследнийБлокМетода.ОписаниеБлока.Тело = ПолучитьСодержимоеБлока(Файл, ПоследнийБлокМетода.КонечнаяСтрока + 1, Блок.НачальнаяСтрока - 1); + ПоследнийБлокМетода.ОписаниеБлока.Тело = ПолучитьСодержимоеБлока(Файл, + ПоследнийБлокМетода.КонечнаяСтрока + 1, Блок.НачальнаяСтрока - 1); ПоследнийБлокМетода = Неопределено; Иначе @@ -807,55 +483,331 @@ // забываем последний комментарий-блок ПоследнийБлокКомментария = Неопределено; - КонецЕсли; + КонецЕсли; КонецЦикла; - // // удалим служебные блоки - // Для Каждого Блок Из БлокиДляУдаления Цикл + УдалитьЛишнийБлок(БлокиМодуля); + + Модуль.ОписаниеМодуля = ОписаниеМодуля; - // БлокиМодуля.Удалить(Блок); +КонецПроцедуры - // КонецЦикла; +Функция НовыйОписаниеМодуля() + ОписаниеМодуля = Новый Структура(); + ОписаниеМодуля.Вставить("Глобальный", Ложь); + ОписаниеМодуля.Вставить("ЕстьНазначениеМодуля", Ложь); + ОписаниеМодуля.Вставить("Назначение", ""); + ОписаниеМодуля.Вставить("Разделы", Новый Массив()); + Возврат ОписаниеМодуля; +КонецФункции - КоличествоБлоков = БлокиМодуля.Количество() - 1; +Процедура УдалитьЛишнийБлок(БлокиМодуля) + КоличествоБлоков = БлокиМодуля.Количество() - 1; Для Ит = 0 По КоличествоБлоков Цикл Блок = БлокиМодуля[КоличествоБлоков - Ит]; - Если Блок.ТипБлока = ТипыБлоковМодуля.ОкончаниеПроцедуры - ИЛИ Блок.ТипБлока = ТипыБлоковМодуля.ОкончаниеФункции - ИЛИ Блок.ТипБлока = ТипыБлоковМодуля.КонецОбласти - ИЛИ Блок.ТипБлока = ТипыБлоковМодуля.Описание - ИЛИ Блок.ТипБлока = ТипыБлоковМодуля.ПустаяСтрока Тогда + БлокНадоУдалить = Блок.ТипБлока = ТипыБлоковМодуля.ОкончаниеПроцедуры + ИЛИ Блок.ТипБлока = ТипыБлоковМодуля.ОкончаниеФункции + ИЛИ Блок.ТипБлока = ТипыБлоковМодуля.КонецОбласти + ИЛИ Блок.ТипБлока = ТипыБлоковМодуля.Описание + ИЛИ Блок.ТипБлока = ТипыБлоковМодуля.ПустаяСтрока; + Если БлокНадоУдалить Тогда БлокиМодуля.Удалить(Блок); КонецЕсли; КонецЦикла; - - Модуль.ОписаниеМодуля = ОписаниеМодуля; +КонецПроцедуры +Функция ЭтоРаздел(Модуль, ИмяОбласти, РазделОткрыт, ЛокальнаяОбластьОткрыта, МетодОткрыт) + + Если Модуль.ТипМодуля = ТипыМодуля.ОбщийМодуль Тогда + ЭтоРаздел = ТипыОбласти.РазделыОбщегоМодуля.Найти(ИмяОбласти) <> Неопределено; + ИначеЕсли Модуль.ТипМодуля = ТипыМодуля.МодульМенеджера Тогда + ЭтоРаздел = ТипыОбласти.РазделыМодуляМенеджера.Найти(ИмяОбласти) <> Неопределено; + Иначе + ЭтоРаздел = Ложь; + КонецЕсли; + + Если РазделОткрыт ИЛИ ЛокальнаяОбластьОткрыта ИЛИ МетодОткрыт Тогда + // кривая структура модуля + ЭтоРаздел = Ложь; + КонецЕсли; + + Возврат ЭтоРаздел; + +КонецФункции + +Функция ТекущаяОбласть(Области) + Если Области.Количество() Тогда + Возврат Области[Области.ВГраница()]; + КонецЕсли; + Возврат ""; +КонецФункции + +Функция ЗаголовокМетода(Блок) + Заголовок = СтрЗаменить(Блок.Содержимое, Символы.ПС, " "); + Заголовок = СокрЛП(СтрЗаменить(Заголовок, Символы.Таб, " ")); + Если Блок.ТипБлока = ТипыБлоковМодуля.ЗаголовокПроцедуры Тогда + Заголовок = СокрЛП(Сред(Заголовок, СтрДлина("Процедура") + 1)); + ИначеЕсли СтрНачинаетсяС(Заголовок, "Функция") Тогда + Заголовок = СокрЛП(Сред(Заголовок, СтрДлина("Функция") + 1)); + Иначе + Заголовок = СокрЛП(Сред(Заголовок, СтрДлина("Function") + 1)); + КонецЕсли; + Возврат Заголовок; +КонецФункции + +Процедура ОпределитьНомераСтрок(Файл, ПоследнийБлокКомментария, НомераСтрок, Назначение) + Для Ит = ПоследнийБлокКомментария.НачальнаяСтрока По ПоследнийБлокКомментария.КонечнаяСтрока Цикл + СтрокаКомментария = Файл.ПолучитьСтроку(Ит); + СтрокаКомментария = СокрЛП(Сред(СтрокаКомментария, 3)); + Если СтрНачинаетсяС(СтрокаКомментария, "Параметры:") Тогда + НомераСтрок.НомерСтрокиПараметры = Ит; + Прервать; + ИначеЕсли СтрНачинаетсяС(СтрокаКомментария, "Возвращаемое значение:") Тогда + НомераСтрок.НомерСтрокиВозвращаемоеЗначение = Ит; + Прервать; + ИначеЕсли СтрНачинаетсяС(СтрокаКомментария, "Примеры:") ИЛИ СтрНачинаетсяС(СтрокаКомментария, "Пример:") Тогда + НомераСтрок.НомерСтрокиПример = Ит; + Прервать; + Иначе + Назначение = Назначение + ?(ПустаяСтрока(Назначение), "", Символы.ПС) + СтрокаКомментария; + КонецЕсли; + КонецЦикла; +КонецПроцедуры + +Процедура ДополнитьИнформациейКомментария(Файл, Блок, ОписаниеМодуля, НазначениеМодуляПрошли, ПоследнийБлокКомментария) + Если НЕ НазначениеМодуляПрошли Тогда + // первый комментарий считаем описанием модуля + НазначениеМодуляПрошли = Истина; + Назначение = ПолучитьНазначениеБлока(Файл, Блок.НачальнаяСтрока, Блок.КонечнаяСтрока); + + Блок.ТипБлока = ТипыБлоковМодуля.Описание; + ОписаниеМодуля.ЕстьНазначениеМодуля = НЕ ПустаяСтрока(Назначение); + ОписаниеМодуля.Назначение = Назначение; + Иначе + ПоследнийБлокКомментария = Блок; + КонецЕсли; +КонецПроцедуры + +Процедура ДополнитьИнформациейРаздела(Файл, Блок, ПоследнийБлокКомментария) + Если ПоследнийБлокКомментария <> Неопределено Тогда + + Назначение = ПолучитьНазначениеБлока(Файл, ПоследнийБлокКомментария.НачальнаяСтрока, + ПоследнийБлокКомментария.КонечнаяСтрока); + Блок.ОписаниеБлока.Вставить("НазначениеРаздела", Назначение); + Если НЕ ПустаяСтрока(Назначение) Тогда + + ПоследнийБлокКомментария.ТипБлока = ТипыБлоковМодуля.Описание; + + КонецЕсли; + + ПоследнийБлокКомментария = Неопределено; + + КонецЕсли; КонецПроцедуры Функция ПолучитьСодержимоеБлока(Текст, НачальнаяСтрока, КонечнаяСтрока, УдалятьКомментарии = Ложь) - Строки = Новый Массив(); Для Ит = НачальнаяСтрока По КонечнаяСтрока Цикл - СтрокаМодуля = Текст.ПолучитьСтроку(Ит); - Если УдалятьКомментарии Тогда - УдалитьКомментарийИзСтроки(СтрокаМодуля); - КонецЕсли; Строки.Добавить(СтрокаМодуля); - КонецЦикла; Возврат СтрСоединить(Строки, Символы.ПС); +КонецФункции + +Функция ПолучитьПримеры(Файл, ПоследнийБлокКомментария, НомерСтрокиПример) + Примеры = Новый Массив; + Если НомерСтрокиПример = Неопределено Тогда + Возврат Примеры; + КонецЕсли; + + СтрокаПример = Новый Массив(); + Для Ит = НомерСтрокиПример + 1 По ПоследнийБлокКомментария.КонечнаяСтрока Цикл + СтрокаКомментария = Файл.ПолучитьСтроку(Ит); + СтрокаКомментария = СокрЛП(Сред(СтрокаКомментария, 3)); + + Если СтрНачинаетсяС(СтрокаКомментария, "Пример") Тогда + Примеры.Добавить(СтрСоединить(СтрокаПример, Символы.ПС)); + СтрокаПример.Очистить(); + ИначеЕсли Не ПустаяСтрока(СтрокаКомментария) Тогда + СтрокаПример.Добавить(СтрокаКомментария); + КонецЕсли; + + КонецЦикла; + + Если СтрокаПример.Количество() Тогда + Примеры.Добавить(СтрСоединить(СтрокаПример, Символы.ПС)); + КонецЕсли; + + Возврат Примеры; +КонецФункции + +Функция ПолучитьВозвращаемоеЗначение(Файл, НомераСтрок, ПоследнийБлокКомментария) + ВозвращаемоеЗначение = Новый Массив(); + Если НомераСтрок.НомерСтрокиВозвращаемоеЗначение = Неопределено Тогда + Возврат ВозвращаемоеЗначение; + КонецЕсли; + + ОписаниеПараметра = ""; + РежимНесколькоТипов = Неопределено; + + ТекущийТип = Неопределено; + Для Ит = НомераСтрок.НомерСтрокиВозвращаемоеЗначение + 1 По ПоследнийБлокКомментария.КонечнаяСтрока Цикл + СтрокаКомментария = Файл.ПолучитьСтроку(Ит); + СтрокаКомментария = СокрЛП(Сред(СтрокаКомментария, 3)); + + Если СтрНачинаетсяС(СтрокаКомментария, "Пример") Тогда + НомераСтрок.НомерСтрокиПример = Ит; + Прервать; + КонецЕсли; + + // 'Тип' - 'Описание' + // 'продолжение описания' + // или + // - 'Тип' - 'Описание' + // 'продолжение описания' + // - 'Тип2' - 'Описание' + // 'продолжение описания' + + Если РежимНесколькоТипов = Неопределено Тогда + РежимНесколькоТипов = СтрНачинаетсяС(СтрокаКомментария, "- "); + КонецЕсли; + + Если НЕ РежимНесколькоТипов Тогда + СоставСтрокиКомментария = СтрРазделить(СтрокаКомментария, "-"); + + Если ТекущийТип = Неопределено Тогда + // это описание параметра + ТекущийТип = Новый Структура("ТипПараметра, ОписаниеПараметра", СокрЛП(СоставСтрокиКомментария[0]), Новый Массив()); + ПозицияДефис = СтрНайти(СтрокаКомментария, "-"); + Если ПозицияДефис Тогда + ТекущийТип.ОписаниеПараметра.Добавить(СокрЛП(Сред(СтрокаКомментария, ПозицияДефис + 1))); + Иначе + ТекущийТип.ОписаниеПараметра.Добавить(" "); + КонецЕсли; + Иначе + // продолжение описания параметра либо косячное описание + ТекущийТип.ОписаниеПараметра.Добавить(СтрокаКомментария); + КонецЕсли; + + ИначеЕсли СтрНачинаетсяС(СтрокаКомментария, "- ") Тогда + ТекущийТип = ЗафиксироватьТипВозврЗначения(ВозвращаемоеЗначение, ТекущийТип); + СоставСтрокиКомментария = СтрРазделить(СтрокаКомментария, "-"); + ТекущийТип.ТипПараметра = СокрЛП(СоставСтрокиКомментария[1]); + Если СоставСтрокиКомментария.Количество() > 2 Тогда + СоставСтрокиКомментария.Удалить(0); + СоставСтрокиКомментария.Удалить(0); + ТекущийТип.ОписаниеПараметра.Добавить(СтрСоединить(СоставСтрокиКомментария, "-")); + Иначе + ТекущийТип.ОписаниеПараметра.Добавить(" "); + КонецЕсли; + ИначеЕсли ТекущийТип <> Неопределено Тогда + Если ТекущийТип.ОписаниеПараметра.Количество() = 0 Тогда + ТекущийТип.ОписаниеПараметра.Добавить(" "); + КонецЕсли; + ТекущийТип.ОписаниеПараметра.Добавить(СтрокаКомментария); + Иначе + ТекущийТип = ЗафиксироватьТипВозврЗначения(); + ТекущийТип.ОписаниеПараметра.Добавить(СтрокаКомментария); + КонецЕсли; + + КонецЦикла; + + ЗафиксироватьТипВозврЗначения(ВозвращаемоеЗначение, ТекущийТип); + Возврат ВозвращаемоеЗначение; КонецФункции + +Процедура ПолучитьПараметры(Файл, Блок, НомераСтрок, ПоследнийБлокКомментария) + Если НомераСтрок.НомерСтрокиПараметры = Неопределено Тогда + Возврат; + КонецЕсли; + + ИмяПараметра = Неопределено; + ОписаниеПараметра = ""; + ТипПараметра = ""; + Дочитывание = Ложь; + ПрошлаяСтрока = ""; + Для Ит = НомераСтрок.НомерСтрокиПараметры + 1 По ПоследнийБлокКомментария.КонечнаяСтрока Цикл + + СтрокаКомментария = Файл.ПолучитьСтроку(Ит); + СтрокаКомментария = СокрЛП(Сред(СтрокаКомментария, 3)); + Если СтрНачинаетсяС(СтрокаКомментария, "Возвращаемое значение:") Тогда + НомераСтрок.НомерСтрокиВозвращаемоеЗначение = Ит; + Прервать; + ИначеЕсли СтрНачинаетсяС(СтрокаКомментария, "Примеры:") ИЛИ СтрНачинаетсяС(СтрокаКомментария, "Пример:") Тогда + НомераСтрок.НомерСтрокиПример = Ит; + Прервать; + КонецЕсли; + + Если Дочитывание Тогда + СтрокаКомментария = ПрошлаяСтрока + СтрокаКомментария; + ПрошлаяСтрока = ""; + Дочитывание = Ложь; + КонецЕсли; + + // шаблон параметра + // 'Имя' - 'Тип' - 'Описание' + // 'продолжение описания' + СоставСтрокиКомментария = СтрРазделить(СтрокаКомментария, "-"); + Если СоставСтрокиКомментария.Количество() = 2 И СтрЗаканчиваетсяНа(СокрЛП(СоставСтрокиКомментария[1]), ",") Тогда + // шаблон параметра + // 'Имя' - 'Тип','Тип', + // 'Тип' - 'Описание' + // 'продолжение описания' + ПрошлаяСтрока = СтрокаКомментария; + Дочитывание = Истина; + ИначеЕсли СоставСтрокиКомментария.Количество() >= 2 Тогда + Если ИмяПараметра <> Неопределено Тогда + СтрокаПараметраМетода = Блок.ОписаниеБлока.ПараметрыМетода.Найти(ИмяПараметра, "Имя"); + Если СтрокаПараметраМетода <> Неопределено Тогда + СтрокаПараметраМетода.ТипПараметра = ТипПараметра; + СтрокаПараметраМетода.ОписаниеПараметра = ОписаниеПараметра; + КонецЕсли; + КонецЕсли; + + // это описание параметра + ИмяПараметра = СокрЛП(СоставСтрокиКомментария[0]); + ТипПараметра = СокрЛП(СоставСтрокиКомментария[1]); + + Если СоставСтрокиКомментария.Количество() > 2 Тогда + ПозицияДефис = СтрНайти(СтрокаКомментария, "-"); + ПозицияДефис = СтрНайти(СтрокаКомментария, "-", , ПозицияДефис + 1); + ОписаниеПараметра = СокрЛП(Сред(СтрокаКомментария, ПозицияДефис + 1)); + КонецЕсли; + + Иначе + + // продолжение описания параметра либо косячное описание + ОписаниеПараметра = ОписаниеПараметра + ?(ПустаяСтрока(ОписаниеПараметра), "", Символы.ПС) + СтрокаКомментария; + КонецЕсли; + + КонецЦикла; + + Если ИмяПараметра <> Неопределено Тогда + СтрокаПараметраМетода = Блок.ОписаниеБлока.ПараметрыМетода.Найти(ИмяПараметра, "Имя"); + Если СтрокаПараметраМетода <> Неопределено Тогда + СтрокаПараметраМетода.ТипПараметра = ТипПараметра; + СтрокаПараметраМетода.ОписаниеПараметра = ОписаниеПараметра; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +Функция ЗафиксироватьТипВозврЗначения(ВозвращаемоеЗначение = Неопределено, ТекущийТип = Неопределено) + Если ТекущийТип <> Неопределено Тогда + ТекущийТип.ОписаниеПараметра = СтрСоединить(ТекущийТип.ОписаниеПараметра, Символы.ПС); + ВозвращаемоеЗначение.Добавить(ТекущийТип); + КонецЕсли; + Возврат Новый Структура("ТипПараметра, ОписаниеПараметра", "", Новый Массив()); +КонецФункции diff --git a/src/Перечисления/Модули/ТипыБлоковМодуля.os b/src/Перечисления/Модули/ТипыБлоковМодуля.os index ace5bc7..8a32541 100644 --- a/src/Перечисления/Модули/ТипыБлоковМодуля.os +++ b/src/Перечисления/Модули/ТипыБлоковМодуля.os @@ -18,6 +18,36 @@ /////////////////////////////////////////////////////////////////////////////////////////////// +Функция ЭтоБлокНачалоОбласти(СтрокаМодуля) Экспорт + Возврат СтрНачинаетсяС(СтрокаМодуля, "#ОБЛАСТЬ") + ИЛИ СтрНачинаетсяС(СтрокаМодуля, "// #ОБЛАСТЬ"); +КонецФункции + +Функция ЭтоБлокКонецОбласти(СтрокаМодуля) Экспорт + Возврат СтрНачинаетсяС(СтрокаМодуля, "#КОНЕЦОБЛАСТИ") + ИЛИ СтрНачинаетсяС(СтрокаМодуля, "// #КОНЕЦОБЛАСТИ"); +КонецФункции + +Функция ЭтоБлокНачалоФункции(СтрокаМодуля) Экспорт + Возврат СтрНачинаетсяС(СтрокаМодуля, "ФУНКЦИЯ ") + ИЛИ СтрНачинаетсяС(СтрокаМодуля, "FUNCTION "); +КонецФункции + +Функция ЭтоБлокНачалоПроцедуры(СтрокаМодуля) Экспорт + Возврат СтрНачинаетсяС(СтрокаМодуля, "ПРОЦЕДУРА ") + ИЛИ СтрНачинаетсяС(СтрокаМодуля, "PROCEDURE "); +КонецФункции + +Функция ЭтоБлокКонецФункции(СтрокаМодуля) Экспорт + Возврат СтрНачинаетсяС(СтрокаМодуля, "КОНЕЦФУНКЦИИ") + ИЛИ СтрНачинаетсяС(СтрокаМодуля, "ENDFUNCTION"); +КонецФункции + +Функция ЭтоБлокКонецПроцедуры(СтрокаМодуля) Экспорт + Возврат СтрНачинаетсяС(СтрокаМодуля, "КОНЕЦПРОЦЕДУРЫ") + ИЛИ СтрНачинаетсяС(СтрокаМодуля, "ENDPROCEDURE"); +КонецФункции + ОписаниеПеременной = "ОписаниеПеременной"; ЗаголовокПроцедуры = "ЗаголовокПроцедуры";