#Использовать osparser Перем ФайлСоставаОПИ; Перем МодульСоставаОПИ; Перем СоответствиеМодулейКоманд; Перем ТекущийМодуль; Перем ТаблицаОписанийПараметров; Перем МассивРасположенийМодулей; Процедура ПриСозданииОбъекта() МодульСоставаОПИ = Новый ТекстовыйДокумент(); ФайлСоставаОПИ = "./cli/data/Modules/СоставБиблиотеки.os"; МассивРасположенийМодулей = Новый Массив; МассивРасположенийМодулей.Добавить("./cli/tools/Modules/"); МассивРасположенийМодулей.Добавить("./OInt/core/Modules"); СоответствиеМодулейКоманд = Новый Соответствие(); СоответствиеМодулейКоманд.Вставить("OPI_Telegram" , "telegram"); СоответствиеМодулейКоманд.Вставить("OPI_VK" , "vk"); СоответствиеМодулейКоманд.Вставить("OPI_Viber" , "viber"); СоответствиеМодулейКоманд.Вставить("OPI_Twitter" , "twitter"); СоответствиеМодулейКоманд.Вставить("OPI_Notion" , "notion"); СоответствиеМодулейКоманд.Вставить("OPI_YandexID" , "yandex"); СоответствиеМодулейКоманд.Вставить("OPI_YandexDisk" , "yadisk"); СоответствиеМодулейКоманд.Вставить("OPI_GoogleWorkspace", "google"); СоответствиеМодулейКоманд.Вставить("OPI_GoogleCalendar" , "gcalendar"); СоответствиеМодулейКоманд.Вставить("OPI_GoogleDrive" , "gdrive"); СоответствиеМодулейКоманд.Вставить("OPI_GoogleSheets" , "gsheets"); СоответствиеМодулейКоманд.Вставить("OPI_Slack" , "slack"); СоответствиеМодулейКоманд.Вставить("OPI_Airtable" , "airtable"); СоответствиеМодулейКоманд.Вставить("Утилиты" , "tools"); МодульСоставаОПИ.ДобавитьСтроку("Функция ПолучитьСоответствиеКомандМодулей() Экспорт"); МодульСоставаОПИ.ДобавитьСтроку("СоответствиеКомандМодулей = Новый Соответствие();"); Для Каждого КомандаМодуля Из СоответствиеМодулейКоманд Цикл МодульСоставаОПИ.ДобавитьСтроку("СоответствиеКомандМодулей.Вставить(""" + КомандаМодуля.Значение + """, """ + КомандаМодуля.Ключ + """);"); КонецЦикла; МодульСоставаОПИ.ДобавитьСтроку("Возврат СоответствиеКомандМодулей;"); МодульСоставаОПИ.ДобавитьСтроку("КонецФункции"); МодульСоставаОПИ.ДобавитьСтроку(""); МодульСоставаОПИ.ДобавитьСтроку("Функция ПолучитьСостав() Экспорт | | ТаблицаСостава = Новый ТаблицаЗначений(); | ТаблицаСостава.Колонки.Добавить(""Библиотека""); | ТаблицаСостава.Колонки.Добавить(""Модуль""); | ТаблицаСостава.Колонки.Добавить(""Метод""); | ТаблицаСостава.Колонки.Добавить(""МетодПоиска""); | ТаблицаСостава.Колонки.Добавить(""Параметр""); | ТаблицаСостава.Колонки.Добавить(""Описание""); | ТаблицаСостава.Колонки.Добавить(""ОписаниеМетода""); |"); ТаблицаОписанийПараметров = Новый ТаблицаЗначений; ТаблицаОписанийПараметров.Колонки.Добавить("Имя"); ТаблицаОписанийПараметров.Колонки.Добавить("Типы"); ТаблицаОписанийПараметров.Колонки.Добавить("Описание"); ТаблицаОписанийПараметров.Колонки.Добавить("ЗначениеПоУмолчанию"); ЗаполнитьТаблицуСостава(); МодульСоставаОПИ.ДобавитьСтроку(" Возврат ТаблицаСостава;"); МодульСоставаОПИ.ДобавитьСтроку("КонецФункции"); МодульСоставаОПИ.ДобавитьСтроку(Символы.ПС); МодульСоставаОПИ.Записать(ФайлСоставаОПИ); КонецПроцедуры Процедура ЗаполнитьТаблицуСостава() ОбщийМассивМодулей = Новый Массив; Для Каждого Расположение Из МассивРасположенийМодулей Цикл ФайлыМодулей = НайтиФайлы(Расположение, "*.os"); Для Каждого Модуль Из ФайлыМодулей Цикл ОбщийМассивМодулей.Добавить(Модуль); КонецЦикла; КонецЦикла; Для Каждого Модуль Из ОбщийМассивМодулей Цикл ТекущийМодуль = Модуль.ИмяБезРасширения; Если Не СоответствиеМодулейКоманд[ТекущийМодуль] = Неопределено Тогда РазобратьМодуль(Модуль); КонецЕсли; КонецЦикла; КонецПроцедуры Процедура РазобратьМодуль(Модуль) Парсер = Новый ПарсерВстроенногоЯзыка; ДокументМодуля = Новый ТекстовыйДокумент; ДокументМодуля.Прочитать(Модуль.ПолноеИмя); ТекстМодуля = ДокументМодуля.ПолучитьТекст(); СтруктураМодуля = Парсер.Разобрать(ТекстМодуля); Для Каждого Метод Из СтруктураМодуля.Объявления Цикл Если Метод.Тип = "ОбъявлениеМетода" И Метод.Сигнатура.Экспорт = Истина Тогда ТаблицаОписанийПараметров.Очистить(); РазобратьКомментарийМетода(ДокументМодуля, Метод, Модуль); КонецЕсли; КонецЦикла; КонецПроцедуры Процедура РазобратьКомментарийМетода(ТекстовыйДокумент, Метод, Модуль) НомерСтроки = Метод.Начало.НомерСтроки; ИмяМетода = Метод.Сигнатура.Имя; МассивКомментария = ПарсингКомментария(ТекстовыйДокумент, НомерСтроки); Если МассивКомментария.Количество() = 0 Тогда Возврат; КонецЕсли; МассивПараметров = Новый Массив; ОписаниеМетода = ""; СформироватьСтруктуруМетода(МассивКомментария, МассивПараметров, ОписаниеМетода); СформироватьТаблицуОписанийПараметров(МассивПараметров, Метод); ДопОписание = ""; ОпределитьДопОписание(ДопОписание, Модуль); ОписаниеМетода = СокрЛП(ОписаниеМетода) + ДопОписание; Для Каждого СтрокаПараметра Из ТаблицаОписанийПараметров Цикл ЗаписатьСозданиеПараметраСостава(СтрокаПараметра, ИмяМетода, СокрЛП(ОписаниеМетода)); ОписаниеМетода = ""; КонецЦикла; КонецПроцедуры Функция ПарсингКомментария(Знач ТекстовыйДокумент, Знач НомерСтроки) ТекущаяСтрока = ТекстовыйДокумент.ПолучитьСтроку(НомерСтроки - 1); ТекстКомментария = ТекущаяСтрока; Счетчик = 1; Пока СтрНайти(ТекущаяСтрока, "//") > 0 Цикл Счетчик = Счетчик + 1; ТекущаяСтрока = ТекстовыйДокумент.ПолучитьСтроку(НомерСтроки - Счетчик); ТекстКомментария = ТекущаяСтрока + Символы.ПС + ТекстКомментария; КонецЦикла; Если СтрНайти(ТекстКомментария, "!NOCLI") > 0 Тогда Возврат Новый Массив; КонецЕсли; МассивКомментария = СтрРазделить(ТекстКомментария, "//", Ложь); Если МассивКомментария.Количество() = 0 Тогда Сообщить(ТекстКомментария); Возврат Новый Массив; Иначе МассивКомментария.Удалить(0); КонецЕсли; Возврат МассивКомментария; КонецФункции Процедура СформироватьСтруктуруМетода(Знач МассивКомментария, МассивПараметров, ОписаниеМетода) ЗаписыватьПараметры = Ложь; ЗаписыватьОписание = Истина; Счетчик = 0; Для Каждого СтрокаКомментария Из МассивКомментария Цикл Счетчик = Счетчик + 1; Если Не ЗначениеЗаполнено(СокрЛП(СтрокаКомментария)) Тогда ЗаписыватьОписание = Ложь; КонецЕсли; Если ЗаписыватьОписание = Истина И Счетчик > 1 Тогда ОписаниеМетода = ?(ЗначениеЗаполнено(ОписаниеМетода), ОписаниеМетода + " | ", ОписаниеМетода) + СтрокаКомментария; КонецЕсли; Если СтрНайти(СтрокаКомментария, "Параметры:") > 0 Тогда ЗаписыватьПараметры = Истина; ЗаписыватьОписание = Ложь; ИначеЕсли СтрНайти(СтрокаКомментария, "Возвращаемое значение:") > 0 Тогда Прервать; ИначеЕсли ЗаписыватьПараметры = Истина И ЗначениеЗаполнено(СокрЛП(СтрокаКомментария)) И Не СтрНачинаетсяС(СокрЛП(СтрокаКомментария), "*") = 0 Тогда МассивПараметров.Добавить(СтрокаКомментария); Иначе Продолжить; КонецЕсли; КонецЦикла; КонецПроцедуры Процедура СформироватьТаблицуОписанийПараметров(Знач МассивПараметров, Знач Метод) Разделитель = "-"; Для Каждого ПараметрМетода Из МассивПараметров Цикл МассивЭлементовПараметра = СтрРазделить(ПараметрМетода, Разделитель, Ложь); КоличествоЭлементов = МассивЭлементовПараметра.Количество(); Для Н = 0 По МассивЭлементовПараметра.ВГраница() Цикл МассивЭлементовПараметра[Н] = СокрЛП(МассивЭлементовПараметра[Н]); КонецЦикла; Если КоличествоЭлементов < 4 Тогда Возврат; КонецЕсли; Имя1С = МассивЭлементовПараметра[0]; Имя = "--" + МассивЭлементовПараметра[3]; Типы = МассивЭлементовПараметра[1]; Описание = ?(КоличествоЭлементов >= 5, МассивЭлементовПараметра[4], МассивЭлементовПараметра[2]); НоваяСтрокаТаблицы = ТаблицаОписанийПараметров.Добавить(); НоваяСтрокаТаблицы.Имя = Имя; НоваяСтрокаТаблицы.Типы = Типы; НоваяСтрокаТаблицы.Описание = Описание; НоваяСтрокаТаблицы.ЗначениеПоУмолчанию = ПолучитьЗначениеПараметраПоУмолчанию(Имя1С, Метод); КонецЦикла; КонецПроцедуры Функция ПолучитьЗначениеПараметраПоУмолчанию(Знач Имя, Знач Метод) Значение = ""; Для Каждого ПараметрМетода Из Метод.Сигнатура.Параметры Цикл Если ПараметрМетода.Имя = Имя Тогда ЗначениеПараметра = ПараметрМетода.Значение; Если ЗначениеЗаполнено(ЗначениеПараметра) Тогда Попытка Значение = ЗначениеПараметра["Элементы"][0]["Значение"]; Исключение Значение = ЗначениеПараметра.Значение; КонецПопытки; Значение = ?(ЗначениеЗаполнено(Значение), Значение, "Пустое значение"); КонецЕсли; КонецЕсли; КонецЦикла; Возврат Значение; КонецФункции Процедура ОпределитьДопОписание(ДопОписание, Модуль) ЕстьМассив = Ложь; ЕстьДата = Ложь; ТекстДополнения = ""; ИмяМодуля = Модуль.ИмяБезРасширения; ДЛя Каждого СтрокаПараметра Из ТаблицаОписанийПараметров Цикл Типы = СтрокаПараметра["Типы"]; Имя = СтрокаПараметра["Имя"]; Если СтрНайти(Типы, "Массив") > 0 Тогда ЕстьМассив = Истина; КонецЕсли; Если СтрНайти(Типы, "Дата") > 0 Тогда ЕстьДата = Истина; КонецЕсли; ОпределитьДопОписаниеПоПараметру(ТекстДополнения, ИмяМодуля, Имя) КонецЦикла; Если ЕстьМассив Тогда ТекстДополнения = " | | Пример указания параметра типа массив: | --param ""['Val1','Val2','Val3']"" |" + ТекстДополнения; КонецЕсли; Если ЕстьДата Тогда ТекстДополнения = " | | Дата указывается в формате ISO 8601: | ""2024-04-07"" | ""2024-04-07T13:34:42+00:00"" | ""2024-04-07T13:34:42Z"" |" + ТекстДополнения; КонецЕсли; ТекстДополнения = СтрЗаменить(ТекстДополнения, Символы.ПС, Символы.ПС + " |"); ДопОписание = ДопОписание + СтрЗаменить(ТекстДополнения, """", """"""); КонецПроцедуры Процедура ОпределитьДопОписаниеПоПараметру(ТекстДополнения, ИмяМодуля, ИмяПараметра) Если ИмяМодуля = "OPI_VK" Тогда Если ИмяПараметра = "--auth" Тогда ТекстДополнения = ТекстДополнения + " | | Структура JSON данных авторизации (параметр --auth): | { | ""access_token"": """", | ""owner_id"" : """", | ""app_id"" : """", | ""group_id"" : """" | } |"; ИначеЕсли ИмяПараметра = "--product" Тогда ТекстДополнения = ТекстДополнения + " | | Структура JSON данных описания товара (параметр --product): | { | ""Имя"" : ""Новый товар"", | ""Описание"" : ""Описание товара"", | ""Категория"" : ""20173"", | ""Цена"" : 1, | ""СтараяЦена"" : """", | ""ОсновноеФото"" : """", | ""URL"" : """", | ""ДополнительныеФото"" : [], | ""ЗначенияСвойств"" : [], | ""ГлавныйВГруппе"" : ""Ложь"", | ""Ширина"" : """", | ""Высота"" : """", | ""Глубина"" : """", | ""Вес"" : """", | ""SKU"" : """", | ""ДоступныйОстаток"" : ""1"" | } |"; КонецЕсли; КонецЕсли; Если ИмяМодуля = "OPI_Telegram" Тогда Если ИмяПараметра = "--media" Тогда ТекстДополнения = ТекстДополнения + " | | Структура JSON данных медиагруппы (параметр --media): | { | ""ПутьКФайлу"": ""ТипМедиа"", | ""ПутьКФайлу"": ""ТипМедиа"", | ... | } |"; КонецЕсли; КонецЕсли; Если ИмяМодуля = "OPI_Twitter" Тогда Если ИмяПараметра = "--auth" Тогда ТекстДополнения = ТекстДополнения + " | | Структура JSON данных авторизации (параметр --auth): | { | ""redirect_uri"" : """", | ""client_id"" : """", | ""client_secret"" : """", | ""access_token"" : """", | ""refresh_token"" : """", | ""oauth_token"" : """", | ""oauth_token_secret"" : """", | ""oauth_consumer_key"" : """", | ""oauth_consumer_secret"" : """" | } |"; КонецЕсли; КонецЕсли; Если ИмяМодуля = "OPI_Notion" Тогда Если ИмяПараметра = "--data" Тогда ТекстДополнения = ТекстДополнения + " | | Структура JSON данных страницы (параметр --data): | { | ""Имя поля БД 1"" : ""Значение1"", | ""Имя поля БД 2"" : ""Значение2"", | ... | } |"; ИначеЕсли ИмяПараметра = "--props" Тогда ТекстДополнения = ТекстДополнения + " | | Структура JSON полей базы (параметр --props): | { | ""Имя поля БД c обычным типом"" : ""Тип данных 1"", | ""Имя поля БД с выбором значения"" : | { | ""Вариант1"" : ""green"", | ""Вариант2"" : ""red"", | ... | }, | ... | } | | Доуступные типы: title(ключевой), rich_text, number, status, | date, files, checkbox, url, email, phone_number, people |"; КонецЕсли; КонецЕсли; Если ИмяМодуля = "OPI_GoogleCalendar" Тогда Если ИмяПараметра = "--props" Тогда ТекстДополнения = ТекстДополнения + " | | Структура JSON данных события (параметр --props): | { | ""Описание"" : """", | ""Заголовок"" : """", | ""МестоПроведения"" : """", | ""ДатаНачала"" : """", | ""ДатаОкончания"" : """", | ""МассивURLФайловВложений"" : | { | ""НазваниеФайла1"" : ""URLФайла1"", | ""НазваниеФайла2"" : ""URLФайла2"", | ... | }, | ""ОтправлятьУведомления"" : true | } |"; КонецЕсли; КонецЕсли; Если ИмяМодуля = "OPI_GoogleDrive" Тогда Если ИмяПараметра = "--props" Тогда ТекстДополнения = ТекстДополнения + " | | Структура JSON данных объекта (параметр --props): | { | ""MIME"" : ""image/jpeg"", | ""Имя"" : ""Новый файл.jpg"", | ""Описание"" : ""Это новый файл"", | ""Родитель"" : ""root"" | } |"; КонецЕсли; КонецЕсли; Если ИмяМодуля = "OPI_GoogleSheets" Тогда Если ИмяПараметра = "--data" Тогда ТекстДополнения = ТекстДополнения + " | | Структура JSON данных ячеек (параметр --data): | { | ""A1"": ""Это данные ячейки A1"", | ""B2"": ""Это данные ячейки B2"", | ... | } |"; КонецЕсли; КонецЕсли; Если ИмяМодуля = "OPI_Airtable" Тогда ФункцииПолей = "Функции формирования описаний полей: " + "ПолучитьПолеСтроковое, " + "ПолучитьПолеНомера"; Если ИмяПараметра = "--fieldsdata" Тогда ТекстДополнения = ТекстДополнения + Символы.ПС + ФункцииПолей + Символы.ПС; КонецЕсли; Если ИмяПараметра = "--fieldsdata" Тогда ТекстДополнения = ТекстДополнения + " | | Структура JSON данных массива полей (параметр --fieldsdata): | [ | { | <Данные описание поля 1> | }, | { | <Данные описание поля 2> | }, | ] |"; ТекстДополнения = ТекстДополнения + Символы.ПС + ФункцииПолей + Символы.ПС; КонецЕсли; Если ИмяПараметра = "--tablesdata" Тогда ТекстДополнения = ТекстДополнения + " | | Структура JSON данных описания таблиц (параметр --tablesdata): | { | ""Имя таблицы 1"": [ | { | <Данные описание поля 1> | }, | { | <Данные описание поля 2> | }, | ], | ... | } |"; ТекстДополнения = ТекстДополнения + Символы.ПС + ФункцииПолей + Символы.ПС; КонецЕсли; КонецЕсли; КонецПроцедуры Процедура ЗаписатьСозданиеПараметраСостава(СтрокаПараметра, ИмяМетода, ОписаниеМетода = "") Имя = СтрокаПараметра["Имя"]; Описание = СтрокаПараметра["Описание"]; Значение = СтрокаПараметра["ЗначениеПоУмолчанию"]; Библиотека = СоответствиеМодулейКоманд.Получить(ТекущийМодуль); Если ЗначениеЗаполнено(Значение) Тогда Описание = Описание + " (необяз. по ум. - " + Значение + ")"; КонецЕсли; МодульСоставаОПИ.ДобавитьСтроку(Символы.ПС); МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока = ТаблицаСостава.Добавить();"); МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.Библиотека = """ + Библиотека + """;"); МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.Модуль = """ + ТекущийМодуль + """;"); МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.Метод = """ + ИмяМетода + """;"); МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.МетодПоиска = """ + вРег(ИмяМетода) + """;"); МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.Параметр = """ + Имя + """;"); МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.Описание = """ + Описание + """;"); Если ЗначениеЗаполнено(ОписаниеМетода) Тогда МодульСоставаОПИ.ДобавитьСтроку(" НоваяСтрока.ОписаниеМетода = """ + ОписаниеМетода + """;"); КонецЕсли; МодульСоставаОПИ.ДобавитьСтроку(Символы.ПС); КонецПроцедуры ПриСозданииОбъекта();