1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2026-06-20 09:19:27 +02:00

Переработка генерации CLI

This commit is contained in:
Anton Titovets
2026-01-23 10:30:09 +03:00
parent d242827709
commit b37ce1cf19
+263 -474
View File
@@ -15,17 +15,17 @@
Перем СписокГласных;
Процедура ПриСозданииОбъекта(Знач ДанныеПроекта_ = Неопределено)
Если ДанныеПроекта_ = Неопределено Тогда
ДанныеПроекта = Новый ProjectData;
Иначе
ДанныеПроекта = ДанныеПроекта_;
КонецЕсли;
Если ДанныеПроекта_ = Неопределено Тогда
ДанныеПроекта = Новый ProjectData;
Иначе
ДанныеПроекта = ДанныеПроекта_;
КонецЕсли;
Корень = ДанныеПроекта.ПолучитьЗначениеНастройки("paths.root");
Языки = ДанныеПроекта.ПолучитьЗначениеНастройки("localization.langs");
КаталогДополнений = ДанныеПроекта.ПолучитьЗначениеНастройки("paths.paramsExamplesSrc");
CommonTools.СообщитьПроцесс("Generating CLI version from Oint");
ЗаполнитьСоответствиеСлужебныхКлючей();
@@ -38,19 +38,21 @@
СоздатьОснову(Язык, Корень);
КонецЕсли;
ОпределитьСоответствиеМодулейКоманд(Язык);
МодульСоставаОПИ = Новый ТекстовыйДокумент();
КаталогСписковСостава = Корень + Язык + "/cli/data/Classes/internal/Classes/";
КаталогИндекса = Корень + Язык + "/cli/data/Classes/index";
КаталогДополненийОпций = КаталогДополнений;
ОбъектИндекса = Новый Файл(КаталогИндекса);
Если Не ОбъектИндекса.Существует() Тогда
СоздатьКаталог(КаталогИндекса);
КонецЕсли;
СоздатьФайлОсновныхДанных(Язык, КаталогИндекса);
ЗаполнитьТаблицыСостава();
ЗаполнитьТаблицыСостава(КаталогИндекса);
ВыполнитьДополнительныйПеревод(Язык);
КонецЦикла;
@@ -73,51 +75,63 @@
КонецПроцедуры
Процедура СоздатьФайлОсновныхДанных(Язык, КаталогИндекса)
ОсновныеДанные = Новый Соответствие();
ОсновныеДанные.Вставить("version", ПолучитьВерсиюПакета());
ОпределитьСоответствиеМодулейКоманд(Язык);
СоответствиеМодулей = Новый Соответствие();
Для Каждого КомандаМодуля Из СоответствиеМодулейКоманд Цикл
СоответствиеМодулей.Вставить(КомандаМодуля.Значение, КомандаМодуля.Ключ);
КонецЦикла;
ОсновныеДанные.Вставить("modules", СоответствиеМодулей);
Путь = ОбъединитьПути(КаталогИндекса, "lib.json");
CommonTools.ЗаписатьФайлJSON(Путь, ОсновныеДанные);
КонецПроцедуры
Процедура ЗаполнитьТаблицыСостава()
Процедура ЗаполнитьТаблицыСостава(КаталогИндекса)
Для Каждого Модуль Из ОбщийМассивМодулей Цикл
ТекущийМодуль = Модуль.ИмяБезРасширения;
Если Не СоответствиеМодулейКоманд[ТекущийМодуль] = Неопределено Тогда
РазобратьМодуль(Модуль);
ИмяКоманды = СоответствиеМодулейКоманд[Модуль.ИмяБезРасширения];
Если Не ИмяКоманды = Неопределено Тогда
ТекущийМодуль = РазобратьМодуль(Модуль);
ПутьФайла = ОбъединитьПути(КаталогИндекса, ИмяКоманды);
CommonTools.ЗаписатьФайлJSON(ПутьФайла, ТекущийМодуль);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура РазобратьМодуль(Модуль)
Функция РазобратьМодуль(Модуль)
ЗаписатьНачалоСоставаБиблиотеки();
ТекущийМодуль = Модуль.ИмяБезРасширения;
ТекущаяОбласть = "Основные методы";
ТекущаяБиблиотека = СоответствиеМодулейКоманд.Получить(ТекущийМодуль);
Парсер = Новый ПарсерВстроенногоЯзыка;
ДокументМодуля = Новый ТекстовыйДокумент;
ДокументМодуля.Прочитать(Модуль.ПолноеИмя);
ТекстМодуля = ДокументМодуля.ПолучитьТекст();
ТекстМодуля = ДокументМодуля.ПолучитьТекст();
СтруктураМодуля = Парсер.Разобрать(ТекстМодуля);
ТекущаяОбласть = "Основные методы";
ТекущийИндекс = Новый Соответствие;
ТекущийИндекс.Вставить("module" , ТекущаяБиблиотека);
ТекущийИндекс.Вставить("library", ТекущаяБиблиотека);
МассивМетодов = Новый Массив;
Для Каждого Метод Из СтруктураМодуля.Объявления Цикл
Если Метод.Тип = "ИнструкцияПрепроцессораОбласть" Тогда
@@ -125,233 +139,55 @@
КонецЕсли;
Если Метод.Тип = "ОбъявлениеМетода" И Метод.Сигнатура.Экспорт = Истина Тогда
ТаблицаОписанийПараметров.Очистить();
РазобратьКомментарийМетода(ДокументМодуля, Метод, Модуль, ТекущаяОбласть);
ТекущийМетод = РазобратьКомментарийМетода(ДокументМодуля, Метод, Модуль);
ТекущийМетод.Вставить("region", ТекущаяОбласть);
МассивМетодов.Добавить(ТекущийМетод);
КонецЕсли;
КонецЦикла;
СписокЗависимостей = ОпределитьСписокЗависимостей(ТекстМодуля);
ТекущийМетод.Вставить("depends", СписокЗависимостей);
Возврат ТекущийМодуль;
ЗаписатьОкончаниеСоставаБиблиотеки();
Команда = СоответствиеМодулейКоманд[Модуль.ИмяБезРасширения];
СпсиокЗависимостей = Новый Структура;
ОсновнойМодуль = Новый Структура;
ОпределитьСписокЗависимостей(ТекстМодуля, Модуль.ИмяБезРасширения, СпсиокЗависимостей, ОсновнойМодуль);
ЗаписатьФункциюПолученияСтрокиПодключения(СпсиокЗависимостей, Команда, ОсновнойМодуль);
КонецПроцедуры
Процедура ОпределитьСписокЗависимостей(ТекстМодуля, ИмяМодуля, СтруктураЗависимостей, ОсновнойМодуль = Неопределено)
КонецФункции
Функция РазобратьКомментарийМетода(ТекстовыйДокумент, Метод, Модуль)
Для Каждого Модуль Из ОбщийМассивМодулей Цикл
ИскомаяЗависимость = Модуль.ИмяБезРасширения;
ЭтоДополнительнаяЗависимость = СтрЧислоВхождений(ТекстМодуля, ИскомаяЗависимость) > 1;
ЭтоОсновнойМодуль = ИскомаяЗависимость = ИмяМодуля;
Если Не ЭтоДополнительнаяЗависимость И Не ЭтоОсновнойМодуль Тогда
Продолжить;
КонецЕсли;
АбсолютныйПуть = Модуль.ПолноеИмя;
АбсолютныйПуть = СтрЗаменить(АбсолютныйПуть, "\", "/");
ЧастиПути = СтрРазделить(АбсолютныйПуть, "/");
ЧислоЧастей = ЧастиПути.ВГраница();
НовыйПуть = Новый Массив;
Для Н = 0 По ЧислоЧастей Цикл
ОбратныйИндекс = ЧислоЧастей - Н;
ТекущийЭлемент = ЧастиПути[ОбратныйИндекс];
Если нРег(ТекущийЭлемент) = "oint" Тогда
НовыйПуть.Вставить(0, "oint");
НовыйПуть.Вставить(0, "%1");
Прервать;
Иначе
НовыйПуть.Вставить(0, ТекущийЭлемент);
КонецЕсли;
КонецЦикла;
НовыйПуть = СтрСоединить(НовыйПуть, "/");
Если ЭтоОсновнойМодуль И Не ОсновнойМодуль = Неопределено Тогда
ОсновнойМодуль.Вставить(ИскомаяЗависимость, НовыйПуть);
КонецЕсли;
Если ЭтоДополнительнаяЗависимость Тогда
Если СтруктураЗависимостей.Свойство(ИскомаяЗависимость) Тогда
Продолжить;
КонецЕсли;
СтруктураЗависимостей.Вставить(ИскомаяЗависимость, НовыйПуть);
ТекстЗависимости = ПолучитьСтрокуИзДвоичныхДанных(Новый ДвоичныеДанные(Модуль.ПолноеИмя));
ОпределитьСписокЗависимостей(ТекстЗависимости, "", СтруктураЗависимостей);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ЗаписатьНачалоСоставаБиблиотеки()
СписокЗанятыхБукв = Новый СписокЗначений();
ТекущийФайлСостава = Новый ТекстовыйДокумент();
ТекущийФайлСостава.ДобавитьСтроку("
|
|Перем ТаблицаСостава;
|
|Функция ПолучитьСостав() Экспорт
|
| Если ТаблицаСостава <> Неопределено Тогда
| Возврат ТаблицаСостава;
| КонецЕсли;
|
| ТаблицаСостава = Новый ТаблицаЗначений();
| ТаблицаСостава.Колонки.Добавить(""Библиотека"");
| ТаблицаСостава.Колонки.Добавить(""Модуль"");
| ТаблицаСостава.Колонки.Добавить(""Метод"");
| ТаблицаСостава.Колонки.Добавить(""МетодПоиска"");
| ТаблицаСостава.Колонки.Добавить(""Параметр"");
| ТаблицаСостава.Колонки.Добавить(""ПараметрСокр"");
| ТаблицаСостава.Колонки.Добавить(""Описание"");
| ТаблицаСостава.Колонки.Добавить(""ОписаниеМетода"");
| ТаблицаСостава.Колонки.Добавить(""Область"");
|");
ТаблицаОписанийПараметров = Новый ТаблицаЗначений;
ТаблицаОписанийПараметров.Колонки.Добавить("Имя");
ТаблицаОписанийПараметров.Колонки.Добавить("ИмяСокр");
ТаблицаОписанийПараметров.Колонки.Добавить("Типы");
ТаблицаОписанийПараметров.Колонки.Добавить("Описание");
ТаблицаОписанийПараметров.Колонки.Добавить("ЗначениеПоУмолчанию");
КонецПроцедуры
Процедура ЗаписатьОкончаниеСоставаБиблиотеки()
ТекущийФайлСостава.ДобавитьСтроку(" Возврат ТаблицаСостава;");
ТекущийФайлСостава.ДобавитьСтроку("КонецФункции");
ТекущийФайлСостава.ДобавитьСтроку(Символы.ПС);
КонецПроцедуры
Процедура ЗаписатьФункциюПолученияСтрокиПодключения(СпсиокЗависимостей, Библиотека, ОсновнойМодуль)
ТекущийФайлСостава.ДобавитьСтроку(Символы.ПС);
ТекущийФайлСостава.ДобавитьСтроку("Функция ПолучитьСтрокуПодключения() Экспорт");
ТекущийФайлСостава.ДобавитьСтроку(Символы.ПС);
ТекущийФайлСостава.ДобавитьСтроку(Символы.ПС);
ТекущийФайлСостава.ДобавитьСтроку(" Возврат """);
ТекущийФайлСостава.ДобавитьСтроку(" |Контекст = Новый Структура;");
ШаблонКонтекста = " |Контекст.Вставить(""""%1"""", Неопределено);";
ШаблонОсновного = " |%1 = ЗагрузитьСценарий(""""%2"""", Контекст);";
ШаблонПодключения = " |%1 = ЗагрузитьСценарий(""""%2"""", Контекст);
| |Контекст.Вставить(""""%1"""", %1);";
МассивКонтекста = Новый Массив;
МассивПодключений = Новый Массив;
ТекстОсновного = "";
Для Каждого Зависимость Из СпсиокЗависимостей Цикл
МассивКонтекста.Добавить(СтрШаблон(ШаблонКонтекста, Зависимость.Ключ));
МассивПодключений.Добавить(СтрШаблон(ШаблонПодключения, Зависимость.Ключ, Зависимость.Значение));
КонецЦикла;
Для Каждого Информация Из ОсновнойМодуль Цикл
ТекстОсновного = СтрШаблон(ШаблонОсновного, Информация.Ключ, Информация.Значение);
КонецЦикла;
ТекстКонтекста = СтрСоединить(МассивКонтекста, Символы.ПС);
ТекстПодключения = СтрСоединить(МассивПодключений, Символы.ПС);
ТекущийФайлСостава.ДобавитьСтроку(ТекстКонтекста);
ТекущийФайлСостава.ДобавитьСтроку(" |");
ТекущийФайлСостава.ДобавитьСтроку(ТекстПодключения);
ТекущийФайлСостава.ДобавитьСтроку(" |");
ТекущийФайлСостава.ДобавитьСтроку(ТекстОсновного);
ТекущийФайлСостава.ДобавитьСтроку(" |"" + Символы.ПС;");
ТекущийФайлСостава.ДобавитьСтроку(Символы.ПС);
ТекущийФайлСостава.ДобавитьСтроку(Символы.ПС);
ТекущийФайлСостава.ДобавитьСтроку("КонецФункции ");
CommonTools.ЗаписатьТекст(ТекущийФайлСостава, КаталогСписковСостава + Библиотека + ".os");
КонецПроцедуры
Процедура РазобратьКомментарийМетода(ТекстовыйДокумент, Метод, Модуль, Область)
ТекущийМетод = Новый Соответствие();
НомерСтроки = Метод.Начало.НомерСтроки;
ИмяМетода = Метод.Сигнатура.Имя;
МассивКомментария = ПарсингКомментария(ТекстовыйДокумент, НомерСтроки);
Если МассивКомментария.Количество() = 0 Тогда
Возврат;
КонецЕсли;
МассивПараметров = Новый Массив;
ОписаниеМетода = "";
СформироватьСтруктуруМетода(МассивКомментария, МассивПараметров, ОписаниеМетода);
СформироватьТаблицуОписанийПараметров(МассивПараметров, Метод, Модуль);
ДопОписание = "";
ОпределитьДопОписание(ДопОписание, Модуль);
ДопОписание = ОпределитьДопОписание(Модуль);
ОписаниеМетода = СформироватьСтруктуруМетода(МассивКомментария, МассивПараметров);
ОписаниеМетода = СокрЛП(ОписаниеМетода) + ДопОписание;
МассивОписаний = Новый Массив;
Для Каждого СтрокаПараметра Из ТаблицаОписанийПараметров Цикл
ЗаписатьСозданиеПараметраСостава(СтрокаПараметра, ИмяМетода, Область, СокрЛП(ОписаниеМетода));
ОписаниеМетода = "";
Для Каждого СтрокаПараметра Из МассивПараметров Цикл
ТекущееОписание = СформироватьСтруктуруОписанияПараметра(Метод, СтрокаПараметра, СписокЗанятыхБукв);
МассивОписаний.Добавить(ТекущееОписание);
КонецЦикла;
КонецПроцедуры
Функция ПарсингКомментария(Знач ТекстовыйДокумент, Знач НомерСтроки)
ТекущийМетод.Вставить("description", ОписаниеМетода);
ТекущийМетод.Вставить("params" , МассивОписаний);
ТекущаяСтрока = ТекстовыйДокумент.ПолучитьСтроку(НомерСтроки - 1);
ТекстКомментария = ТекущаяСтрока;
Счетчик = 1;
Пока СтрНайти(ТекущаяСтрока, "//") > 0 Цикл
Счетчик = Счетчик + 1;
ТекущаяСтрока = ТекстовыйДокумент.ПолучитьСтроку(НомерСтроки - Счетчик);
ТекстКомментария = ТекущаяСтрока + Символы.ПС + ТекстКомментария;
КонецЦикла;
Если СтрНайти(ТекстКомментария, "!NOCLI") > 0 Тогда
Возврат Новый Массив;
КонецЕсли;
МассивКомментария = СтрРазделить(ТекстКомментария, "//", Ложь);
Если МассивКомментария.Количество() = 0 Тогда
Возврат Новый Массив;
Иначе
МассивКомментария.Удалить(0);
КонецЕсли;
Возврат МассивКомментария;
Возврат ТекущийМетод;
КонецФункции
Процедура СформироватьСтруктуруМетода(Знач МассивКомментария, МассивПараметров, ОписаниеМетода)
Функция СформироватьСтруктуруМетода(Знач МассивКомментария, МассивПараметров)
ОписаниеМетода = "";
ЗаписыватьПараметры = Ложь;
ЗаписыватьОписание = Истина;
@@ -389,151 +225,186 @@
КонецЦикла;
КонецПроцедуры
Процедура СформироватьТаблицуОписанийПараметров(Знач МассивПараметров, Знач Метод, Знач Модуль = "")
Возврат ОписаниеМетода;
СписокСокращенийИмен = Новый СписокЗначений();
СписокЗанятыхБукв = Новый СписокЗначений();
ТекущийМассивСтрок = Новый Массив;
КонецФункции
Функция ОпределитьСписокЗависимостей(ТекстМодуля)
СтруктураЗависимостей = Новый Соответствие();
Для Каждого Модуль Из ОбщийМассивМодулей Цикл
ИскомаяЗависимость = Модуль.ИмяБезРасширения;
АбсолютныйПуть = Модуль.ПолноеИмя;
АбсолютныйПуть = СтрЗаменить(АбсолютныйПуть, "\", "/");
ЧастиПути = СтрРазделить(АбсолютныйПуть, "/");
ЧислоЧастей = ЧастиПути.ВГраница();
НовыйПуть = Новый Массив;
Для Н = 0 По ЧислоЧастей Цикл
ОбратныйИндекс = ЧислоЧастей - Н;
ТекущийЭлемент = ЧастиПути[ОбратныйИндекс];
Если нРег(ТекущийЭлемент) = "oint" Тогда
НовыйПуть.Вставить(0, "oint");
НовыйПуть.Вставить(0, "%1");
Прервать;
Иначе
НовыйПуть.Вставить(0, ТекущийЭлемент);
КонецЕсли;
КонецЦикла;
НовыйПуть = СтрСоединить(НовыйПуть, "/");
Если СтруктураЗависимостей.Свойство(ИскомаяЗависимость) Тогда
Продолжить;
КонецЕсли;
СтруктураЗависимостей.Вставить(ИскомаяЗависимость, НовыйПуть);
ТекстЗависимости = ПолучитьСтрокуИзДвоичныхДанных(Новый ДвоичныеДанные(Модуль.ПолноеИмя));
Для Каждого ВнутренняяЗависимость Из ОпределитьСписокЗависимостей(ТекстЗависимости) Цикл
СтруктураЗависимостей.Вставить(ВнутренняяЗависимость.Ключ, ВнутренняяЗависимость.Значение);
КонецЦикла;
КонецЦикла;
Возврат СтруктураЗависимостей;
КонецФункции
Функция ПарсингКомментария(Знач ТекстовыйДокумент, Знач НомерСтроки)
ТекущаяСтрока = ТекстовыйДокумент.ПолучитьСтроку(НомерСтроки - 1);
ТекстКомментария = ТекущаяСтрока;
Счетчик = 1;
Пока СтрНайти(ТекущаяСтрока, "//") > 0 Цикл
Счетчик = Счетчик + 1;
ТекущаяСтрока = ТекстовыйДокумент.ПолучитьСтроку(НомерСтроки - Счетчик);
ТекстКомментария = ТекущаяСтрока + Символы.ПС + ТекстКомментария;
КонецЦикла;
Если СтрНайти(ТекстКомментария, "!NOCLI") > 0 Тогда
Возврат Новый Массив;
КонецЕсли;
МассивКомментария = СтрРазделить(ТекстКомментария, "//", Ложь);
Если МассивКомментария.Количество() = 0 Тогда
Возврат Новый Массив;
Иначе
МассивКомментария.Удалить(0);
КонецЕсли;
Возврат МассивКомментария;
КонецФункции
Функция СформироватьСтруктуруОписанияПараметра(Знач Метод, Знач ПараметрМетода, СписокЗанятыхБукв)
ТекущееОписание = Новый Соответствие();
Разделитель = "-";
Для Каждого ПараметрМетода Из МассивПараметров Цикл
МассивЭлементовПараметра = СтрРазделить(ПараметрМетода, Разделитель, Ложь);
КоличествоЭлементов = МассивЭлементовПараметра.Количество();
Для Н = 0 По МассивЭлементовПараметра.ВГраница() Цикл
МассивЭлементовПараметра[Н] = СокрЛП(МассивЭлементовПараметра[Н]);
КонецЦикла;
Если КоличествоЭлементов < 4 Тогда
Сообщить("Недостаточный набор данных в док. комментарии: " + Модуль.ИмяБезРасширения + " - " + Метод.Сигнатура.Имя);
Возврат;
КонецЕсли;
Имя1С = МассивЭлементовПараметра[0];
Имя = "--" + МассивЭлементовПараметра[3];
Буква = Лев(МассивЭлементовПараметра[3], 1);
ИмяСокр = "-" + Буква;
Типы = МассивЭлементовПараметра[1];
Описание = ?(КоличествоЭлементов >= 5, МассивЭлементовПараметра[4], МассивЭлементовПараметра[2]);
Если КоличествоЭлементов > 5 Или СтрНайти(Имя, " ") > 0 Тогда
ВызватьИсключение("Некоррентный документирующий комментарий в методе: " + Модуль.ИмяБезРасширения + " - " + Метод.Сигнатура.Имя);
КонецЕсли;
НоваяСтрокаТаблицы = ТаблицаОписанийПараметров.Добавить();
НоваяСтрокаТаблицы.Имя = Имя;
НоваяСтрокаТаблицы.Типы = Типы;
НоваяСтрокаТаблицы.Описание = Описание;
Если СписокСокращенийИмен.НайтиПоЗначению(ИмяСокр) = Неопределено Тогда
СписокСокращенийИмен.Добавить(ИмяСокр);
СписокЗанятыхБукв.Добавить(Буква);
НоваяСтрокаТаблицы.ИмяСокр = ИмяСокр;
КонецЕсли;
НоваяСтрокаТаблицы.ЗначениеПоУмолчанию = ПолучитьЗначениеПараметраПоУмолчанию(Имя1С, Метод);
ТекущийМассивСтрок.Добавить(НоваяСтрокаТаблицы);
КонецЦикла;
Для Каждого СуществующаяСтрока Из ТекущийМассивСтрок Цикл
Если ЗначениеЗаполнено(СуществующаяСтрока.ИмяСокр) Тогда
Продолжить;
КонецЕсли;
Имя = СуществующаяСтрока.Имя;
Для Н = 3 По СтрДлина(Имя) Цикл
ТекущаяБуква = Сред(Имя, Н, 1);
ЭтоСогласная = СписокСогласных.НайтиПоЗначению(ТекущаяБуква) <> Неопределено;
ЭтоНезанятая = СписокЗанятыхБукв.НайтиПоЗначению(ТекущаяБуква) = Неопределено;
Если ЭтоСогласная И ЭтоНезанятая Тогда
ИмяСокр = "-" + ТекущаяБуква;
СуществующаяСтрока.ИмяСокр = ИмяСокр;
СписокСокращенийИмен.Добавить(ИмяСокр);
СписокЗанятыхБукв.Добавить(ТекущаяБуква);
Прервать;
КонецЕсли;
КонецЦикла;
Если ЗначениеЗаполнено(СуществующаяСтрока.ИмяСокр) Тогда
Продолжить;
КонецЕсли;
Для Н = 3 По СтрДлина(Имя) Цикл
ТекущаяБуква = Сред(Имя, Н, 1);
ЭтоГласная = СписокГласных.НайтиПоЗначению(ТекущаяБуква) <> Неопределено;
ЭтоНезанятая = СписокЗанятыхБукв.НайтиПоЗначению(ТекущаяБуква) = Неопределено;
Если ЭтоГласная И ЭтоНезанятая Тогда
ИмяСокр = "-" + ТекущаяБуква;
СуществующаяСтрока.ИмяСокр = ИмяСокр;
СписокСокращенийИмен.Добавить(ИмяСокр);
СписокЗанятыхБукв.Добавить(ТекущаяБуква);
Прервать;
КонецЕсли;
КонецЦикла;
Если ЗначениеЗаполнено(СуществующаяСтрока.ИмяСокр) Тогда
Продолжить;
КонецЕсли;
Для Каждого СогласнаяБуква Из СписокСогласных Цикл
ТекущаяБуква = СогласнаяБуква.Значение;
ЭтоНезанятая = СписокЗанятыхБукв.НайтиПоЗначению(ТекущаяБуква) = Неопределено;
Если ЭтоНезанятая Тогда
ИмяСокр = "-" + ТекущаяБуква;
СуществующаяСтрока.ИмяСокр = ИмяСокр;
СписокСокращенийИмен.Добавить(ИмяСокр);
СписокЗанятыхБукв.Добавить(ТекущаяБуква);
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
СписокПроверки = Новый СписокЗначений();
Для Каждого СуществующаяСтрока Из ТекущийМассивСтрок Цикл
ИмяСокр = СуществующаяСтрока.ИмяСокр;
Если Не ЗначениеЗаполнено(ИмяСокр) Тогда
ВызватьИсключение "Не заполнено ИмяСокр в " + Метод.Сигнатура.Имя;
КонецЕсли;
Если СписокПроверки.НайтиПоЗначению(ИмяСокр) <> Неопределено Тогда
ВызватьИсключение СтрШаблон("Дублирующий ИмяСокр %1 в %2", ИмяСокр, Метод.Сигнатура.Имя);
Иначе
СписокПроверки.Добавить(ИмяСокр);
КонецЕсли;
МассивЭлементовПараметра = СтрРазделить(ПараметрМетода, Разделитель, Ложь);
КоличествоЭлементов = МассивЭлементовПараметра.Количество();
Для Н = 0 По МассивЭлементовПараметра.ВГраница() Цикл
МассивЭлементовПараметра[Н] = СокрЛП(МассивЭлементовПараметра[Н]);
КонецЦикла;
КонецПроцедуры
Если КоличествоЭлементов < 4 Тогда
ВызватьИсключение("Недостаточный набор данных в док. комментарии: " + Метод.Сигнатура.Имя);
КонецЕсли;
Имя1С = МассивЭлементовПараметра[0];
Имя = "--" + МассивЭлементовПараметра[3];
Буква = Лев(МассивЭлементовПараметра[3], 1);
Типы = МассивЭлементовПараметра[1];
Описание = ?(КоличествоЭлементов >= 5, МассивЭлементовПараметра[4], МассивЭлементовПараметра[2]);
ЗначениеУМ = ПолучитьЗначениеПараметраПоУмолчанию(Имя1С, Метод);
Если КоличествоЭлементов > 5 Или СтрНайти(Имя, " ") > 0 Тогда
ВызватьИсключение("Некорректный документирующий комментарий в методе: " + Метод.Сигнатура.Имя);
КонецЕсли;
ТекущееОписание.Вставить("name" , Имя);
ТекущееОписание.Вставить("types" , Типы);
ТекущееОписание.Вставить("description", Описание);
ТекущееОписание.Вставить("default" , ЗначениеУМ);
Если СписокЗанятыхБукв.НайтиПоЗначению(Буква) = Неопределено Тогда
СписокЗанятыхБукв.Добавить(Буква);
ТекущееОписание.Вставить("short", "-" + Буква);
Иначе
Для Н = 3 По СтрДлина(Имя) Цикл
ТекущаяБуква = Сред(Имя, Н, 1);
ЭтоСогласная = СписокСогласных.НайтиПоЗначению(ТекущаяБуква) <> Неопределено;
ЭтоНезанятая = СписокЗанятыхБукв.НайтиПоЗначению(ТекущаяБуква) = Неопределено;
Если ЭтоСогласная И ЭтоНезанятая Тогда
ТекущееОписание.Вставить("short", "-" + Буква);
СписокЗанятыхБукв.Добавить(ТекущаяБуква);
Прервать;
КонецЕсли;
КонецЦикла;
Если ЗначениеЗаполнено(ТекущееОписание["short"]) Тогда
Возврат ТекущееОписание;
КонецЕсли;
Для Н = 3 По СтрДлина(Имя) Цикл
ТекущаяБуква = Сред(Имя, Н, 1);
ЭтоГласная = СписокГласных.НайтиПоЗначению(ТекущаяБуква) <> Неопределено;
ЭтоНезанятая = СписокЗанятыхБукв.НайтиПоЗначению(ТекущаяБуква) = Неопределено;
Если ЭтоГласная И ЭтоНезанятая Тогда
ТекущееОписание.Вставить("short", "-" + Буква);
СписокЗанятыхБукв.Добавить(ТекущаяБуква);
Прервать;
КонецЕсли;
КонецЦикла;
Если ЗначениеЗаполнено(ТекущееОписание["short"]) Тогда
Возврат ТекущееОписание;
КонецЕсли;
Для Каждого СогласнаяБуква Из СписокСогласных Цикл
ТекущаяБуква = СогласнаяБуква.Значение;
ЭтоНезанятая = СписокЗанятыхБукв.НайтиПоЗначению(ТекущаяБуква) = Неопределено;
Если ЭтоНезанятая Тогда
ТекущееОписание.Вставить("short", "-" + Буква);
СписокЗанятыхБукв.Добавить(ТекущаяБуква);
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат ТекущееОписание;
КонецФункции
Функция ПолучитьЗначениеПараметраПоУмолчанию(Знач Имя, Знач Метод)
@@ -561,8 +432,9 @@
КонецФункции
Процедура ОпределитьДопОписание(ДопОписание, Модуль)
Функция ОпределитьДопОписание(Модуль)
ДопОписание = "";
ЕстьМассив = Ложь;
ЕстьДата = Ложь;
ТекстДополнения = "";
@@ -581,8 +453,6 @@
ЕстьДата = Истина;
КонецЕсли;
ОпределитьДопОписаниеПоПараметру(ТекстДополнения, ИмяМодуля, Имя)
КонецЦикла;
Если ЕстьМассив Тогда
@@ -606,93 +476,12 @@
|" + ТекстДополнения;
КонецЕсли;
ТекстДополнения = СтрЗаменить(ТекстДополнения, Символы.ПС, Символы.ПС + " |");
ДопОписание = ДопОписание + СтрЗаменить(ТекстДополнения, """", """""");
ДопОписание = ДопОписание + ТекстДополнения;
КонецПроцедуры
Возврат ДопОписание;
КонецФункции
Процедура ОпределитьДопОписаниеПоПараметру(ТекстДополнения, ИмяМодуля, ИмяПараметра)
ИмяФайлаДополнения = КаталогДополненийОпций
+ СтрЗаменить(ИмяМодуля, "OPI_", "")
+ "/"
+ СтрЗаменить(ИмяПараметра, "--", "")
+ ".txt";
ОбъектФайлаДополнения = Новый Файл(ИмяФайлаДополнения);
Если Не ОбъектФайлаДополнения.Существует() Тогда
Возврат;
КонецЕсли;
ТекстовыйДокумент = Новый ТекстовыйДокумент();
ТекстовыйДокумент.Прочитать(ИмяФайлаДополнения, "UTF-8");
ТекстДополненияФайла = СокрЛП(ТекстовыйДокумент.ПолучитьТекст());
Если Не ЗначениеЗаполнено(ТекстДополненияФайла) Тогда
Возврат;
КонецЕсли;
ЧислоСтрок = СтрЧислоСтрок(ТекстДополненияФайла);
ВставленоПримечание = Ложь;
ТекстДополнения = ТекстДополнения + Символы.ПС;
Для Н = 1 По ЧислоСтрок Цикл
ТекущаяСтрока = СтрПолучитьСтроку(ТекстДополненияФайла, Н);
Если СтрНачинаетсяС(СокрЛ(ТекущаяСтрока), "{")
И Не ВставленоПримечание Тогда
ВставленоПримечание = Истина;
ТекстДополнения = ТекстДополнения
+ " Структура заполнения опции "
+ ИмяПараметра
+ ":"
+ Символы.ПС;
КонецЕсли;
ТекстДополнения = ТекстДополнения
+ " "
+ ТекущаяСтрока
+ Символы.ПС;
КонецЦикла;
КонецПроцедуры
Процедура ЗаписатьСозданиеПараметраСостава(СтрокаПараметра, ИмяМетода, Область, ОписаниеМетода = "")
Имя = СтрокаПараметра["Имя"];
ИмяСокр = СтрокаПараметра["ИмяСокр"];
Описание = СтрокаПараметра["Описание"];
Значение = СтрокаПараметра["ЗначениеПоУмолчанию"];
Библиотека = СоответствиеМодулейКоманд.Получить(ТекущийМодуль);
Если ЗначениеЗаполнено(Значение) Тогда
Описание = Описание + " (необяз. по ум. - " + Значение + ")";
КонецЕсли;
ТекущийФайлСостава.ДобавитьСтроку(Символы.ПС);
ТекущийФайлСостава.ДобавитьСтроку(" НоваяСтрока = ТаблицаСостава.Добавить();");
ТекущийФайлСостава.ДобавитьСтроку(" НоваяСтрока.Библиотека = """ + Библиотека + """;");
ТекущийФайлСостава.ДобавитьСтроку(" НоваяСтрока.Модуль = """ + ТекущийМодуль + """;");
ТекущийФайлСостава.ДобавитьСтроку(" НоваяСтрока.Метод = """ + ИмяМетода + """;");
ТекущийФайлСостава.ДобавитьСтроку(" НоваяСтрока.МетодПоиска = """ + вРег(ИмяМетода) + """;");
ТекущийФайлСостава.ДобавитьСтроку(" НоваяСтрока.Параметр = """ + Имя + """;");
ТекущийФайлСостава.ДобавитьСтроку(" НоваяСтрока.ПараметрСокр = """ + ИмяСокр + """;");
ТекущийФайлСостава.ДобавитьСтроку(" НоваяСтрока.Описание = """ + Описание + """;");
ТекущийФайлСостава.ДобавитьСтроку(" НоваяСтрока.Область = """ + Область + """;");
Если ЗначениеЗаполнено(ОписаниеМетода) Тогда
ТекущийФайлСостава.ДобавитьСтроку(" НоваяСтрока.ОписаниеМетода = """ + ОписаниеМетода + """;");
КонецЕсли;
ТекущийФайлСостава.ДобавитьСтроку(Символы.ПС);
КонецПроцедуры
Процедура ОпределитьСоответствиеМодулейКоманд(ТекущийЯзык)
@@ -706,7 +495,7 @@
КомандаCLI = ОпределитьКомандуCLI(Модуль.ПолноеИмя);
НазваниеМодуля = Модуль.ИмяБезРасширения;
Если Не ЗначениеЗаполнено(КомандаCLI) Или СокрЛП(Строка(КомандаCLI)) = "none" Тогда
Продолжить;
КонецЕсли;
@@ -861,35 +650,35 @@
Для Каждого Элемент Из ТЗСловаря Цикл
ТекстМодуля = СтрЗаменить(ТекстМодуля, Элемент.Ключ, Элемент.Значение);
КонецЦикла;
Для Каждого СлужебныйКлюч Из СоответствиеСлужебныхКлючей Цикл
ТекстМодуля = СтрЗаменить(ТекстМодуля, "." + СлужебныйКлюч.Ключ, "." + СлужебныйКлюч.Значение);
ТекстМодуля = СтрЗаменить(ТекстМодуля, "(""" + СлужебныйКлюч.Ключ + """)", "(""" + СлужебныйКлюч.Значение + """)");
ТекстМодуля = СтрЗаменить(ТекстМодуля, СлужебныйКлюч.Ключ + "(", СлужебныйКлюч.Значение + "(");
КонецЦикла;
ТекстМодуля = СтрЗаменить(ТекстМодуля, "Console.", "Консоль.");
ТекстовыйДокумент.УстановитьТекст(ТекстМодуля);
CommonTools.ЗаписатьТекст(ТекстовыйДокумент, ПереводимыйМодуль.ПолноеИмя);
КонецЦикла;
КонецПроцедуры
Процедура ЗаполнитьСоответствиеСлужебныхКлючей()
СоответствиеСлужебныхКлючей = Новый Соответствие();
СоответствиеСлужебныхКлючей.Вставить("FileCopy" , "CopyFile"); // Вопрос разных имен в 8.15 и более новых версиях
СоответствиеСлужебныхКлючей.Вставить("WeekDay" , "DayOfWeek"); // Не исправлено
СоответствиеСлужебныхКлючей.Вставить("PositionInStream" , "StreamPosition");
СоответствиеСлужебныхКлючей.Вставить("FileCopy" , "CopyFile"); // Вопрос разных имен в 8.15 и более новых версиях
СоответствиеСлужебныхКлючей.Вставить("WeekDay" , "DayOfWeek"); // Не исправлено
СоответствиеСлужебныхКлючей.Вставить("PositionInStream" , "StreamPosition");
СоответствиеСлужебныхКлючей.Вставить("ThisObject" , "ЭтотОбъект");
КонецПроцедуры
Процедура ЗаполнитьСписокСогласных()
СписокСогласных = Новый СписокЗначений();
СписокСогласных.Добавить("b");
СписокСогласных.Добавить("c");
@@ -911,11 +700,11 @@
СписокСогласных.Добавить("w");
СписокСогласных.Добавить("x");
СписокСогласных.Добавить("z");
КонецПроцедуры
Процедура ЗаполнитьСписокГласных()
СписокГласных = Новый СписокЗначений();
СписокГласных.Добавить("a");
СписокГласных.Добавить("e");
@@ -923,5 +712,5 @@
СписокГласных.Добавить("o");
СписокГласных.Добавить("u");
СписокГласных.Добавить("y");
КонецПроцедуры