├── pict ├── html1.PNG ├── html2.PNG ├── confluence1.png ├── confluence2.png └── confluence3.png ├── .gitignore ├── installlocalhost.sh ├── installlocalhost.bat ├── src ├── Команды │ ├── КомандаСправкаПоПриложению.os │ ├── ШаблонКоманды.os-template │ ├── ПроверитьИсходники.os │ ├── СгенерироватьДокументациюПоФайлу.os │ ├── СгенерироватьДокументацию.os │ └── ПроверитьОпубликованнуюДокументацию.os ├── additional │ ├── Шаблоны_Markdown.json │ ├── Шаблоны_HTML.json │ └── Шаблоны_conluence.json ├── main.os ├── Модули │ ├── ПараметрыПриложения.os │ ├── МенеджерПриложения.os │ ├── ПомощникГенерацииДокументации.os │ └── ОбщегоНазначения.os ├── package-loader.os └── Классы │ ├── ШаблонГенераторДокументации.os-template │ ├── ГенераторДокументации_markdown.os │ ├── ГенераторДокументации_html.os │ ├── ГенераторДокументации_JSON.os │ ├── НастройкиСтенда.os │ ├── ГенераторДокументации_confluence.os │ └── ГенераторДокументации.os ├── tasks ├── test-feature.os └── test.os ├── features ├── opm-build.feature └── ПростыеКоманды.feature ├── packagedef ├── tests ├── fixtures │ ├── config.json │ ├── bad-configuration │ │ ├── CommonModules │ │ │ ├── TestModule │ │ │ │ └── Ext │ │ │ │ │ └── Module.bsl │ │ │ └── TestModule.xml │ │ ├── Subsystems │ │ │ ├── Уровень1.xml │ │ │ └── Уровень1 │ │ │ │ └── Subsystems │ │ │ │ ├── Уровень2.xml │ │ │ │ └── Уровень2 │ │ │ │ └── Subsystems │ │ │ │ └── Уровень3.xml │ │ └── Configuration.xml │ └── configuration │ │ ├── CommonModules │ │ ├── TestModule.xml │ │ └── TestModule │ │ │ └── Ext │ │ │ └── Module.bsl │ │ ├── Subsystems │ │ ├── Уровень1.xml │ │ └── Уровень1 │ │ │ └── Subsystems │ │ │ ├── Уровень2.xml │ │ │ └── Уровень2 │ │ │ └── Subsystems │ │ │ └── Уровень3.xml │ │ └── Configuration.xml ├── ТестПроверкаФайла.os └── ТестГенерацияДокументацииПоФайлу.os ├── LICENSE ├── Jenkinsfile └── readme.md /pict/html1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bia-technologies/autodocgen/HEAD/pict/html1.PNG -------------------------------------------------------------------------------- /pict/html2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bia-technologies/autodocgen/HEAD/pict/html2.PNG -------------------------------------------------------------------------------- /pict/confluence1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bia-technologies/autodocgen/HEAD/pict/confluence1.png -------------------------------------------------------------------------------- /pict/confluence2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bia-technologies/autodocgen/HEAD/pict/confluence2.png -------------------------------------------------------------------------------- /pict/confluence3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bia-technologies/autodocgen/HEAD/pict/confluence3.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | bdd-log.xml 2 | *.ospx 3 | *.orig 4 | *.log 5 | ignore/** 6 | tests.xml 7 | .vscode/** 8 | **/*_autodoc/** 9 | -------------------------------------------------------------------------------- /installlocalhost.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | rm *.ospx 3 | 4 | result=$(oscript -version) 5 | 6 | if [[ $result = "1.0.19.105" ]]; then 7 | opm build . -mf ./packagedef -out . 8 | else 9 | opm build -m ./packagedef -o . 10 | fi 11 | 12 | opm install -f *.ospx 13 | -------------------------------------------------------------------------------- /installlocalhost.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | call del "*.ospx" 3 | 4 | for /f %%i in ('"oscript -version"') do set result=%%i 5 | 6 | if %result%==1.0.19.105 ( 7 | call opm build . -mf ./packagedef -out . 8 | ) else ( 9 | call opm build -m ./packagedef -o . 10 | ) 11 | 12 | call opm install -f *.ospx -------------------------------------------------------------------------------- /src/Команды/КомандаСправкаПоПриложению.os: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////// 2 | // 3 | // Служебный модуль с реализацией работы команды help 4 | // 5 | /////////////////////////////////////////////////////////////////////////////// 6 | 7 | Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт 8 | 9 | КомандаПриложения.ВывестиСправку(); 10 | 11 | КонецПроцедуры -------------------------------------------------------------------------------- /tasks/test-feature.os: -------------------------------------------------------------------------------- 1 | #Использовать ".." 2 | #Использовать 1bdd 3 | 4 | КаталогФич = ОбъединитьПути(".", "features"); 5 | ПутьФичи = ОбъединитьПути(".", "features", АргументыКоманднойСтроки[0]); 6 | Файл_КаталогФич = Новый Файл(КаталогФич); 7 | ФайлФичи = Новый Файл(ПутьФичи); 8 | 9 | ИсполнительБДД = Новый ИсполнительБДД; 10 | РезультатВыполнения = ИсполнительБДД.ВыполнитьФичу(ФайлФичи, Файл_КаталогФич); 11 | ИтоговыйРезультатВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатВыполнения); 12 | 13 | Сообщить(ИтоговыйРезультатВыполнения); 14 | Если ИтоговыйРезультатВыполнения = ИсполнительБДД.ВозможныеСтатусыВыполнения().Сломался Тогда 15 | 16 | ВызватьИсключение 1; 17 | 18 | КонецЕсли; 19 | -------------------------------------------------------------------------------- /src/additional/Шаблоны_Markdown.json: -------------------------------------------------------------------------------- 1 | { 2 | "ШаблонСплиттерНачало": "## %1\n", 3 | "ШаблонСплиттерКонец": "", 4 | "ШаблонЗаголовок": "## %1\n", 5 | "ШаблонЗаголовокДляКонстант": "### %1\n", 6 | "ШаблонШапкаТЧ": "| № | Параметр | Обязательный | Тип | Описание |\n|---|---|---|---|---|", 7 | "ШаблонШапкаТЧДляКонстант": "| Константа | Тип | Описание|\n|---|---|---|", 8 | "ШаблонСтрокаТЧ": "| %1 | %2 | %3 | %4 | %5", 9 | "ШаблонСтрокаТЧДляКонстант": "| %1 | %2 | %3 |", 10 | "ШаблонПодвалТЧ": "", 11 | "ШаблонВозврат": "*Возвращаемое значение:*\n\n**%1** - %2\n", 12 | "ШаблонОписание": "%1\n", 13 | "ШаблонПример": "\nПример вызова\n\n```bsl\n%1\n```", 14 | "ШаблонНачалоСтраницы": "# %1\n", 15 | "ШаблонКонецСтраницы": "\n" 16 | } -------------------------------------------------------------------------------- /features/opm-build.feature: -------------------------------------------------------------------------------- 1 | # language: ru 2 | 3 | Функционал: Проверка сборки продукта 4 | Как Пользователь 5 | Я хочу автоматически проверять сборку моего продукта 6 | Чтобы гарантировать возможность установку моего продукта у пользователей 7 | 8 | Контекст: Отключение отладки в логах 9 | Допустим Я выключаю отладку лога с именем "oscript.lib.commands" 10 | И Я очищаю параметры команды "opm" в контексте 11 | 12 | Сценарий: Выполнение команды без параметров 13 | Когда Я добавляю параметр "build ." для команды "opm" 14 | И Я выполняю команду "opm" 15 | Тогда Вывод команды "opm" содержит "Сборка пакета завершена" 16 | И Вывод команды "opm" не содержит "Внешнее исключение" 17 | И Код возврата команды "opm" равен 0 18 | -------------------------------------------------------------------------------- /src/main.os: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////// 2 | // 3 | // CLI-интерфейс для oscript-app 4 | // 5 | /////////////////////////////////////////////////////////////////////////////// 6 | 7 | /////////////////////////////////////////////////////////////////////////////// 8 | // 9 | // Рекомендованная структура модуля точки входа приложения 10 | // 11 | /////////////////////////////////////////////////////////////////////////////// 12 | 13 | #Использовать "." 14 | 15 | /////////////////////////////////////////////////////////////////////////////// 16 | 17 | Попытка 18 | 19 | МенеджерПриложения.Запустить(АргументыКоманднойСтроки); 20 | 21 | Исключение 22 | 23 | Сообщить(ОписаниеОшибки()); 24 | ЗавершитьРаботу(1); 25 | 26 | КонецПопытки; -------------------------------------------------------------------------------- /packagedef: -------------------------------------------------------------------------------- 1 | ПутьКСценариюПараметров = ОбъединитьПути(ТекущийСценарий().Каталог, "src", "Модули", "ПараметрыПриложения.os"); 2 | ПараметрыСистемы_ЛокальнаяВерсия = ЗагрузитьСценарий(ПутьКСценариюПараметров); 3 | 4 | ИмяПродукта = НРег(ПараметрыСистемы_ЛокальнаяВерсия.ИмяПродукта()); 5 | 6 | Описание.Имя(ИмяПродукта) 7 | .ВерсияСреды("1.8.3.2") 8 | .Версия(ПараметрыСистемы_ЛокальнаяВерсия.ВерсияПродукта()) 9 | .ЗависитОт("logos", "1.4") 10 | .ЗависитОт("cli", "0.10.0") 11 | .ЗависитОт("tempfiles", "1.0.0") 12 | .ЗависитОт("1commands", "1.5.0") 13 | .ЗависитОт("confluence", "1.1.2") 14 | .ЗависитОт("bsl-parser", "23.05") 15 | .ЗависитОт("json", "1.1.1") 16 | .ВключитьФайл("src") 17 | .ВключитьФайл("pict") 18 | .ВключитьФайл("readme.md") 19 | .ВключитьФайл("LICENSE") 20 | .ИсполняемыйФайл("src/main.os", ИмяПродукта); 21 | -------------------------------------------------------------------------------- /tests/fixtures/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "GLOBAL": { 3 | "КаталогИсходныхФайлов": "src/configuration", 4 | "version": "1.0.4" 5 | }, 6 | "AutodocGen":{ 7 | "НастройкиConluence": { 8 | "АдресСервера":"https://confluence.ru/", 9 | "Пространство":"bsptest", 10 | "КорневаяСтраница":"MD-page", 11 | "АнализироватьТолькоПотомковПодсистемы": "ПодсистемыБСП" 12 | }, 13 | "НастройкиJSON": { 14 | "КаталогПубликации": "./json_autodoc", 15 | "АнализироватьТолькоПотомковПодсистемы": "ПодсистемыБСП" 16 | }, 17 | "НастройкиHTML": { 18 | "КаталогПубликации": "./html_autodoc", 19 | "АнализироватьТолькоПотомковПодсистемы": "ПодсистемыБСП" 20 | }, 21 | "НастройкиMarkdown": { 22 | "КаталогПубликации": "./markdown_autodoc", 23 | "АнализироватьТолькоПотомковПодсистемы": "ПодсистемыБСП" 24 | }, 25 | "ПоследнийОбработанныйКоммит": "" 26 | } 27 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Andrei Ovsiankin 4 | Copyright (c) 2015-2023 Valery Maximov aka theshadowco 5 | Copyright (c) 2017-2023 BIA Technologies, LLC 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so, subject to the following conditions: 13 | 14 | The above copyright notice and this permission notice shall be included in all 15 | copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 | SOFTWARE. 24 | -------------------------------------------------------------------------------- /src/additional/Шаблоны_HTML.json: -------------------------------------------------------------------------------- 1 | { 2 | "ШаблонСплиттерНачало": "%1", 3 | "ШаблонСплиттерКонец": "", 4 | "ШаблонЗаголовок": "

%1

", 5 | "ШаблонЗаголовокДляКонстант": "

%1

", 6 | "ШаблонШапкаТЧ": "", 7 | "ШаблонШапкаТЧДляКонстант": "
 ПараметрОбязательныйТипОписание
", 8 | "ШаблонСтрокаТЧ": "", 9 | "ШаблонСтрокаТЧДляКонстант": "", 10 | "ШаблонПодвалТЧ": "
КонстантаТипОписание
%1%2%3%4%5
%1%2%3
", 11 | "ШаблонВозврат": "

Возвращаемое значение

%1 - %2

", 12 | "ШаблонОписание": "

%1

", 13 | "ШаблонПример": "

Пример вызова

", 14 | "ШаблонНачалоСтраницы": "", 15 | "ШаблонКонецСтраницы": "" 16 | } -------------------------------------------------------------------------------- /tests/fixtures/bad-configuration/CommonModules/TestModule/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 | #Область ПрограммныйИнтерфейс 2 | 3 | Функция ТестоваяФункция() Экспорт 4 | 5 | КонецФункции 6 | 7 | // ФункцияСПараметрами 8 | // Метод принимающий два параметра и возвращающий их сумму 9 | // Параметры: 10 | // Параметр1 - Строка - Строковый параметр метода 11 | // Параметр4 - Массив, Число, Строка - Второй параметр метода 12 | // Может принимать различные типы 13 | // Возвращаемое значение: 14 | // Строка - Конкантенация параметров 15 | // Примеры: 16 | // ФункцияСПараметрами("Привет", ", мир!") 17 | // 18 | Функция ФункцияСПараметрами(Параметр1, Параметр2) Экспорт 19 | 20 | Возврат Параметр1 + Параметр2; 21 | 22 | КонецФункции 23 | 24 | // ПроцедураСПараметрами 25 | // Что-то делает, но не известно что. 26 | // Параметры: 27 | // Параметры: 28 | // Параметр1 29 | // Параметр2 - Массив, Число, Строка - Второй параметр метода 30 | // Может принимать различные типы 31 | // 32 | Процедура ПроцедураСПараметрами(Параметр1, Параметр2) Экспорт 33 | 34 | КонецПроцедуры 35 | 36 | // ПроцедураСПараметром 37 | // Что-то делает, но не известно что. 38 | // Параметры: 39 | // Параметры: 40 | // Параметр1 - Произвольный 41 | // 42 | Процедура ПроцедураСПараметром(Параметр1) Экспорт 43 | 44 | КонецПроцедуры 45 | 46 | #КонецОбласти 47 | 48 | #Область СлужебныйПрограммныйИнтерфейс 49 | 50 | #КонецОбласти -------------------------------------------------------------------------------- /tests/fixtures/configuration/CommonModules/TestModule.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | TestModule 6 | 7 | 8 | ru 9 | TestModule 10 | 11 | 12 | false 13 | true 14 | true 15 | true 16 | true 17 | false 18 | false 19 | DontUse 20 | 21 | 22 | -------------------------------------------------------------------------------- /tests/fixtures/bad-configuration/CommonModules/TestModule.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | TestModule 6 | 7 | 8 | ru 9 | TestModule 10 | 11 | 12 | false 13 | true 14 | true 15 | true 16 | true 17 | false 18 | false 19 | DontUse 20 | 21 | 22 | -------------------------------------------------------------------------------- /tests/fixtures/configuration/Subsystems/Уровень1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Уровень1 6 | 7 | 8 | ru 9 | Уровень 1 10 | 11 | 12 | 13 | true 14 | false 15 | 16 | 17 | ru 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | Уровень2 26 | 27 | 28 | -------------------------------------------------------------------------------- /tests/fixtures/bad-configuration/Subsystems/Уровень1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Уровень1 6 | 7 | 8 | ru 9 | Уровень 1 10 | 11 | 12 | 13 | true 14 | false 15 | 16 | 17 | ru 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | Уровень2 26 | 27 | 28 | -------------------------------------------------------------------------------- /tests/fixtures/bad-configuration/Subsystems/Уровень1/Subsystems/Уровень2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Уровень2 6 | 7 | 8 | ru 9 | Уровень 2 10 | 11 | 12 | 13 | true 14 | true 15 | 16 | 17 | ru 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | Уровень3 26 | 27 | 28 | -------------------------------------------------------------------------------- /tests/fixtures/configuration/Subsystems/Уровень1/Subsystems/Уровень2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Уровень2 6 | 7 | 8 | ru 9 | Уровень 2 10 | 11 | 12 | 13 | true 14 | true 15 | 16 | 17 | ru 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | Уровень3 26 | 27 | 28 | -------------------------------------------------------------------------------- /features/ПростыеКоманды.feature: -------------------------------------------------------------------------------- 1 | # language: ru 2 | 3 | Функциональность: Выполнение команды продукта 4 | 5 | Как разработчик 6 | Я хочу иметь возможность выполнять команды продукта 7 | Чтобы выполнять коллективную разработку приложения для OneScript 8 | 9 | Контекст: 10 | Допустим Я очищаю параметры команды "oscript" в контексте 11 | И я включаю отладку лога с именем "oscript.app.AutodocGen" 12 | # И я включаю отладку лога с именем "bdd" 13 | 14 | Сценарий: Получение версии продукта 15 | Когда Я выполняю команду "oscript" c параметрами "src/main.os version" 16 | Тогда Я сообщаю вывод команды "oscript" 17 | И Вывод команды "oscript" содержит "1.0.4" 18 | И Вывод команды "oscript" не содержит "AutodocGen v" 19 | И Код возврата команды "oscript" равен 0 20 | 21 | Сценарий: Получение помощи продукта 22 | Когда Я выполняю команду "oscript" c параметрами "src/main.os help" 23 | Тогда Вывод команды "oscript" содержит 24 | """ 25 | AutodocGen v1.0.4 26 | Возможные команды: 27 | help - Выводит справку по командам 28 | version - Выводит версию приложения 29 | generate - Выполняет генерацию документации на основании исходных файлов 30 | """ 31 | И Код возврата команды "oscript" равен 0 32 | 33 | Сценарий: Вызов исполняемого файла без параметров 34 | Когда Я выполняю команду "oscript" c параметрами "src/main.os" 35 | Тогда Вывод команды "oscript" содержит 36 | """ 37 | AutodocGen v1.0.4 38 | Возможные команды: 39 | help - Выводит справку по командам 40 | version - Выводит версию приложения 41 | generate - Выполняет генерацию документации на основании исходных файлов 42 | """ 43 | И Код возврата команды "oscript" равен 5 44 | -------------------------------------------------------------------------------- /tests/fixtures/configuration/Subsystems/Уровень1/Subsystems/Уровень2/Subsystems/Уровень3.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Уровень3 6 | 7 | 8 | ru 9 | Уровень 3 10 | 11 | 12 | 13 | true 14 | true 15 | 16 | 17 | ru 18 | 19 | 20 | 21 | 22 | 23 | CommonModule.TestModule 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /tests/fixtures/bad-configuration/Subsystems/Уровень1/Subsystems/Уровень2/Subsystems/Уровень3.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Уровень3 6 | 7 | 8 | ru 9 | Уровень 3 10 | 11 | 12 | 13 | true 14 | true 15 | 16 | 17 | ru 18 | 19 | 20 | 21 | 22 | 23 | CommonModule.TestModule 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /src/Команды/ШаблонКоманды.os-template: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////////// 2 | // 3 | // Служебный модуль с реализацией работы команды 4 | // 5 | /////////////////////////////////////////////////////////////////////////////// 6 | 7 | // Возвращает имя команды приложения 8 | Функция ИмяКоманды() Экспорт 9 | 10 | ВызватьИсключение "Не реализовано"; 11 | 12 | Возврат "name"; 13 | 14 | КонецФункции // ИмяКоманды 15 | 16 | // Возвращает описание исполняемой команды 17 | Функция ОписаниеКоманды() Экспорт 18 | 19 | ВызватьИсключение "Не реализовано"; 20 | 21 | Возврат ""; 22 | 23 | КонецФункции // ОписаниеКоманды 24 | 25 | Процедура НастроитьКоманду(Знач Команда, Знач Парсер) Экспорт 26 | 27 | // Добавление параметров команды 28 | // Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "ИмяПараметра", "Описание параметра"); 29 | // Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "ИмяПараметра", "Описание параметра"); 30 | // Парсер.ДобавитьПараметрФлагКоманды(Команда, "ИмяПараметра", "Описание параметра"); 31 | // Парсер.ДобавитьПараметрКоллекцияКоманды(Команда, "ИмяПараметра", "Описание параметра"); 32 | // Парсер.ДобавитьИменованныйПараметрКоллекцияКоманды(Команда, "ИмяПараметра", "Описание параметра"); 33 | 34 | КонецПроцедуры // НастроитьКоманду 35 | 36 | // Выполняет логику команды 37 | // 38 | // Параметры: 39 | // ПараметрыКоманды - Соответствие - Соответствие ключей командной строки и их значений 40 | // Приложение - Модуль - Модуль менеджера приложения 41 | // 42 | Функция ВыполнитьКоманду(Знач ПараметрыКоманды, Знач Приложение) Экспорт 43 | 44 | ВызватьИсключение "Не реализовано"; 45 | 46 | // При успешном выполнении возвращает код успеха 47 | Возврат Приложение.РезультатыКоманд().Успех; 48 | 49 | КонецФункции // ВыполнитьКоманду 50 | -------------------------------------------------------------------------------- /src/Модули/ПараметрыПриложения.os: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////// 2 | // 3 | // Служебный модуль с набором служебных параметров приложения 4 | // 5 | // При создании нового приложения обязательно внести изменение 6 | // в ф-ии ИмяПродукта, указав имя вашего приложения. 7 | // 8 | // При выпуске новой версии обязательно изменить ее значение 9 | // в ф-ии ВерсияПродукта 10 | // 11 | /////////////////////////////////////////////////////////////////////////////// 12 | 13 | #Использовать logos 14 | 15 | /////////////////////////////////////////////////////////////////////////////// 16 | // СВОЙСТВА ПРОДУКТА 17 | 18 | // ИмяПродукта 19 | // Возвращает имя продукта 20 | // 21 | // Возвращаемое значение: 22 | // Строка - Значение имени продукта 23 | // 24 | Функция ИмяПродукта() Экспорт 25 | 26 | Возврат "AutodocGen"; 27 | 28 | КонецФункции // ИмяПродукта 29 | 30 | // КраткоеОписаниеПродукта 31 | // Возвращает краткое описание продукта 32 | // 33 | // Возвращаемое значение: 34 | // Строка - Значение описания продукта 35 | // 36 | Функция КраткоеОписаниеПродукта() Экспорт 37 | 38 | Возврат "Генерация документации по исходному коду 1С"; 39 | 40 | КонецФункции // ИмяПродукта 41 | 42 | // ВерсияПродукта 43 | // Возвращает текущую версию продукта 44 | // 45 | // Возвращаемое значение: 46 | // Строка - Значение текущей версии продукта 47 | // 48 | Функция ВерсияПродукта() Экспорт 49 | 50 | Возврат "23.05"; 51 | 52 | КонецФункции // ВерсияПродукта 53 | 54 | /////////////////////////////////////////////////////////////////////////////// 55 | // ЛОГИРОВАНИЕ 56 | 57 | // Форматирование логов 58 | // См. описание метода "УстановитьРаскладку" библиотеки logos 59 | // 60 | Функция Форматировать(Знач Уровень, Знач Сообщение) Экспорт 61 | 62 | Возврат СтрШаблон("%1: %2 - %3", ТекущаяДата(), УровниЛога.НаименованиеУровня(Уровень), Сообщение); 63 | 64 | КонецФункции 65 | 66 | // ИмяЛогаСистемы 67 | // Возвращает идентификатор лога приложения 68 | // 69 | // Возвращаемое значение: 70 | // Строка - Значение идентификатора лога приложения 71 | // 72 | Функция ИмяЛогаСистемы() Экспорт 73 | 74 | Возврат "oscript.app." + ИмяПродукта(); 75 | 76 | КонецФункции // ИмяЛогаСистемы 77 | -------------------------------------------------------------------------------- /tests/fixtures/configuration/CommonModules/TestModule/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 | #Область ПрограммныйИнтерфейс 2 | 3 | 4 | // ТестоваяФункция 5 | // Тестовый метод 6 | // Возвращаемое значение: 7 | // Произвольный - описание возвращаемого значения 8 | // 9 | Функция ТестоваяФункция() Экспорт 10 | 11 | КонецФункции 12 | 13 | // ФункцияСПараметрами 14 | // Метод принимающий два параметра и возвращающий их сумму 15 | // Параметры: 16 | // Параметр1 - Строка - Строковый параметр метода 17 | // Параметр2 - Массив, Число, Строка - Второй параметр метода 18 | // Может принимать различные типы 19 | // Возвращаемое значение: 20 | // Строка - Конкантенация параметров 21 | // Примеры: 22 | // ФункцияСПараметрами("Привет", ", мир!") 23 | // 24 | Функция ФункцияСПараметрами(Параметр1, Параметр2) Экспорт 25 | 26 | Возврат Параметр1 + Параметр2; 27 | 28 | КонецФункции 29 | 30 | // ПроцедураСПараметрами 31 | // Что-то делает, но не известно что. 32 | // Параметры: 33 | // Параметры: 34 | // Параметр1 - Структура - Набор параметров 35 | // Ключ1 - Первый ключ 36 | // Ключ2 - Второй ключ 37 | // Ключ3 - И третий ключ 38 | // Параметр2 - Массив, Число, Строка - Второй параметр метода 39 | // Может принимать различные типы 40 | // 41 | Процедура ПроцедураСПараметрами(Параметр1, Параметр2) Экспорт 42 | 43 | КонецПроцедуры 44 | 45 | // УстановитьПараметр 46 | // Служит примером многострочных описаний параметров 47 | // Далее по тексту параметр стоит читать как параметр 48 | // 49 | // Параметры: 50 | // Настройки - НастройкиКомпоновкиДанных, ПользовательскиеНастройкиКомпоновкиДанных, 51 | // КомпоновщикНастроекКомпоновкиДанных - проверяется кейс когда описание параметров идет в 2 строки 52 | // Параметр - Строка, ПараметрКомпоновкиДанных - параметр, который требуется установить 53 | // но очень длинное описание параметра 54 | // Значение - Произвольный, 55 | // Строка - значение, которое требуется установить 56 | // Но с длинным описанием 57 | // Использование - Булево - Проверяется кейс когда запятая в конце не ломает описание параметра, 58 | // Недоступный - Булево - просто описание 59 | // 60 | // Возвращаемое значение: 61 | // ЗначениеПараметраНастроекКомпоновкиДанных - установленный параметр настроек КД. Неопределено, если параметр на найден. 62 | // 63 | Функция УстановитьПараметр(Настройки, Параметр, Значение, Использование = Истина, Недоступный = Ложь) Экспорт 64 | 65 | Возврат Настройки; 66 | КонецФункции 67 | 68 | #КонецОбласти 69 | 70 | #Область СлужебныйПрограммныйИнтерфейс 71 | 72 | #КонецОбласти -------------------------------------------------------------------------------- /tasks/test.os: -------------------------------------------------------------------------------- 1 | #Использовать "../src" 2 | #Использовать 1bdd 3 | #Использовать 1testrunner 4 | 5 | Функция ПрогнатьТесты() 6 | 7 | Тестер = Новый Тестер; 8 | 9 | ПутьКТестам = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "tests"); 10 | ПутьКОтчетуJUnit = ОбъединитьПути(ТекущийСценарий().Каталог, ".."); 11 | 12 | КаталогТестов = Новый Файл(ПутьКТестам); 13 | Если Не КаталогТестов.Существует() Тогда 14 | Сообщить(СтрШаблон("Не найден каталог тестов %1", ПутьКТестам)); 15 | Возврат Истина; 16 | КонецЕсли; 17 | 18 | РезультатТестирования = Тестер.ТестироватьКаталог( 19 | КаталогТестов, 20 | Новый Файл(ПутьКОтчетуJUnit) 21 | ); 22 | 23 | Успешно = РезультатТестирования = 0; 24 | 25 | Возврат Успешно; 26 | КонецФункции // ПрогнатьТесты() 27 | 28 | Функция ПрогнатьФичи() 29 | 30 | ПутьОтчетаJUnit = "./bdd-log.xml"; 31 | 32 | КаталогФич = ОбъединитьПути(".", "features"); 33 | 34 | Файл_КаталогФич = Новый Файл(КаталогФич); 35 | Если Не Файл_КаталогФич.Существует() Тогда 36 | Сообщить(СтрШаблон("Не найден каталог фич %1", КаталогФич)); 37 | Возврат Истина; 38 | КонецЕсли; 39 | 40 | ИсполнительБДД = Новый ИсполнительБДД; 41 | РезультатыВыполнения = ИсполнительБДД.ВыполнитьФичу(Файл_КаталогФич, Файл_КаталогФич); 42 | ИтоговыйРезультатВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения); 43 | 44 | СтатусВыполнения = ИсполнительБДД.ВозможныеСтатусыВыполнения().НеВыполнялся; 45 | Если РезультатыВыполнения.Строки.Количество() > 0 Тогда 46 | 47 | СтатусВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения); 48 | 49 | КонецЕсли; 50 | 51 | ГенераторОтчетаJUnit = Новый ГенераторОтчетаJUnit; 52 | ГенераторОтчетаJUnit.Сформировать(РезультатыВыполнения, СтатусВыполнения, ПутьОтчетаJUnit); 53 | 54 | Сообщить(СтрШаблон("Результат прогона фич <%1> 55 | |", ИтоговыйРезультатВыполнения)); 56 | 57 | Возврат ИтоговыйРезультатВыполнения <> ИсполнительБДД.ВозможныеСтатусыВыполнения().Сломался; 58 | КонецФункции // ПрогнатьФичи() 59 | 60 | Попытка 61 | ТестыПрошли = ПрогнатьТесты(); 62 | 63 | Исключение 64 | ТестыПрошли = Ложь; 65 | Сообщить(СтрШаблон("Тесты через 1testrunner выполнены неудачно 66 | |%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); 67 | КонецПопытки; 68 | 69 | Попытка 70 | ФичиПрошли = ПрогнатьФичи(); 71 | Исключение 72 | ФичиПрошли = Ложь; 73 | Сообщить(СтрШаблон("Тесты поведения через 1bdd выполнены неудачно 74 | |%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); 75 | КонецПопытки; 76 | 77 | Если Не ТестыПрошли Или Не ФичиПрошли Тогда 78 | ВызватьИсключение "Тестирование завершилось неудачно!"; 79 | Иначе 80 | Сообщить(СтрШаблон("Результат прогона тестов <%1> 81 | |", ТестыПрошли)); 82 | КонецЕсли; 83 | -------------------------------------------------------------------------------- /tests/fixtures/configuration/Configuration.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 21 | 22 | 9cd510cd-abfc-11d4-9434-004095e12fc7 23 | 4aab352c-237a-48d9-ac87-9b712737883a 24 | 25 | 26 | 9fcd25a0-4822-11d4-9414-008048da11f9 27 | 201fa516-ea98-4cd8-ba33-9c618012d1aa 28 | 29 | 30 | e3687481-0a87-462c-a166-9f34594f9bba 31 | 4274e268-8a33-4966-9ab6-ab1fe28a7fb7 32 | 33 | 34 | 9de14907-ec23-4a07-96f0-85521cb6b53b 35 | dd27a34b-0ff2-4cf4-a01e-442113261bc9 36 | 37 | 38 | 51f2d5d8-ea4d-4064-8892-82951750031e 39 | a03050ac-179e-4d27-a108-b224f5034d2e 40 | 41 | 42 | e68182ea-4237-4383-967f-90c1e3370bc7 43 | 5050a031-4b87-4270-9d88-550daacfdb50 44 | 45 | 46 | 47 | ТестоваяКонфигурация 48 | 49 | 50 | ru 51 | Тестовая конфигурация 52 | 53 | 54 | 55 | 56 | 57 | Русский 58 | Уровень1 59 | TestModule 60 | 61 | 62 | -------------------------------------------------------------------------------- /tests/fixtures/bad-configuration/Configuration.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 21 | 22 | 9cd510cd-abfc-11d4-9434-004095e12fc7 23 | 4aab352c-237a-48d9-ac87-9b712737883a 24 | 25 | 26 | 9fcd25a0-4822-11d4-9414-008048da11f9 27 | 201fa516-ea98-4cd8-ba33-9c618012d1aa 28 | 29 | 30 | e3687481-0a87-462c-a166-9f34594f9bba 31 | 4274e268-8a33-4966-9ab6-ab1fe28a7fb7 32 | 33 | 34 | 9de14907-ec23-4a07-96f0-85521cb6b53b 35 | dd27a34b-0ff2-4cf4-a01e-442113261bc9 36 | 37 | 38 | 51f2d5d8-ea4d-4064-8892-82951750031e 39 | a03050ac-179e-4d27-a108-b224f5034d2e 40 | 41 | 42 | e68182ea-4237-4383-967f-90c1e3370bc7 43 | 5050a031-4b87-4270-9d88-550daacfdb50 44 | 45 | 46 | 47 | ТестоваяКонфигурация 48 | 49 | 50 | ru 51 | Тестовая конфигурация 52 | 53 | 54 | 55 | 56 | 57 | Русский 58 | Уровень1 59 | TestModule 60 | 61 | 62 | -------------------------------------------------------------------------------- /Jenkinsfile: -------------------------------------------------------------------------------- 1 | 2 | pipeline { 3 | agent none 4 | options { 5 | buildDiscarder(logRotator(numToKeepStr: '7')) 6 | skipDefaultCheckout() 7 | } 8 | 9 | stages { 10 | stage('Тестирование кода пакета WIN') { 11 | 12 | agent { label 'windows' } 13 | 14 | steps { 15 | checkout scm 16 | 17 | script { 18 | if( fileExists ('tasks/test.os') ){ 19 | bat 'chcp 65001 > nul && oscript tasks/test.os' 20 | if( fileExists ('tests.xml') ){ 21 | junit 'tests.xml' 22 | } 23 | if( fileExists ('bdd-log.xml') ){ 24 | junit 'bdd-log.xml' 25 | } 26 | } 27 | else 28 | echo 'no testing task' 29 | } 30 | 31 | } 32 | 33 | } 34 | 35 | stage('Тестирование кода пакета LINUX') { 36 | 37 | agent { label 'master' } 38 | 39 | steps { 40 | echo 'under development' 41 | } 42 | 43 | } 44 | 45 | stage('Сборка пакета') { 46 | 47 | agent { label 'windows' } 48 | 49 | steps { 50 | checkout scm 51 | 52 | bat 'erase /Q *.ospx' 53 | bat 'chcp 65001 > nul && call opm build .' 54 | 55 | stash includes: '*.ospx', name: 'package' 56 | archiveArtifacts '*.ospx' 57 | } 58 | 59 | } 60 | 61 | stage('Публикация в хабе') { 62 | when { 63 | branch 'master' 64 | } 65 | agent { label 'master' } 66 | steps { 67 | sh 'rm -f *.ospx' 68 | unstash 'package' 69 | 70 | sh ''' 71 | artifact=`ls -1 *.ospx` 72 | basename=`echo $artifact | sed -r 's/(.+)-.*(.ospx)/\\1/'` 73 | cp $artifact $basename.ospx 74 | sudo rsync -rv *.ospx /var/www/hub.oscript.io/download/$basename/ 75 | '''.stripIndent() 76 | } 77 | } 78 | 79 | stage('Публикация в нестабильном хабе') { 80 | when { 81 | branch 'develop' 82 | } 83 | agent { label 'master' } 84 | steps { 85 | sh 'rm -f *.ospx' 86 | unstash 'package' 87 | 88 | sh ''' 89 | artifact=`ls -1 *.ospx` 90 | basename=`echo $artifact | sed -r 's/(.+)-.*(.ospx)/\\1/'` 91 | cp $artifact $basename.ospx 92 | sudo rsync -rv *.ospx /var/www/hub.oscript.io/dev-channel/$basename/ 93 | '''.stripIndent() 94 | } 95 | } 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /src/package-loader.os: -------------------------------------------------------------------------------- 1 | Процедура ПриЗагрузкеБиблиотеки(Путь, СтандартнаяОбработка, Отказ) 2 | 3 | СтандартнаяОбработка = Ложь; 4 | ОбработатьСтруктуруКаталоговПоСоглашению(Путь, СтандартнаяОбработка, Отказ); 5 | 6 | КонецПроцедуры 7 | 8 | Процедура ОбработатьСтруктуруКаталоговПоСоглашению(Путь, СтандартнаяОбработка, Отказ) 9 | 10 | КаталогиКлассов = Новый Массив; 11 | КаталогиКлассов.Добавить(ОбъединитьПути(Путь, "Классы")); 12 | КаталогиКлассов.Добавить(ОбъединитьПути(Путь, "Classes")); 13 | КаталогиКлассов.Добавить(ОбъединитьПути(Путь, "Команды")); 14 | КаталогиКлассов.Добавить(ОбъединитьПути(Путь, "src", "Классы")); 15 | КаталогиКлассов.Добавить(ОбъединитьПути(Путь, "src", "Classes")); 16 | КаталогиКлассов.Добавить(ОбъединитьПути(Путь, "src", "Команды")); 17 | 18 | КаталогиМодулей = Новый Массив; 19 | КаталогиМодулей.Добавить(ОбъединитьПути(Путь, "Модули")); 20 | КаталогиМодулей.Добавить(ОбъединитьПути(Путь, "Modules")); 21 | КаталогиМодулей.Добавить(ОбъединитьПути(Путь, "Перечисления")); 22 | КаталогиМодулей.Добавить(ОбъединитьПути(Путь, "src", "Модули")); 23 | КаталогиМодулей.Добавить(ОбъединитьПути(Путь, "src", "Modules")); 24 | КаталогиМодулей.Добавить(ОбъединитьПути(Путь, "src", "Перечисления")); 25 | 26 | 27 | Для Каждого мКаталог Из КаталогиКлассов Цикл 28 | 29 | ОбработатьКаталогКлассов(мКаталог, СтандартнаяОбработка, Отказ); 30 | 31 | КонецЦикла; 32 | 33 | Для Каждого мКаталог Из КаталогиМодулей Цикл 34 | 35 | ОбработатьКаталогМодулей(мКаталог, СтандартнаяОбработка, Отказ); 36 | 37 | КонецЦикла; 38 | 39 | КонецПроцедуры 40 | 41 | Процедура ОбработатьКаталогКлассов(Знач Путь, СтандартнаяОбработка, Отказ) 42 | 43 | КаталогКлассов = Новый Файл(Путь); 44 | 45 | Если КаталогКлассов.Существует() Тогда 46 | Файлы = НайтиФайлы(КаталогКлассов.ПолноеИмя, "*.os"); 47 | Для Каждого Файл Из Файлы Цикл 48 | СтандартнаяОбработка = Ложь; 49 | ДобавитьКлассЕслиРанееНеДобавляли(Файл.ПолноеИмя, Файл.ИмяБезРасширения); 50 | КонецЦикла; 51 | КонецЕсли; 52 | 53 | КонецПроцедуры 54 | 55 | Процедура ОбработатьКаталогМодулей(Знач Путь, СтандартнаяОбработка, Отказ) 56 | 57 | КаталогМодулей = Новый Файл(Путь); 58 | 59 | Если КаталогМодулей.Существует() Тогда 60 | Файлы = НайтиФайлы(КаталогМодулей.ПолноеИмя, "*.os"); 61 | Для Каждого Файл Из Файлы Цикл 62 | СтандартнаяОбработка = Ложь; 63 | Попытка 64 | ДобавитьМодуль(Файл.ПолноеИмя, Файл.ИмяБезРасширения); 65 | Исключение 66 | СтандартнаяОбработка = Истина; 67 | КонецПопытки; 68 | КонецЦикла; 69 | КонецЕсли; 70 | 71 | КонецПроцедуры 72 | 73 | Процедура ДобавитьКлассЕслиРанееНеДобавляли(ПутьФайла, ИмяКласса) 74 | 75 | КлассУжеЕсть = Ложь; 76 | Попытка 77 | Объект = Новый(ИмяКласса); 78 | КлассУжеЕсть = Истина; 79 | Исключение 80 | СообщениеОшибки = ОписаниеОшибки(); 81 | ИскомаяОшибка = СтрШаблон("Конструктор не найден (%1)", ИмяКласса); 82 | КлассУжеЕсть = СтрНайти(СообщениеОшибки, ИскомаяОшибка) = 0; 83 | КонецПопытки; 84 | Если Не КлассУжеЕсть Тогда 85 | 86 | ДобавитьКласс(ПутьФайла, ИмяКласса); 87 | 88 | КонецЕсли; 89 | КонецПроцедуры 90 | -------------------------------------------------------------------------------- /src/Команды/ПроверитьИсходники.os: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////////// 2 | // 3 | // Служебный модуль с реализацией работы команды 4 | // 5 | /////////////////////////////////////////////////////////////////////////////// 6 | 7 | Процедура ОписаниеКоманды(КомандаПриложения) Экспорт 8 | 9 | КомандаПриложения.Аргумент("PATH", "", 10 | "Каталог исходных файлов конфигурации 1С. 11 | |При использовании опции -g (--git) нужно передавать каталог репозитория") 12 | .Обязательный(Истина); 13 | 14 | КомандаПриложения.Опция("config c", "", 15 | "Путь к конфигурационному файлу. По умолчанию ищет в каталоге исходных файлов"); 16 | 17 | КомандаПриложения.Опция("git g", Ложь, 18 | "Включает режим обработки изменений репозитория git"); 19 | 20 | КомандаПриложения.Опция("edt", Ложь, 21 | "Исходники хранятся в формате EDT"); 22 | 23 | КонецПроцедуры 24 | 25 | Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт 26 | 27 | ПараметрыКоманды = ПолучитьСтруктуруПараметров(КомандаПриложения); 28 | 29 | ТекстОшибки = ""; 30 | Успешно = ВыполнитьПроверкуИсходников(ПараметрыКоманды, ТекстОшибки); 31 | 32 | Если НЕ Успешно Тогда 33 | 34 | МенеджерПриложения.ПолучитьЛог().Ошибка(ТекстОшибки); 35 | ЗавершитьРаботу(1); 36 | 37 | КонецЕсли; 38 | 39 | КонецПроцедуры 40 | 41 | // Возвращает имя команды приложения 42 | Функция ИмяКоманды() Экспорт 43 | 44 | Возврат "check"; 45 | 46 | КонецФункции // ИмяКоманды 47 | 48 | // Возвращает описание исполняемой команды 49 | Функция КраткоеОписаниеКоманды() Экспорт 50 | 51 | Возврат "Выполняет проверку исходных файлов на соответствие требованиям к описаниям"; 52 | 53 | КонецФункции // ОписаниеКоманды 54 | 55 | #Область Служебные 56 | 57 | Функция ПолучитьСтруктуруПараметров(Знач КомандаПриложения) 58 | 59 | ПараметрыКоманды = Новый Структура; 60 | ПараметрыКоманды.Вставить("КаталогИсходныхФайлов", КомандаПриложения.ЗначениеАргумента("PATH")); 61 | ПараметрыКоманды.Вставить("ФорматEDT", КомандаПриложения.ЗначениеОпции("edt")); 62 | ПараметрыКоманды.Вставить("РежимGit", КомандаПриложения.ЗначениеОпции("git")); 63 | ПараметрыКоманды.Вставить("ФайлНастроек", КомандаПриложения.ЗначениеОпции("config")); 64 | 65 | Возврат ПараметрыКоманды; 66 | 67 | КонецФункции 68 | 69 | Функция ВыполнитьПроверкуИсходников(ПараметрыКоманды, ТекстОшибки) 70 | 71 | ОбщегоНазначения.ПроверитьПараметрыКоманды(ПараметрыКоманды); 72 | 73 | ОбщегоНазначения.ДополнитьПараметры(ПараметрыКоманды); 74 | 75 | КаталогИсходныхФайлов = ПараметрыКоманды.КаталогИсходныхФайлов; 76 | 77 | ТекущийКаталогИсходныхФайлов = ОбщегоНазначения.ПолноеИмяФайла(ПараметрыКоманды.КаталогКонфигурации); 78 | 79 | Конфигурация = РазборКонфигураций.ЗагрузитьКонфигурацию(ТекущийКаталогИсходныхФайлов); 80 | Конфигурация.ЗаполнитьПодсистемыОбъектовКонфигурации(); 81 | Конфигурация.НайтиМодули(); 82 | 83 | НастройкиГенератора = Новый Структура; 84 | НастройкиГенератора.Вставить("Парсер", Конфигурация); 85 | НастройкиГенератора.Вставить("НастройкиАнализаИзменений", ПараметрыКоманды.НастройкиАнализаИзменений); 86 | 87 | ГенераторДокументации = Новый ГенераторДокументации(Неопределено); 88 | 89 | ОшибкиГенерации = ГенераторДокументации.ПроверитьИсходники(НастройкиГенератора); 90 | 91 | Если НЕ ПустаяСтрока(ОшибкиГенерации) Тогда 92 | ТекстОшибки = "Проверка исходников завершилась с ошибкой: " + ОшибкиГенерации; 93 | КонецЕсли; 94 | 95 | Возврат ПустаяСтрока(ТекстОшибки); 96 | 97 | КонецФункции 98 | 99 | #КонецОбласти 100 | -------------------------------------------------------------------------------- /src/Классы/ШаблонГенераторДокументации.os-template: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////// 2 | // 3 | // Служебный класс генерации документации в формате <имя формата> 4 | // 5 | /////////////////////////////////////////////////////////////////// 6 | 7 | //////////////////////////////////////////////////////////////////////////////// 8 | // 9 | // Служебный класс генерации документации в формате <Формат> 10 | // 11 | /////////////////////////////////////////////////////////////////////////////// 12 | 13 | Перем КаталогПубликацииДокументации; 14 | Перем АнализироватьТолькоПотомковПодсистемы Экспорт; 15 | 16 | /////////////////////////////////////////////////////////////////// 17 | // СТАНДАРТНЫЙ ИНТЕРФЕЙС 18 | /////////////////////////////////////////////////////////////////// 19 | 20 | #Область ГенерацияДанных 21 | 22 | // ДокументацияПоМодулю 23 | // 24 | // Параметры: 25 | // ДанныеМодуля - Структура - Описание модуля, структура содержащая массив описаний методов, см. ГенераторДокументации.ОписаниеМетода 26 | // Ошибки - Массив - Коллекция ошибок генерации документации, сюда помещаем информацию о возникших ошибках 27 | // 28 | // Возвращаемое значение: 29 | // Строка - Текст документации по модулю, если пустая строка, публикация не выполняется 30 | // 31 | Функция ДокументацияПоМодулю(ДанныеМодуля, Ошибки) Экспорт 32 | 33 | ВызватьИсключение "Не реализованно"; 34 | 35 | // Возврат ТекстДокументации; 36 | 37 | КонецФункции 38 | 39 | // ДокументацияКонстанты 40 | // 41 | // Параметры: 42 | // МассивКонстант - Массив - Массив структур описаний констант 43 | // Имя - Имя константы 44 | // Тип - Тип значения константы 45 | // Описание - Описание константы 46 | // Подсистема - Описание подсистем, которой принадлежит константа. см ГенераторДокументации.ПолучитьСтруктуруПодсистем 47 | // Ошибки - Массив - Коллекция ошибок генерации документации, сюда помещаем информацию о возникших ошибках 48 | // 49 | // Возвращаемое значение: 50 | // Строка - Текст документации по модулю, если пустая строка, публикация не выполняется 51 | // 52 | Функция ДокументацияКонстанты(МассивКонстант, Ошибки) Экспорт 53 | 54 | ВызватьИсключение "Не реализованно"; 55 | 56 | // Возврат ТекстДокументации; 57 | 58 | КонецФункции 59 | 60 | #КонецОбласти 61 | 62 | #Область Публикация 63 | 64 | // ОпубликоватьРаздел 65 | // 66 | // Параметры: 67 | // Раздел - СтрокаТаблицыЗначений - Описание публикуемого раздела 68 | // * Имя - Имя страницы/раздела 69 | // * Родитель - Родитель страницы, ссылку на строку этой же таблицы 70 | // * Содержимое - Содержимое страницы 71 | // * Идентификатор - Служебное поле, можно использовать при публикации 72 | // ОбъектыРаздела - СтрокаТаблицыЗначений - Массив описаний объектов раздела 73 | // * Имя - Имя объекта 74 | // * Родитель - Родитель страницы, ссылку на строку этой же таблицы 75 | // * Содержимое - Содержимое страницы 76 | // * Идентификатор - Служебное поле, можно использовать при публикации 77 | // ОшибкиПубликации - Массив - Коллекция ошибок публикации документации, сюда помещаем информацию о возникших ошибках 78 | // 79 | // Возвращаемое значение: 80 | // Булево - Признак успешности 81 | // 82 | Функция ОпубликоватьРаздел(Раздел, ОбъектыРаздела, ОшибкиПубликации) Экспорт 83 | 84 | ВызватьИсключение "Не реализованно"; 85 | 86 | // Возврат Успешно; 87 | 88 | КонецФункции 89 | 90 | Функция ПрефиксИмени(ТипСтраницы) Экспорт 91 | 92 | Если ТипСтраницы = "Модуль" Тогда 93 | 94 | Возврат "Программный интерфейс: "; 95 | 96 | Иначе 97 | 98 | Возврат ""; 99 | 100 | КонецЕсли; 101 | 102 | КонецФункции 103 | 104 | #КонецОбласти 105 | 106 | #Область Настройки 107 | 108 | // Производит чтение настроек из конфигурационного файла и сохраняет их в свойствах объекта 109 | // 110 | // Параметры: 111 | // НастройкиСтенда - Объект.НастройкиСтенда - Объект, содержащий информацию конфигурационного файла 112 | // 113 | // Возвращаемое значение: 114 | // Строка - описание возникших ошибок 115 | Функция ПрочитатьНастройки(НастройкиСтенда) Экспорт 116 | 117 | ВызватьИсключение "Не реализованно"; 118 | 119 | // Возврат ТекстОшибки; 120 | 121 | КонецФункции 122 | 123 | #КонецОбласти 124 | -------------------------------------------------------------------------------- /src/Команды/СгенерироватьДокументациюПоФайлу.os: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////////// 2 | // 3 | // Служебный модуль с реализацией работы команды 4 | // 5 | /////////////////////////////////////////////////////////////////////////////// 6 | 7 | Процедура ОписаниеКоманды(КомандаПриложения) Экспорт 8 | 9 | КомандаПриложения.Аргумент("PATH", "", 10 | "Исходный файл, для которого необходимо сгенерировать документацию") 11 | .Обязательный(Истина); 12 | 13 | КомандаПриложения.Опция("format f", "html", 14 | "Формат генерации документации. Поддерживается confluence, html, json, markdown") 15 | .ТПеречисление() 16 | .Перечисление("html", "html", "Документация в формате html") 17 | .Перечисление("json", "JSON", "Документация в формате JSON") 18 | .Перечисление("markdown", "Markdown", "Документация в формате Markdown"); 19 | 20 | КомандаПриложения.Опция("config c", "", 21 | "Путь к конфигурационному файлу. По умолчанию ищет в каталоге с исходным файлом"); 22 | 23 | КомандаПриложения.Опция("git g", Ложь, 24 | "Включает режим обработки изменений репозитория git"); 25 | 26 | КомандаПриложения.Опция("errno e", Ложь, 27 | "Выполняет генерацию даже при наличии ошибок"); 28 | 29 | КомандаПриложения.Опция("edt", Ложь, 30 | "Исходники хранятся в формате EDT"); 31 | 32 | КонецПроцедуры 33 | 34 | Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт 35 | 36 | ПараметрыКоманды = ПолучитьСтруктуруПараметров(КомандаПриложения); 37 | 38 | ТекстОшибки = ""; 39 | Успешно = ВыполнитьГенерациюДокументации(ПараметрыКоманды, ТекстОшибки); 40 | 41 | Если НЕ Успешно Тогда 42 | 43 | МенеджерПриложения.ПолучитьЛог().Ошибка(ТекстОшибки); 44 | ЗавершитьРаботу(1); 45 | 46 | КонецЕсли; 47 | 48 | КонецПроцедуры 49 | 50 | // Возвращает имя команды приложения 51 | Функция ИмяКоманды() Экспорт 52 | 53 | Возврат "alone"; 54 | 55 | КонецФункции // ИмяКоманды 56 | 57 | // Возвращает описание исполняемой команды 58 | Функция КраткоеОписаниеКоманды() Экспорт 59 | 60 | Возврат "Выполняет генерацию документации указанного файла"; 61 | 62 | КонецФункции 63 | 64 | #Область Служебные 65 | 66 | Функция ПолучитьСтруктуруПараметров(Знач КомандаПриложения) 67 | 68 | ПараметрыКоманды = Новый Структура; 69 | ПараметрыКоманды.Вставить("ИсходныйФайл", КомандаПриложения.ЗначениеАргумента("PATH")); 70 | ПараметрыКоманды.Вставить("Формат", КомандаПриложения.ЗначениеОпции("format")); 71 | ПараметрыКоманды.Вставить("ФорматEDT", КомандаПриложения.ЗначениеОпции("edt")); 72 | ПараметрыКоманды.Вставить("РежимGit", КомандаПриложения.ЗначениеОпции("git")); 73 | ПараметрыКоманды.Вставить("ГенерацияПриНаличииОшибок", КомандаПриложения.ЗначениеОпции("errno")); 74 | ПараметрыКоманды.Вставить("ФайлНастроек", КомандаПриложения.ЗначениеОпции("config")); 75 | 76 | Возврат ПараметрыКоманды; 77 | 78 | КонецФункции 79 | 80 | Функция ВыполнитьГенерациюДокументации(ПараметрыКоманды, ТекстОшибки) Экспорт 81 | 82 | ИсходныйФайл = ПараметрыКоманды.ИсходныйФайл; 83 | 84 | ОбщегоНазначения.ПроверитьПараметрыКоманды(ПараметрыКоманды); 85 | 86 | ОбщегоНазначения.ДополнитьПараметры(ПараметрыКоманды); 87 | 88 | Модуль = ОбщегоНазначения.ОписаниеМодуля(ИсходныйФайл); 89 | 90 | НастройкиГенератора = Новый Структура; 91 | 92 | НастройкиГенератора.Вставить("ОписаниеМодуля", Модуль); 93 | НастройкиГенератора.Вставить("НастройкиАнализаИзменений", ПараметрыКоманды.НастройкиАнализаИзменений); 94 | 95 | ГенераторСодержимого = ОбщегоНазначения.ПолучитьГенераторДокументации( 96 | ПараметрыКоманды.НастройкиСтенда, 97 | ПараметрыКоманды.Формат); 98 | 99 | ГенераторДокументации = Новый ГенераторДокументации(ГенераторСодержимого); 100 | 101 | РезультатГенерации = ГенераторДокументации.СгенерироватьПоФайлу(НастройкиГенератора); 102 | 103 | ЕстьОшибкиГенерации = НЕ РезультатГенерации.Успешно; 104 | 105 | ОшибкиГенерации = СтрСоединить(РезультатГенерации.Ошибки, Символы.ПС); 106 | ОшибкиПубликации = ""; 107 | 108 | Если ПараметрыКоманды.ГенерацияПриНаличииОшибок ИЛИ НЕ ЕстьОшибкиГенерации Тогда 109 | 110 | РезультатПубликации = ГенераторДокументации.Опубликовать(РезультатГенерации); 111 | ОшибкиПубликации = СтрСоединить(РезультатПубликации.ОшибкиПубликации, Символы.ПС); 112 | 113 | КонецЕсли; 114 | 115 | Если ЕстьОшибкиГенерации Тогда 116 | ТекстОшибки = "Генерация документации завершилась ошибкой: " + ОшибкиГенерации; 117 | КонецЕсли; 118 | 119 | Если НЕ ПустаяСтрока(ОшибкиПубликации) Тогда 120 | ТекстОшибки = ТекстОшибки + Символы.ПС + "Публикация документации завершилась ошибкой: " + ОшибкиПубликации; 121 | КонецЕсли; 122 | 123 | Возврат ПустаяСтрока(ТекстОшибки); 124 | 125 | КонецФункции 126 | 127 | #КонецОбласти 128 | -------------------------------------------------------------------------------- /tests/ТестПроверкаФайла.os: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////// 2 | // 3 | // Тестирование основной функциональности пакета 4 | // Проверка на соответствие выгрузки эталону 5 | // 6 | // (с) BIA Technologies, LLC 7 | // 8 | /////////////////////////////////////////////////////////////////////////////// 9 | 10 | #Использовать "..\src" 11 | #Использовать logos 12 | #Использовать asserts 13 | #Использовать fs 14 | 15 | /////////////////////////////////////////////////////////////////////////////// 16 | 17 | Функция ПолучитьСписокТестов(Знач ЮнитТестирование) Экспорт 18 | 19 | Лог = Логирование.ПолучитьЛог("Тест"); 20 | 21 | МассивТестов = Новый Массив; 22 | МассивТестов.Добавить("ТестПроверкаВалидногоМодуля"); 23 | МассивТестов.Добавить("ТестПроверкаНеВалидногоМодуля"); 24 | 25 | МассивТестов.Добавить("ТестПроверкаВалиднойКонфигурации"); 26 | МассивТестов.Добавить("ТестПроверкаНеВалиднойКонфигурации"); 27 | 28 | Возврат МассивТестов; 29 | 30 | КонецФункции 31 | 32 | 33 | Процедура ПередЗапускомТеста() Экспорт 34 | 35 | КонецПроцедуры 36 | 37 | Процедура ПослеЗапускаТеста() Экспорт 38 | 39 | КонецПроцедуры 40 | 41 | #Область Шаги_теста 42 | 43 | Процедура ТестПроверкаВалидногоМодуля() Экспорт 44 | 45 | ОбщиеМодули = ОбъединитьПути(КаталогФикстур(), "configuration", "CommonModules"); 46 | ФайлМодуля = ОбъединитьПути(ОбщиеМодули, "TestModule", "Ext", "Module.bsl"); 47 | 48 | Генератор = Новый ГенераторДокументации(Неопределено); 49 | 50 | Модуль = ОбщегоНазначения.ОписаниеМодуля(ФайлМодуля); 51 | Ошибки = Генератор.ПроверитьФайл(Новый Структура("ОписаниеМодуля", Модуль)); 52 | 53 | Ожидаем.Что(Ошибки, "Модуль не должен содержать ошибок").НЕ_().Заполнено(); 54 | 55 | КонецПроцедуры 56 | 57 | Процедура ТестПроверкаВалиднойКонфигурации() Экспорт 58 | 59 | КаталогКонфигурации = ОбъединитьПути(КаталогФикстур(), "configuration"); 60 | 61 | ГенераторДокументации = Новый ГенераторДокументации(Неопределено); 62 | 63 | Ошибки = ПроверитьКонфигурацию(КаталогКонфигурации); 64 | 65 | Ожидаем.Что(Ошибки, "Модуль не должен содержать ошибок").НЕ_().Заполнено(); 66 | 67 | КонецПроцедуры 68 | 69 | Процедура ТестПроверкаНеВалиднойКонфигурации() Экспорт 70 | 71 | КаталогКонфигурации = ОбъединитьПути(КаталогФикстур(), "bad-configuration"); 72 | 73 | ГенераторДокументации = Новый ГенераторДокументации(Неопределено); 74 | 75 | Ошибки = ПроверитьКонфигурацию(КаталогКонфигурации); 76 | 77 | ОшибкиТестовогоМодуля(Ошибки); 78 | 79 | КонецПроцедуры 80 | 81 | Процедура ТестПроверкаНеВалидногоМодуля() Экспорт 82 | 83 | ОбщиеМодули = ОбъединитьПути(КаталогФикстур(), "bad-configuration", "CommonModules"); 84 | ФайлМодуля = ОбъединитьПути(ОбщиеМодули, "TestModule", "Ext", "Module.bsl"); 85 | 86 | Генератор = Новый ГенераторДокументации(Неопределено); 87 | 88 | Модуль = ОбщегоНазначения.ОписаниеМодуля(ФайлМодуля); 89 | Ошибки = Генератор.ПроверитьФайл(Новый Структура("ОписаниеМодуля", Модуль)); 90 | 91 | ОшибкиТестовогоМодуля(Ошибки); 92 | 93 | КонецПроцедуры 94 | 95 | #КонецОбласти 96 | 97 | Процедура ОшибкиТестовогоМодуля(Ошибки) 98 | 99 | Префикс = "Должна быть ошибка "; 100 | Ожидаем.Что(Ошибки, "Модуль должен содержать ошибок").Заполнено(); 101 | Ожидаем.Что(Ошибки, Префикс + "отсутствия описания метода").Содержит("У метода 'ТестоваяФункция' не заполнено описание"); 102 | Ожидаем.Что(Ошибки, Префикс + "отсутствия описания параметра").Содержит("У метода 'ФункцияСПараметрами' не заполнено описание параметра №2 (Параметр2)"); 103 | Ожидаем.Что(Ошибки, Префикс + "отсутствия описания параметра").Содержит("У метода 'ПроцедураСПараметрами' не заполнено описание параметра №1 (Параметр1)"); 104 | Ожидаем.Что(Ошибки, Префикс + "отсутствия описания параметра").Содержит("У метода 'ПроцедураСПараметром' не заполнено описание параметра №1 (Параметр1)"); 105 | 106 | КонецПроцедуры 107 | 108 | Функция КаталогФикстур() 109 | 110 | Возврат ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures"); 111 | 112 | КонецФункции 113 | 114 | Функция ПараметрыРазбора(Путь) 115 | 116 | ФайлНастроек = ОбъединитьПути(КаталогФикстур(), "config.json"); 117 | 118 | ПараметрыКоманды = Новый Структура; 119 | 120 | Файл = Новый Файл(Путь); 121 | 122 | Если Файл.ЭтоКаталог() Тогда 123 | ПараметрыКоманды.Вставить("КаталогИсходныхФайлов", Путь); 124 | ПараметрыКоманды.Вставить("КаталогКонфигурации", Путь); 125 | Иначе 126 | ПараметрыКоманды.Вставить("ИсходныйФайл", Путь); 127 | КонецЕсли; 128 | 129 | ПараметрыКоманды.Вставить("ФорматEDT", Ложь); 130 | ПараметрыКоманды.Вставить("РежимGit", Ложь); 131 | ПараметрыКоманды.Вставить("ГенерацияПриНаличииОшибок", Ложь); 132 | ПараметрыКоманды.Вставить("ФайлНастроек", ФайлНастроек); 133 | 134 | ОбщегоНазначения.ДополнитьПараметры(ПараметрыКоманды); 135 | 136 | Возврат ПараметрыКоманды; 137 | 138 | КонецФункции 139 | 140 | Функция ПроверитьКонфигурацию(КаталогКонфигурации) 141 | 142 | ПараметрыКоманды = ПараметрыРазбора(КаталогКонфигурации); 143 | 144 | Конфигурация = РазборКонфигураций.ЗагрузитьКонфигурацию(КаталогКонфигурации); 145 | Конфигурация.ЗаполнитьПодсистемыОбъектовКонфигурации(); 146 | Конфигурация.НайтиМодули(); 147 | 148 | НастройкиГенератора = Новый Структура; 149 | НастройкиГенератора.Вставить("Парсер", Конфигурация); 150 | НастройкиГенератора.Вставить("НастройкиАнализаИзменений", ПараметрыКоманды.НастройкиАнализаИзменений); 151 | 152 | ГенераторДокументации = Новый ГенераторДокументации(Неопределено); 153 | 154 | Возврат ГенераторДокументации.ПроверитьИсходники(НастройкиГенератора); 155 | 156 | КонецФункции 157 | 158 | -------------------------------------------------------------------------------- /src/Команды/СгенерироватьДокументацию.os: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////////// 2 | // 3 | // Служебный модуль с реализацией работы команды 4 | // 5 | /////////////////////////////////////////////////////////////////////////////// 6 | 7 | Процедура ОписаниеКоманды(КомандаПриложения) Экспорт 8 | 9 | КомандаПриложения.Аргумент("PATH", "", 10 | "Каталог исходных файлов конфигурации 1С. 11 | |При использовании опции -g (--git) нужно передавать каталог репозитория") 12 | .Обязательный(Истина); 13 | 14 | КомандаПриложения.Опция("format f", "confluence", 15 | "Формат генерации документации. Поддерживается confluence, html, json, markdown") 16 | .ТПеречисление() 17 | .Перечисление("confluence", "confluence", "Документация в формате confluence") 18 | .Перечисление("html", "html", "Документация в формате html") 19 | .Перечисление("json", "JSON", "Документация в формате JSON") 20 | .Перечисление("markdown", "Markdown", "Документация в формате Markdown") 21 | ; 22 | 23 | КомандаПриложения.Опция("config c", "", 24 | "Путь к конфигурационному файлу. По умолчанию ищет в каталоге исходных файлов"); 25 | 26 | КомандаПриложения.Опция("git g", Ложь, 27 | "Включает режим обработки изменений репозитория git"); 28 | 29 | КомандаПриложения.Опция("errno e", Ложь, 30 | "Выполняет генерацию даже при наличии ошибок"); 31 | 32 | КомандаПриложения.Опция("edt", Ложь, 33 | "Исходники хранятся в формате EDT"); 34 | 35 | КомандаПриложения.Опция("push-manual", , 36 | "Каталог ""ручной"" документации"); 37 | 38 | КонецПроцедуры 39 | 40 | Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт 41 | 42 | ПараметрыКоманды = ПолучитьСтруктуруПараметров(КомандаПриложения); 43 | 44 | ТекстОшибки = ""; 45 | Успешно = ВыполнитьГенерациюДокументации(ПараметрыКоманды, ТекстОшибки); 46 | 47 | Если НЕ Успешно Тогда 48 | 49 | МенеджерПриложения.ПолучитьЛог().Ошибка(ТекстОшибки); 50 | ЗавершитьРаботу(1); 51 | 52 | КонецЕсли; 53 | 54 | КонецПроцедуры 55 | 56 | // Возвращает имя команды приложения 57 | Функция ИмяКоманды() Экспорт 58 | 59 | Возврат "generate"; 60 | 61 | КонецФункции // ИмяКоманды 62 | 63 | // Возвращает описание исполняемой команды 64 | Функция КраткоеОписаниеКоманды() Экспорт 65 | 66 | Возврат "Выполняет генерацию документации на основании исходных файлов"; 67 | 68 | КонецФункции // ОписаниеКоманды 69 | 70 | #Область Служебные 71 | 72 | Функция ПолучитьСтруктуруПараметров(Знач КомандаПриложения) 73 | 74 | ПараметрыКоманды = Новый Структура; 75 | ПараметрыКоманды.Вставить("КаталогИсходныхФайлов", КомандаПриложения.ЗначениеАргумента("PATH")); 76 | ПараметрыКоманды.Вставить("Формат", КомандаПриложения.ЗначениеОпции("format")); 77 | ПараметрыКоманды.Вставить("ФорматEDT", КомандаПриложения.ЗначениеОпции("edt")); 78 | ПараметрыКоманды.Вставить("РежимGit", КомандаПриложения.ЗначениеОпции("git")); 79 | ПараметрыКоманды.Вставить("ГенерацияПриНаличииОшибок", КомандаПриложения.ЗначениеОпции("errno")); 80 | ПараметрыКоманды.Вставить("ФайлНастроек", КомандаПриложения.ЗначениеОпции("config")); 81 | ПараметрыКоманды.Вставить("КаталогДополнительнойДокументации", КомандаПриложения.ЗначениеОпции("push-manual")); 82 | 83 | Возврат ПараметрыКоманды; 84 | 85 | КонецФункции 86 | 87 | Функция ВыполнитьГенерациюДокументации(ПараметрыКоманды, ТекстОшибки) 88 | 89 | ОбщегоНазначения.ПроверитьПараметрыКоманды(ПараметрыКоманды); 90 | 91 | ОбщегоНазначения.ДополнитьПараметры(ПараметрыКоманды); 92 | 93 | КаталогИсходныхФайлов = ПараметрыКоманды.КаталогИсходныхФайлов; 94 | НастройкиСтенда = ПараметрыКоманды.НастройкиСтенда; 95 | НастройкиАнализаИзменений = ПараметрыКоманды.НастройкиАнализаИзменений; 96 | 97 | ТекущийКаталогИсходныхФайлов = ОбщегоНазначения.ПолноеИмяФайла(ПараметрыКоманды.КаталогКонфигурации); 98 | 99 | Конфигурация = РазборКонфигураций.ЗагрузитьКонфигурацию(ТекущийКаталогИсходныхФайлов); 100 | Конфигурация.ЗаполнитьПодсистемыОбъектовКонфигурации(); 101 | Конфигурация.НайтиМодули(); 102 | 103 | НастройкиГенератора = Новый Структура; 104 | 105 | НастройкиГенератора.Вставить("Парсер", Конфигурация); 106 | НастройкиГенератора.Вставить("НастройкиАнализаИзменений", НастройкиАнализаИзменений); 107 | НастройкиГенератора.Вставить("КаталогРуководства", ПараметрыКоманды.КаталогДополнительнойДокументации); 108 | 109 | ГенераторСодержимого = ОбщегоНазначения.ПолучитьГенераторДокументации( 110 | ПараметрыКоманды.НастройкиСтенда, 111 | ПараметрыКоманды.Формат); 112 | 113 | ГенераторДокументации = Новый ГенераторДокументации(ГенераторСодержимого); 114 | 115 | РезультатГенерации = ГенераторДокументации.Сгенерировать(НастройкиГенератора); 116 | 117 | ЕстьОшибкиГенерации = НЕ РезультатГенерации.Успешно; 118 | 119 | ОшибкиГенерации = СтрСоединить(РезультатГенерации.Ошибки, Символы.ПС); 120 | ОшибкиПубликации = ""; 121 | 122 | Если ПараметрыКоманды.ГенерацияПриНаличииОшибок ИЛИ НЕ ЕстьОшибкиГенерации Тогда 123 | 124 | РезультатПубликации = ГенераторДокументации.Опубликовать(РезультатГенерации); 125 | ОшибкиПубликации = СтрСоединить(РезультатПубликации.ОшибкиПубликации, Символы.ПС); 126 | 127 | КонецЕсли; 128 | 129 | Если ЕстьОшибкиГенерации Тогда 130 | ТекстОшибки = "Генерация документации завершилась ошибкой: " + ОшибкиГенерации; 131 | КонецЕсли; 132 | 133 | Если НЕ ПустаяСтрока(ОшибкиПубликации) Тогда 134 | ТекстОшибки = ТекстОшибки + Символы.ПС + "Публикация документации завершилась ошибкой: " + ОшибкиПубликации; 135 | КонецЕсли; 136 | 137 | Возврат ПустаяСтрока(ТекстОшибки); 138 | 139 | КонецФункции 140 | 141 | #КонецОбласти 142 | -------------------------------------------------------------------------------- /src/Команды/ПроверитьОпубликованнуюДокументацию.os: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////////////////// 2 | // 3 | // Служебный модуль с реализацией работы команды 4 | // 5 | /////////////////////////////////////////////////////////////////////////////// 6 | 7 | Процедура ОписаниеКоманды(КомандаПриложения) Экспорт 8 | 9 | КомандаПриложения.Аргумент("PATH", "", 10 | "Каталог исходных файлов конфигурации 1С. 11 | |При использовании опции -g (--git) нужно передавать каталог репозитория") 12 | .Обязательный(Истина); 13 | 14 | КомандаПриложения.Опция("format f", "confluence", 15 | "Формат генерации документации. Поддерживается confluence, html, json, markdown") 16 | .ТПеречисление() 17 | .Перечисление("confluence", "confluence", "Документация в формате confluence") 18 | .Перечисление("html", "html", "Документация в формате html") 19 | .Перечисление("json", "JSON", "Документация в формате JSON") 20 | .Перечисление("markdown", "Markdown", "Документация в формате Markdown"); 21 | 22 | КомандаПриложения.Опция("config c", "", 23 | "Путь к конфигурационному файлу. По умолчанию ищет в каталоге исходных файлов"); 24 | 25 | КомандаПриложения.Опция("edt", Ложь, 26 | "Исходники хранятся в формате EDT"); 27 | КомандаПриложения.Опция("delete", Ложь, 28 | "Удаление ненужных страниц"); 29 | 30 | КомандаПриложения.Опция("check-manual", , 31 | "Каталог ""ручной"" документации"); 32 | 33 | КонецПроцедуры 34 | 35 | Процедура ВыполнитьКоманду(Знач КомандаПриложения) Экспорт 36 | 37 | ПараметрыКоманды = ПолучитьСтруктуруПараметров(КомандаПриложения); 38 | 39 | ТекстОшибки = ""; 40 | Успешно = ВыполнитьПроверкуПубликации(ПараметрыКоманды, ТекстОшибки); 41 | 42 | Если НЕ Успешно Тогда 43 | 44 | МенеджерПриложения.ПолучитьЛог().Ошибка(ТекстОшибки); 45 | ЗавершитьРаботу(1); 46 | 47 | КонецЕсли; 48 | 49 | КонецПроцедуры 50 | 51 | // Возвращает имя команды приложения 52 | Функция ИмяКоманды() Экспорт 53 | 54 | Возврат "check-publish"; 55 | 56 | КонецФункции // ИмяКоманды 57 | 58 | // Возвращает описание исполняемой команды 59 | Функция КраткоеОписаниеКоманды() Экспорт 60 | 61 | Возврат "Проверяет наличие страниц в confluence и соответствующих им модулей конфигурации. 62 | |Поддерживается только формат Confluence"; 63 | 64 | КонецФункции // ОписаниеКоманды 65 | 66 | #Область Служебные 67 | 68 | Функция ПолучитьСтруктуруПараметров(Знач КомандаПриложения) 69 | 70 | ПараметрыКоманды = Новый Структура; 71 | ПараметрыКоманды.Вставить("КаталогИсходныхФайлов", КомандаПриложения.ЗначениеАргумента("PATH")); 72 | ПараметрыКоманды.Вставить("Формат", КомандаПриложения.ЗначениеОпции("format")); 73 | ПараметрыКоманды.Вставить("ФорматEDT", КомандаПриложения.ЗначениеОпции("edt")); 74 | ПараметрыКоманды.Вставить("ФайлНастроек", КомандаПриложения.ЗначениеОпции("config")); 75 | ПараметрыКоманды.Вставить("КаталогДополнительнойДокументации", КомандаПриложения.ЗначениеОпции("check-manual")); 76 | ПараметрыКоманды.Вставить("УдалятьСтраницы", КомандаПриложения.ЗначениеОпции("delete")); 77 | 78 | Возврат ПараметрыКоманды; 79 | 80 | КонецФункции 81 | 82 | Функция ВыполнитьПроверкуПубликации(ПараметрыКоманды, ТекстОшибки) 83 | 84 | Если ПараметрыКоманды.Формат <> "confluence" Тогда 85 | 86 | ТекстОшибки = "Проверка реализована только для формата Confluence"; 87 | Возврат Ложь; 88 | 89 | КонецЕсли; 90 | 91 | ОбщегоНазначения.ПроверитьПараметрыКоманды(ПараметрыКоманды); 92 | 93 | ОбщегоНазначения.ДополнитьПараметры(ПараметрыКоманды); 94 | 95 | КаталогИсходныхФайлов = ПараметрыКоманды.КаталогИсходныхФайлов; 96 | НастройкиСтенда = ПараметрыКоманды.НастройкиСтенда; 97 | НастройкиАнализаИзменений = ПараметрыКоманды.НастройкиАнализаИзменений; 98 | 99 | ТекущийКаталогИсходныхФайлов = ОбщегоНазначения.ПолноеИмяФайла(ПараметрыКоманды.КаталогКонфигурации); 100 | 101 | Конфигурация = РазборКонфигураций.ЗагрузитьКонфигурацию(ТекущийКаталогИсходныхФайлов); 102 | Конфигурация.ЗаполнитьПодсистемыОбъектовКонфигурации(); 103 | Конфигурация.НайтиМодули(); 104 | 105 | НастройкиГенератора = Новый Структура; 106 | 107 | НастройкиГенератора.Вставить("Парсер", Конфигурация); 108 | НастройкиГенератора.Вставить("НастройкиАнализаИзменений", НастройкиАнализаИзменений); 109 | НастройкиГенератора.Вставить("КаталогРуководства", ПараметрыКоманды.КаталогДополнительнойДокументации); 110 | 111 | ГенераторСодержимого = ОбщегоНазначения.ПолучитьГенераторДокументации( 112 | ПараметрыКоманды.НастройкиСтенда, 113 | ПараметрыКоманды.Формат); 114 | 115 | ГенераторДокументации = Новый ГенераторДокументации(ГенераторСодержимого); 116 | 117 | Результат = ГенераторДокументации.ПроверитьОпубликованнуюДокументацию(НастройкиГенератора); 118 | 119 | Лог = МенеджерПриложения.ПолучитьЛог(); 120 | 121 | Если Результат.Свойство("Сообщения") И Результат.Сообщения.Количество() Тогда 122 | 123 | Для Каждого Сообщение Из Результат.Сообщения Цикл 124 | 125 | Лог.Информация(Сообщение); 126 | 127 | КонецЦикла; 128 | 129 | КонецЕсли; 130 | 131 | Успешно = Результат.Успешно; 132 | 133 | Если Успешно И ПараметрыКоманды.УдалятьСтраницы Тогда 134 | 135 | Для Каждого Страница Из Результат.УдаляемыеСтраницы Цикл 136 | 137 | Лог.Отладка("Удаляю страницу %1", Страница.Представление); 138 | 139 | Попытка 140 | 141 | ГенераторСодержимого.УдалитьСтраницу(Страница); 142 | Лог.Предупреждение("Удалена страница %1 и подчиненные (при наличии)", Страница.Представление); 143 | 144 | Исключение 145 | 146 | Результат.Ошибки.Добавить("Ошибка удаления страницы " + Страница.Представление + ": " + ОписаниеОшибки()); 147 | Успешно = Ложь; 148 | 149 | КонецПопытки; 150 | 151 | КонецЦикла; 152 | 153 | КонецЕсли; 154 | 155 | ТекстОшибки = СтрСоединить(Результат.Ошибки, Символы.ПС); 156 | 157 | Если НЕ Успешно Тогда 158 | 159 | ТекстОшибки = "Проверка публикации завершилась с ошибкой: " + Символы.ПС + ТекстОшибки; 160 | 161 | КонецЕсли; 162 | 163 | Возврат ПустаяСтрока(ТекстОшибки); 164 | 165 | КонецФункции 166 | 167 | #КонецОбласти 168 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # AutodocGen 2 | 3 | Инструмент генерации документации на основании файлов исходных кодов конфигурации 1С:Предприятие. 4 | 5 | ## Об инструменте 6 | 7 | Инструмент позволяет 8 | 9 | - автоматически сформировать документацию на основании исходных файлов конфигурации 1С:Предприятие 10 | - выполнить проверку на возможность корректного разбора информации, выступающей исходными данными для документации 11 | - опубликовать сгенерированную документацию 12 | 13 | ## Установка 14 | 15 | Процесс установки стандартен: 16 | 17 | - либо `opm install autodocgen` 18 | - либо, если по разным причинам первый способ не подходит, то скачать архив из релизов, распаковать и выполнить (для windows) `installlocalhost.bat` 19 | 20 | ## Использование 21 | 22 | Основные возможности есть в справке. Отдельно стоит обратить внимание на конфигурационный файл. 23 | 24 | Конфигурационный файл соответствует структуре единого конфигурационного файла, ниже приведен пример 25 | 26 | ```json 27 | { 28 | "GLOBAL": { 29 | "КаталогИсходныхФайлов": "src\\configuration", 30 | "version": "1.0.4" 31 | }, 32 | "AutodocGen":{ 33 | "НастройкиConluence": { 34 | "АдресСервера":"https://my-confluence.myhost.ru", 35 | "Пользователь":"user", 36 | "Пароль":"password", 37 | "Пространство":"key", 38 | "КорневаяСтраница":"Имя кореневой страницы в пространстве key", 39 | "ПутьКШаблонам": "", 40 | "АнализироватьТолькоПотомковПодсистемы": "МояКорневаяПодсистема" 41 | }, 42 | "НастройкиHTML": { 43 | "ПутьКШаблонам": "", 44 | "КаталогПубликации": "./doc", 45 | "АнализироватьТолькоПотомковПодсистемы": "МояКорневаяПодсистема" 46 | }, 47 | "НастройкиJSON": { 48 | "ПутьКШаблонам": "", 49 | "КаталогПубликации": "./json", 50 | "АнализироватьТолькоПотомковПодсистемы": "МояКорневаяПодсистема" 51 | }, 52 | "НастройкиMarkdown": { 53 | "ПутьКШаблонам": "", 54 | "КаталогПубликации": "./markdown", 55 | "АнализироватьТолькоПотомковПодсистемы": "МояКорневаяПодсистема" 56 | }, 57 | "ПоследнийОбработанныйКоммит": "" 58 | } 59 | } 60 | ``` 61 | 62 | Располагать конфигурационный файл нужно в корне репозитория под именем `v8config.json`. 63 | 64 | ## Поддерживаемые варианты генерации автодокументации 65 | 66 | Как видно из пример конфигурационного файла, поддерживаются 2 формата (ключ `-format`) 67 | 68 | - `confluence` - генерация страниц в указанном пространстве [confluence](https://ru.atlassian.com/software/confluence) 69 | - `html` - генерация структуры каталогов в соответствии с подсистемами и файлов-страниц в каталогах. 70 | - `json` - генерация структуры каталогов в соответствии с подсистемами и json файлов в каталогах. 71 | - `markdown` - генерация структуры каталогов в соответствии с подсистемами и markdown файлов в каталогах. 72 | 73 | Для добавления новых стоит воспользоваться шаблоном [src/Классы/ШаблонГенераторДокументации.os-template](src/Классы/ШаблонГенераторДокументации.os-template) 74 | 75 | ## Шаблоны 76 | 77 | 1. ШаблонСплиттерНачало - Начало области, раздела, подсистемы. Шаблон: %1 - Имя области 78 | 2. ШаблонСплиттерКонец - Окончание области, раздела, подсистемы. 79 | 3. ШаблонЗаголовок - Заголовок метода. Шаблон: %1 - Имя метода 80 | 4. ШаблонЗаголовокДляКонстант - Заголовок раздела констант. Шаблон: %1 - Имя раздела 81 | 5. ШаблонШапкаТЧ - Шапка списка параметров метода 82 | 6. ШаблонШапкаТЧДляКонстант - Шапка списка констант 83 | 7. ШаблонСтрокаТЧ - Строка описания параметра. 84 | Шаблон: 85 | - %1 - номер 86 | - %2 - имя 87 | - %3 - обязательный 88 | - %4 - тип параметра 89 | - %5 - описание параметра 90 | 91 | 8. ШаблонСтрокаТЧДляКонстант - Строка описания константы. 92 | Шаблон: 93 | - %1 - имя 94 | - %2 - тип параметра 95 | - %3 - описание параметра 96 | 9. ШаблонПодвалТЧ - Подвал списка параметров метода и констант 97 | 10. ШаблонВозврат - Описание возвращаемого методов значения. Шаблон: %1 - тип, %2 - описание 98 | 11. ШаблонОписание - Описание метода. Шаблон: %1 - текст описания 99 | 12. ШаблонПример - Пример использования метода. Шаблон: %1 - текст примера 100 | 13. ШаблонНачалоСтраницы - Начало страницы документации. Шаблон: %1 - Имя страницы 101 | 14. ШаблонКонецСтраницы - Окончание страницы документации 102 | 103 | ## Подготовка конфигурации 104 | 105 | Для генерации документации конфигурация должна соответствовать требованиям: 106 | 107 | - Все модули должны иметь определенную структуру областей (в соответствии с требованиями 1С) 108 | - В документацию добавляются только экспортные методы, находящиеся в разделе `ПрограммныйИнтерфейс` 109 | - Описание методов должно соответствовать требованиям оформления кода 110 | - Поддерживаются общие модули и модули менеджеров объектов 111 | - Все модули / объекты, которые попадают под правила автодокументирования, должны располагаться в соответствующих подсистемах. Принятая структура: 112 | 113 | ``` none 114 | Подсистемы конфигурации 115 | | 116 | +-- МояКорневаяПодсистема (не выводится в интерфейс пользователя) 117 | | 118 | +-- Раздел 119 | | 120 | +-- Подсистема 121 | | 122 | +-- ОбъектМетаданных 123 | 124 | ``` 125 | 126 | ## Примеры 127 | 128 | ### В формате Confluence 129 | 130 | ![confluence](pict/confluence1.png) 131 | 132 | ![confluence](pict/confluence2.png) 133 | 134 | ![confluence](pict/confluence3.png) 135 | 136 | ### В Формате HTML 137 | 138 | ![html](pict/html1.PNG) 139 | 140 | ![html](pict/html2.PNG) 141 | 142 | ## Лицензии и права 143 | 144 | - основная лицензия исходного кода продукта - [MIT](LICENSE) 145 | - лицензии стороннего кода - BSDv3, Apache License, Freeware, etc - подробные разъяснения лицензий на исходный код продукта и его документации в том числе содержатся внутри файлов исходного кода 146 | 147 | TODO: 148 | 149 | 1. Публикация документации в формате Markdown и каталога doc, иерархия каталогов = иерархии подсистем (начиная с корневой) 150 | 2. В каталоге doc предусмотреть обработку index.md - описание подсистемы 151 | 3. Команда проверки исходников 152 | 4. Проверка исходников по списку файлов 153 | -------------------------------------------------------------------------------- /src/Классы/ГенераторДокументации_markdown.os: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////// 2 | // 3 | // Служебный класс генерации документации в формате markdown 4 | // 5 | // (с) BIA Technologies, LLC 6 | // 7 | /////////////////////////////////////////////////////////////////////////////// 8 | 9 | Перем Шаблоны; 10 | 11 | Перем КаталогПубликацииДокументации; 12 | Перем АнализироватьТолькоПотомковПодсистемы Экспорт; 13 | 14 | Перем СимволыЗамены; 15 | 16 | /////////////////////////////////////////////////////////////////// 17 | // СТАНДАРТНЫЙ ИНТЕРФЕЙС 18 | /////////////////////////////////////////////////////////////////// 19 | 20 | #Область ГенерацияДанных 21 | 22 | // ДокументацияПоМодулю 23 | // 24 | // Параметры: 25 | // ДанныеМодуля - Структура - Описание модуля, структура содержащая массив описаний методов, см. ГенераторДокументации.ОписаниеМетода 26 | // Ошибки - Массив - Коллекция ошибок генерации документации, сюда помещаем информацию о возникших ошибках 27 | // 28 | // Возвращаемое значение: 29 | // Строка - Текст документации по модулю, если пустая строка, публикация не выполняется 30 | // 31 | Функция ДокументацияПоМодулю(ДанныеМодуля, Ошибки) Экспорт 32 | 33 | ПомощникГенерацииДокументации.УстановитьПараметрыГенерации(Новый Структура("ЭкранироватьКавычки", Ложь)); 34 | 35 | Строки = ПомощникГенерацииДокументации.СформироватьОписаниеМодуляПоШаблонам(ДанныеМодуля, Шаблоны, СимволыЗамены); 36 | 37 | Если Строки.Количество() Тогда 38 | 39 | Строки.Вставить(0, СтрШаблон(Шаблоны.ШаблонНачалоСтраницы, ДанныеМодуля.Имя)); 40 | Строки.Добавить(Шаблоны.ШаблонКонецСтраницы); 41 | 42 | КонецЕсли; 43 | 44 | Возврат СтрСоединить(Строки, Символы.ПС); 45 | 46 | КонецФункции 47 | 48 | // ДокументацияКонстанты 49 | // 50 | // Параметры: 51 | // МассивКонстант - Массив - Массив структур описаний констант 52 | // Имя - Имя константы 53 | // Тип - Тип значения константы 54 | // Описание - Описание константы 55 | // Подсистема - Описание подсистем, которой принадлежит константа. см ГенераторДокументации.ПолучитьСтруктуруПодсистем 56 | // Ошибки - Массив - Коллекция ошибок генерации документации, сюда помещаем информацию о возникших ошибках 57 | // 58 | // Возвращаемое значение: 59 | // Строка - Текст документации по модулю, если пустая строка, публикация не выполняется 60 | // 61 | Функция ДокументацияКонстанты(МассивКонстант, Ошибки) Экспорт 62 | 63 | ПомощникГенерацииДокументации.УстановитьПараметрыГенерации(Новый Структура("ЭкранироватьКавычки", Ложь)); 64 | 65 | Строки = ПомощникГенерацииДокументации.СформироватьОписаниеКонстантПоШаблонам(МассивКонстант, Шаблоны, СимволыЗамены); 66 | 67 | Если Строки.Количество() Тогда 68 | 69 | Строки.Вставить(0, СтрШаблон(Шаблоны.ШаблонНачалоСтраницы, "Константы")); 70 | Строки.Добавить(Шаблоны.ШаблонКонецСтраницы); 71 | 72 | КонецЕсли; 73 | 74 | Возврат СтрСоединить(Строки, Символы.ПС); 75 | 76 | КонецФункции 77 | 78 | #КонецОбласти 79 | 80 | #Область Публикация 81 | 82 | // ОпубликоватьРаздел 83 | // 84 | // Параметры: 85 | // Раздел - СтрокаТаблицыЗначений - Описание публикуемого раздела 86 | // * Имя - Имя страницы/раздела 87 | // * Родитель - Родитель страницы, ссылку на строку этой же таблицы 88 | // * Содержимое - Содержимое страницы 89 | // * Идентификатор - Служебное поле, можно использовать при публикации 90 | // ОбъектыРаздела - СтрокаТаблицыЗначений - Массив описаний объектов раздела 91 | // * Имя - Имя объекта 92 | // * Родитель - Родитель страницы, ссылку на строку этой же таблицы 93 | // * Содержимое - Содержимое страницы 94 | // * Идентификатор - Служебное поле, можно использовать при публикации 95 | // ОшибкиПубликации - Массив - Коллекция ошибок публикации документации, сюда помещаем информацию о возникших ошибках 96 | // 97 | // Возвращаемое значение: 98 | // Булево - Признак успешности 99 | // 100 | Функция ОпубликоватьРаздел(Раздел, ОбъектыРаздела, ОшибкиПубликации) Экспорт 101 | 102 | Если НЕ ПомощникГенерацииДокументации.ПроверкаВозможностиПубликацииВКаталог(КаталогПубликацииДокументации, Раздел, ОшибкиПубликации) Тогда 103 | 104 | Возврат Ложь; 105 | 106 | КонецЕсли; 107 | 108 | Успешно = Истина; 109 | 110 | Каталог = ПомощникГенерацииДокументации.СоздатьКаталогРаздела(КаталогПубликацииДокументации, Раздел); 111 | 112 | Для Каждого НоваяСтраница Из ОбъектыРаздела Цикл 113 | 114 | Попытка 115 | 116 | ПутьКСтранице = ОбъединитьПути(Каталог, НоваяСтраница.Имя) + ".md"; 117 | ОбщегоНазначения.ЗаписатьФайл(ПутьКСтранице, СокрЛП(НоваяСтраница.Содержимое)); 118 | 119 | Исключение 120 | 121 | ОшибкиПубликации.Добавить("Ошибка создания страницы '" + НоваяСтраница.Имя + "': " + ОписаниеОшибки()); 122 | Успешно = Ложь; 123 | 124 | КонецПопытки; 125 | 126 | КонецЦикла; 127 | 128 | Возврат Успешно; 129 | 130 | КонецФункции 131 | 132 | Функция ПрефиксИмени(ТипСтраницы) Экспорт 133 | 134 | Если ТипСтраницы = "Модуль" Тогда 135 | 136 | Возврат "Программный интерфейс. "; 137 | 138 | Иначе 139 | 140 | Возврат ""; 141 | 142 | КонецЕсли; 143 | 144 | КонецФункции 145 | 146 | #КонецОбласти 147 | 148 | #Область Настройки 149 | 150 | // Производит чтение настроек из конфигурационного файла и сохраняет их в свойствах объекта 151 | // 152 | // Параметры: 153 | // НастройкиСтенда - Объект.НастройкиСтенда - Объект, содержащий информацию конфигурационного файла 154 | // 155 | // Возвращаемое значение: 156 | // Строка - описание возникших ошибок 157 | Функция ПрочитатьНастройки(НастройкиСтенда) Экспорт 158 | 159 | ТекстОшибки = ""; 160 | 161 | Настройки = НастройкиСтенда.Настройка("AutodocGen\НастройкиMarkdown"); 162 | Если ЗначениеЗаполнено(Настройки) Тогда 163 | 164 | Шаблоны = ПомощникГенерацииДокументации.ЗагрузитьШаблоны(Настройки["ПутьКШаблонам"], "Шаблоны_Markdown.json"); 165 | КаталогПубликацииДокументации = Настройки["КаталогПубликации"]; 166 | АнализироватьТолькоПотомковПодсистемы = Строка(Настройки["АнализироватьТолькоПотомковПодсистемы"]); 167 | 168 | Если НЕ ЗначениеЗаполнено(КаталогПубликацииДокументации) Тогда 169 | 170 | ТекстОшибки = "Некорректные настройки каталога публикации"; 171 | 172 | КонецЕсли; 173 | 174 | Иначе 175 | 176 | ТекстОшибки = "Отсутствуют настройки"; 177 | 178 | КонецЕсли; 179 | 180 | Возврат ТекстОшибки; 181 | 182 | КонецФункции 183 | 184 | #КонецОбласти 185 | 186 | СимволыЗамены = Новый Соответствие(); 187 | СимволыЗамены.Вставить(Символы.ПС, "
"); 188 | СимволыЗамены.Вставить(Символ(13), "
"); -------------------------------------------------------------------------------- /src/Классы/ГенераторДокументации_html.os: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////// 2 | // 3 | // Служебный класс генерации документации в формате html 4 | // 5 | // (с) BIA Technologies, LLC 6 | // 7 | /////////////////////////////////////////////////////////////////////////////// 8 | 9 | Перем Шаблоны; 10 | 11 | Перем КаталогПубликацииДокументации; 12 | Перем АнализироватьТолькоПотомковПодсистемы Экспорт; 13 | 14 | Перем СимволыЗамены; 15 | 16 | /////////////////////////////////////////////////////////////////// 17 | // СТАНДАРТНЫЙ ИНТЕРФЕЙС 18 | /////////////////////////////////////////////////////////////////// 19 | 20 | #Область ГенерацияДанных 21 | 22 | // ДокументацияПоМодулю 23 | // 24 | // Параметры: 25 | // ДанныеМодуля - Структура - Описание модуля, структура содержащая массив описаний методов, см. ГенераторДокументации.ОписаниеМетода 26 | // Ошибки - Массив - Коллекция ошибок генерации документации, сюда помещаем информацию о возникших ошибках 27 | // 28 | // Возвращаемое значение: 29 | // Строка - Текст документации по модулю, если пустая строка, публикация не выполняется 30 | // 31 | Функция ДокументацияПоМодулю(ДанныеМодуля, Ошибки) Экспорт 32 | 33 | Строки = ПомощникГенерацииДокументации.СформироватьОписаниеМодуляПоШаблонам(ДанныеМодуля, Шаблоны, СимволыЗамены); 34 | 35 | Если Строки.Количество() Тогда 36 | 37 | Строки.Вставить(0, Шаблоны.ШаблонНачалоСтраницы); 38 | Строки.Добавить(Шаблоны.ШаблонКонецСтраницы); 39 | 40 | КонецЕсли; 41 | 42 | Возврат СтрСоединить(Строки, " "); 43 | 44 | КонецФункции 45 | 46 | // ДокументацияКонстанты 47 | // 48 | // Параметры: 49 | // МассивКонстант - Массив - Массив структур описаний констант 50 | // Имя - Имя константы 51 | // Тип - Тип значения константы 52 | // Описание - Описание константы 53 | // Подсистема - Описание подсистем, которой принадлежит константа. см ГенераторДокументации.ПолучитьСтруктуруПодсистем 54 | // Ошибки - Массив - Коллекция ошибок генерации документации, сюда помещаем информацию о возникших ошибках 55 | // 56 | // Возвращаемое значение: 57 | // Строка - Текст документации по модулю, если пустая строка, публикация не выполняется 58 | // 59 | Функция ДокументацияКонстанты(МассивКонстант, Ошибки) Экспорт 60 | 61 | Строки = ПомощникГенерацииДокументации.СформироватьОписаниеКонстантПоШаблонам(МассивКонстант, Шаблоны, СимволыЗамены); 62 | 63 | Если Строки.Количество() Тогда 64 | 65 | Строки.Вставить(0, Шаблоны.ШаблонНачалоСтраницы); 66 | Строки.Добавить(Шаблоны.ШаблонКонецСтраницы); 67 | 68 | КонецЕсли; 69 | 70 | Возврат СтрСоединить(Строки, " "); 71 | 72 | КонецФункции 73 | 74 | #КонецОбласти 75 | 76 | #Область Публикация 77 | 78 | // ОпубликоватьРаздел 79 | // 80 | // Параметры: 81 | // Раздел - СтрокаТаблицыЗначений - Описание публикуемого раздела 82 | // * Имя - Имя страницы/раздела 83 | // * Родитель - Родитель страницы, ссылку на строку этой же таблицы 84 | // * Содержимое - Содержимое страницы 85 | // * Идентификатор - Служебное поле, можно использовать при публикации 86 | // ОбъектыРаздела - СтрокаТаблицыЗначений - Массив описаний объектов раздела 87 | // * Имя - Имя объекта 88 | // * Родитель - Родитель страницы, ссылку на строку этой же таблицы 89 | // * Содержимое - Содержимое страницы 90 | // * Идентификатор - Служебное поле, можно использовать при публикации 91 | // ОшибкиПубликации - Массив - Коллекция ошибок публикации документации, сюда помещаем информацию о возникших ошибках 92 | // 93 | // Возвращаемое значение: 94 | // Булево - Признак успешности 95 | // 96 | Функция ОпубликоватьРаздел(Раздел, ОбъектыРаздела, ОшибкиПубликации) Экспорт 97 | 98 | Если НЕ ПомощникГенерацииДокументации.ПроверкаВозможностиПубликацииВКаталог(КаталогПубликацииДокументации, Раздел, ОшибкиПубликации) Тогда 99 | 100 | Возврат Ложь; 101 | 102 | КонецЕсли; 103 | 104 | Успешно = Истина; 105 | 106 | Каталог = ПомощникГенерацииДокументации.СоздатьКаталогРаздела(КаталогПубликацииДокументации, Раздел); 107 | 108 | Для Каждого НоваяСтраница Из ОбъектыРаздела Цикл 109 | 110 | Попытка 111 | 112 | ПутьКСтранице = ОбъединитьПути(Каталог, НоваяСтраница.Имя) + ".html"; 113 | ОбщегоНазначения.ЗаписатьФайл(ПутьКСтранице, СокрЛП(НоваяСтраница.Содержимое)); 114 | 115 | Исключение 116 | 117 | ОшибкиПубликации.Добавить("Ошибка создания страницы '" + НоваяСтраница.Имя + "': " + ОписаниеОшибки()); 118 | Успешно = Ложь; 119 | 120 | КонецПопытки; 121 | 122 | КонецЦикла; 123 | 124 | Возврат Успешно; 125 | 126 | КонецФункции 127 | 128 | Функция ПрефиксИмени(ТипСтраницы) Экспорт 129 | 130 | Если ТипСтраницы = "Модуль" Тогда 131 | 132 | Возврат "Программный интерфейс. "; 133 | 134 | Иначе 135 | 136 | Возврат ""; 137 | 138 | КонецЕсли; 139 | 140 | КонецФункции 141 | 142 | #КонецОбласти 143 | 144 | #Область Настройки 145 | 146 | // Производит чтение настроек из конфигурационного файла и сохраняет их в свойствах объекта 147 | // 148 | // Параметры: 149 | // НастройкиСтенда - Объект.НастройкиСтенда - Объект, содержащий информацию конфигурационного файла 150 | // 151 | // Возвращаемое значение: 152 | // Строка - описание возникших ошибок 153 | Функция ПрочитатьНастройки(НастройкиСтенда) Экспорт 154 | 155 | ТекстОшибки = ""; 156 | 157 | НастройкиHTML = НастройкиСтенда.Настройка("AutodocGen\НастройкиHTML"); 158 | Если ЗначениеЗаполнено(НастройкиHTML) Тогда 159 | 160 | Шаблоны = ПомощникГенерацииДокументации.ЗагрузитьШаблоны(НастройкиHTML["ПутьКШаблонам"], "Шаблоны_HTML.json"); 161 | КаталогПубликацииДокументации = НастройкиHTML["КаталогПубликации"]; 162 | АнализироватьТолькоПотомковПодсистемы = Строка(НастройкиHTML["АнализироватьТолькоПотомковПодсистемы"]); 163 | 164 | Если НЕ ЗначениеЗаполнено(КаталогПубликацииДокументации) Тогда 165 | 166 | ТекстОшибки = "Некорректные настройки каталога публикации"; 167 | 168 | КонецЕсли; 169 | 170 | Иначе 171 | 172 | ТекстОшибки = "Отсутствуют настройки"; 173 | 174 | КонецЕсли; 175 | 176 | Возврат ТекстОшибки; 177 | 178 | КонецФункции 179 | 180 | #КонецОбласти 181 | 182 | СимволыЗамены = Новый Соответствие(); 183 | СимволыЗамены.Вставить("\", "\\"); 184 | СимволыЗамены.Вставить("&", "&"); 185 | СимволыЗамены.Вставить("<", "<"); 186 | СимволыЗамены.Вставить(">", ">"); 187 | СимволыЗамены.Вставить(Символ(8211), "–"); 188 | СимволыЗамены.Вставить(Символ(8212), "—"); 189 | СимволыЗамены.Вставить(Символы.ПС, "
"); 190 | СимволыЗамены.Вставить(Символ(13), "
"); 191 | СимволыЗамены.Вставить(Символы.Таб, " "); 192 | 193 | -------------------------------------------------------------------------------- /tests/ТестГенерацияДокументацииПоФайлу.os: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////// 2 | // 3 | // Тестирование основной функциональности пакета 4 | // Проверка на соответствие выгрузки эталону 5 | // 6 | // (с) BIA Technologies, LLC 7 | // 8 | /////////////////////////////////////////////////////////////////////////////// 9 | 10 | #Использовать "..\src" 11 | #Использовать logos 12 | #Использовать asserts 13 | #Использовать fs 14 | 15 | /////////////////////////////////////////////////////////////////////////////// 16 | 17 | Функция ПолучитьСписокТестов(Знач ЮнитТестирование) Экспорт 18 | 19 | Лог = Логирование.ПолучитьЛог("Тест"); 20 | 21 | МассивТестов = Новый Массив; 22 | МассивТестов.Добавить("ТестСформироватьДокументациюОбщегоМодуляJSON"); 23 | МассивТестов.Добавить("ТестСформироватьДокументациюОбщегоМодуляHTML"); 24 | МассивТестов.Добавить("ТестСформироватьДокументациюОбщегоМодуляMarkDown"); 25 | 26 | Возврат МассивТестов; 27 | 28 | КонецФункции 29 | 30 | Процедура ПередЗапускомТеста() Экспорт 31 | 32 | КонецПроцедуры 33 | 34 | Процедура ПослеЗапускаТеста() Экспорт 35 | 36 | Форматы = Новый Массив(); 37 | Форматы.Добавить("JSON"); 38 | Форматы.Добавить("HTML"); 39 | Форматы.Добавить("Markdown"); 40 | 41 | Для Каждого Формат Из Форматы Цикл 42 | 43 | КаталогДокументации = ОбъединитьПути(ТекущийКаталог(), СтрШаблон("%1_autodoc", Формат)); 44 | 45 | Файл = Новый Файл(КаталогДокументации); 46 | Если Файл.Существует() Тогда 47 | 48 | УдалитьФайлы(КаталогДокументации); 49 | 50 | КонецЕсли; 51 | 52 | КонецЦикла; 53 | 54 | КонецПроцедуры 55 | 56 | Процедура ТестСформироватьДокументациюОбщегоМодуляJSON() Экспорт 57 | 58 | ФайлМодуля = ТестовыйМодуль(); 59 | 60 | ИмяСформированногоФайла = СформироватьДокументациюМодуля(ФайлМодуля, "JSON"); 61 | 62 | Чтение = Новый ЧтениеJSON(); 63 | Чтение.ОткрытьФайл(ИмяСформированногоФайла); 64 | ПрочитатьJSON(Чтение); 65 | Чтение.Закрыть(); 66 | 67 | КонецПроцедуры 68 | 69 | Процедура ТестСформироватьДокументациюОбщегоМодуляHTML() Экспорт 70 | 71 | ФайлМодуля = ТестовыйМодуль(); 72 | 73 | СформироватьДокументациюМодуля(ФайлМодуля, "HTML"); 74 | 75 | КонецПроцедуры 76 | 77 | Процедура ТестСформироватьДокументациюОбщегоМодуляMarkDown() Экспорт 78 | 79 | ФайлМодуля = ТестовыйМодуль(); 80 | 81 | СформироватьДокументациюМодуля(ФайлМодуля, "MarkDown"); 82 | 83 | КонецПроцедуры 84 | 85 | Процедура ТестПубликацииConfluence() Экспорт 86 | 87 | КаталогИсходников = ОбъединитьПути(КаталогФикстур(), "configuration"); 88 | 89 | Опубликовать(КаталогИсходников, Неопределено); 90 | 91 | КонецПроцедуры 92 | 93 | Процедура ТестПубликацииConfluenceСРуководствами() Экспорт 94 | 95 | КаталогИсходников = ОбъединитьПути(КаталогФикстур(), "configuration"); 96 | КаталогРуководств = ОбъединитьПути(КаталогФикстур(), "Doc"); 97 | 98 | Опубликовать(КаталогИсходников, КаталогРуководств); 99 | 100 | КонецПроцедуры 101 | 102 | Процедура Опубликовать(КаталогИсходников, КаталогРуководств) 103 | 104 | ФайлНастроек = ОбъединитьПути(КаталогФикстур(), "config.json"); 105 | 106 | ПараметрыКоманды = Новый Структура; 107 | ПараметрыКоманды.Вставить("КаталогИсходныхФайлов", КаталогИсходников); 108 | ПараметрыКоманды.Вставить("КаталогКонфигурации", КаталогИсходников); 109 | ПараметрыКоманды.Вставить("Формат", "confluence"); 110 | ПараметрыКоманды.Вставить("ФорматEDT", Ложь); 111 | ПараметрыКоманды.Вставить("РежимGit", Ложь); 112 | ПараметрыКоманды.Вставить("ГенерацияПриНаличииОшибок", Ложь); 113 | ПараметрыКоманды.Вставить("ФайлНастроек", ФайлНастроек); 114 | ПараметрыКоманды.Вставить("КаталогДополнительнойДокументации", КаталогРуководств); 115 | 116 | ОбщегоНазначения.ДополнитьПараметры(ПараметрыКоманды); 117 | 118 | Конфигурация = РазборКонфигураций.ЗагрузитьКонфигурацию(ПараметрыКоманды.КаталогКонфигурации); 119 | Конфигурация.ЗаполнитьПодсистемыОбъектовКонфигурации(); 120 | Конфигурация.НайтиМодули(); 121 | 122 | НастройкиГенератора = Новый Структура; 123 | 124 | НастройкиГенератора.Вставить("Парсер", Конфигурация); 125 | НастройкиГенератора.Вставить("НастройкиАнализаИзменений", ПараметрыКоманды.НастройкиАнализаИзменений); 126 | 127 | ГенераторСодержимого = ОбщегоНазначения.ПолучитьГенераторДокументации(ПараметрыКоманды.НастройкиСтенда, ПараметрыКоманды.Формат); 128 | 129 | ГенераторДокументации = Новый ГенераторДокументации(ГенераторСодержимого); 130 | 131 | РезультатГенерации = ГенераторДокументации.Сгенерировать(НастройкиГенератора); 132 | 133 | Ошибки = РезультатГенерации.Ошибки; 134 | 135 | Если РезультатГенерации.Успешно Тогда 136 | РезультатПубликации = ГенераторДокументации.Опубликовать(РезультатГенерации); 137 | Ошибки = РезультатПубликации.ОшибкиПубликации; 138 | 139 | КонецЕсли; 140 | 141 | Сообщить(СтрСоединить(Ошибки, Символы.ПС)); 142 | 143 | КонецПроцедуры 144 | 145 | Функция СформироватьДокументациюМодуля(ИмяФайла, Формат) 146 | 147 | ФайлНастроек = ОбъединитьПути(КаталогФикстур(), "config.json"); 148 | 149 | ПараметрыКоманды = Новый Структура; 150 | ПараметрыКоманды.Вставить("ИсходныйФайл", ИмяФайла); 151 | ПараметрыКоманды.Вставить("Формат", Формат); 152 | ПараметрыКоманды.Вставить("ФорматEDT", Истина); 153 | ПараметрыКоманды.Вставить("РежимGit", Ложь); 154 | ПараметрыКоманды.Вставить("ГенерацияПриНаличииОшибок", Ложь); 155 | ПараметрыКоманды.Вставить("ФайлНастроек", ФайлНастроек); 156 | 157 | КаталогДокументации = ОбъединитьПути(ТекущийКаталог(), СтрШаблон("%1_autodoc", ПараметрыКоманды.Формат)); 158 | 159 | СоздатьКаталог(КаталогДокументации); 160 | 161 | ТекстОшибки = ""; 162 | 163 | Команда = Новый СгенерироватьДокументациюПоФайлу(); 164 | Успех = Команда.ВыполнитьГенерациюДокументации(ПараметрыКоманды, ТекстОшибки); 165 | 166 | Если Формат <> "JSON" Тогда 167 | 168 | ИмяСформированногоФайла = ОбъединитьПути(КаталогДокументации, "autodoc", "Программный интерфейс. Модуль." + Формат); 169 | 170 | Иначе 171 | 172 | ИмяСформированногоФайла = ОбъединитьПути(КаталогДокументации, "autodoc", "Модуль." + Формат); 173 | 174 | КонецЕсли; 175 | 176 | Ожидаем.Что(Успех, "Не удалось сформировать документацию по модулю. " + ТекстОшибки).ЭтоИстина(); 177 | Ожидаем.Что(ТекстОшибки, "При формировании возникли ошибки. " + ТекстОшибки).НЕ_().Заполнено(); 178 | Файл = Новый Файл(ИмяСформированногоФайла); 179 | Ожидаем.Что(Файл.Существует(), "Не найден сформированный файл").ЭтоИстина(); 180 | 181 | Возврат ИмяСформированногоФайла; 182 | 183 | КонецФункции 184 | 185 | Функция ТестовыйМодуль() 186 | 187 | ОбщиеМодули = ОбъединитьПути(КаталогФикстур(), "configuration", "CommonModules"); 188 | ФайлМодуля = ОбъединитьПути(ОбщиеМодули, "TestModule", "Ext", "Module.bsl"); 189 | 190 | Возврат ФайлМодуля; 191 | 192 | КонецФункции 193 | 194 | Функция КаталогФикстур() 195 | 196 | Возврат ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures"); 197 | 198 | КонецФункции 199 | -------------------------------------------------------------------------------- /src/Модули/МенеджерПриложения.os: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////// 2 | // 3 | // Служебный модуль управления приложением 4 | // 5 | /////////////////////////////////////////////////////////////////////////////// 6 | 7 | #Использовать logos 8 | #Использовать json 9 | #Использовать cli 10 | 11 | /////////////////////////////////////////////////////////////////////////////// 12 | 13 | Перем Приложение; 14 | Перем ИмяПараметраФайлаНастроек; 15 | 16 | /////////////////////////////////////////////////////////////////////////////// 17 | // ПРОГРАММНЫЙ ИНТЕРФЕЙС 18 | /////////////////////////////////////////////////////////////////////////////// 19 | 20 | // Выполняет инициализацию приложения 21 | // Заполнение параметров и регистрацию команд 22 | // 23 | Функция ИнициализироватьПриложение() Экспорт 24 | 25 | Если Приложение <> Неопределено Тогда 26 | 27 | ВызватьИсключение "Приложение уже инициализировано"; 28 | 29 | КонецЕсли; 30 | 31 | Приложение = Новый КонсольноеПриложение( 32 | ПараметрыПриложения.ИмяПродукта(), 33 | ПараметрыПриложения.КраткоеОписаниеПродукта(), 34 | Новый КомандаСправкаПоПриложению()); 35 | 36 | Приложение.Версия("v version", ПараметрыПриложения.ВерсияПродукта()); 37 | 38 | ЗарегистрироватьКомандыПриложения(); 39 | 40 | КонецФункции 41 | 42 | // Выполняет запуск приложения 43 | // И при необходимости инициализацию 44 | // 45 | // Параметры: 46 | // АргументыЗапуска - Массив - Аргументы командной строки 47 | // 48 | Процедура Запустить(АргументыЗапуска = Неопределено) Экспорт 49 | 50 | Если Приложение = Неопределено Тогда 51 | 52 | ИнициализироватьПриложение(); 53 | 54 | КонецЕсли; 55 | 56 | Если АргументыЗапуска = Неопределено Тогда 57 | 58 | АргументыЗапуска = АргументыКоманднойСтроки; 59 | 60 | КонецЕсли; 61 | 62 | Аргументы = СоздатьМассивИзФиксированного(АргументыЗапуска); 63 | 64 | ИмяФайлаПараметров = НайтиИмяФайлаНастроек(Аргументы); 65 | 66 | Если ЗначениеЗаполнено(ИмяФайлаПараметров) Тогда 67 | 68 | ЗагрузитьПараметрыИзФайла(ИмяФайлаПараметров); 69 | 70 | КонецЕсли; 71 | 72 | Приложение.Запустить(Аргументы); 73 | 74 | КонецПроцедуры 75 | 76 | // ПолучитьЛог 77 | // Возвращает лог приложения 78 | // 79 | // Возвращаемое значение: 80 | // Лог - Лог приложения 81 | // 82 | Функция ПолучитьЛог() Экспорт 83 | 84 | Возврат Логирование.ПолучитьЛог(ПараметрыПриложения.ИмяЛогаСистемы()); 85 | 86 | КонецФункции 87 | 88 | // Метод возвращает экземпляр приложения 89 | // 90 | // Возвращаемое значение: 91 | // КонсольноеПриложение - Экземпляр приложения 92 | // 93 | Функция Приложение() Экспорт 94 | 95 | Возврат Приложение; 96 | 97 | КонецФункции 98 | 99 | // Выполняет чтение параметров из файла и их установку 100 | // 101 | // Параметры: 102 | // ИмяФайлаНастроек - Строка - Имя файла настроек 103 | // 104 | Процедура ЗагрузитьПараметрыИзФайла(ИмяФайлаНастроек) Экспорт 105 | 106 | Если НЕ ЗначениеЗаполнено(ИмяФайлаНастроек) Тогда 107 | 108 | Возврат; 109 | 110 | КонецЕсли; 111 | 112 | ИмяФайлаНастроек = ОбъединитьПути(ТекущийКаталог(), ИмяФайлаНастроек); 113 | 114 | Параметры = ПрочитатьФайл(ИмяФайлаНастроек); 115 | 116 | Если Тип("Структура") <> ТипЗнч(Параметры) Тогда 117 | 118 | Возврат; 119 | 120 | КонецЕсли; 121 | 122 | ОсновнаяКоманда = Приложение.ПолучитьКоманду(); 123 | КомандыПриложения = ОсновнаяКоманда.ПолучитьПодкоманды(); 124 | 125 | Для Каждого Команда Из КомандыПриложения Цикл 126 | 127 | Синонимы = Команда.ПолучитьСинонимы(); 128 | 129 | ПараметрыКоманды = Неопределено; 130 | 131 | Для Каждого Синоним Из Синонимы Цикл 132 | 133 | Если Параметры.Свойство(Синоним) Тогда 134 | 135 | ПараметрыКоманды = Параметры[Синоним]; 136 | Прервать; 137 | 138 | КонецЕсли; 139 | 140 | КонецЦикла; 141 | 142 | Если ПараметрыКоманды = Неопределено Тогда 143 | 144 | Продолжить; 145 | 146 | КонецЕсли; 147 | 148 | Команда.НачалоЗапуска(); 149 | 150 | Для Каждого Элемент Из ПараметрыКоманды Цикл 151 | 152 | ПараметрКоманды = Команда.АргументИзИндекса(Элемент.Ключ); 153 | 154 | Если ПараметрКоманды = Неопределено Тогда 155 | 156 | ПараметрКоманды = Команда.ОпцияИзИндекса(Элемент.Ключ); 157 | Если ПараметрКоманды = Неопределено Тогда 158 | 159 | Продолжить; 160 | 161 | КонецЕсли; 162 | 163 | КонецЕсли; 164 | 165 | ПараметрКоманды.Значение = Элемент.Значение; 166 | ПараметрКоманды.УстановленаПользователем = Истина; 167 | 168 | КонецЦикла; 169 | 170 | КонецЦикла; 171 | 172 | КонецПроцедуры 173 | 174 | // Ищет в аргументах командной строки имя файла настроек 175 | // 176 | // Параметры: 177 | // Аргументы - Массив - Аргументы командной строки 178 | // УдалитьАргументФайла - Булево - Истина - параметр с файлом настроек будет удален из аргументов 179 | // 180 | // Возвращаемое значение: 181 | // Строка, Неопределено - Имя файла или неопределено, если файл не найден 182 | // 183 | Функция НайтиИмяФайлаНастроек(Аргументы, УдалитьАргументФайла = Истина) Экспорт 184 | 185 | Если НЕ ЗначениеЗаполнено(ИмяПараметраФайлаНастроек) Тогда 186 | 187 | ИмяПараметраФайлаНастроек = "--settings"; 188 | 189 | КонецЕсли; 190 | 191 | Для Каждого Аргумент Из Аргументы Цикл 192 | 193 | Если СтрНачинаетсяС(Аргумент, ИмяПараметраФайлаНастроек) Тогда 194 | 195 | ИмяФайлаНастроек = Сред(Аргумент, СтрДлина(ИмяПараметраФайлаНастроек) + 2); 196 | 197 | Аргументы.Удалить(Аргументы.Найти(Аргумент)); 198 | 199 | Возврат ИмяФайлаНастроек; 200 | 201 | КонецЕсли; 202 | 203 | КонецЦикла; 204 | 205 | Возврат ИмяФайлаНастроек; 206 | 207 | КонецФункции 208 | 209 | // Устанавливает имя параметра файла настроек, которое будет использовано при поиске 210 | // 211 | // Параметры: 212 | // НовоеИмяПараметраФайлаНастроек - Строка - Новое имя параметра 213 | // 214 | Процедура УстановитьИмяПараметраФайлаНастроек(НовоеИмяПараметраФайлаНастроек) Экспорт 215 | 216 | ИмяПараметраФайлаНастроек = НовоеИмяПараметраФайлаНастроек; 217 | 218 | КонецПроцедуры 219 | /////////////////////////////////////////////////////////////////////////////// 220 | // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ 221 | /////////////////////////////////////////////////////////////////////////////// 222 | 223 | Функция ПрочитатьФайл(ИмяФайла) 224 | 225 | Чтение = Новый ЧтениеJSON(); 226 | Чтение.ОткрытьФайл(ИмяФайла, КодировкаТекста.UTF8); 227 | Данные = ПрочитатьJSON(Чтение, Ложь); 228 | Чтение.Закрыть(); 229 | 230 | Возврат Данные; 231 | 232 | КонецФункции 233 | 234 | Функция СоздатьМассивИзФиксированного(ФиксированныйМассив) 235 | 236 | Результат = Новый Массив(); 237 | 238 | Для инд = 0 По ФиксированныйМассив.ВГраница() Цикл 239 | 240 | Результат.Добавить(ФиксированныйМассив[инд]); 241 | 242 | КонецЦикла; 243 | 244 | Возврат Результат; 245 | 246 | КонецФункции 247 | 248 | Процедура ЗарегистрироватьКомандыПриложения() 249 | 250 | ФайлыКоманд = НайтиФайлы(ОбъединитьПути(СтартовыйСценарий().Каталог, "Команды"), "*.os"); 251 | Для Каждого ФайлКоманды Из ФайлыКоманд Цикл 252 | 253 | ИмяКлассаРеализации = ФайлКоманды.ИмяБезРасширения; 254 | 255 | Если СтрСравнить(ИмяКлассаРеализации, "КомандаСправкаПоПриложению") = 0 Тогда 256 | Продолжить; 257 | КонецЕсли; 258 | 259 | РеализацияКоманды = Новый(ИмяКлассаРеализации); 260 | ИмяКоманды = РеализацияКоманды.ИмяКоманды(); 261 | 262 | Приложение.ДобавитьКоманду(ИмяКоманды + " " + Лев(ИмяКоманды, 1), 263 | РеализацияКоманды.КраткоеОписаниеКоманды(), 264 | РеализацияКоманды); 265 | 266 | КонецЦикла; 267 | 268 | КонецПроцедуры 269 | -------------------------------------------------------------------------------- /src/Модули/ПомощникГенерацииДокументации.os: -------------------------------------------------------------------------------- 1 | #Использовать bsl-parser 2 | 3 | Перем ПараметрыГенерации; 4 | 5 | Функция ЗагрузитьШаблоны(ПутьКШаблонам, ШаблоныПоУмолчанию) Экспорт 6 | 7 | Если НЕ ЗначениеЗаполнено(ПутьКШаблонам) Тогда 8 | 9 | ПутьКШаблонам = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "additional", ШаблоныПоУмолчанию); 10 | 11 | КонецЕсли; 12 | 13 | Текст = Новый ТекстовыйДокумент; 14 | Текст.Прочитать(ПутьКШаблонам, "UTF-8"); 15 | СодержимоеШаблона = Текст.ПолучитьТекст(); 16 | ПарсерJSON = Новый ПарсерJSON; 17 | ПредШаблоны = ПарсерJSON.ПрочитатьJSON(СодержимоеШаблона); 18 | Шаблоны = Новый Структура; 19 | Для Каждого Элемент Из ПредШаблоны Цикл 20 | 21 | Шаблоны.Вставить(Элемент.Ключ, Элемент.Значение); 22 | 23 | КонецЦикла; 24 | 25 | Возврат Шаблоны; 26 | 27 | КонецФункции 28 | 29 | Функция СоздатьКаталогРаздела(Знач БазовыйКаталог, Знач Раздел) Экспорт 30 | 31 | ЧастиПути = Новый Массив; 32 | 33 | Пока Раздел <> Неопределено Цикл 34 | ЧастиПути.Добавить(Раздел.Имя); 35 | Раздел = Раздел.Родитель; 36 | КонецЦикла; 37 | 38 | Каталог = БазовыйКаталог; 39 | 40 | Для Инд = 1 По ЧастиПути.Количество() Цикл 41 | 42 | Каталог = ОбъединитьПути(Каталог, ЧастиПути[ЧастиПути.Количество() - Инд]); 43 | СоздатьКаталог(Каталог); 44 | 45 | КонецЦикла; 46 | 47 | Возврат Каталог; 48 | 49 | КонецФункции 50 | 51 | Функция ПроверкаВозможностиПубликацииВКаталог(БазовыйКаталог, Раздел, ОшибкиПубликации) Экспорт 52 | 53 | Каталог = Новый Файл(БазовыйКаталог); 54 | 55 | Если НЕ Каталог.Существует() ИЛИ НЕ Каталог.ЭтоКаталог() Тогда 56 | 57 | ОшибкиПубликации.Добавить("Отсутствует каталог размещения автодокументации: '" + Каталог.ПолноеИмя + "'"); 58 | Возврат Ложь; 59 | 60 | КонецЕсли; 61 | 62 | Попытка 63 | 64 | СоздатьКаталогРаздела(БазовыйКаталог, Раздел); 65 | 66 | Исключение 67 | 68 | ОшибкиПубликации.Добавить("Ошибка создания каталога '" + Раздел.Имя + "': " + ОписаниеОшибки()); 69 | Возврат Ложь; 70 | 71 | КонецПопытки; 72 | 73 | Возврат Истина; 74 | 75 | КонецФункции 76 | 77 | Функция СобратьИерархиюПоПодсистемам(ОбъектыПодсистем) Экспорт 78 | 79 | Иерархия = Новый Соответствие; 80 | 81 | Для Каждого Объект Из ОбъектыПодсистем Цикл 82 | 83 | Если Объект.Подсистема = Неопределено ИЛИ ПустаяСтрока(Объект.Подсистема.ИмяРаздела) Тогда 84 | 85 | Сообщить(СтрШаблон("Объект %1 не включен в подсистемы", Объект.Имя)); 86 | Продолжить; 87 | 88 | КонецЕсли; 89 | 90 | ДанныеПодсистемы = Объект.Подсистема; 91 | 92 | Раздел = ДанныеПодсистемы.ИмяРаздела; 93 | Подсистема = ДанныеПодсистемы.ИмяПодсистемы; 94 | 95 | ДанныеРаздела = Иерархия[Раздел]; 96 | 97 | Если ДанныеРаздела = Неопределено Тогда 98 | 99 | ДанныеРаздела = Новый Соответствие; 100 | Иерархия[Раздел] = ДанныеРаздела; 101 | 102 | КонецЕсли; 103 | 104 | ДанныеПодсистемы = ДанныеРаздела[Подсистема]; 105 | Если ДанныеПодсистемы = Неопределено Тогда 106 | 107 | ДанныеПодсистемы = Новый Массив; 108 | ДанныеРаздела[Подсистема] = ДанныеПодсистемы; 109 | 110 | КонецЕсли; 111 | 112 | ДанныеПодсистемы.Добавить(Объект); 113 | 114 | КонецЦикла; 115 | 116 | Возврат Иерархия; 117 | 118 | КонецФункции 119 | 120 | Функция СформироватьОписаниеМодуляПоШаблонам(ДанныеМодуля, Шаблоны, СимволыЗамены) Экспорт 121 | 122 | ЧастиТекста = Новый Массив; 123 | ТекущаяОбласть = ""; 124 | ОбластьОткрыта = Ложь; 125 | 126 | Для Каждого ОписаниеМетода Из ДанныеМодуля.Методы Цикл 127 | 128 | Если ОписаниеМетода.ИмяРаздела <> ТипыОбласти.РазделПрограммныйИнтерфейс Тогда 129 | 130 | Продолжить; 131 | 132 | КонецЕсли; 133 | 134 | Если ТекущаяОбласть <> ОписаниеМетода.ИмяОбласти И ОбластьОткрыта Тогда 135 | 136 | ЧастиТекста.Добавить(Шаблоны.ШаблонСплиттерКонец); 137 | ОбластьОткрыта = Ложь; 138 | ТекущаяОбласть = ""; 139 | 140 | КонецЕсли; 141 | 142 | Если ЗначениеЗаполнено(ОписаниеМетода.ИмяОбласти) И НЕ ОбластьОткрыта Тогда 143 | 144 | ОбластьОткрыта = Истина; 145 | ТекущаяОбласть = ОписаниеМетода.ИмяОбласти; 146 | ЧастиТекста.Добавить(СтрШаблон(Шаблоны.ШаблонСплиттерНачало, ОписаниеМетода.ИмяОбласти)); 147 | 148 | КонецЕсли; 149 | 150 | ЧастиТекста.Добавить(СтрШаблон(Шаблоны.ШаблонЗаголовок, ОписаниеМетода.ИмяМетода)); 151 | 152 | ЧастиТекста.Добавить(СтрШаблон(Шаблоны.ШаблонОписание, ОбработатьСтроку(ОписаниеМетода.Описание, СимволыЗамены))); 153 | 154 | Если ОписаниеМетода.ПараметрыМетода.Количество() Тогда 155 | 156 | ЧастиТекста.Добавить(Шаблоны.ШаблонШапкаТЧ); 157 | 158 | Ит = 0; 159 | Для Каждого Параметр Из ОписаниеМетода.ПараметрыМетода Цикл 160 | 161 | Ит = Ит + 1; 162 | ЧастиТекста.Добавить(СтрШаблон(Шаблоны.ШаблонСтрокаТЧ, 163 | Ит, 164 | Параметр.Имя, 165 | ?(ЗначениеЗаполнено(Параметр.ЗначениеПоУмолчанию), "Нет", "Да"), 166 | Параметр.ТипПараметра, 167 | ОбработатьСтроку(Параметр.ОписаниеПараметра, СимволыЗамены))); 168 | 169 | КонецЦикла; 170 | 171 | ЧастиТекста.Добавить(Шаблоны.ШаблонПодвалТЧ); 172 | 173 | КонецЕсли; 174 | 175 | Если ОписаниеМетода.ТипБлока = ТипыБлоковМодуля.ЗаголовокФункции Тогда 176 | Для Каждого ОписаниеВозврата Из ОписаниеМетода.ТипВозвращаемогоЗначения Цикл 177 | ЧастиТекста.Добавить( 178 | СтрШаблон(Шаблоны.ШаблонВозврат, 179 | ОписаниеВозврата.ТипПараметра, 180 | ОбработатьСтроку(ОписаниеВозврата.ОписаниеПараметра, СимволыЗамены)) 181 | ); 182 | КонецЦикла; 183 | 184 | КонецЕсли; 185 | 186 | Для Каждого Пример Из ОписаниеМетода.Примеры Цикл 187 | 188 | ЧастиТекста.Добавить(СтрШаблон(Шаблоны.ШаблонПример, ОбработатьСтроку(Пример, СимволыЗамены, Истина))); 189 | 190 | КонецЦикла; 191 | 192 | КонецЦикла; 193 | 194 | Если ОбластьОткрыта Тогда 195 | 196 | ЧастиТекста.Добавить(Шаблоны.ШаблонСплиттерКонец); 197 | 198 | КонецЕсли; 199 | 200 | Возврат ЧастиТекста; 201 | 202 | КонецФункции 203 | 204 | Функция СформироватьОписаниеКонстантПоШаблонам(МассивКонстант, Шаблоны, СимволыЗамены) Экспорт 205 | 206 | СтрокиОписания = Новый Массив; 207 | 208 | Иерархия = СобратьИерархиюПоПодсистемам(МассивКонстант); 209 | 210 | Для Каждого ДанныеРаздела Из Иерархия Цикл 211 | 212 | СтрокиОписания.Добавить(СтрШаблон(Шаблоны.ШаблонСплиттерНачало, ДанныеРаздела.Ключ)); 213 | 214 | Для Каждого ДанныеПодсистемы Из ДанныеРаздела.Значение Цикл 215 | 216 | СтрокиОписания.Добавить(СтрШаблон(Шаблоны.ШаблонЗаголовокДляКонстант, ДанныеПодсистемы.Ключ)); 217 | СтрокиОписания.Добавить(Шаблоны.ШаблонШапкаТЧДляКонстант); 218 | 219 | Для Каждого Константа Из ДанныеПодсистемы.Значение Цикл 220 | Если Константа.Описание.Свойство("ru") Тогда 221 | Описание = Константа.Описание.ru; 222 | ИначеЕсли Константа.Описание.Свойство("en") Тогда 223 | Описание = Константа.Описание.en; 224 | Иначе 225 | Описание = Константа.Имя; 226 | КонецЕсли; 227 | СтрокиОписания.Добавить(СтрШаблон(Шаблоны.ШаблонСтрокаТЧДляКонстант, 228 | Константа.Имя, 229 | Константа.Тип, 230 | ОбработатьСтроку(Описание, СимволыЗамены))); 231 | 232 | КонецЦикла; 233 | 234 | СтрокиОписания.Добавить(Шаблоны.ШаблонПодвалТЧ); 235 | 236 | КонецЦикла; 237 | 238 | Если Шаблоны.ШаблонСплиттерКонец <> "" Тогда 239 | 240 | СтрокиОписания.Добавить(Шаблоны.ШаблонСплиттерКонец); 241 | 242 | КонецЕсли; 243 | 244 | КонецЦикла; 245 | 246 | Возврат СтрокиОписания; 247 | 248 | КонецФункции 249 | 250 | Функция ОбработатьСтроку(Знач ВходнаяСтрока, СимволыЗамены, ДляCDATA = Ложь) Экспорт 251 | 252 | 253 | Для Каждого СимволЗамены Из СимволыЗамены Цикл 254 | 255 | ВходнаяСтрока = СтрЗаменить(ВходнаяСтрока, СимволЗамены.Ключ, СимволЗамены.Значение); 256 | 257 | КонецЦикла; 258 | 259 | 260 | Если ПараметрыГенерации.ЭкранироватьКавычки Тогда 261 | 262 | Если НЕ ДляCDATA Тогда 263 | 264 | ВходнаяСтрока = СтрЗаменить(ВходнаяСтрока, """", """); 265 | 266 | КонецЕсли; 267 | 268 | КонецЕсли; 269 | 270 | Возврат ВходнаяСтрока; 271 | 272 | КонецФункции 273 | 274 | Процедура УстановитьПараметрыГенерации(НовыеПараметрыГенерации) Экспорт 275 | 276 | ПараметрыГенерации = Новый Структура("ЭкранироватьКавычки", Истина); 277 | 278 | Для каждого Элемент Из НовыеПараметрыГенерации Цикл 279 | 280 | ПараметрыГенерации.Вставить(Элемент.Ключ, Элемент.Значение); 281 | 282 | КонецЦикла; 283 | 284 | КонецПроцедуры 285 | 286 | УстановитьПараметрыГенерации(Новый Структура); 287 | -------------------------------------------------------------------------------- /src/Классы/ГенераторДокументации_JSON.os: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////// 2 | // 3 | // Служебный класс генерации документации в формате JSON 4 | // 5 | // (с) BIA Technologies, LLC 6 | // 7 | /////////////////////////////////////////////////////////////////////////////// 8 | 9 | Перем КаталогПубликацииДокументации; 10 | Перем АнализироватьТолькоПотомковПодсистемы Экспорт; 11 | 12 | /////////////////////////////////////////////////////////////////// 13 | // СТАНДАРТНЫЙ ИНТЕРФЕЙС 14 | /////////////////////////////////////////////////////////////////// 15 | 16 | #Область ГенерацияДанных 17 | 18 | // ДокументацияПоМодулю 19 | // 20 | // Параметры: 21 | // ДанныеМодуля - Структура - Описание модуля, структура содержащая массив описаний методов, см. ГенераторДокументации.ОписаниеМетода 22 | // Ошибки - Массив - Коллекция ошибок генерации документации, сюда помещаем информацию о возникших ошибках 23 | // 24 | // Возвращаемое значение: 25 | // Строка - Текст документации по модулю, если пустая строка, публикация не выполняется 26 | // 27 | Функция ДокументацияПоМодулю(ДанныеМодуля, Ошибки) Экспорт 28 | 29 | Если НЕ ДанныеМодуля.Методы.Количество() Тогда 30 | 31 | Возврат ""; 32 | 33 | КонецЕсли; 34 | 35 | Запись = НовыйЗаписьJSON(); 36 | 37 | Запись.ЗаписатьНачалоОбъекта(); 38 | 39 | ТекущийРаздел = Неопределено; 40 | 41 | Для Каждого ОписаниеМетода Из ДанныеМодуля.Методы Цикл 42 | 43 | Если ТекущийРаздел <> ОписаниеМетода.ИмяРаздела Тогда 44 | 45 | Если ТекущийРаздел <> Неопределено Тогда 46 | 47 | Запись.ЗаписатьКонецМассива(); 48 | 49 | КонецЕсли; 50 | 51 | ТекущийРаздел = ОписаниеМетода.ИмяРаздела; 52 | Запись.ЗаписатьИмяСвойства(ТекущийРаздел); 53 | Запись.ЗаписатьНачалоМассива(); 54 | 55 | КонецЕсли; 56 | 57 | ОписаниеПараметров = Новый Массив; 58 | 59 | Для Каждого Параметр Из ОписаниеМетода.ПараметрыМетода Цикл 60 | 61 | ОписаниеПараметра = Новый Структура; 62 | ОписаниеПараметра.Вставить("name", Параметр.Имя); 63 | ОписаниеПараметра.Вставить("required", НЕ ЗначениеЗаполнено(Параметр.ЗначениеПоУмолчанию)); 64 | ОписаниеПараметра.Вставить("type", Параметр.ТипПараметра); 65 | ОписаниеПараметра.Вставить("description", Параметр.ОписаниеПараметра); 66 | ОписаниеПараметра.Вставить("default", Параметр.ЗначениеПоУмолчанию); 67 | 68 | ОписаниеПараметров.Добавить(ОписаниеПараметра); 69 | 70 | КонецЦикла; 71 | 72 | ЭтоФункция = ОписаниеМетода.ТипБлока = ТипыБлоковМодуля.ЗаголовокФункции; 73 | Метод = Новый Структура; 74 | Метод.Вставить("name", ОписаниеМетода.ИмяМетода); 75 | Метод.Вставить("description", ОписаниеМетода.Описание); 76 | Метод.Вставить("type", ?(ЭтоФункция, "function", "procedure")); 77 | Метод.Вставить("public", ОписаниеМетода.Экспортный); 78 | 79 | Если ОписаниеПараметров.Количество() Тогда 80 | Метод.Вставить("parameters", ОписаниеПараметров); 81 | КонецЕсли; 82 | 83 | Если ЭтоФункция Тогда 84 | ОписаниеВозврат = Новый Структура; 85 | ОписаниеВозврат.Вставить("types", ОписаниеМетода.ТипВозвращаемогоЗначения); 86 | Метод.Вставить("return", ОписаниеВозврат); 87 | КонецЕсли; 88 | 89 | Если ОписаниеМетода.Примеры.Количество() Тогда 90 | Метод.Вставить("samples", ОписаниеМетода.Примеры); 91 | КонецЕсли; 92 | 93 | ЗаписатьJSON(Запись, Метод); 94 | 95 | КонецЦикла; 96 | 97 | Если ТекущийРаздел <> Неопределено Тогда 98 | Запись.ЗаписатьКонецМассива(); 99 | КонецЕсли; 100 | 101 | Запись.ЗаписатьКонецОбъекта(); 102 | 103 | Возврат Запись.Закрыть(); 104 | 105 | КонецФункции 106 | 107 | // ДокументацияКонстанты 108 | // 109 | // Параметры: 110 | // МассивКонстант - Массив - Массив структур описаний констант 111 | // Имя - Имя константы 112 | // Тип - Тип значения константы 113 | // Описание - Описание константы 114 | // Подсистема - Описание подсистем, которой принадлежит константа. см ГенераторДокументации.ПолучитьСтруктуруПодсистем 115 | // Ошибки - Массив - Коллекция ошибок генерации документации, сюда помещаем информацию о возникших ошибках 116 | // 117 | // Возвращаемое значение: 118 | // Строка - Текст документации по модулю, если пустая строка, публикация не выполняется 119 | // 120 | Функция ДокументацияКонстанты(МассивКонстант, Ошибки) Экспорт 121 | 122 | Данные = Новый Массив; 123 | Иерархия = ПомощникГенерацииДокументации.СобратьИерархиюПоПодсистемам(МассивКонстант); 124 | 125 | Для Каждого ДанныеРаздела Из Иерархия Цикл 126 | 127 | ОписаниеРаздела = Новый Структура("name, values", ДанныеРаздела.Ключ, Новый Массив()); 128 | Данные.Добавить(ОписаниеРаздела); 129 | 130 | Для Каждого ДанныеПодсистемы Из ДанныеРаздела.Значение Цикл 131 | 132 | ОписаниеПодсистемы = Новый Структура("name, values", ДанныеПодсистемы.Ключ, Новый Массив()); 133 | ОписаниеРаздела.values.Добавить(ОписаниеПодсистемы); 134 | 135 | Для Каждого Константа Из ДанныеПодсистемы.Значение Цикл 136 | 137 | ОписаниеПодсистемы.values.Добавить(Новый Структура("name, type, description", 138 | Константа.Имя, 139 | Константа.Тип, 140 | Константа.Описание)); 141 | 142 | КонецЦикла; 143 | 144 | КонецЦикла; 145 | 146 | КонецЦикла; 147 | 148 | Запись = НовыйЗаписьJSON(); 149 | ЗаписатьJSON(Запись, Данные); 150 | 151 | Возврат Запись.Закрыть(); 152 | 153 | КонецФункции 154 | 155 | #КонецОбласти 156 | 157 | #Область Публикация 158 | 159 | // ОпубликоватьРаздел 160 | // 161 | // Параметры: 162 | // Раздел - СтрокаТаблицыЗначений - Описание публикуемого раздела 163 | // * Имя - Имя страницы/раздела 164 | // * Родитель - Родитель страницы, ссылку на строку этой же таблицы 165 | // * Содержимое - Содержимое страницы 166 | // * Идентификатор - Служебное поле, можно использовать при публикации 167 | // ОбъектыРаздела - СтрокаТаблицыЗначений - Массив описаний объектов раздела 168 | // * Имя - Имя объекта 169 | // * Родитель - Родитель страницы, ссылку на строку этой же таблицы 170 | // * Содержимое - Содержимое страницы 171 | // * Идентификатор - Служебное поле, можно использовать при публикации 172 | // ОшибкиПубликации - Массив - Коллекция ошибок публикации документации, сюда помещаем информацию о возникших ошибках 173 | // 174 | // Возвращаемое значение: 175 | // Булево - Признак успешности 176 | // 177 | Функция ОпубликоватьРаздел(Раздел, ОбъектыРаздела, ОшибкиПубликации) Экспорт 178 | 179 | Если НЕ ПомощникГенерацииДокументации.ПроверкаВозможностиПубликацииВКаталог(КаталогПубликацииДокументации, Раздел, ОшибкиПубликации) Тогда 180 | Возврат Ложь; 181 | КонецЕсли; 182 | 183 | Каталог = ПомощникГенерацииДокументации.СоздатьКаталогРаздела(КаталогПубликацииДокументации, Раздел); 184 | 185 | Если Раздел <> Неопределено И НЕ ПустаяСтрока(Раздел.Содержимое) Тогда 186 | 187 | ИмяФайла = ОбъединитьПути(Каталог, "Description.json"); 188 | ОбщегоНазначения.ЗаписатьФайл(ИмяФайла, Раздел.Содержимое); 189 | 190 | КонецЕсли; 191 | 192 | Для Каждого Объект Из ОбъектыРаздела Цикл 193 | 194 | ИмяФайла = ОбъединитьПути(Каталог, Объект.Имя + ".json"); 195 | ОбщегоНазначения.ЗаписатьФайл(ИмяФайла, Объект.Содержимое); 196 | 197 | КонецЦикла; 198 | 199 | Возврат Истина; 200 | 201 | КонецФункции 202 | 203 | Функция ПрефиксИмени(ТипСтраницы) Экспорт 204 | 205 | Возврат ""; 206 | 207 | КонецФункции 208 | 209 | #КонецОбласти 210 | 211 | #Область Настройки 212 | 213 | // Производит чтение настроек из конфигурационного файла и сохраняет их в свойствах объекта 214 | // 215 | // Параметры: 216 | // НастройкиСтенда - Объект.НастройкиСтенда - Объект, содержащий информацию конфигурационного файла 217 | // 218 | // Возвращаемое значение: 219 | // Строка - описание возникших ошибок 220 | Функция ПрочитатьНастройки(НастройкиСтенда) Экспорт 221 | 222 | ТекстОшибки = ""; 223 | 224 | Настройки = НастройкиСтенда.Настройка("AutodocGen\НастройкиJSON"); 225 | Если ЗначениеЗаполнено(Настройки) Тогда 226 | 227 | КаталогПубликацииДокументации = Настройки["КаталогПубликации"]; 228 | АнализироватьТолькоПотомковПодсистемы = Строка(Настройки["АнализироватьТолькоПотомковПодсистемы"]); 229 | 230 | Если НЕ ЗначениеЗаполнено(КаталогПубликацииДокументации) Тогда 231 | 232 | ТекстОшибки = "Некорректные настройки каталога публикации"; 233 | 234 | КонецЕсли; 235 | 236 | Иначе 237 | 238 | ТекстОшибки = "Отсутствуют настройки"; 239 | 240 | КонецЕсли; 241 | 242 | Возврат ТекстОшибки; 243 | 244 | КонецФункции 245 | 246 | #КонецОбласти 247 | 248 | Функция НовыйЗаписьJSON() 249 | 250 | Запись = Новый ЗаписьJSON(); 251 | ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Unix); 252 | Запись.УстановитьСтроку(ПараметрыЗаписиJSON); 253 | 254 | Возврат Запись; 255 | 256 | КонецФункции -------------------------------------------------------------------------------- /src/additional/Шаблоны_conluence.json: -------------------------------------------------------------------------------- 1 | { 2 | "ШаблонСплиттерНачало": "%1", 3 | "ШаблонСплиттерКонец": "", 4 | "ШаблонЗаголовок": "

%1

", 5 | "ШаблонЗаголовокДляКонстант": "

%1

", 6 | "ШаблонШапкаТЧ": "", 7 | "ШаблонШапкаТЧДляКонстант": "
 ПараметрОбязательныйТипОписание
", 8 | "ШаблонСтрокаТЧ": "", 9 | "ШаблонСтрокаТЧДляКонстант": "", 10 | "ШаблонПодвалТЧ": "
КонстантаТипОписание
%1%2%3%4%5
%1%2%3
", 11 | "ШаблонВозврат": "

Возвращаемое значение

%1 - %2

", 12 | "ШаблонОписание": "

%1

", 13 | "ШаблонПример": "

Пример вызова

", 14 | "ШаблонСтраницыРаздела": "editBLOCK

Раздел - подсистема подчиненная подсистеме \"ПодсистемыБСП\" первого уровня. 

Наименование статьи должно совпадать с представлением раздела.  

Блок должен содержать краткое описание состава раздела 

 

%1

Подсистемы

   natural 

", 15 | "ШаблонСтраницыПодсистемы": " edit BLOCK

Наименование статьи должно совпадать с представлением подсистемы. Формат имени \"Подсистема Имя моей подсистемы\"  

 
 

 

 
 
edit BLOCK

В данном блоке размещается информация по изменениям связанная с выпуском новых релизов.

       
Релиз Вид изменения Краткое описание изменений
<N.N.N.NN> Изменение поведения
Новый функционал
Переименование
Оптимизация
Удаление
Добавлен функционал
Изменен алгоритм
Переименован метод
Удален объект

Пример заполнения таблицы:

           
Релиз Вид изменения Краткое описание изменений
БСП 1.2.3 Новый функционал Добавлена функция 1
Изменение поведения Добавлен параметр 2 функции 4
БСП 1.1.10 Изменение поведения Добавлен тип параметра 1 функции 5
 
 
Изменения в релизах        
Релиз Вид изменения Краткое описание изменений
  Новый функционал Создана подсистема
 
 
 
 

Назначение

edit BLOCK

Описание назначения подсистемы.

Описание отвечает на вопросы:

  • для чего предназначена;
  • какие вопросы решает;
  • область применения.
  •  
 
 

%1

 
 

Настройка

edit BLOCK

Пошаговое описание необходимых настроек подсистемы, в случае различий настройки в версиях, описание настроек сделать обособленными блоками для каждой версии платформы (в случае простой подсистемы):

  • интерактивные настройки
  • программные настройки
  • регламентные задания
  • и т.д.
  •  

Перечень ссылок на описание необходимых настроек дочерних подсистем (в случае сложной подсистемы):

  • <ссылка 1> - краткое описание ссылки
  • <ссылка 2> - краткое описание ссылки
  • ...
  •  
 
 

 

 
 

Использование

edit BLOCK

Данный раздел не редактируется. В нем автоматически отображаются подчиненные статьи с описанием программного интерфейса, пользовательских инструкций и т.д.

 
 

    2 natural  

 
 
 
" 16 | } -------------------------------------------------------------------------------- /src/Классы/НастройкиСтенда.os: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////// 2 | // 3 | // Работает с настройками в конфигурационном файле репозитория 1С 4 | // в Git 5 | // 6 | // (с) BIA Technologies, LLC 7 | // 8 | /////////////////////////////////////////////////////////////////// 9 | 10 | #Использовать json 11 | 12 | /////////////////////////////////////////////////////////////////// 13 | 14 | Перем ИнициализацияВыполнена; // содержит признак инициализации репозитория 15 | Перем НовыйКонфиг; // содержит признак нового конфига 16 | Перем Конфигурация; // описание конфигурации 17 | Перем АдресКонфигурационногоФайла; // адрес нахождения конфигурационного файла 18 | Перем ОбновлятьКонфигурацию; // флаг необходимости обновления конфигурации / затирания 19 | 20 | /////////////////////////////////////////////////////////////////// 21 | // Программный интерфейс 22 | /////////////////////////////////////////////////////////////////// 23 | 24 | // Инициализация 25 | // Выполняет инициализацию репозитория 26 | // 27 | // Параметры: 28 | // КонфигурационныйФайл - Строка - Путь до конфигурационного файла либо адрес каталога, 29 | // в котором находится конфигурационный файл v8config.json 30 | // ОбновлятьКонф - Булево - флаг необходимости обновления конфигурации / затирания 31 | // 32 | Процедура Инициализация(Знач КонфигурационныйФайл, ОбновлятьКонф = Ложь) Экспорт 33 | 34 | Конфигурация = Неопределено; 35 | ИнициализацияВыполнена = Ложь; 36 | 37 | Файл = Новый Файл(КонфигурационныйФайл); 38 | Если НЕ Файл.Существует() Тогда 39 | 40 | ВызватьИсключение "Конфигурационный файл / каталог '" + КонфигурационныйФайл + "' не обнаружен"; 41 | 42 | ИначеЕсли Файл.ЭтоКаталог() Тогда 43 | 44 | АдресКонфигурационногоФайла = ОбъединитьПути(КонфигурационныйФайл, "v8config.json"); 45 | 46 | Иначе 47 | 48 | АдресКонфигурационногоФайла = КонфигурационныйФайл; 49 | 50 | КонецЕсли; 51 | 52 | Файл = Новый Файл(АдресКонфигурационногоФайла); 53 | Если Файл.Существует() Тогда 54 | 55 | Чтение = Новый ЧтениеТекста(АдресКонфигурационногоФайла, "UTF-8"); 56 | ТекстКонфигурации = Чтение.Прочитать(); 57 | Чтение.Закрыть(); 58 | 59 | ПарсерJSON = Новый ПарсерJSON; 60 | Конфигурация = ПарсерJSON.ПрочитатьJSON(ТекстКонфигурации); 61 | 62 | Иначе 63 | 64 | НовыйКонфиг = Истина; 65 | Конфигурация = Новый Соответствие; 66 | 67 | КонецЕсли; 68 | 69 | ИнициализацияВыполнена = Истина; 70 | ОбновлятьКонфигурацию = ОбновлятьКонф; 71 | 72 | КонецПроцедуры // Инициализация() 73 | 74 | // ЭтоНовый 75 | // Возвращает признак нового конфига, т.е. отсутствие файла 76 | // 77 | // Возвращаемое значение: 78 | // Булево - Признак отсутствия файла 79 | // 80 | Функция ЭтоНовый() Экспорт 81 | 82 | Возврат НовыйКонфиг; 83 | 84 | КонецФункции // ЭтоНовый() 85 | 86 | // ГлобальныеНастройки 87 | // Возвращает набор глобальных настроек 88 | // 89 | // Возвращаемое значение: 90 | // Соответствие - Набор глобальных настроек при их наличии, если настроек нет то будет возвращено пустое соответствие 91 | // 92 | Функция ГлобальныеНастройки() Экспорт 93 | 94 | ПроверкаИнициализации(); 95 | 96 | Возврат НастройкиПриложения("GLOBAL"); 97 | 98 | КонецФункции // ГлобальныеНастройки() 99 | 100 | // НастройкиПриложения 101 | // Возвращает набор настроек для приложения 102 | // 103 | // Параметры: 104 | // ИмяПриложения - Строка - Имя приложения 105 | // 106 | // Возвращаемое значение: 107 | // Соответствие - Набор настроек при их наличии, если настроек нет то будет возвращено пустое соответствие 108 | // 109 | Функция НастройкиПриложения(ИмяПриложения) Экспорт 110 | 111 | ПроверкаИнициализации(); 112 | Если ПустаяСтрока(ИмяПриложения) Тогда 113 | 114 | ВызватьИсключение "Не указано имя приложения"; 115 | 116 | КонецЕсли; 117 | 118 | ИскомыеНастройки = Конфигурация.Получить(ИмяПриложения); 119 | Если ИскомыеНастройки = Неопределено Тогда 120 | 121 | ИскомыеНастройки = Новый Соответствие; 122 | 123 | КонецЕсли; 124 | 125 | Возврат ИскомыеНастройки; 126 | 127 | КонецФункции // НастройкиПриложения() 128 | 129 | // Настройка 130 | // Возвращает значение искомой настройки 131 | // 132 | // Параметры: 133 | // ИмяНастройки - Строка - Имя искомой настройки. Возможные форматы 134 | // - "МояНастройка" - для чтения глобальной настройки 135 | // - "МоеПриложение\МояНастройка" - для чтения настройки приложения 136 | // 137 | // Возвращаемое значение: 138 | // Произвольный - Значение настройки 139 | // 140 | Функция Настройка(ИмяНастройки)Экспорт 141 | 142 | ПроверкаИнициализации(); 143 | 144 | РазложенноеИмяНастройки = РазобратьИмяНастройки(ИмяНастройки); 145 | ИскомоеПриложение = НастройкиПриложения(РазложенноеИмяНастройки.ИмяПриложения); 146 | Возврат ИскомоеПриложение.Получить(РазложенноеИмяНастройки.ИмяНастройки); 147 | 148 | КонецФункции // Настройка(ИмяНастройки) 149 | 150 | // ЗаписатьНастройку 151 | // Записывает настройку в конфигурационный файл 152 | // 153 | // Параметры: 154 | // ИмяНастройки - Строка - Имя искомой настройки. Возможные форматы 155 | // - "МояНастройка" - для чтения глобальной настройки 156 | // - "МоеПриложение\МояНастройка" - для чтения настройки приложения 157 | // 158 | // Значение - Произвольный - Значение настройки, сериализуемое в JSON 159 | // 160 | Процедура ЗаписатьНастройку(ИмяНастройки, Значение) Экспорт 161 | 162 | ПроверкаИнициализации(); 163 | 164 | РазложенноеИмяНастройки = РазобратьИмяНастройки(ИмяНастройки); 165 | ИскомоеПриложение = НастройкиПриложения(РазложенноеИмяНастройки.ИмяПриложения); 166 | Если ОбновлятьКонфигурацию ИЛИ ИскомоеПриложение.Получить(РазложенноеИмяНастройки.ИмяНастройки) = Неопределено Тогда 167 | 168 | ИскомоеПриложение.Вставить(РазложенноеИмяНастройки.ИмяНастройки, Значение); 169 | 170 | КонецЕсли; 171 | Конфигурация.Вставить(РазложенноеИмяНастройки.ИмяПриложения, ИскомоеПриложение); 172 | 173 | ОбновитьКонфигурационныйФайл(); 174 | 175 | КонецПроцедуры // ЗаписатьНастройку(ИмяНастройки, Значение) 176 | 177 | // УдалитьНастройку 178 | // Удалить настройку в конфигурационный файл 179 | // 180 | // Параметры: 181 | // ИмяНастройки - Строка - Имя искомой настройки. Возможные форматы 182 | // - "МояНастройка" - для чтения глобальной настройки 183 | // - "МоеПриложение\МояНастройка" - для чтения настройки приложения 184 | // 185 | Процедура УдалитьНастройку(ИмяНастройки) Экспорт 186 | 187 | ПроверкаИнициализации(); 188 | 189 | РазложенноеИмяНастройки = РазобратьИмяНастройки(ИмяНастройки); 190 | ИскомоеПриложение = НастройкиПриложения(РазложенноеИмяНастройки.ИмяПриложения); 191 | 192 | Конфигурация.Удалить(РазложенноеИмяНастройки.ИмяПриложения, ИскомоеПриложение); 193 | 194 | ОбновитьКонфигурационныйФайл(); 195 | 196 | КонецПроцедуры // УдалитьНастройку() 197 | 198 | // ЗаписатьНастройкиПриложения 199 | // Записывает набор настроек приложения 200 | // 201 | // Параметры: 202 | // ИмяПриложения - Строка - Имя приложения 203 | // Значение - Соответствие - Набор настроек приложения 204 | // 205 | Процедура ЗаписатьНастройкиПриложения(ИмяПриложения, Значение) Экспорт 206 | 207 | ПроверкаИнициализации(); 208 | 209 | Если ПустаяСтрока(ИмяПриложения) Тогда 210 | 211 | ВызватьИсключение "Не указано имя приложения"; 212 | 213 | КонецЕсли; 214 | 215 | Если ТипЗнч(Значение) <> Тип("Соответствие") Тогда 216 | 217 | ВызватьИсключение "Тип значения должен быть Соответствие"; 218 | 219 | КонецЕсли; 220 | 221 | Конфигурация.Вставить(ИмяПриложения, Значение); 222 | 223 | ОбновитьКонфигурационныйФайл(); 224 | 225 | КонецПроцедуры // ЗаписатьНастройкиПриложения() 226 | 227 | // УдалитьНастройкиПриложения 228 | // Удалить набор настроек приложения 229 | // 230 | // Параметры: 231 | // ИмяПриложения - Строка - Имя приложения 232 | // 233 | Процедура УдалитьНастройкиПриложения(ИмяПриложения) Экспорт 234 | 235 | ПроверкаИнициализации(); 236 | 237 | Если ПустаяСтрока(ИмяПриложения) Тогда 238 | 239 | ВызватьИсключение "Не указано имя приложения"; 240 | 241 | КонецЕсли; 242 | 243 | Конфигурация.Удалить(ИмяПриложения); 244 | 245 | ОбновитьКонфигурационныйФайл(); 246 | 247 | КонецПроцедуры // УдалитьНастройкиПриложения() 248 | 249 | /////////////////////////////////////////////////////////////////// 250 | // Служебный функционал 251 | /////////////////////////////////////////////////////////////////// 252 | 253 | Процедура ПроверкаИнициализации() 254 | 255 | Если Не ИнициализацияВыполнена Тогда 256 | 257 | ВызватьИсключение "Необходимо выполнить инициализацию"; 258 | 259 | КонецЕсли; 260 | 261 | КонецПроцедуры 262 | 263 | Функция РазобратьИмяНастройки(Знач ИмяНастройки) 264 | 265 | Если ПустаяСтрока(ИмяНастройки) Тогда 266 | 267 | ВызватьИсключение "Не передано имя настройки"; 268 | 269 | КонецЕсли; 270 | 271 | ИмяПриложения = "GLOBAL"; 272 | ПозицияРазделителя = СтрНайти(ИмяНастройки, "\"); 273 | Если ПозицияРазделителя > 0 Тогда 274 | 275 | ИмяПриложения = Лев(ИмяНастройки, ПозицияРазделителя - 1); 276 | ИмяНастройки = Сред(ИмяНастройки, ПозицияРазделителя + 1); 277 | 278 | КонецЕсли; 279 | 280 | Возврат Новый Структура("ИмяПриложения, ИмяНастройки", ИмяПриложения, ИмяНастройки); 281 | 282 | КонецФункции // РазобратьИмяНастройки() 283 | 284 | Процедура ОбновитьКонфигурационныйФайл() 285 | 286 | ПарсерJSON = Новый ПарсерJSON; 287 | ТекстКонфигурации = ПарсерJSON.ЗаписатьJSON(Конфигурация); 288 | Запись = Новый ЗаписьТекста(АдресКонфигурационногоФайла, "UTF-8"); 289 | Запись.Записать(ТекстКонфигурации); 290 | Запись.Закрыть(); 291 | 292 | НовыйКонфиг = Ложь; 293 | 294 | КонецПроцедуры 295 | 296 | /////////////////////////////////////////////////////////////////// 297 | 298 | ИнициализацияВыполнена = Ложь; 299 | НовыйКонфиг = Ложь; 300 | Конфигурация = Неопределено; 301 | АдресКонфигурационногоФайла = ""; 302 | ОбновлятьКонфигурацию = Ложь; 303 | -------------------------------------------------------------------------------- /src/Модули/ОбщегоНазначения.os: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////////) 2 | // 3 | // Служебный модуль с методами общего назначения для приложения 4 | // 5 | /////////////////////////////////////////////////////////////////////////////// 6 | 7 | #Использовать tempfiles 8 | #Использовать 1commands 9 | #Использовать bsl-parser 10 | 11 | Процедура ПроверитьПараметрыКоманды(ПараметрыКоманды) Экспорт 12 | 13 | Ошибки = Новый Массив(); 14 | 15 | Если ПараметрыКоманды.Свойство("КаталогИсходныхФайлов") Тогда 16 | 17 | ПроверкаСуществующийКаталог(ПараметрыКоманды.КаталогИсходныхФайлов, Ошибки, "исходных файлов"); 18 | 19 | КонецЕсли; 20 | 21 | Если ПараметрыКоманды.Свойство("КаталогКонфигурации") Тогда 22 | 23 | ПроверкаСуществующийКаталог(ПараметрыКоманды.КаталогКонфигурации, Ошибки, "конфигурации"); 24 | 25 | КонецЕсли; 26 | 27 | Если ПараметрыКоманды.Свойство("ИсходныйФайл") Тогда 28 | 29 | ПроверкаСуществующийФайл(ПараметрыКоманды.ИсходныйФайл, Ошибки, ".bsl", "модуля"); 30 | 31 | КонецЕсли; 32 | 33 | Если ПараметрыКоманды.Свойство("КаталогДополнительнойДокументации") 34 | И НЕ ПустаяСтрока(ПараметрыКоманды.КаталогДополнительнойДокументации)Тогда 35 | 36 | Если ПараметрыКоманды.Формат <> "confluence" Тогда 37 | 38 | Ошибки.Добавить("Публикация ручной документации поддерживается только для Confluence"); 39 | 40 | Иначе 41 | 42 | ПроверкаСуществующийКаталог(ПараметрыКоманды.КаталогДополнительнойДокументации, Ошибки, "руководств"); 43 | 44 | КонецЕсли; 45 | 46 | КонецЕсли; 47 | 48 | ОбработатьМассивОшибок(Ошибки, "Не корректные входные параметры"); 49 | 50 | КонецПроцедуры 51 | 52 | Процедура ОбработатьМассивОшибок(Ошибки, Сообщение) 53 | 54 | Если Ошибки.Количество() Тогда 55 | 56 | Лог = МенеджерПриложения.ПолучитьЛог(); 57 | Лог.Ошибка(Сообщение); 58 | Лог.Ошибка(СтрСоединить(Ошибки, Символы.ПС)); 59 | 60 | ЗавершитьРаботу(1); 61 | 62 | КонецЕсли; 63 | 64 | КонецПроцедуры 65 | 66 | Функция ПроверкаСуществующийКаталог(Путь, Ошибки, Пояснение) 67 | 68 | Если НЕ ЗначениеЗаполнено(Путь) Тогда 69 | 70 | Ошибки.Добавить("Не указан каталог " + Пояснение); 71 | Возврат Ложь; 72 | 73 | КонецЕсли; 74 | 75 | Файл = Новый Файл(Путь); 76 | 77 | Если Не Файл.Существует() Тогда 78 | 79 | Ошибки.Добавить(СтрШаблон("Каталог %1 '%2' не существует", Пояснение, Путь)); 80 | Возврат Ложь; 81 | 82 | ИначеЕсли НЕ Файл.ЭтоКаталог() Тогда 83 | 84 | Ошибки.Добавить(СтрШаблон("Путь к каталогу %1 является файлом '%2'", Пояснение, Путь)); 85 | Возврат Ложь; 86 | 87 | Иначе 88 | 89 | Возврат Истина; 90 | 91 | КонецЕсли; 92 | 93 | КонецФункции 94 | 95 | Функция ПроверкаСуществующийФайл(Путь, Ошибки, Расширение, Пояснение) 96 | 97 | Если НЕ ЗначениеЗаполнено(Путь) Тогда 98 | 99 | Ошибки.Добавить("Не указан файл" + Пояснение); 100 | Возврат Ложь; 101 | 102 | КонецЕсли; 103 | 104 | Файл = Новый Файл(Путь); 105 | 106 | Если Не Файл.Существует() Тогда 107 | 108 | Ошибки.Добавить(СтрШаблон("Файл %1 '%2' не существует", Пояснение, Путь)); 109 | Возврат Ложь; 110 | 111 | ИначеЕсли Файл.ЭтоКаталог() Тогда 112 | 113 | Ошибки.Добавить(СтрШаблон("Путь к файлу %1 является каталогом '%2'", Пояснение, Путь)); 114 | Возврат Ложь; 115 | 116 | ИначеЕсли СтрСравнить(Файл.Расширение, Расширение) <> 0 Тогда 117 | 118 | Ошибки.Добавить(СтрШаблон("Файл %1 имеет не корректно расширение '%2'", Пояснение, Путь)); 119 | Возврат Ложь; 120 | 121 | Иначе 122 | 123 | Возврат Истина; 124 | 125 | КонецЕсли; 126 | 127 | КонецФункции 128 | 129 | Процедура ДополнитьПараметры(ПараметрыКоманды) Экспорт 130 | 131 | РаботаСКаталогом = ПараметрыКоманды.Свойство("КаталогИсходныхФайлов"); 132 | 133 | Если РаботаСКаталогом И НЕ ПараметрыКоманды.Свойство("КаталогКонфигурации") Тогда 134 | 135 | Если ПараметрыКоманды.ФорматEDT Тогда 136 | КаталогКонфигурации = ОбъединитьПути(ПараметрыКоманды.КаталогИсходныхФайлов, "configuration", "src"); 137 | Иначе 138 | КаталогКонфигурации = ОбъединитьПути(ПараметрыКоманды.КаталогИсходныхФайлов, "src", "configuration"); 139 | КонецЕсли; 140 | 141 | ПараметрыКоманды.Вставить("КаталогКонфигурации", КаталогКонфигурации); 142 | 143 | Ошибки = Новый Массив(); 144 | ПроверкаСуществующийКаталог(КаталогКонфигурации, Ошибки, "конфигурации"); 145 | ОбработатьМассивОшибок(Ошибки, "Не корректные входные параметры"); 146 | 147 | КонецЕсли; 148 | 149 | Если РаботаСКаталогом Тогда 150 | КаталогНастроек = ПараметрыКоманды.КаталогИсходныхФайлов; 151 | Иначе 152 | Файл = Новый Файл(ПараметрыКоманды.ИсходныйФайл); 153 | КаталогНастроек = Файл.Путь; 154 | КонецЕсли; 155 | 156 | НастройкиСтенда = ПрочитатьНастройкиСтенда(КаталогНастроек, ПараметрыКоманды.ФайлНастроек); 157 | НастройкиАнализаИзменений = ПрочитатьНастройкиАнализаИзменений( 158 | НастройкиСтенда, 159 | КаталогНастроек, 160 | ПараметрыКоманды.Свойство("РежимGit") И ПараметрыКоманды.РежимGit); 161 | 162 | ПараметрыКоманды.Вставить("НастройкиСтенда", НастройкиСтенда); 163 | ПараметрыКоманды.Вставить("НастройкиАнализаИзменений", НастройкиАнализаИзменений); 164 | 165 | КонецПроцедуры 166 | 167 | Функция ПрочитатьНастройкиСтенда(КаталогИсходныхФайлов, АдресКонфигурационногоФайла = Неопределено) Экспорт 168 | 169 | Если НЕ ЗначениеЗаполнено(АдресКонфигурационногоФайла) Тогда 170 | 171 | АдресКонфигурационногоФайла = КаталогИсходныхФайлов; 172 | 173 | КонецЕсли; 174 | 175 | НастройкиСтенда = Новый НастройкиСтенда(); 176 | НастройкиСтенда.Инициализация(АдресКонфигурационногоФайла); 177 | 178 | Если НастройкиСтенда.ЭтоНовый() Тогда 179 | 180 | МенеджерПриложения.ПолучитьЛог().Ошибка("Конфигурационный файл не обнаружен в каталоге '%1'", КаталогИсходныхФайлов); 181 | ЗавершитьРаботу(1); 182 | Возврат Неопределено; 183 | 184 | КонецЕсли; 185 | 186 | Возврат НастройкиСтенда; 187 | 188 | КонецФункции 189 | 190 | Функция ПрочитатьНастройкиАнализаИзменений(НастройкиСтенда, КаталогИсходныхФайлов, Анализировать = Неопределено) Экспорт 191 | 192 | НастройкиАнализаИзменений = Новый Структура(); 193 | НастройкиАнализаИзменений.Вставить("Анализировать", Анализировать); 194 | Если НастройкиАнализаИзменений.Анализировать = Неопределено Тогда 195 | 196 | НастройкиАнализаИзменений.Анализировать = Ложь; 197 | 198 | КонецЕсли; 199 | 200 | Если НЕ НастройкиАнализаИзменений.Анализировать Тогда 201 | 202 | Возврат НастройкиАнализаИзменений; 203 | 204 | КонецЕсли; 205 | 206 | ПоследняяВерсия = НастройкиСтенда.Настройка("AutodocGen\ПоследнийОбработанныйКоммит"); 207 | Если НЕ ЗначениеЗаполнено(ПоследняяВерсия) Тогда 208 | 209 | ПоследняяВерсия = ""; 210 | 211 | КонецЕсли; 212 | 213 | ФайлЛог = ВременныеФайлы.НовоеИмяФайла("log"); 214 | КомандаGit = Новый КомандныйФайл(); 215 | КомандаGit.ДобавитьКоманду(СтрШаблон("cd /d ""%1""", КаталогИсходныхФайлов)); 216 | КомандаGit.ДобавитьКоманду("git pull origin"); 217 | КомандаGit.ДобавитьКоманду(СтрШаблон( 218 | "git log %1 --pretty=short --name-only --no-merges --all -- *CommonModule/*/Module.txt* *CommonModules/*/Module.bsl* *Ext/ManagerModule.bsl* > ""%2"" ", 219 | ?(Не ПустаяСтрока(ПоследняяВерсия), ПоследняяВерсия + "..HEAD", "--after='2001-01-01'"), 220 | ФайлЛог)); 221 | 222 | КодВозврата = КомандаGit.Исполнить(); 223 | ВыводКоманды = КомандаGit.ПолучитьВывод(); 224 | 225 | Если КодВозврата <> 0 Тогда 226 | 227 | ТекстОшибки = СтрШаблон("Ошибка получения изменений: код ошибки %1%2Вывод%3", КодВозврата, Символы.ПС, ВыводКоманды); 228 | МенеджерПриложения.ПолучитьЛог().Ошибка(ТекстОшибки); 229 | ЗавершитьРаботу(1); 230 | Возврат Неопределено; 231 | 232 | КонецЕсли; 233 | 234 | СоставЛога = РазобратьФайлЛога(ФайлЛог, КаталогИсходныхФайлов); 235 | 236 | НастройкиАнализаИзменений.Вставить("ИзмененныеФайлы", СоставЛога.ИзмененныеФайлы); 237 | НастройкиАнализаИзменений.Вставить("ИдентификаторКоммита", СоставЛога.ИдентификаторКоммита); 238 | 239 | Возврат НастройкиАнализаИзменений; 240 | 241 | КонецФункции 242 | 243 | Функция ПолучитьГенераторДокументации(НастройкиСтенда, Формат = Неопределено) Экспорт 244 | 245 | Если НЕ ЗначениеЗаполнено(Формат) Тогда 246 | 247 | Формат = "confluence"; 248 | 249 | КонецЕсли; 250 | 251 | Попытка 252 | 253 | ГенераторДокументации = Новый ("ГенераторДокументации_" + Формат); 254 | 255 | Исключение 256 | 257 | ТекстОшибки = СтрШаблон("Ошибка создания объект генератора документации в формате '%1': %2", Формат, ОписаниеОшибки()); 258 | МенеджерПриложения.ПолучитьЛог().Ошибка(ТекстОшибки); 259 | ЗавершитьРаботу(1); 260 | 261 | Возврат Неопределено; 262 | 263 | КонецПопытки; 264 | 265 | ТекстОшибки = ГенераторДокументации.ПрочитатьНастройки(НастройкиСтенда); 266 | Если Не ПустаяСтрока(ТекстОшибки) Тогда 267 | 268 | ТекстОшибки = СтрШаблон("Ошибка чтения настроек генератора документации в формате '%1': %2", Формат, ТекстОшибки); 269 | МенеджерПриложения.ПолучитьЛог().Ошибка(ТекстОшибки); 270 | ЗавершитьРаботу(1); 271 | Возврат Неопределено; 272 | 273 | КонецЕсли; 274 | 275 | Возврат ГенераторДокументации; 276 | 277 | КонецФункции 278 | 279 | Функция ПолучитьПарсерКонфигурации(Знач ПарсерКонфигурации = Неопределено) Экспорт 280 | 281 | Если ПарсерКонфигурации = Неопределено Тогда 282 | 283 | ПарсерКонфигурации = Новый РазборСтруктурыКонфигурации1С; 284 | 285 | КонецЕсли; 286 | 287 | Возврат ПарсерКонфигурации; 288 | 289 | КонецФункции 290 | 291 | /////////////////////////////////////////////////////////////////////////////// 292 | 293 | Функция РазобратьФайлЛога(ИмяФайла, КаталогРепозитория) 294 | 295 | Файл = Новый ТекстовыйДокумент; 296 | Файл.Прочитать(ИмяФайла, "UTF-8"); 297 | КолСтрок = Файл.КоличествоСтрок(); 298 | 299 | ИдентификаторКоммита = ""; 300 | ИзмененныеФайлы = Новый Массив; 301 | 302 | Для Ит = 1 По КолСтрок Цикл 303 | 304 | СтрокаМодуля = Файл.ПолучитьСтроку(Ит); 305 | Если СтрНачинаетсяС(СтрокаМодуля, "commit") Тогда 306 | 307 | Если ПустаяСтрока(ИдентификаторКоммита) Тогда 308 | 309 | ИдентификаторКоммита = СокрЛП(Сред(СтрокаМодуля, СтрДлина("commit") + 1)); 310 | 311 | КонецЕсли; 312 | 313 | Продолжить; 314 | 315 | Иначе 316 | 317 | Попытка 318 | 319 | ФайлМодуля = Новый Файл(ОбъединитьПути(КаталогРепозитория, СтрокаМодуля)); 320 | 321 | Если ФайлМодуля.Существует() И НЕ ФайлМодуля.ЭтоКаталог() Тогда 322 | 323 | ИзмененныеФайлы.Добавить(НРег(ФайлМодуля.ПолноеИмя)); 324 | 325 | КонецЕсли; 326 | 327 | Исключение 328 | 329 | // это мусорные строки 330 | 331 | КонецПопытки; 332 | 333 | КонецЕсли; 334 | 335 | КонецЦикла; 336 | 337 | Возврат Новый Структура("ИзмененныеФайлы, ИдентификаторКоммита", ИзмененныеФайлы, ИдентификаторКоммита); 338 | 339 | КонецФункции 340 | 341 | Функция ПолноеИмяФайла(ИмяФайла) Экспорт 342 | 343 | Файл = Новый Файл(ИмяФайла); 344 | Возврат Файл.ПолноеИмя; 345 | 346 | КонецФункции 347 | 348 | 349 | Процедура ЗаписатьФайл(ИмяФайла, Содержимое) Экспорт 350 | 351 | Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8); 352 | Запись.Записать(Содержимое); 353 | Запись.Закрыть(); 354 | 355 | КонецПроцедуры 356 | 357 | Функция ОписаниеМодуля(ИмяФайла) Экспорт 358 | 359 | Модуль = Новый Структура(СтрСоединить(СтруктурыОписаний.РеквизитыМодуляКонфигурации(), ", ")); 360 | Модуль.ПутьКФайлу = ИмяФайла; 361 | Модуль.ТипМодуля = ТипыМодуля.ТипМодуляПоИмениФайла(Модуль.ПутьКФайлу); 362 | Модуль.Родитель = Новый Структура(СтрСоединить(СтруктурыОписаний.РеквизитыОписанияОбъектовКонфигурации(), ", ")); 363 | Модуль.Родитель.Наименование = "Модуль"; 364 | 365 | СодержимоеМодуля = ЧтениеМодулей.ПрочитатьМодуль(Модуль.ПутьКФайлу, Модуль); 366 | 367 | Модуль.Вставить("Содержимое", СодержимоеМодуля.Содержимое); 368 | Модуль.Вставить("НаборБлоков", СодержимоеМодуля.БлокиМодуля); 369 | 370 | Возврат Модуль; 371 | 372 | КонецФункции -------------------------------------------------------------------------------- /src/Классы/ГенераторДокументации_confluence.os: -------------------------------------------------------------------------------- 1 | /////////////////////////////////////////////////////////////////////////////// 2 | // 3 | // Служебный класс генерации документации в формате confluence 4 | // 5 | // (с) BIA Technologies, LLC 6 | // 7 | /////////////////////////////////////////////////////////////////////////////// 8 | 9 | #Использовать confluence 10 | 11 | Перем Шаблоны; 12 | 13 | Перем АнализироватьТолькоПотомковПодсистемы Экспорт; 14 | 15 | Перем ПодключениеConfluence; 16 | Перем ПространствоConflunece; 17 | Перем КорневаяСтраницаConflunece; 18 | 19 | Перем СимволыЗамены; 20 | Перем ОбновлятьИзмененныеСтраницы; 21 | 22 | Перем АдресКорневойСтраницы; 23 | 24 | Перем Лог; 25 | 26 | /////////////////////////////////////////////////////////////////////////////// 27 | // ПРОГРАММНЫЙ ИНТЕРФЕЙС 28 | /////////////////////////////////////////////////////////////////////////////// 29 | 30 | #Область ГенерацияДанных 31 | 32 | // ДокументацияПоМодулю 33 | // 34 | // Параметры: 35 | // ДанныеМодуля - Структура - Описание модуля, структура содержащая массив описаний методов, см. ГенераторДокументации.ОписаниеМетода 36 | // Ошибки - Массив - Коллекция ошибок генерации документации, сюда помещаем информацию о возникших ошибках 37 | // 38 | // Возвращаемое значение: 39 | // Строка - Текст документации по модулю, если пустая строка, публикация не выполняется 40 | // 41 | Функция ДокументацияПоМодулю(ДанныеМодуля, Ошибки) Экспорт 42 | 43 | Строки = ПомощникГенерацииДокументации.СформироватьОписаниеМодуляПоШаблонам(ДанныеМодуля, Шаблоны, СимволыЗамены); 44 | 45 | Возврат СтрСоединить(Строки, " "); 46 | 47 | КонецФункции 48 | 49 | // ДокументацияКонстанты 50 | // 51 | // Параметры: 52 | // МассивКонстант - Массив - Массив структур описаний констант 53 | // Имя - Имя константы 54 | // Тип - Тип значения константы 55 | // Описание - Описание константы 56 | // Подсистема - Описание подсистем, которой принадлежит константа. см ГенераторДокументации.ПолучитьСтруктуруПодсистем 57 | // Ошибки - Массив - Коллекция ошибок генерации документации, сюда помещаем информацию о возникших ошибках 58 | // 59 | // Возвращаемое значение: 60 | // Строка - Текст документации по модулю, если пустая строка, публикация не выполняется 61 | // 62 | Функция ДокументацияКонстанты(МассивКонстант, Ошибки) Экспорт 63 | 64 | Строки = ПомощникГенерацииДокументации.СформироватьОписаниеКонстантПоШаблонам(МассивКонстант, Шаблоны, СимволыЗамены); 65 | 66 | Возврат СтрСоединить(Строки, " "); 67 | 68 | КонецФункции 69 | 70 | #КонецОбласти 71 | 72 | #Область Публикация 73 | 74 | // ОпубликоватьРаздел 75 | // 76 | // Параметры: 77 | // Раздел - СтрокаТаблицыЗначений - Описание публикуемого раздела 78 | // * Имя - Имя страницы/раздела 79 | // * Родитель - Родитель страницы, ссылку на строку этой же таблицы 80 | // * Содержимое - Содержимое страницы 81 | // * Идентификатор - Служебное поле, можно использовать при публикации 82 | // ОбъектыРаздела - СтрокаТаблицыЗначений - Массив описаний объектов раздела 83 | // * Имя - Имя объекта 84 | // * Родитель - Родитель страницы, ссылку на строку этой же таблицы 85 | // * Содержимое - Содержимое страницы 86 | // * Идентификатор - Служебное поле, можно использовать при публикации 87 | // ОшибкиПубликации - Массив - Коллекция ошибок публикации документации, сюда помещаем информацию о возникших ошибках 88 | // 89 | // Возвращаемое значение: 90 | // Булево - Признак успешности 91 | // 92 | Функция ОпубликоватьРаздел(Раздел, ОбъектыРаздела, ОшибкиПубликации) Экспорт 93 | 94 | Лог.Отладка("================================================="); 95 | Лог.Отладка("Публикация раздела: %1", ?(Раздел = Неопределено, "Корневой раздел", Раздел.Имя)); 96 | 97 | Если НЕ ПроверкаВозможностиПубликации(Раздел, ОшибкиПубликации) Тогда 98 | 99 | Возврат Ложь; 100 | 101 | КонецЕсли; 102 | 103 | Успешно = Истина; 104 | 105 | АдресРаздела = СоздатьРаздел(Раздел, ОшибкиПубликации); 106 | 107 | Для Каждого НоваяСтраница Из ОбъектыРаздела Цикл 108 | 109 | Попытка 110 | 111 | Лог.Отладка("================================================="); 112 | Лог.Отладка("Публикация страницы: %1", НоваяСтраница.Имя); 113 | 114 | АдресСтраницы = АдресПодчиненнойСтраницы(АдресРаздела, НоваяСтраница.Имя); 115 | 116 | СоздатьОбновитьСтраницу( 117 | АдресСтраницы, 118 | НоваяСтраница.Содержимое 119 | ); 120 | 121 | Лог.Отладка("================================================="); 122 | 123 | Исключение 124 | 125 | ОшибкиПубликации.Добавить("Ошибка создания страницы '" + НоваяСтраница.Имя + "': " + ОписаниеОшибки()); 126 | Успешно = Ложь; 127 | Прервать; 128 | 129 | КонецПопытки; 130 | 131 | КонецЦикла; 132 | 133 | Лог.Отладка("Изменения раздела опубликованы: %1", ?(Раздел = Неопределено, "Корневой раздел", Раздел.Имя)); 134 | Лог.Отладка("================================================="); 135 | Возврат Успешно; 136 | 137 | КонецФункции 138 | 139 | Функция ПолучитьСтруктуруДляПубликацииКаталога(РезультатГенерации, Каталог, Родитель, ТолькоКаталоги = Ложь) Экспорт 140 | 141 | ЕстьПодчиненные = Ложь; 142 | 143 | Для Каждого Файл Из НайтиФайлы(Каталог, "*", Ложь) Цикл 144 | 145 | Если Файл.ЭтоКаталог() Тогда 146 | 147 | СтруктураПоиска = Новый Структура("Имя, Родитель", Файл.Имя, Родитель); 148 | 149 | СуществующиеРазделы = РезультатГенерации.СоздаваемыеРазделы.НайтиСтроки(СтруктураПоиска); 150 | 151 | Если СуществующиеРазделы.Количество() Тогда 152 | 153 | СтрокаРаздел = СуществующиеРазделы[0]; 154 | 155 | Иначе 156 | 157 | СтрокаРаздел = РезультатГенерации.СоздаваемыеРазделы.Добавить(); 158 | СтрокаРаздел.Имя = Файл.Имя; 159 | СтрокаРаздел.Тип = "РазделРуководства"; 160 | СтрокаРаздел.Родитель = Родитель; 161 | 162 | КонецЕсли; 163 | 164 | Если ПолучитьСтруктуруДляПубликацииКаталога(РезультатГенерации, Файл.ПолноеИмя, СтрокаРаздел) Тогда 165 | 166 | ЕстьПодчиненные = Истина; 167 | 168 | ИначеЕсли СуществующиеРазделы.Количество() = 0 Тогда // Пустой созданный раздел удалим 169 | 170 | РезультатГенерации.СоздаваемыеРазделы.Удалить(СтрокаРаздел); 171 | 172 | КонецЕсли; 173 | 174 | ИначеЕсли ТолькоКаталоги Тогда 175 | 176 | Продолжить; 177 | 178 | ИначеЕсли СтрСравнить(Файл.Расширение, ".html") = 0 Тогда 179 | 180 | СтрокаСтраницы = РезультатГенерации.СозданныеОбъекты.Добавить(); 181 | 182 | СтрокаСтраницы.Имя = Файл.ИмяБезРасширения; 183 | СтрокаСтраницы.Тип = "Руководство"; 184 | СтрокаСтраницы.Родитель = Родитель; 185 | СтрокаСтраницы.Содержимое = ТекстФайла(Файл.ПолноеИмя); 186 | 187 | ЕстьПодчиненные = Истина; 188 | 189 | ИначеЕсли СтрСравнить(Файл.Расширение, ".md") = 0 ИЛИ СтрСравнить(Файл.Расширение, ".markdown") = 0 Тогда 190 | 191 | СтрокаСтраницы = РезультатГенерации.СозданныеОбъекты.Добавить(); 192 | 193 | СтрокаСтраницы.Имя = Файл.ИмяБезРасширения; 194 | СтрокаСтраницы.Тип = "Руководство"; 195 | СтрокаСтраницы.Родитель = Родитель; 196 | СтрокаСтраницы.Содержимое = Новый Структура("Формат, ИмяФайла"); 197 | СтрокаСтраницы.Содержимое.Формат = confluence.ФорматыСодержимого.MarkDown; 198 | СтрокаСтраницы.Содержимое.ИмяФайла = Файл.ПолноеИмя; 199 | 200 | ЕстьПодчиненные = Истина; 201 | 202 | Иначе 203 | 204 | Лог.Информация("Файл %1 пропущен, его публикация не поддерживается", Файл.ПолноеИмя); 205 | 206 | КонецЕсли; 207 | 208 | КонецЦикла; 209 | 210 | Возврат ЕстьПодчиненные; 211 | 212 | КонецФункции 213 | 214 | // ПолучитьСтруктуруОпубликованныхСтраниц 215 | // 216 | // Параметры: 217 | // Раздел - СтрокаТаблицыЗначений, Строка - Описание создаваемого раздела или идентификатор страницы 218 | // 219 | // Возвращаемое значение: 220 | // ТаблицаЗначений - Подчиненные страницы (Наименование, Представление) 221 | // 222 | Функция ПолучитьСтруктуруОпубликованныхСтраниц(Раздел) Экспорт 223 | 224 | Результат = Новый Структура("Ошибки", Новый Массив()); 225 | 226 | Если НЕ ПроверкаВозможностиПубликации(Неопределено, Результат.Ошибки) Тогда 227 | 228 | Возврат Результат; 229 | 230 | КонецЕсли; 231 | 232 | Если ТипЗнч(Раздел) = Тип("Строка") Тогда 233 | 234 | Идентификатор = Раздел; 235 | 236 | Иначе 237 | 238 | Идентификатор = АдресРаздела(Раздел).Идентификатор; 239 | 240 | КонецЕсли; 241 | 242 | Страницы = Confluence.ПодчиненныеСтраницыПоИдентификатору(ПодключениеConfluence, Идентификатор); 243 | 244 | Страницы.Колонки.Добавить("Представление"); 245 | 246 | Для Каждого Страница Из Страницы Цикл 247 | 248 | Страница.Представление = СтрШаблон("'%1' (%2)", Страница.Наименование, Страница.Идентификатор); 249 | 250 | КонецЦикла; 251 | 252 | Возврат Страницы; 253 | 254 | КонецФункции 255 | 256 | // ПрефиксИмени 257 | // 258 | // Параметры: 259 | // ТипСтраницы - Строка - Тип источника документации 260 | // 261 | // Возвращаемое значение: 262 | // Строка - Префикс имени объекта (страницы) 263 | // 264 | Функция ПрефиксИмени(ТипСтраницы) Экспорт 265 | 266 | Если ТипСтраницы = "Модуль" Тогда 267 | 268 | Возврат "Программный интерфейс: "; 269 | 270 | ИначеЕсли ТипСтраницы = "Руководство" Тогда 271 | 272 | Возврат "Руководство: "; 273 | 274 | ИначеЕсли ТипСтраницы = "Подсистема" Тогда 275 | 276 | Возврат "Подсистема "; 277 | 278 | Иначе 279 | 280 | Возврат ""; 281 | 282 | КонецЕсли; 283 | 284 | КонецФункции 285 | 286 | // УдалитьСтраницу 287 | // 288 | // Параметры: 289 | // Страница - СтрокаТаблицыЗначений - Описание страницы полученное из ПолучитьСтруктуруОпубликованныхСтраниц 290 | // 291 | // Возвращаемое значение: 292 | // Булево - Признак успешности 293 | // 294 | Функция УдалитьСтраницу(Страница) Экспорт 295 | 296 | Confluence.УдалитьСтраницу(ПодключениеConfluence, ПространствоConflunece, Страница.Наименование, Страница.Идентификатор, Истина); 297 | 298 | Возврат Истина; 299 | 300 | КонецФункции 301 | 302 | #КонецОбласти 303 | 304 | #Область Настройки 305 | 306 | // Производит чтение настроек из конфигурационного файла и сохраняет их в свойствах объекта 307 | // 308 | // Параметры: 309 | // НастройкиСтенда - Объект.НастройкиСтенда - Объект, содержащий информацию конфигурационного файла 310 | // 311 | // Возвращаемое значение: 312 | // Строка - описание возникших ошибок 313 | Функция ПрочитатьНастройки(НастройкиСтенда) Экспорт 314 | 315 | ТекстОшибки = ""; 316 | 317 | НастройкиConfluence = НастройкиСтенда.Настройка("AutodocGen\НастройкиConluence"); 318 | Если ЗначениеЗаполнено(НастройкиConfluence) Тогда 319 | 320 | Попытка 321 | 322 | ПодключениеConfluence = confluence.ОписаниеПодключения(НастройкиConfluence["АдресСервера"], НастройкиConfluence["Пользователь"], НастройкиConfluence["Пароль"]); 323 | ПространствоConflunece = НастройкиConfluence["Пространство"]; 324 | КорневаяСтраницаConflunece = НастройкиConfluence["КорневаяСтраница"]; 325 | АнализироватьТолькоПотомковПодсистемы = Строка(НастройкиConfluence["АнализироватьТолькоПотомковПодсистемы"]); 326 | 327 | Если НЕ (ЗначениеЗаполнено(ПространствоConflunece) И ЗначениеЗаполнено(КорневаяСтраницаConflunece)) Тогда 328 | 329 | ВызватьИсключение "Некорректные настройки пространства и корневой страницы confluence"; 330 | 331 | КонецЕсли; 332 | 333 | Шаблоны = ПомощникГенерацииДокументации.ЗагрузитьШаблоны(НастройкиConfluence["ПутьКШаблонам"], "Шаблоны_conluence.json"); 334 | 335 | Исключение 336 | 337 | ТекстОшибки = "Ошибка установки соединения с сервером confluence: " + ОписаниеОшибки(); 338 | 339 | КонецПопытки; 340 | 341 | Иначе 342 | 343 | ТекстОшибки = "Отсутствуют настройки подключения к confluence"; 344 | 345 | КонецЕсли; 346 | 347 | Возврат ТекстОшибки; 348 | 349 | КонецФункции 350 | 351 | #КонецОбласти 352 | 353 | #Область Служебные 354 | 355 | Функция ПроверкаВозможностиПубликации(Раздел, ОшибкиПубликации) 356 | 357 | Если АдресКорневойСтраницы = Неопределено Тогда 358 | 359 | Идентификатор = Confluence.НайтиСтраницуПоИмени(ПодключениеConfluence, ПространствоConflunece, КорневаяСтраницаConflunece); 360 | 361 | АдресКорневойСтраницы = confluence.АдресСтраницы(ПространствоConflunece, КорневаяСтраницаConflunece, Идентификатор); 362 | 363 | КонецЕсли; 364 | 365 | Если ПустаяСтрока(АдресКорневойСтраницы.Идентификатор) Тогда 366 | 367 | ОшибкиПубликации.Добавить("В пространстве отсутствует корневая страница документации '" + КорневаяСтраницаConflunece + "'"); 368 | Возврат Ложь; 369 | 370 | КонецЕсли; 371 | 372 | Если Раздел <> Неопределено И СоздатьРаздел(Раздел, ОшибкиПубликации) = Неопределено Тогда 373 | 374 | Возврат Ложь; 375 | 376 | КонецЕсли; 377 | 378 | Возврат Истина; 379 | 380 | КонецФункции 381 | 382 | Функция СоздатьРаздел(Раздел, ОшибкиПубликации) 383 | 384 | Если Раздел <> Неопределено 385 | И Раздел.Родитель <> Неопределено 386 | И НЕ ЗначениеЗаполнено(Раздел.Родитель.Идентификатор) Тогда 387 | 388 | ОшибкиПубликации.Добавить("Создание страницы подсистемы '" + Раздел.Имя + "' невозможно, т.к. не создана страница раздела"); 389 | Возврат Неопределено; 390 | 391 | КонецЕсли; 392 | 393 | АдресРаздела = АдресРаздела(Раздел); 394 | 395 | Если НЕ ЗначениеЗаполнено(АдресРаздела.Идентификатор) Тогда 396 | 397 | Попытка 398 | 399 | НайтиСоздатьРаздел(АдресРаздела, ОписаниеРаздела(Раздел), ОшибкиПубликации); 400 | Раздел.Идентификатор = АдресРаздела; 401 | 402 | Исключение 403 | 404 | ОшибкиПубликации.Добавить("Ошибка создания страницы '" + Раздел.Имя + "': " + ОписаниеОшибки()); 405 | 406 | Возврат Неопределено; 407 | 408 | КонецПопытки; 409 | 410 | КонецЕсли; 411 | 412 | Возврат АдресРаздела; 413 | 414 | КонецФункции 415 | 416 | Функция АдресРаздела(Раздел) 417 | 418 | Адрес = Неопределено; 419 | 420 | Если Раздел = Неопределено Тогда 421 | 422 | Адрес = АдресКорневойСтраницы; 423 | 424 | ИначеЕсли НЕ ЗначениеЗаполнено(Раздел.Идентификатор) Тогда 425 | 426 | Если Раздел.Родитель = Неопределено Тогда 427 | 428 | Адрес = АдресПодчиненнойСтраницы(АдресКорневойСтраницы, Раздел.Имя); 429 | 430 | Иначе 431 | 432 | Адрес = АдресПодчиненнойСтраницы(Раздел.Родитель.Идентификатор, Раздел.Имя); 433 | 434 | КонецЕсли; 435 | 436 | Раздел.Идентификатор = Адрес; 437 | 438 | Иначе 439 | 440 | Адрес = Раздел.Идентификатор; 441 | 442 | КонецЕсли; 443 | 444 | Возврат Адрес; 445 | 446 | КонецФункции 447 | 448 | Функция НайтиСоздатьРаздел(АдресРаздела, Содержимое, Ошибки) 449 | 450 | Если НЕ ПустаяСтрока(АдресРаздела.Идентификатор) Тогда 451 | 452 | Возврат АдресРаздела.Идентификатор; 453 | 454 | КонецЕсли; 455 | 456 | АдресРаздела.Идентификатор = Confluence.НайтиСтраницуПоИмени( 457 | ПодключениеConfluence, 458 | АдресРаздела.КодПространства, 459 | АдресРаздела.ИмяСтраницы); 460 | 461 | Если НЕ ПустаяСтрока(АдресРаздела.Идентификатор) Тогда 462 | 463 | Возврат АдресРаздела.Идентификатор; 464 | 465 | КонецЕсли; 466 | 467 | Попытка 468 | 469 | Confluence.Создать( 470 | ПодключениеConfluence, 471 | АдресРаздела, 472 | Содержимое); 473 | 474 | Лог.Информация("Создан раздел '%1'", АдресРаздела.ИмяСтраницы); 475 | 476 | Исключение 477 | 478 | Ошибки.Добавить("Ошибка создания страницы '" + АдресРаздела.ИмяСтраницы + "': " + ОписаниеОшибки()); 479 | Возврат Неопределено; 480 | 481 | КонецПопытки; 482 | 483 | Возврат АдресРаздела.Идентификатор; 484 | 485 | КонецФункции 486 | 487 | Функция СоздатьОбновитьСтраницу(Знач Адрес, Знач Содержимое) 488 | 489 | Если ПустаяСтрока(Адрес.ИдентификаторРодителя) Тогда 490 | 491 | ВызватьИсключение СтрШаблон("Для страницы '%1' не указан родитель", Адрес.ИмяСтраницы); 492 | 493 | КонецЕсли; 494 | 495 | РезультатСоздания = Confluence.СоздатьИлиОбновить( 496 | ПодключениеConfluence, 497 | Адрес, 498 | Содержимое, 499 | ОбновлятьИзмененныеСтраницы); 500 | 501 | 502 | Если РезультатСоздания.Действие = "Создание" Тогда 503 | Лог.Информация("Создана страница '%1' (%3.%2)", Адрес.ИмяСтраницы, Адрес.Идентификатор, Адрес.ИдентификаторРодителя); 504 | ИначеЕсли РезультатСоздания.Действие = "Обновление" Тогда 505 | Лог.Информация("Обновлена страница '%1'", Адрес.ИмяСтраницы); 506 | КонецЕсли; 507 | 508 | Возврат РезультатСоздания; 509 | 510 | КонецФункции 511 | 512 | Функция АдресПодчиненнойСтраницы(АдресРодителя, ИмяСтраницы) 513 | 514 | АдресСтраницы = confluence.АдресСтраницы(АдресРодителя.КодПространства, ИмяСтраницы, , АдресРодителя.Идентификатор); 515 | 516 | Возврат АдресСтраницы; 517 | 518 | КонецФункции 519 | 520 | Функция ТекстФайла(ИмяФайла) 521 | 522 | Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8); 523 | Содержимое = Чтение.Прочитать(); 524 | Чтение.Закрыть(); 525 | 526 | Возврат Содержимое; 527 | 528 | КонецФункции 529 | 530 | Функция ОписаниеРаздела(Раздел) 531 | 532 | Если Раздел = Неопределено Тогда 533 | Описание = ""; 534 | Иначе 535 | Описание = ПомощникГенерацииДокументации.ОбработатьСтроку(Раздел.Содержимое, СимволыЗамены); 536 | КонецЕсли; 537 | 538 | Если Раздел = Неопределено ИЛИ Раздел.Родитель = Неопределено Тогда 539 | Возврат СтрШаблон(Шаблоны.ШаблонСтраницыРаздела, Описание); 540 | Иначе 541 | Возврат СтрШаблон(Шаблоны.ШаблонСтраницыПодсистемы, Описание); 542 | КонецЕсли; 543 | 544 | КонецФункции 545 | 546 | #КонецОбласти 547 | 548 | /////////////////////////////////////////////////////////////////// 549 | 550 | СимволыЗамены = Новый Соответствие; 551 | СимволыЗамены.Вставить("&", "&"); 552 | СимволыЗамены.Вставить("<", "<"); 553 | СимволыЗамены.Вставить(">", ">"); 554 | СимволыЗамены.Вставить(Символ(8211), "–"); 555 | СимволыЗамены.Вставить(Символ(8212), "—"); 556 | СимволыЗамены.Вставить(Символы.Таб, " "); 557 | 558 | ОбновлятьИзмененныеСтраницы = Истина; // в параметры выносить не будем... пока 559 | 560 | Лог = МенеджерПриложения.ПолучитьЛог(); -------------------------------------------------------------------------------- /src/Классы/ГенераторДокументации.os: -------------------------------------------------------------------------------- 1 | Перем КаталогПубликацииДокументации; 2 | Перем АнализироватьТолькоПотомковПодсистемы; 3 | 4 | Перем ГенераторСодержимого; 5 | Перем СозданныеОбъекты; 6 | Перем СоздаваемыеРазделы; 7 | 8 | // Генератор документации - формирует данные для формирования документации 9 | // Управляет потоком генерации 10 | // Генераторы содержимого - шаблонизаторы, формируют тексты документации на основании подготовленных данных 11 | 12 | #Область ПрограммныйИнтерфейс 13 | 14 | // Сгенерировать 15 | // Генерирует структуру документации и проверяет на валидность в процессе генерации 16 | // 17 | // Параметры: 18 | // НастройкиГенератора - Структура - набор параметров, собранных в результате разбора конфигурации 19 | // * Парсер 20 | // * ОписаниеКонфигурации 21 | // * Модули 22 | // * ПодсистемыКонфигурации 23 | // * НастройкиАнализаИзменений 24 | // 25 | // Возвращаемое значение: 26 | // Структура - описание структуры сформированной документации 27 | // * Ошибки - строка - обязательное поле, содержащее описание полученных ошибок 28 | Функция Сгенерировать(НастройкиГенератора) Экспорт 29 | 30 | // Сначала документация формируются локально, таким образом достигается целостность документации. 31 | // Если во время формирования одного из блоков документации возникла ошибка вся операция прерывается 32 | // Предварительно сформированные данные держаться в памяти 33 | 34 | Результат = ПодготовитьДанныеПубликации(НастройкиГенератора, Ложь); 35 | 36 | Возврат Результат; 37 | 38 | КонецФункции 39 | 40 | // СгенерироватьПоФайлу 41 | // Генерирует документацию по модулю 42 | // 43 | // Параметры: 44 | // НастройкиГенератора - Структура - набор параметров, собранных в результате разбора конфигурации 45 | // * ОписаниеМодуля 46 | // * НастройкиАнализаИзменений 47 | // 48 | // Возвращаемое значение: 49 | // Структура - описание структуры сформированной документации 50 | // * Ошибки - строка - обязательное поле, содержащее описание полученных ошибок 51 | Функция СгенерироватьПоФайлу(НастройкиГенератора) Экспорт 52 | 53 | Результат = СтруктураРезультатГенерации(); 54 | 55 | Модуль = НастройкиГенератора.ОписаниеМодуля; 56 | 57 | Раздел = СоздаваемыеРазделы.Добавить(); 58 | Раздел.Имя = "autodoc"; 59 | 60 | Если НЕ ПроверитьМодуль(Модуль, Результат.Ошибки, Ложь) Тогда 61 | 62 | Возврат Результат; 63 | 64 | КонецЕсли; 65 | 66 | ДанныеМодуля = ДанныеМодуля(Модуль, Результат.Ошибки); 67 | 68 | Если Результат.Ошибки.Количество() Тогда 69 | 70 | Возврат Результат; 71 | 72 | ИначеЕсли ДанныеМодуля <> Неопределено Тогда 73 | 74 | Содержимое = ДокументацияПоМодулю(ДанныеМодуля, Результат.Ошибки); 75 | 76 | Если НЕ ПустаяСтрока(Содержимое) Тогда 77 | 78 | СтрокаОписания = Результат.СозданныеОбъекты.Добавить(); 79 | СтрокаОписания.Содержимое = Содержимое; 80 | СтрокаОписания.Имя = ЧтениеОписанийБазовый.ПолноеИмяОбъекта(Модуль, Ложь); 81 | СтрокаОписания.Родитель = Раздел; 82 | СтрокаОписания.Тип = "Модуль"; 83 | 84 | КонецЕсли; 85 | 86 | КонецЕсли; 87 | 88 | Результат.Успешно = Результат.Ошибки.Количество() = 0; 89 | 90 | Возврат Результат; 91 | 92 | КонецФункции 93 | 94 | // ПроверитьИсходники 95 | // Выполняет проверку описаний исходных файлов 96 | // Параметры: 97 | // НастройкиГенератора - Структура - набор параметров, собранных в результате разбора конфигурации 98 | // * Парсер 99 | // * ОписаниеКонфигурации 100 | // * Модули 101 | // * ПодсистемыКонфигурации 102 | // * НастройкиАнализаИзменений 103 | // 104 | // Возвращаемое значение: 105 | // Строка - описание полученных ошибок 106 | // 107 | Функция ПроверитьИсходники(НастройкиГенератора) Экспорт 108 | 109 | Результат = СтруктураРезультатГенерации(); 110 | 111 | Модули = НастройкиГенератора.Парсер.ОписаниеКонфигурации().Модули; 112 | 113 | // Формирование данных для генерации доки по модулям 114 | Для Каждого Модуль Из Модули Цикл 115 | 116 | Если НЕ ОбрабатываемФайл(НастройкиГенератора, Модуль.ПутьКФайлу, Модуль) Тогда 117 | 118 | Продолжить; 119 | 120 | КонецЕсли; 121 | 122 | НастройкиГенератора.Парсер.ПрочитатьСодержимоеМодуля(Модуль); 123 | 124 | ПроверитьМодуль(Модуль, Результат.Ошибки); 125 | 126 | ДанныеМодуля(Модуль, Результат.Ошибки); 127 | 128 | КонецЦикла; 129 | 130 | // Формирование доки по константам 131 | Константы = ДанныеКонстант(НастройкиГенератора, Результат.Ошибки); 132 | 133 | Возврат СтрСоединить(Результат.Ошибки, Символы.ПС); 134 | 135 | КонецФункции 136 | 137 | // ПроверитьИсходники 138 | // Выполняет проверку описания модуля 139 | // Параметры: 140 | // НастройкиГенератора - Структура - набор параметров, собранных в результате разбора конфигурации 141 | // * ОписаниеМодуля 142 | // * НастройкиАнализаИзменений 143 | // 144 | // Возвращаемое значение: 145 | // Строка - описание полученных ошибок 146 | // 147 | Функция ПроверитьФайл(НастройкиГенератора) Экспорт 148 | 149 | Результат = СтруктураРезультатГенерации(); 150 | 151 | Модуль = НастройкиГенератора.ОписаниеМодуля; 152 | 153 | ПроверитьМодуль(Модуль, Результат.Ошибки, Ложь); 154 | 155 | ДанныеМодуля(Модуль, Результат.Ошибки); 156 | 157 | Возврат СтрСоединить(Результат.Ошибки, Символы.ПС); 158 | 159 | КонецФункции 160 | 161 | #КонецОбласти 162 | 163 | #Область ГенерацияДанных 164 | 165 | Функция ДанныеМодуля(Модуль, Ошибки) 166 | 167 | Данные = Новый Структура("Методы, Имя", Новый Массив, ЧтениеОписанийБазовый.ПолноеИмяОбъекта(Модуль, Ложь)); 168 | 169 | Для Каждого Блок Из Модуль.НаборБлоков Цикл 170 | 171 | Если Блок.ТипБлока <> ТипыБлоковМодуля.ЗаголовокПроцедуры 172 | И Блок.ТипБлока <> ТипыБлоковМодуля.ЗаголовокФункции Тогда 173 | 174 | Продолжить; 175 | 176 | КонецЕсли; 177 | 178 | ОписаниеМетода = ОписаниеМетода(Блок); 179 | 180 | ОшибкиМетода = ПроверитьМетод(ОписаниеМетода); 181 | 182 | Если ПустаяСтрока(ОшибкиМетода) Тогда 183 | 184 | Данные.Методы.Добавить(ОписаниеМетода); 185 | 186 | Иначе 187 | 188 | Ошибки.Добавить(Модуль.ПутьКФайлу + ": " + ОшибкиМетода); 189 | 190 | КонецЕсли; 191 | 192 | КонецЦикла; 193 | 194 | Возврат Данные; 195 | 196 | КонецФункции 197 | 198 | Функция ДанныеКонстант(НастройкиГенератора, Ошибки) 199 | 200 | Константы = Новый Массив; 201 | 202 | Для Каждого Константа Из НастройкиГенератора.Парсер.ОписаниеКонфигурации().НайтиОбъектыПоТипу("Константы") Цикл 203 | 204 | ЧтениеКонфигурации.ПрочитатьОписание(Константа); 205 | 206 | ОписаниеКонстанты = Новый Структура("Имя, Тип, Описание, Подсистема"); 207 | 208 | ОписаниеКонстанты.Имя = Константа.Описание.Наименование; 209 | ОписаниеКонстанты.Тип = Константа.Описание.Тип; 210 | ОписаниеКонстанты.Описание = Константа.Описание.Пояснение; 211 | 212 | Подсистема = ПолучитьСтруктуруПодсистем(Константа.Подсистемы); 213 | 214 | ОписаниеКонстанты.Подсистема = Подсистема; 215 | 216 | Константы.Добавить(ОписаниеКонстанты); 217 | 218 | Если ПустаяСтрока(ОписаниеКонстанты.Описание) Тогда 219 | 220 | Ошибки.Добавить(ОписаниеКонстанты.Имя + ": Описание константы не заполнено."); 221 | 222 | КонецЕсли; 223 | 224 | Если ПустаяСтрока(ОписаниеКонстанты.Подсистема) Тогда 225 | 226 | Ошибки.Добавить(ОписаниеКонстанты.Имя + ": Константа не включена ни в одну подсистему."); 227 | 228 | КонецЕсли; 229 | 230 | КонецЦикла; 231 | 232 | Возврат Константы; 233 | 234 | КонецФункции 235 | 236 | #КонецОбласти //ГенерацияДанных 237 | 238 | #Область Шаблонизатор 239 | 240 | // ДокументацияПоМодулю 241 | // 242 | // Параметры: 243 | // ДанныеМодуля - Структура - Описание модуля, структура содержащая массив описаний методов, см. ГенераторДокументации.ОписаниеМетода 244 | // Ошибки - Массив - Коллекция ошибок генерации документации, сюда помещаем информацию о возникших ошибках 245 | // 246 | // Возвращаемое значение: 247 | // Строка - Текст документации по модулю, если пустая строка, публикация не выполняется 248 | // 249 | Функция ДокументацияПоМодулю(ДанныеМодуля, Ошибки) 250 | 251 | Содержимое = ГенераторСодержимого.ДокументацияПоМодулю(ДанныеМодуля, Ошибки); 252 | 253 | Возврат Содержимое; 254 | 255 | КонецФункции 256 | 257 | // ДокументацияКонстанты 258 | // 259 | // Параметры: 260 | // ОписаниеКонстант - Массив - Массив структур описаний констант 261 | // Имя - Имя константы 262 | // Тип - Тип значения константы 263 | // Описание - Описание константы 264 | // Подсистема - Описание подсистем, которой принадлежит константа. см ГенераторДокументации.ПолучитьСтруктуруПодсистем 265 | // Ошибки - Массив - Коллекция ошибок генерации документации, сюда помещаем информацию о возникших ошибках 266 | // 267 | // Возвращаемое значение: 268 | // Строка - Текст документации по модулю, если пустая строка, публикация не выполняется 269 | // 270 | Функция ДокументацияКонстанты(ОписаниеКонстант, Ошибки) 271 | 272 | Содержимое = ГенераторСодержимого.ДокументацияКонстанты(ОписаниеКонстант, Ошибки); 273 | 274 | Возврат Содержимое; 275 | 276 | КонецФункции 277 | 278 | #КонецОбласти // Шаблонизатор 279 | 280 | #Область Публикация 281 | 282 | // Опубликовать 283 | // 284 | // Параметры: 285 | // РезультатГенерации - Структура - Результат функции Сгенерировать 286 | // 287 | // Возвращаемое значение: 288 | // Структура - Результат публикации 289 | // * ОшибкиПубликации - Массив - коллекция возникших ошибок 290 | // 291 | Функция Опубликовать(РезультатГенерации) Экспорт 292 | 293 | Ошибки = Новый Массив; 294 | 295 | Успешно = Истина; 296 | 297 | СкорректироватьИменаСтраниц(РезультатГенерации); 298 | 299 | Для Каждого Раздел Из РезультатГенерации.СоздаваемыеРазделы Цикл 300 | 301 | ОбъектыРаздела = РезультатГенерации.СозданныеОбъекты.НайтиСтроки(Новый Структура("Родитель", Раздел)); 302 | 303 | Если Успешно И НЕ ГенераторСодержимого.ОпубликоватьРаздел(Раздел, ОбъектыРаздела, Ошибки) Тогда 304 | 305 | Прервать; 306 | 307 | КонецЕсли; 308 | 309 | КонецЦикла; 310 | 311 | Если Успешно Тогда 312 | 313 | ОбъектыРаздела = РезультатГенерации.СозданныеОбъекты.НайтиСтроки(Новый Структура("Родитель", Неопределено)); 314 | 315 | ГенераторСодержимого.ОпубликоватьРаздел(Неопределено, ОбъектыРаздела, Ошибки); 316 | 317 | КонецЕсли; 318 | 319 | Возврат Новый Структура("ОшибкиПубликации", Ошибки); 320 | 321 | КонецФункции 322 | 323 | Функция ПроверитьОпубликованнуюДокументацию(НастройкиГенератора) Экспорт 324 | 325 | Результат = ПодготовитьДанныеПубликации(НастройкиГенератора, Истина); 326 | 327 | Если НЕ Результат.Успешно Тогда 328 | 329 | Возврат Результат; 330 | 331 | КонецЕсли; 332 | 333 | СоздаваемыеРазделы = Результат.СоздаваемыеРазделы; 334 | СоздаваемыеСтраницы = Результат.СозданныеОбъекты; 335 | 336 | СкорректироватьИменаСтраниц(Результат); 337 | 338 | СтраницыКорень = ГенераторСодержимого.ПолучитьСтруктуруОпубликованныхСтраниц(Неопределено); 339 | 340 | УдаляемыеСтраницы = Новый Массив(); 341 | 342 | Результат.Вставить("УдаляемыеСтраницы", УдаляемыеСтраницы); 343 | 344 | Результат.Вставить("Сообщения", Новый Массив()); 345 | 346 | ПубликуемыеТипы = Новый Массив(); 347 | ПубликуемыеТипы.Добавить("Модуль"); 348 | ПубликуемыеТипы.Добавить("Константа"); 349 | 350 | Если НЕ ПустаяСтрока(НастройкиГенератора.КаталогРуководства) Тогда 351 | 352 | ПубликуемыеТипы.Добавить("Руководство"); 353 | 354 | КонецЕсли; 355 | 356 | Для Каждого ИмеющийсяРаздел Из СтраницыКорень Цикл 357 | 358 | Если ИмеющийсяРаздел.Наименование = "Константы" Тогда 359 | 360 | Продолжить; 361 | 362 | КонецЕсли; 363 | 364 | НайденныйРаздел = СоздаваемыеРазделы.Найти(ИмеющийсяРаздел.Наименование, "Имя"); 365 | 366 | Если НайденныйРаздел = Неопределено Тогда 367 | 368 | Результат.Сообщения.Добавить("Нужно удалить раздел " + ИмеющийсяРаздел.Представление + " и все подчиненные"); 369 | 370 | УдаляемыеСтраницы.Добавить(ИмеющийсяРаздел); 371 | 372 | Иначе 373 | 374 | СтраницыРаздела = ГенераторСодержимого.ПолучитьСтруктуруОпубликованныхСтраниц(ИмеющийсяРаздел.Идентификатор); 375 | 376 | Для Каждого ИмеющаясяПодсистема Из СтраницыРаздела Цикл 377 | 378 | УдалитьПодсистему = Ложь; 379 | СтруктураПоиска = Новый Структура("Родитель, Имя", НайденныйРаздел, ИмеющаясяПодсистема.Наименование); 380 | НайденныеПодсистемыРаздела = СоздаваемыеРазделы.НайтиСтроки(СтруктураПоиска); 381 | ДочерниеСтраницыПодсистемы = Неопределено; 382 | 383 | Если НайденныеПодсистемыРаздела.Количество() <> 1 Тогда 384 | 385 | ДочерниеСтраницыПодсистемы = ГенераторСодержимого.ПолучитьСтруктуруОпубликованныхСтраниц(ИмеющаясяПодсистема.Идентификатор); 386 | 387 | УдалитьПодсистему = Истина; 388 | Для Каждого ИмеющаясяСтраница Из ДочерниеСтраницыПодсистемы Цикл 389 | 390 | // TODO: Проверка наименования работает только для confluence 391 | // При расширении на другие форматы необходимо доработать 392 | Если НЕ ЭтоПрограммноСформированнаяСтраница(ИмеющаясяСтраница.Наименование, ПубликуемыеТипы) Тогда 393 | 394 | УдалитьПодсистему = Ложь; 395 | Прервать; 396 | 397 | КонецЕсли; 398 | 399 | КонецЦикла; 400 | 401 | УдалитьПодсистему = УдалитьПодсистему И СоздаваемыеСтраницы.НайтиСтроки(СтруктураПоиска).Количество() = 0; 402 | 403 | Если УдалитьПодсистему Тогда 404 | 405 | Результат.Сообщения.Добавить("Нужно удалить подсистему " + ИмеющаясяПодсистема.Представление + " и все подчиненные"); 406 | УдаляемыеСтраницы.Добавить(ИмеющаясяПодсистема); 407 | Продолжить; 408 | 409 | КонецЕсли; 410 | 411 | НайденнаяСтраница = СоздаваемыеСтраницы.НайтиСтроки(СтруктураПоиска); 412 | 413 | КонецЕсли; 414 | 415 | Если ДочерниеСтраницыПодсистемы = Неопределено Тогда 416 | 417 | ДочерниеСтраницыПодсистемы = ГенераторСодержимого.ПолучитьСтруктуруОпубликованныхСтраниц(ИмеющаясяПодсистема.Идентификатор); 418 | 419 | КонецЕсли; 420 | 421 | Если НайденныеПодсистемыРаздела.Количество() Тогда 422 | Подсистема = НайденныеПодсистемыРаздела[0]; 423 | Иначе 424 | Подсистема = Неопределено; 425 | КонецЕсли; 426 | 427 | Для Каждого ИмеющаясяСтраница Из ДочерниеСтраницыПодсистемы Цикл 428 | 429 | Если Подсистема <> Неопределено Тогда 430 | 431 | СтруктураПоиска = Новый Структура("Родитель, Имя", Подсистема, ИмеющаясяСтраница.Наименование); 432 | НайденныеСтраницыПодсистемы = СоздаваемыеСтраницы.НайтиСтроки(СтруктураПоиска); 433 | 434 | Иначе 435 | 436 | НайденныеСтраницыПодсистемы = Новый Массив; 437 | 438 | КонецЕсли; 439 | 440 | Если НайденныеСтраницыПодсистемы.Количество() <> 1 Тогда 441 | 442 | Если ЭтоПрограммноСформированнаяСтраница(ИмеющаясяСтраница.Наименование, ПубликуемыеТипы) Тогда 443 | 444 | Результат.Сообщения.Добавить("Нужно удалить страницу " + ИмеющаясяСтраница.Представление); 445 | 446 | УдаляемыеСтраницы.Добавить(ИмеющаясяСтраница); 447 | 448 | КонецЕсли; 449 | 450 | КонецЕсли; 451 | 452 | КонецЦикла; 453 | 454 | КонецЦикла; 455 | 456 | КонецЕсли; 457 | 458 | КонецЦикла; 459 | 460 | Результат.Успешно = Результат.Ошибки.Количество() = 0; 461 | 462 | Возврат Результат; 463 | 464 | КонецФункции 465 | 466 | #КонецОбласти 467 | 468 | #Область Служебные 469 | 470 | Процедура СкорректироватьИменаСтраниц(РезультатГенерации) 471 | 472 | Для каждого Строка Из РезультатГенерации.СозданныеОбъекты Цикл 473 | 474 | Строка.Имя = ГенераторСодержимого.ПрефиксИмени(Строка.Тип) + Строка.Имя; 475 | 476 | КонецЦикла; 477 | 478 | Для каждого Строка Из РезультатГенерации.СоздаваемыеРазделы Цикл 479 | 480 | Строка.Имя = ГенераторСодержимого.ПрефиксИмени(Строка.Тип) + Строка.Имя; 481 | 482 | КонецЦикла; 483 | 484 | КонецПроцедуры 485 | 486 | Функция ЭтоПрограммноСформированнаяСтраница(ИмяСтарицы, ТипыСтраниц) 487 | 488 | Для Каждого Тип Из ТипыСтраниц Цикл 489 | 490 | ПрефиксИмени = ГенераторСодержимого.ПрефиксИмени(Тип); 491 | 492 | Если НЕ ПустаяСтрока(ПрефиксИмени) И СтрНачинаетсяС(ИмяСтарицы, ПрефиксИмени) Тогда 493 | 494 | Возврат Истина; 495 | 496 | КонецЕсли; 497 | 498 | КонецЦикла; 499 | 500 | Возврат Ложь; 501 | 502 | КонецФункции 503 | 504 | Функция ПодготовитьДанныеПубликации(НастройкиГенератора, ТолькоСтруктура) 505 | 506 | Результат = СтруктураРезультатГенерации(); 507 | 508 | // Формирование данных для генерации доки по модулям 509 | Для Каждого Модуль Из НастройкиГенератора.Парсер.ОписаниеКонфигурации().Модули Цикл 510 | 511 | Если НЕ ОбрабатываемФайл(НастройкиГенератора, Модуль.ПутьКФайлу, Модуль) Тогда 512 | 513 | Продолжить; 514 | 515 | КонецЕсли; 516 | 517 | Если ТолькоСтруктура Тогда 518 | 519 | СтрокаОписания = Результат.СозданныеОбъекты.Добавить(); 520 | СтрокаОписания.Имя = ЧтениеОписанийБазовый.ПолноеИмяОбъекта(Модуль, Ложь); 521 | СтрокаОписания.Родитель = Раздел(Модуль, ""); 522 | СтрокаОписания.Тип = "Модуль"; 523 | 524 | Иначе 525 | 526 | Если Модуль.Содержимое = Неопределено Тогда 527 | 528 | НастройкиГенератора.Парсер.ПрочитатьСодержимоеМодуля(Модуль); 529 | 530 | КонецЕсли; 531 | 532 | Если НЕ ОбработатьМодуль(Модуль, НастройкиГенератора, Результат) Тогда 533 | 534 | Возврат Результат; 535 | 536 | КонецЕсли; 537 | 538 | КонецЕсли; 539 | 540 | КонецЦикла; 541 | 542 | // Формирование доки по константам 543 | СтрокаОписания = СозданныеОбъекты.Добавить(); 544 | 545 | Если НЕ ТолькоСтруктура Тогда 546 | Константы = ДанныеКонстант(НастройкиГенератора, Результат.Ошибки); 547 | СтрокаОписания.Содержимое = ДокументацияКонстанты(Константы, Результат.Ошибки); 548 | КонецЕсли; 549 | 550 | СтрокаОписания.Имя = "Константы"; 551 | СтрокаОписания.Родитель = Неопределено; 552 | СтрокаОписания.Тип = "Константа"; 553 | 554 | Если ЗначениеЗаполнено(НастройкиГенератора.КаталогРуководства) Тогда 555 | 556 | ГенераторСодержимого.ПолучитьСтруктуруДляПубликацииКаталога(Результат, НастройкиГенератора.КаталогРуководства, Неопределено, Истина); 557 | 558 | КонецЕсли; 559 | 560 | Результат.Успешно = Результат.Ошибки.Количество() = 0; 561 | 562 | Возврат Результат; 563 | 564 | КонецФункции 565 | 566 | Функция ОбработатьМодуль(Модуль, НастройкиГенератора, Результат) 567 | 568 | Если НЕ ПроверитьМодуль(Модуль, Результат.Ошибки) Тогда 569 | 570 | Возврат Ложь; 571 | 572 | КонецЕсли; 573 | 574 | ДанныеМодуля = ДанныеМодуля(Модуль, Результат.Ошибки); 575 | 576 | Если Результат.Ошибки.Количество() Тогда 577 | 578 | Возврат Ложь; 579 | 580 | ИначеЕсли ДанныеМодуля <> Неопределено Тогда 581 | 582 | ТекстОшибки = Неопределено; 583 | 584 | Раздел = Раздел(Модуль, ТекстОшибки); 585 | 586 | Если НЕ ПустаяСтрока(ТекстОшибки) Тогда 587 | 588 | Результат.Ошибки.Добавить(Модуль.ПутьКФайлу + ": " + ТекстОшибки); 589 | Возврат Ложь; 590 | 591 | КонецЕсли; 592 | 593 | Содержимое = ДокументацияПоМодулю(ДанныеМодуля, Результат.Ошибки); 594 | 595 | Если НЕ ПустаяСтрока(Содержимое) Тогда 596 | 597 | СтрокаОписания = Результат.СозданныеОбъекты.Добавить(); 598 | СтрокаОписания.Содержимое = Содержимое; 599 | СтрокаОписания.Имя = ЧтениеОписанийБазовый.ПолноеИмяОбъекта(Модуль, Ложь); 600 | СтрокаОписания.Родитель = Раздел; 601 | СтрокаОписания.Тип = "Модуль"; 602 | 603 | КонецЕсли; 604 | 605 | КонецЕсли; 606 | 607 | Возврат Истина; 608 | 609 | КонецФункции 610 | 611 | Функция СтруктураРезультатГенерации() 612 | 613 | СозданныеОбъекты = Новый ТаблицаЗначений; 614 | СозданныеОбъекты.Колонки.Добавить("Имя"); // Имя страницы/раздела 615 | СозданныеОбъекты.Колонки.Добавить("Тип"); // Тип источника документации 616 | СозданныеОбъекты.Колонки.Добавить("Родитель"); // Родитель страницы, ссылку на строку этой же таблицы 617 | СозданныеОбъекты.Колонки.Добавить("Содержимое"); // Содержимое страницы 618 | СозданныеОбъекты.Колонки.Добавить("Идентификатор"); // Служебное поле, можно использовать при публикации 619 | 620 | СоздаваемыеРазделы = СозданныеОбъекты.Скопировать(); 621 | 622 | Ошибки = Новый Массив(); 623 | 624 | Результат = Новый Структура; 625 | Результат.Вставить("СозданныеОбъекты", СозданныеОбъекты); 626 | Результат.Вставить("СоздаваемыеРазделы", СоздаваемыеРазделы); 627 | Результат.Вставить("Ошибки", Новый Массив()); 628 | Результат.Вставить("Успешно", Ложь); 629 | 630 | Возврат Результат; 631 | 632 | КонецФункции 633 | 634 | Функция ПроверитьМодуль(Модуль, Ошибки, ЭтоМодульКонфигурации = Истина) Экспорт 635 | 636 | Если ЭтоМодульКонфигурации И НЕ ПроверитьПодсистемыМодуля(Модуль, Ошибки) Тогда 637 | 638 | Возврат Ложь; 639 | 640 | КонецЕсли; 641 | 642 | ТекстОшибки = ПроверитьРазделыМодуля(Модуль); 643 | 644 | Если НЕ ПустаяСтрока(ТекстОшибки) Тогда 645 | 646 | Ошибки.Добавить(Модуль.ПутьКФайлу + ": " + ТекстОшибки); 647 | Возврат Ложь; 648 | 649 | КонецЕсли; 650 | 651 | Возврат Истина; 652 | 653 | КонецФункции 654 | 655 | Функция ПроверитьПодсистемыМодуля(Модуль, Ошибки) 656 | 657 | Если Модуль.Родитель.Подсистемы = Неопределено Тогда 658 | 659 | Ошибки.Добавить(Модуль.ПутьКФайлу + ": не включен в состав подсистем"); 660 | Возврат Ложь; 661 | 662 | КонецЕсли; 663 | 664 | СтруктураПодсистем = ПолучитьСтруктуруПодсистем(Модуль.Родитель.Подсистемы); 665 | 666 | Если ПустаяСтрока(СтруктураПодсистем.ИмяРаздела) Тогда 667 | 668 | Ошибки.Добавить(Модуль.ПутьКФайлу + ": ошибочная структура подсистем"); 669 | Возврат Ложь; 670 | 671 | КонецЕсли; 672 | 673 | Возврат Истина; 674 | 675 | КонецФункции 676 | 677 | Функция ПроверитьРазделыМодуля(Модуль) 678 | 679 | Разделы = ОбязательныеРазделыМодуля(Модуль); 680 | 681 | Ошибки = Новый Массив(); 682 | 683 | Если Модуль.НаборБлоков.Количество() 684 | И Модуль.ОписаниеМодуля.Разделы.Количество() <> Разделы.Количество() Тогда 685 | 686 | // TODO: Проверить, когда указаны не корректные имена разделов, но количество совпадает 687 | Для Каждого ТекРаздел Из Разделы Цикл 688 | 689 | Если Модуль.ОписаниеМодуля.Разделы.Найти(ТекРаздел) = Неопределено Тогда 690 | 691 | Ошибки.Добавить(" - отсутствует раздел " + ТекРаздел); 692 | 693 | КонецЕсли; 694 | 695 | КонецЦикла; 696 | 697 | Если Ошибки.Количество() Тогда 698 | 699 | ТекстОшибок = "В структуре модуля неполный состав разделов: " + СтрСоединить(Ошибки); 700 | 701 | Иначе 702 | 703 | ТекстОшибок = "В структуре модуля присутсвуют дубли разделов"; 704 | 705 | КонецЕсли; 706 | 707 | КонецЕсли; 708 | 709 | Возврат ""; 710 | 711 | КонецФункции 712 | 713 | Функция ПроверитьМетод(ОписаниеМетода) 714 | 715 | Если ПустаяСтрока(ОписаниеМетода.ИмяРаздела) Тогда 716 | 717 | Возврат СтрШаблон("Метод '%1' находится вне раздела", ОписаниеМетода.ИмяМетода); 718 | 719 | КонецЕсли; 720 | 721 | ОжидаемЭкспортныйМетод = ОписаниеМетода.ИмяРаздела = ТипыОбласти.РазделПрограммныйИнтерфейс 722 | ИЛИ ОписаниеМетода.ИмяРаздела = ТипыОбласти.РазделСлужебныйПрограммныйИнтерфейс; 723 | 724 | Если НЕ ОписаниеМетода.Экспортный И ОжидаемЭкспортныйМетод Тогда 725 | 726 | Возврат СтрШаблон("В разделе %1 находится неэкспортный метод '%2'", ОписаниеМетода.ИмяРаздела, ОписаниеМетода.ИмяМетода); 727 | 728 | КонецЕсли; 729 | 730 | Если ОписаниеМетода.ИмяРаздела = ТипыОбласти.РазделПрограммныйИнтерфейс Тогда 731 | 732 | Возврат ПроверитьОписаниеМетодаAPI(ОписаниеМетода); 733 | 734 | Иначе 735 | 736 | Возврат Неопределено; 737 | 738 | КонецЕсли; 739 | 740 | КонецФункции 741 | 742 | Функция ПроверитьОписаниеМетодаAPI(ОписаниеМетода) 743 | 744 | Ошибки = Новый Массив(); 745 | 746 | Если НЕ ЗначениеЗаполнено(ОписаниеМетода.Описание) Тогда 747 | 748 | Ошибки.Добавить(СтрШаблон("У метода '%1' не заполнено описание", ОписаниеМетода.ИмяМетода)); 749 | 750 | КонецЕсли; 751 | 752 | Возврат СтрСоединить(Ошибки, Символы.ПС); 753 | 754 | КонецФункции 755 | 756 | Функция ОписаниеМетода(Блок) 757 | 758 | Описание = Новый Структура; 759 | Описание.Вставить("ТипБлока", Блок.ТипБлока); 760 | Описание.Вставить("ИмяРаздела", Блок.ОписаниеБлока.ИмяРаздела); 761 | Описание.Вставить("ИмяОбласти", Блок.ОписаниеБлока.ИмяОбласти); 762 | Описание.Вставить("Экспортный", Блок.ОписаниеБлока.Экспортный); 763 | Описание.Вставить("ИмяМетода", Блок.ОписаниеБлока.ИмяМетода); 764 | Описание.Вставить("Описание", Блок.ОписаниеБлока.Назначение); 765 | Описание.Вставить("ПараметрыМетода", Блок.ОписаниеБлока.ПараметрыМетода); 766 | Описание.Вставить("ТипВозвращаемогоЗначения", Блок.ОписаниеБлока.ТипВозвращаемогоЗначения); 767 | Описание.Вставить("Примеры", Блок.ОписаниеБлока.Примеры); 768 | 769 | Возврат Описание; 770 | 771 | КонецФункции 772 | 773 | Функция ОбязательныеРазделыМодуля(Модуль) 774 | 775 | НужныеРазделы = Новый Массив(); 776 | 777 | Если Модуль.ТипМодуля = ТипыМодуля.ОбщийМодуль Тогда 778 | 779 | НужныеРазделы = ТипыОбласти.РазделыОбщегоМодуля; 780 | 781 | ИначеЕсли Модуль.ТипМодуля = ТипыМодуля.МодульМенеджера Тогда 782 | 783 | НужныеРазделы = ТипыОбласти.РазделыМодуляМенеджера; 784 | 785 | КонецЕсли; 786 | 787 | Возврат НужныеРазделы; 788 | 789 | КонецФункции 790 | 791 | Функция Раздел(Модуль, ТекстОшибки) 792 | 793 | СтруктураПодсистем = ПолучитьСтруктуруПодсистем(Модуль.Родитель.Подсистемы); 794 | Если ПустаяСтрока(СтруктураПодсистем.ИмяРаздела) Тогда 795 | 796 | ТекстОшибки = "Ошибочная структура подсистем"; 797 | Возврат Неопределено; 798 | 799 | КонецЕсли; 800 | 801 | Раздел = СоздаваемыеРазделы.Найти(СтруктураПодсистем.ИмяРаздела, "Имя"); 802 | Если Раздел = Неопределено Тогда 803 | 804 | Раздел = СоздаваемыеРазделы.Добавить(); 805 | Раздел.Имя = СтруктураПодсистем.ИмяРаздела; 806 | Раздел.Содержимое = СтруктураПодсистем.ОписаниеРаздела; 807 | Раздел.Тип = "Раздел"; 808 | 809 | КонецЕсли; 810 | 811 | ИмяПодсистемы = СтруктураПодсистем.ИмяПодсистемы; 812 | Если СтруктураПодсистем.ИмяПодсистемы = "Общего назначения" Тогда 813 | 814 | ИмяПодсистемы = ИмяПодсистемы + " (" + НРег(СтруктураПодсистем.ИмяРаздела) + ")"; 815 | 816 | КонецЕсли; 817 | 818 | Подсистема = СоздаваемыеРазделы.Найти(ИмяПодсистемы, "Имя"); 819 | 820 | Если Подсистема = Неопределено Тогда 821 | 822 | Подсистема = СоздаваемыеРазделы.Добавить(); 823 | Подсистема.Имя = ИмяПодсистемы; 824 | Подсистема.Содержимое = СтруктураПодсистем.ОписаниеПодсистемы; 825 | Подсистема.Родитель = Раздел; 826 | Подсистема.Тип = "Подсистема"; 827 | 828 | КонецЕсли; 829 | 830 | Возврат Подсистема; 831 | 832 | КонецФункции 833 | 834 | Функция ОбрабатываемФайл(НастройкиГенератора, ИмяФайла, Модуль) 835 | 836 | Если Модуль.ТипМодуля <> ТипыМодуля.ОбщийМодуль 837 | И Модуль.ТипМодуля <> ТипыМодуля.МодульМенеджера Тогда 838 | 839 | // Реализован анализ только для общих модулей и модулей менеджеров 840 | // остальные пропускаем 841 | Возврат Ложь; 842 | 843 | КонецЕсли; 844 | 845 | Если Модуль.Родитель <> Неопределено И Модуль.Родитель.Тип = "Constant" Тогда 846 | 847 | // Для констант не поддерживается 848 | Возврат Ложь; 849 | 850 | КонецЕсли; 851 | 852 | Возврат НЕ НастройкиГенератора.НастройкиАнализаИзменений.Анализировать 853 | ИЛИ НастройкиГенератора.НастройкиАнализаИзменений.ИзмененныеФайлы.Найти(НРег(ИмяФайла)) <> Неопределено; 854 | 855 | КонецФункции 856 | 857 | Функция ПолучитьСтруктуруПодсистем(Подсистемы) 858 | 859 | ИскомаяПодсистема = Неопределено; 860 | 861 | Для Каждого Подсистема Из Подсистемы Цикл 862 | 863 | Если Подсистема.Визуальная Тогда 864 | 865 | Продолжить; 866 | 867 | КонецЕсли; 868 | 869 | Если НЕ ПустаяСтрока(АнализироватьТолькоПотомковПодсистемы) И Не СтрНачинаетсяС(Подсистема.Имя, АнализироватьТолькоПотомковПодсистемы) Тогда 870 | 871 | Продолжить; 872 | 873 | КонецЕсли; 874 | 875 | Имена = СтрРазделить(Подсистема.Представление, "/"); 876 | Если Имена.Количество() <> 3 Тогда 877 | 878 | Продолжить; 879 | 880 | КонецЕсли; 881 | 882 | ИскомаяПодсистема = Подсистема; 883 | Прервать; 884 | 885 | КонецЦикла; 886 | 887 | СтруктураПодсистем = Новый Структура("ИмяРаздела, ИмяПодсистемы, ОписаниеРаздела, ОписаниеПодсистемы", "", "", "", ""); 888 | Если ИскомаяПодсистема <> Неопределено Тогда 889 | 890 | СтруктураПодсистем.ИмяРаздела = ИскомаяПодсистема.Родитель.ПредставлениеКратко; 891 | СтруктураПодсистем.ИмяПодсистемы = ИскомаяПодсистема.ПредставлениеКратко; 892 | СтруктураПодсистем.ОписаниеРаздела = ИскомаяПодсистема.Родитель.ПодсистемаОписание; 893 | СтруктураПодсистем.ОписаниеПодсистемы = ИскомаяПодсистема.ПодсистемаОписание; 894 | 895 | КонецЕсли; 896 | 897 | Возврат СтруктураПодсистем; 898 | 899 | КонецФункции 900 | 901 | #КонецОбласти 902 | 903 | Процедура ПриСозданииОбъекта(Шаблонизатор) 904 | 905 | ГенераторСодержимого = Шаблонизатор; 906 | 907 | Попытка 908 | 909 | АнализироватьТолькоПотомковПодсистемы = ГенераторСодержимого.АнализироватьТолькоПотомковПодсистемы; 910 | 911 | Исключение 912 | 913 | // Реакция на ошибку не нужна 914 | 915 | КонецПопытки; 916 | 917 | КонецПроцедуры --------------------------------------------------------------------------------