├── VA-Тесты
├── steps
│ ├── kapral.epf
│ ├── ОбщиеФормы.feature
│ ├── Обработки.feature
│ ├── ЖурналыДокументов.feature
│ ├── Отчеты.feature
│ ├── ПВР.feature
│ ├── Справочники.feature
│ └── Документы.feature
├── templates
│ ├── ОбщиеФормы.feature
│ ├── Отчеты.feature
│ ├── Обработки.feature
│ ├── Документы-Создание.feature
│ ├── Документы-ЗаполнениеСоздание.feature
│ ├── Документы-Исправление.feature
│ ├── Документы-ЗаполнениеОткрытие.feature
│ ├── Документы-Проведение.feature
│ ├── ЖурналыДокументов.feature
│ ├── Отчеты-ОтсутствуетПравоПросмотр.feature
│ ├── Документы-ОтсутствуетПравоЧтение.feature
│ ├── Справочники-ОтсутствуетПравоЧтение.feature
│ ├── Документы-ОтсутствуетПравоИзменение.feature
│ ├── Документы-ОтсутствуетПравоДобавление.feature
│ ├── ЖурналыДокументов-ОтсутствуетПравоЧтение.feature
│ ├── Документы-Открытие.feature
│ ├── Документы-Создание-Запись.feature
│ ├── Документы-ЗаполнениеСозданиеОткрытие.feature
│ ├── Шапка.feature
│ ├── Документы-Создание-Проведение.feature
│ ├── Справочники-Открытие.feature
│ ├── Документы-Открытие-Печать.feature
│ ├── Справочники-Открытие-Печать.feature
│ ├── ПВР-Открытие-Создание.feature
│ ├── Справочники-Открытие-Создание.feature
│ └── Справочники-Открытие-Создание-Печать.feature
├── СоздатьФичи.ps1
├── ЗапуститьТесты.ps1
├── .project
└── AFParams.json
├── Скрипты
├── .project
├── РешетоЭратосфена.sbsl
├── ТестRing.sbsl
└── ОбновлениеПлатформ.sbsl
├── GitLab-CI
├── .project
├── 1cicd.json
├── .1cicd.json
├── AFParams.json
└── .gitlab-ci.yml
├── Библиотеки
├── .project
├── ПакетныйРежимVA.sbsl
├── ПакетныйРежимGit.sbsl
├── ЗапускСкриптов.sbsl
├── ПутьКПлатформеПроекта.sbsl
├── СписокИнформационныхБаз.sbsl
├── АгентКонфигуратора.sbsl
├── СериализацияФорматов.xbsl
├── УстановленныеПлатформы83.sbsl
├── dl-1c.sbsl
├── GitLabAPI.sbsl
├── ПакетныйРежимПлатформы.sbsl
├── ОпубликованныеПлатформы83.sbsl
├── ПакетныйРежимЕДТ.sbsl
└── ПакетныйРежимSonarQube.sbsl
├── LICENSE
└── README.md
/VA-Тесты/steps/kapral.epf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DoublesunRUS/devscripts/HEAD/VA-Тесты/steps/kapral.epf
--------------------------------------------------------------------------------
/VA-Тесты/templates/ОбщиеФормы.feature:
--------------------------------------------------------------------------------
1 | #report.feature=Общая форма "%ИмяОбъекта%"
2 | Сценарий: Открытие общей формы "%ИмяОбъекта%"
3 | Дано Открытие общей формы "%ИмяОбъекта%"
4 |
--------------------------------------------------------------------------------
/VA-Тесты/templates/Отчеты.feature:
--------------------------------------------------------------------------------
1 | #report.feature=Отчет "%ИмяОбъекта%"
2 | Сценарий: Формирование всех вариантов отчета "%ИмяОбъекта%"
3 | Дано Формирование всех вариантов отчета "%ИмяОбъекта%"
4 |
--------------------------------------------------------------------------------
/VA-Тесты/templates/Обработки.feature:
--------------------------------------------------------------------------------
1 | #report.feature=Обработка "%ИмяОбъекта%"
2 | Сценарий: Открытие основной формы обработки "%ИмяОбъекта%"
3 | Дано Открытие основной формы обработки "%ИмяОбъекта%"
4 |
--------------------------------------------------------------------------------
/VA-Тесты/templates/Документы-Создание.feature:
--------------------------------------------------------------------------------
1 | #report.feature=Документ "%ИмяОбъекта%"
2 | Сценарий: Открытие формы нового документа "%ИмяОбъекта%"
3 | Дано Открытие формы нового документа "%ИмяОбъекта%"
4 |
--------------------------------------------------------------------------------
/VA-Тесты/СоздатьФичи.ps1:
--------------------------------------------------------------------------------
1 | chcp 65001
2 |
3 | executor_j11 -s АвтофичиVA.sbsl -m CreateFeatures "AFParams.json"
4 |
5 | Write-Host "Press any key to continue..."
6 | [void][System.Console]::ReadKey($true)
7 |
--------------------------------------------------------------------------------
/VA-Тесты/templates/Документы-ЗаполнениеСоздание.feature:
--------------------------------------------------------------------------------
1 | #report.feature=Документ "%ИмяОбъекта%"
2 | Сценарий: Заполнение нового документа "%ИмяОбъекта%"
3 | Дано Заполнение нового документа "%ИмяОбъекта%"
4 |
--------------------------------------------------------------------------------
/VA-Тесты/templates/Документы-Исправление.feature:
--------------------------------------------------------------------------------
1 | #report.feature=Документ "%ИмяОбъекта%"
2 | Сценарий: Исправление существующего документа "%ИмяОбъекта%"
3 | Дано Исправление существующего документа "%ИмяОбъекта%"
4 |
--------------------------------------------------------------------------------
/VA-Тесты/templates/Документы-ЗаполнениеОткрытие.feature:
--------------------------------------------------------------------------------
1 | #report.feature=Документ "%ИмяОбъекта%"
2 | Сценарий: Заполнение существующего документа "%ИмяОбъекта%"
3 | Дано Заполнение существующего документа "%ИмяОбъекта%"
4 |
--------------------------------------------------------------------------------
/VA-Тесты/templates/Документы-Проведение.feature:
--------------------------------------------------------------------------------
1 | #report.feature=Документ "%ИмяОбъекта%"
2 | Сценарий: Перепроведение существующего документа "%ИмяОбъекта%"
3 | Дано Перепроведение существующего документа "%ИмяОбъекта%"
4 |
--------------------------------------------------------------------------------
/VA-Тесты/templates/ЖурналыДокументов.feature:
--------------------------------------------------------------------------------
1 | #report.feature=Журнал документов "%ИмяОбъекта%"
2 | Сценарий: Открытие формы журнала документов "%ИмяОбъекта%"
3 | Дано Открытие формы журнала документов "%ИмяОбъекта%"
4 |
--------------------------------------------------------------------------------
/VA-Тесты/templates/Отчеты-ОтсутствуетПравоПросмотр.feature:
--------------------------------------------------------------------------------
1 | #report.feature=Отчет "%ИмяОбъекта%"
2 | Сценарий: Отсутствует право "Просмотр" для отчета "%ИмяОбъекта%"
3 | Дано Отсутствует право "Просмотр" для отчета "%ИмяОбъекта%"
4 |
--------------------------------------------------------------------------------
/VA-Тесты/templates/Документы-ОтсутствуетПравоЧтение.feature:
--------------------------------------------------------------------------------
1 | #report.feature=Документ "%ИмяОбъекта%"
2 | Сценарий: Отсутствует право "Просмотр" для документа "%ИмяОбъекта%"
3 | Дано Отсутствует право "Просмотр" для документа "%ИмяОбъекта%"
4 |
--------------------------------------------------------------------------------
/VA-Тесты/ЗапуститьТесты.ps1:
--------------------------------------------------------------------------------
1 | chcp 65001
2 |
3 | executor_j11 -s АвтофичиVA.sbsl -m CreateFeatures "AFParams.json"
4 | executor_j11 -s АвтофичиVA.sbsl -m RunTests "AFParams.json"
5 | executor_j11 -s АвтофичиVA.sbsl -m OpenReport "AFParams.json"
6 |
--------------------------------------------------------------------------------
/VA-Тесты/templates/Справочники-ОтсутствуетПравоЧтение.feature:
--------------------------------------------------------------------------------
1 | #report.feature=Справочник "%ИмяОбъекта%"
2 | Сценарий: Отсутствует право "Просмотр" для справочника "%ИмяОбъекта%"
3 | Дано Отсутствует право "Просмотр" для справочника "%ИмяОбъекта%"
4 |
--------------------------------------------------------------------------------
/VA-Тесты/templates/Документы-ОтсутствуетПравоИзменение.feature:
--------------------------------------------------------------------------------
1 | #report.feature=Документ "%ИмяОбъекта%"
2 | Сценарий: Отсутствует право "Редактирование" для документа "%ИмяОбъекта%"
3 | Дано Отсутствует право "Редактирование" для документа "%ИмяОбъекта%"
4 |
--------------------------------------------------------------------------------
/Скрипты/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | Скрипты
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/GitLab-CI/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | GitLab-CI
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/VA-Тесты/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | VA-Тесты
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/VA-Тесты/templates/Документы-ОтсутствуетПравоДобавление.feature:
--------------------------------------------------------------------------------
1 | #report.feature=Документ "%ИмяОбъекта%"
2 | Сценарий: Отсутствует право "ИнтерактивноеДобавление" для документа "%ИмяОбъекта%"
3 | Дано Отсутствует право "ИнтерактивноеДобавление" для документа "%ИмяОбъекта%"
4 |
--------------------------------------------------------------------------------
/VA-Тесты/templates/ЖурналыДокументов-ОтсутствуетПравоЧтение.feature:
--------------------------------------------------------------------------------
1 | #report.feature=Журнал документов "%ИмяОбъекта%"
2 | Сценарий: Отсутствует право "Просмотр" для журнала документов "%ИмяОбъекта%"
3 | Дано Отсутствует право "Просмотр" для журнала документов "%ИмяОбъекта%"
4 |
--------------------------------------------------------------------------------
/Библиотеки/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | Библиотеки
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/VA-Тесты/templates/Документы-Открытие.feature:
--------------------------------------------------------------------------------
1 | #report.feature=Документ "%ИмяОбъекта%"
2 | Сценарий: Открытие формы списка документа "%ИмяОбъекта%"
3 | Дано Открытие формы списка документа "%ИмяОбъекта%"
4 |
5 | #report.feature=Документ "%ИмяОбъекта%"
6 | Сценарий: Открытие формы существующего документа "%ИмяОбъекта%"
7 | Дано Открытие формы существующего документа "%ИмяОбъекта%"
8 |
--------------------------------------------------------------------------------
/VA-Тесты/templates/Документы-Создание-Запись.feature:
--------------------------------------------------------------------------------
1 | #report.feature=Документ "%ИмяОбъекта%"
2 | Сценарий: Открытие формы нового документа "%ИмяОбъекта%"
3 | Дано Открытие формы нового документа "%ИмяОбъекта%"
4 |
5 | #report.feature=Документ "%ИмяОбъекта%"
6 | Сценарий: Перезапись существующего документа "%ИмяОбъекта%"
7 | Дано Перезапись существующего документа "%ИмяОбъекта%"
8 |
--------------------------------------------------------------------------------
/VA-Тесты/templates/Документы-ЗаполнениеСозданиеОткрытие.feature:
--------------------------------------------------------------------------------
1 | #report.feature=Документ "%ИмяОбъекта%"
2 | Сценарий: Заполнение нового документа "%ИмяОбъекта%"
3 | Дано Заполнение нового документа "%ИмяОбъекта%"
4 |
5 | #report.feature=Документ "%ИмяОбъекта%"
6 | Сценарий: Заполнение существующего документа "%ИмяОбъекта%"
7 | Дано Заполнение существующего документа "%ИмяОбъекта%"
8 |
--------------------------------------------------------------------------------
/VA-Тесты/templates/Шапка.feature:
--------------------------------------------------------------------------------
1 | #language: ru
2 |
3 | @tree
4 |
5 | #report.story=Пользователь "%ПредставлениеПользователя%"
6 | Функциональность: %Фича% - "%ПредставлениеПользователя%"
7 |
8 | Контекст:
9 | Дано я подключаю TestClient "%ПредставлениеПользователя%" логин "%ИмяПользователя%" пароль "%ПарольПользователя%"
10 | И я закрыл все окна клиентского приложения
11 |
--------------------------------------------------------------------------------
/VA-Тесты/templates/Документы-Создание-Проведение.feature:
--------------------------------------------------------------------------------
1 | #report.feature=Документ "%ИмяОбъекта%"
2 | Сценарий: Открытие формы нового документа "%ИмяОбъекта%"
3 | Дано Открытие формы нового документа "%ИмяОбъекта%"
4 |
5 | #report.feature=Документ "%ИмяОбъекта%"
6 | Сценарий: Перепроведение существующего документа "%ИмяОбъекта%"
7 | Дано Перепроведение существующего документа "%ИмяОбъекта%"
8 |
--------------------------------------------------------------------------------
/VA-Тесты/templates/Справочники-Открытие.feature:
--------------------------------------------------------------------------------
1 | #report.feature=Справочник "%ИмяОбъекта%"
2 | Сценарий: Открытие формы списка справочника "%ИмяОбъекта%"
3 | Дано Открытие формы списка справочника "%ИмяОбъекта%"
4 |
5 | #report.feature=Справочник "%ИмяОбъекта%"
6 | Сценарий: Открытие формы существующего элемента справочника "%ИмяОбъекта%"
7 | Дано Открытие формы существующего элемента справочника "%ИмяОбъекта%"
8 |
--------------------------------------------------------------------------------
/GitLab-CI/1cicd.json:
--------------------------------------------------------------------------------
1 | {
2 | "CI_DATA": "<Путь к тестовым данным>",
3 | "CI_EPFS": "<Путь к служебным обработкам>",
4 | "CI_VA": "<Путь к VA>",
5 | "CI_SONARSCANNER": "<Путь к корневому каталогу SonarScaner>",
6 | "ТестовыйСервер": {
7 | "Сервер1С": "",
8 | "Пользователь1С": "",
9 | "Пароль1С": "",
10 | "ТипСУБД": "",
11 | "СерверБазДанных": "",
12 | "ПользовательБазыДанных": "",
13 | "ПарольБазыДанных": ""
14 | }
15 | }
--------------------------------------------------------------------------------
/VA-Тесты/templates/Документы-Открытие-Печать.feature:
--------------------------------------------------------------------------------
1 | #report.feature=Документ "%ИмяОбъекта%"
2 | Сценарий: Открытие формы списка документа "%ИмяОбъекта%"
3 | Дано Открытие формы списка документа "%ИмяОбъекта%"
4 |
5 | #report.feature=Документ "%ИмяОбъекта%"
6 | Сценарий: Открытие формы существующего документа "%ИмяОбъекта%"
7 | Дано Открытие формы существующего документа "%ИмяОбъекта%"
8 |
9 | #report.feature=Документ "%ИмяОбъекта%"
10 | Сценарий: Печать существующего документа "%ИмяОбъекта%"
11 | Дано Печать существующего документа "%ИмяОбъекта%"
12 |
--------------------------------------------------------------------------------
/VA-Тесты/templates/Справочники-Открытие-Печать.feature:
--------------------------------------------------------------------------------
1 | #report.feature=Справочник "%ИмяОбъекта%"
2 | Сценарий: Открытие формы списка справочника "%ИмяОбъекта%"
3 | Дано Открытие формы списка справочника "%ИмяОбъекта%"
4 |
5 | #report.feature=Справочник "%ИмяОбъекта%"
6 | Сценарий: Открытие формы существующего элемента справочника "%ИмяОбъекта%"
7 | Дано Открытие формы существующего элемента справочника "%ИмяОбъекта%"
8 |
9 | #report.feature=Справочник "%ИмяОбъекта%"
10 | Сценарий: Печать существующего элемента справочника "%ИмяОбъекта%"
11 | Дано Печать существующего элемента справочника "%ИмяОбъекта%"
12 |
--------------------------------------------------------------------------------
/VA-Тесты/templates/ПВР-Открытие-Создание.feature:
--------------------------------------------------------------------------------
1 | #report.feature=ПланВидовРасчета "%ИмяОбъекта%"
2 | Сценарий: Открытие формы списка ПВР "%ИмяОбъекта%"
3 | Дано Открытие формы списка ПВР "%ИмяОбъекта%"
4 |
5 | #report.feature=ПланВидовРасчета "%ИмяОбъекта%"
6 | Сценарий: Открытие формы существующего элемента ПВР "%ИмяОбъекта%"
7 | Дано Открытие формы существующего элемента ПВР "%ИмяОбъекта%"
8 |
9 | #report.feature=ПланВидовРасчета "%ИмяОбъекта%"
10 | Сценарий: Открытие формы нового элемента ПВР "%ИмяОбъекта%"
11 | Дано Открытие формы нового элемента ПВР "%ИмяОбъекта%"
12 |
13 | #report.feature=ПланВидовРасчета "%ИмяОбъекта%"
14 | Сценарий: Перезапись существующего элемента ПВР "%ИмяОбъекта%"
15 | Дано Перезапись существующего элемента ПВР "%ИмяОбъекта%"
16 |
--------------------------------------------------------------------------------
/VA-Тесты/steps/ОбщиеФормы.feature:
--------------------------------------------------------------------------------
1 | #language: ru
2 |
3 | @tree
4 | @ExportScenarios
5 |
6 | Функциональность: Проверка Общих форм
7 |
8 | Сценарий: Открытие общей формы "ИмяОбщейФормы"
9 | Если объект "ОбщаяФорма.[ИмяОбщейФормы]" недоступен по функциональным опциям
10 | Тогда я останавливаю выполнение сценария "Skipped"
11 |
12 | Если нет права "Просмотр" к объекту "ОбщаяФорма.[ИмяОбщейФормы]" тогда
13 | Тогда я останавливаю выполнение сценария "Skipped"
14 |
15 | Дано я закрыл все окна клиентского приложения
16 | И я очищаю окно сообщений пользователю
17 |
18 | Дано я открываю общую форму "ИмяОбщейФормы"
19 | Если появилось предупреждение тогда
20 | Тогда я вызываю исключение "Не удалось открыть общую форму [ИмяОбщейФормы]"
21 |
22 | И я закрыл все окна клиентского приложения
23 |
--------------------------------------------------------------------------------
/VA-Тесты/templates/Справочники-Открытие-Создание.feature:
--------------------------------------------------------------------------------
1 | #report.feature=Справочник "%ИмяОбъекта%"
2 | Сценарий: Открытие формы списка справочника "%ИмяОбъекта%"
3 | Дано Открытие формы списка справочника "%ИмяОбъекта%"
4 |
5 | #report.feature=Справочник "%ИмяОбъекта%"
6 | Сценарий: Открытие формы существующего элемента справочника "%ИмяОбъекта%"
7 | Дано Открытие формы существующего элемента справочника "%ИмяОбъекта%"
8 |
9 | #report.feature=Справочник "%ИмяОбъекта%"
10 | Сценарий: Открытие формы нового элемента справочника "%ИмяОбъекта%"
11 | Дано Открытие формы нового элемента справочника "%ИмяОбъекта%"
12 |
13 | #report.feature=Справочник "%ИмяОбъекта%"
14 | Сценарий: Перезапись существующего элемента справочника "%ИмяОбъекта%"
15 | Дано Перезапись существующего элемента справочника "%ИмяОбъекта%"
16 |
--------------------------------------------------------------------------------
/VA-Тесты/steps/Обработки.feature:
--------------------------------------------------------------------------------
1 | #language: ru
2 |
3 | @tree
4 | @ExportScenarios
5 |
6 | Функциональность: Проверка Обработок
7 |
8 | Сценарий: Открытие основной формы обработки "ИмяОбработки"
9 | Если объект "Обработка.[ИмяОбработки]" недоступен по функциональным опциям
10 | Тогда я останавливаю выполнение сценария "Skipped"
11 |
12 | Если нет права "Использование" к объекту "Обработка.[ИмяОбработки]" тогда
13 | Тогда я останавливаю выполнение сценария "Skipped"
14 |
15 | Дано я закрыл все окна клиентского приложения
16 | И я очищаю окно сообщений пользователю
17 |
18 | Дано я открываю основную форму обработки "ИмяОбработки"
19 | Если появилось предупреждение тогда
20 | Тогда я вызываю исключение "Не удалось открыть форму основную обработки [ИмяОбработки]"
21 |
22 | И я закрыл все окна клиентского приложения
23 |
--------------------------------------------------------------------------------
/GitLab-CI/.1cicd.json:
--------------------------------------------------------------------------------
1 | {
2 | "Конфигурация": {
3 | "Имя": "<имя репозитория>",
4 | "Проект": "<Имя проекта EDT>",
5 | "ПеременнаяТокена": "<Имя репозитория>_TOKEN"
6 | },
7 | "ПрикладныеРасширения": [
8 | {
9 | "Имя": "<имя репозитория>",
10 | "Проект": "<Имя проекта EDT>",
11 | "ПеременнаяТокена": "<Имя репозитория>_TOKEN"
12 | }
13 | ],
14 | "ТестовыеРасширения": [
15 | {
16 | "Имя": "<имя репозитория>",
17 | "Проект": "<Имя проекта EDT>",
18 | "ПеременнаяТокена": "<Имя репозитория>_TOKEN"
19 | }
20 | ],
21 | "СценарныеТесты": [
22 | {
23 | "Имя": "<имя репозитория>",
24 | "ПеременнаяТокена": "<Имя репозитория>_TOKEN"
25 | }
26 | ],
27 | "СерверSonarQube": ""
28 | }
--------------------------------------------------------------------------------
/GitLab-CI/AFParams.json:
--------------------------------------------------------------------------------
1 | {
2 | "ТестоваяБаза": {
3 | "ПутьКDT": "<относительный путь к демо базе>",
4 | "ИмяПользователя": "<имя административного пользователя демо базы>",
5 | "ПарольПользователя": "<пароль административного пользователя демо базы>",
6 | "ТипРасположенияИБ": "Файловая|Серверная",
7 | "КаталогОшибокСППР": "<относительный путь для ошибок СППР>"
8 | },
9 | "Шаблоны": {
10 | "ФайлШаблонаШапки": "Шапка.feature",
11 | "Пользователи": [
12 | {
13 | "ПредставлениеПользователя": "<Представление пользователя для указания в tsv файле>",
14 | "ИмяПользователя": "<имя пользователя демо базы под которым выполняются тесты>",
15 | "ПарольПользователя": "<пароль пользователя демо базы под которым выполняются тесты>"
16 | }
17 | ]
18 | }
19 | }
--------------------------------------------------------------------------------
/VA-Тесты/templates/Справочники-Открытие-Создание-Печать.feature:
--------------------------------------------------------------------------------
1 | #report.feature=Справочник "%ИмяОбъекта%"
2 | Сценарий: Открытие формы списка справочника "%ИмяОбъекта%"
3 | Дано Открытие формы списка справочника "%ИмяОбъекта%"
4 |
5 | #report.feature=Справочник "%ИмяОбъекта%"
6 | Сценарий: Открытие формы существующего элемента справочника "%ИмяОбъекта%"
7 | Дано Открытие формы существующего элемента справочника "%ИмяОбъекта%"
8 |
9 | #report.feature=Справочник "%ИмяОбъекта%"
10 | Сценарий: Открытие формы нового элемента справочника "%ИмяОбъекта%"
11 | Дано Открытие формы нового элемента справочника "%ИмяОбъекта%"
12 |
13 | #report.feature=Справочник "%ИмяОбъекта%"
14 | Сценарий: Перезапись существующего элемента справочника "%ИмяОбъекта%"
15 | Дано Перезапись существующего элемента справочника "%ИмяОбъекта%"
16 |
17 | #report.feature=Справочник "%ИмяОбъекта%"
18 | Сценарий: Печать существующего элемента справочника "%ИмяОбъекта%"
19 | Дано Печать существующего элемента справочника "%ИмяОбъекта%"
20 |
--------------------------------------------------------------------------------
/VA-Тесты/AFParams.json:
--------------------------------------------------------------------------------
1 | {
2 | "НастройкиVA": {
3 | "ПутьVanessaAutomationSingle": "<каталог автофич>\\vanessa-automation-single.epf",
4 | "КаталогПроекта": "",
5 | "КаталогФич": "<каталог проекта>\\features",
6 | "КаталогиБиблиотек": [
7 | "<каталог автофич>\\steps"
8 | ],
9 | "КаталогОтчетов": "<каталог проекта>\\reports"
10 | },
11 | "НастройкиТестовойБазы": {
12 | "ВерсияПлатформы": "8.3.ХХ.ХХХХ",
13 | "ПутьКDT": "<каталог проекта>\\1cv8.dt",
14 | "ИмяПользователя": "<имя административного пользователя демо базы>",
15 | "ПарольПользователя": "<пароль административного пользователя демо базы>"
16 | },
17 | "НастройкиАвтофич": {
18 | "КаталогАвтофич": "<каталог проекта>\\auto_features",
19 | "КаталогШаблоновШагов": "<каталог автофич>\\templates",
20 | "ФайлШаблонаШапки": "Шапка.feature",
21 | "Пользователи": [
22 | {
23 | "ПредставлениеПользователя": "<Представление пользователя для указания в tsv файле>",
24 | "ИмяПользователя": "<имя пользователя демо базы под которым выполняются тесты>",
25 | "ПарольПользователя": "<пароль пользователя демо базы под которым выполняются тесты>"
26 | }
27 | ]
28 | }
29 | }
--------------------------------------------------------------------------------
/VA-Тесты/steps/ЖурналыДокументов.feature:
--------------------------------------------------------------------------------
1 | #language: ru
2 |
3 | @tree
4 | @ExportScenarios
5 |
6 | Функциональность: Проверка Журналов документов
7 |
8 | Сценарий: Отсутствует право "ИмяПрава" для журнала документов "ИмяЖурналаДокументов"
9 | Если объект "ЖурналДокументов.[ИмяЖурналаДокументов]" недоступен по функциональным опциям
10 | Тогда я останавливаю выполнение сценария "Skipped"
11 |
12 | Если есть право "ИмяПрава" к объекту "ЖурналДокументов.[ИмяЖурналаДокументов]" тогда
13 | Тогда я вызываю исключение "Ошибочно установлено право [ИмяПрава] для журнала документов [ИмяЖурналаДокументов]"
14 |
15 | Сценарий: Открытие формы журнала документов "ИмяЖурналаДокументов"
16 | Если объект "ЖурналДокументов.[ИмяЖурналаДокументов]" недоступен по функциональным опциям
17 | Тогда я останавливаю выполнение сценария "Skipped"
18 |
19 | Если нет права "Просмотр" к объекту "ЖурналДокументов.[ИмяЖурналаДокументов]" тогда
20 | Тогда я останавливаю выполнение сценария "Skipped"
21 |
22 | Дано я закрыл все окна клиентского приложения
23 | И я очищаю окно сообщений пользователю
24 |
25 | Дано я открываю основную форму журнала документов "ИмяЖурналаДокументов"
26 | Если появилось предупреждение тогда
27 | Тогда я вызываю исключение "Не удалось открыть форму журнала документов [ИмяЖурналаДокументов]"
28 |
29 | И я закрыл все окна клиентского приложения
30 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | BSD 3-Clause License
2 |
3 | Copyright (c) 2020, Александр Капралов
4 | All rights reserved.
5 |
6 | Redistribution and use in source and binary forms, with or without
7 | modification, are permitted provided that the following conditions are met:
8 |
9 | 1. Redistributions of source code must retain the above copyright notice, this
10 | list of conditions and the following disclaimer.
11 |
12 | 2. Redistributions in binary form must reproduce the above copyright notice,
13 | this list of conditions and the following disclaimer in the documentation
14 | and/or other materials provided with the distribution.
15 |
16 | 3. Neither the name of the copyright holder nor the names of its
17 | contributors may be used to endorse or promote products derived from
18 | this software without specific prior written permission.
19 |
20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 |
--------------------------------------------------------------------------------
/Библиотеки/ПакетныйРежимVA.sbsl:
--------------------------------------------------------------------------------
1 | #!/usr/bin/executor
2 |
3 | /*******************************************************************************
4 | * Copyright (c) 2020 Alexander Kapralov and Contributors
5 | * This program and the accompanying materials are made available under
6 | * the terms of the BSD 3-Clause License which is available at
7 | * https://spdx.org/licenses/BSD-3-Clause.html#licenseText
8 | *
9 | * SPDX-License-Identifier: BSD-3-Clause
10 | *
11 | * Contributors:
12 | *
13 | *
14 | ******************************************************************************/
15 |
16 | структура ОписаниеПараметров
17 | пер КаталогФич: Строка
18 | пер КаталогПроекта: Строка
19 | знч ВыполнитьСценарии = Истина
20 | знч ВыполнятьШагиАссинхронно = Ложь
21 | знч ДелатьЛогВыполненияСценариевВЖР = Ложь
22 | знч ДелатьОтчетВФорматеjUnit = Истина
23 | знч ЗавершитьРаботуСистемы = Истина
24 | пер КаталогВыгрузкиjUnit: Строка
25 | знч ОбновлятьСтатистикуВДереве = Ложь
26 | знч ОбновлятьДеревоПриНачалеВыполненияСценария = Ложь
27 |
28 | конструктор(КаталогФич, КаталогПроекта, КаталогВыгрузкиjUnit)
29 | ;
30 |
31 |
32 | метод СформироватьФайлПараметров(каталогФич: Строка, каталогПроекта: Строка, каталогВыгрузкиjUnit: Строка,
33 | путьКФайлуПараметров: Строка)
34 | знч файлПараметров = новый Файл(путьКФайлуПараметров + Файлы.СимволРазделителя + "params.json")
35 | знч поток = файлПараметров.ОткрытьПотокЗаписи()
36 |
37 | знч параметры = новый ОписаниеПараметров(каталогФич, каталогПроекта, каталогВыгрузкиjUnit)
38 |
39 | СериализацияJson.ЗаписатьОбъект(поток, параметры)
40 | поток.Закрыть()
41 | ;
--------------------------------------------------------------------------------
/Библиотеки/ПакетныйРежимGit.sbsl:
--------------------------------------------------------------------------------
1 | /*******************************************************************************
2 | * Copyright (c) 2020 Alexander Kapralov and Contributors
3 | * This program and the accompanying materials are made available under
4 | * the terms of the BSD 3-Clause License which is available at
5 | * https://spdx.org/licenses/BSD-3-Clause.html#licenseText
6 | *
7 | * SPDX-License-Identifier: BSD-3-Clause
8 | *
9 | * Contributors:
10 | *
11 | *
12 | ******************************************************************************/
13 |
14 | метод Git_Clone(адресРепозитория: Строка, веткаРепозитория: Строка)
15 | пер параметрыПроцесса = новый Массив()
16 | параметрыПроцесса.Добавить("clone")
17 | параметрыПроцесса.Добавить("--quiet")
18 | параметрыПроцесса.Добавить("--single-branch")
19 | параметрыПроцесса.Добавить("--branch")
20 | параметрыПроцесса.Добавить(веткаРепозитория)
21 | параметрыПроцесса.Добавить(адресРепозитория)
22 |
23 | знч процесс = новый ПроцессОс("git", параметрыПроцесса)
24 | процесс.Запустить()
25 | процесс.ОжидатьЗавершения()
26 |
27 | пер результатВыполненияСкрипта = процесс.ПолучитьПотокВывода()
28 | знч текстРезультата = результатВыполненияСкрипта.ПрочитатьКакТекст()
29 | если не текстРезультата.Пусто()
30 | Консоль.Записать(текстРезультата)
31 | ;
32 |
33 | знч кодВозврата = процесс.ПолучитьКодВозврата()
34 |
35 | если кодВозврата == 0
36 | Консоль.Записать("Репозиторий успешно склонирован.")
37 | возврат
38 | ;
39 |
40 | пер текстОшибки = Строки.Шаблон("Код возврата: $0", кодВозврата)
41 |
42 | текстОшибки += Строки.Шаблон("\в\н$0\в\нgit $0", Строки.Соединить(параметрыПроцесса, " "))
43 |
44 | выбросить новый ИсключениеНедопустимоеСостояние(текстОшибки)
45 | ;
--------------------------------------------------------------------------------
/Скрипты/РешетоЭратосфена.sbsl:
--------------------------------------------------------------------------------
1 | #!/usr/bin/executor
2 |
3 | /*******************************************************************************
4 | * Copyright (c) 2020 Alexander Kapralov and Contributors
5 | * This program and the accompanying materials are made available under
6 | * the terms of the BSD 3-Clause License which is available at
7 | * https://spdx.org/licenses/BSD-3-Clause.html#licenseText
8 | *
9 | * SPDX-License-Identifier: BSD-3-Clause
10 | *
11 | * Contributors:
12 | * Andrei Ovsiankin - Алгоритм
13 | *
14 | ******************************************************************************/
15 |
16 | метод Скрипт()
17 | знч времяНачала = ДатаВремя.Сейчас()
18 |
19 | пер мсЦиклаВычислений = 0
20 |
21 | мсЦиклаВычислений += ВычислитьЭлементы(100)
22 | мсЦиклаВычислений += ВычислитьЭлементы(5000000)
23 | мсЦиклаВычислений += ВычислитьЭлементы(50000000)
24 |
25 | знч времяОкончания = ДатаВремя.Сейчас()
26 | знч мсЦикла = (времяОкончания - времяНачала).ВМиллисекундах() - мсЦиклаВычислений
27 | знч сЦикла = мсЦикла / 1000
28 | Консоль.Записать("Время скрипта без вычислений: %сЦикла")
29 | ;
30 |
31 | метод ВычислитьЭлементы(н: Число): Число
32 | пер массив = новый Массив()
33 |
34 | массив.Добавить(Ложь)
35 | массив.Добавить(Ложь)
36 |
37 | для индекс = 2 по н
38 | массив.Добавить(Истина)
39 | ;
40 |
41 | знч времяНачала = ДатаВремя.Сейчас()
42 | для индекс = 2 по н
43 | если массив[индекс]
44 | пер квадрат = индекс * индекс
45 | если квадрат <= н
46 | пер м = квадрат
47 | пока м <= н
48 | массив[м] = Ложь
49 | м += индекс
50 | ;
51 | ;
52 | ;
53 | ;
54 |
55 | знч времяОкончания = ДатаВремя.Сейчас()
56 | знч мсЦикла = (времяОкончания - времяНачала).ВМиллисекундах()
57 | знч сЦикла = мсЦикла / 1000
58 | Консоль.Записать("%н: %сЦикла")
59 |
60 | возврат мсЦикла
61 | ;
62 |
63 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## Скрипты для разработчиков
2 |
3 | ### Скрипты
4 | #### ОбновлениеПлатформ.sbsl
5 | В РАЗРАБОТКЕ.
6 | Скрипт, который позволяет обновить платформы, установленные на компьютере.
7 | Скрипт проверяет список последний версий платформы на сайте, смотрит список баз компьютера, список установленных платформ. После чего определяет, какие версии платформ нужно установить, а какие - удалить.
8 | - метод Скрипт() - запрашивает имя и пароль пользователя через консоль
9 | - метод ОбновитьПлатформы() - использует имя пользователя и пароль из параметров запуска
10 |
11 | #### 1cicd.sbsl
12 | В РАЗРАБОТКЕ.
13 | Скрипт для непрерывной интеграции с использованием GitLab.
14 |
15 | #### АвтоФичиVA.sbsl
16 | В РАЗРАБОТКЕ.
17 | Скрипт, позволяющий сгенерировать и запустить тесты в VanessaAutomation по шаблонам.
18 |
19 | ### Библиотеки
20 | #### ЗапускСкриптов.sbsl
21 | Скрипт содержит методы, позволяющие вызывать из своего скрипта другие скрипты.
22 | Все методы скрипта необходимо копировать в свой скрипт.
23 | - метод ВыполнитьСкрипт() - позволяет вызвать другой скрипт и получить ПотокВывода этого скрипта
24 | - метод ОбъектИзПотокаВывода() - преобразует поток вывода в строку или массив строк
25 |
26 | #### ОпубликованныеПлатформы83.sbsl
27 | Cкрипт для получения списка опубликованных на сайте релизов платформы 8.3.
28 | - метод ВсеРелизы() - возвращает список всех релизов
29 | - метод ПоследниеРелизы() - возвращает список последних сборок каждого релиза платформы
30 |
31 | #### ПутьКПлатформеПроекта.sbsl
32 | Скрипт для переданного пути к проекту ЕДТ определяет версию платформы проекта. Затем ищет на компьютере установленную версию платформы максимальной сборки и возвращает путь к исполняемому файлу платформы.
33 |
34 | #### ПакетныйРежимПлатформы.sbsl
35 | Скрипт содержит команды для работы с платформой в пакетном режиме.
36 |
37 | #### СписокИнформационныхБаз.sbsl
38 | Cкрипт для получения списка информационных баз компьютера.
39 | - метод ДоступныеБазы() - возвращает описание всех баз
40 | - метод ИспользуемыеВерсии() - возвращает все используемые версии платформы, указанные в списке баз
41 |
42 | #### УстановленныеПлатформы83.sbsl
43 | В РАЗРАБОТКЕ.
44 | Cкрипт для взаимодействия с установленными платформами.
45 | - метод УстановленныеПлатформы() - возвращает список установленных на коммьютере платформ
46 | - метод УстановитьПлатформу() - устанавливает платформу из дистрибутива
47 |
48 | #### dl-1c.sbsl
49 | Скрипт для скачивания релизов. Автор Дмитрий Клименко. [Репозиторий](https://github.com/klimenko-1c/dl-1c)
50 |
51 | #### GitLabAPI.sbsl
52 | Скрипт содержит команды для работы с GitLab API.
53 |
--------------------------------------------------------------------------------
/Скрипты/ТестRing.sbsl:
--------------------------------------------------------------------------------
1 | #!/usr/bin/executor
2 |
3 | /*******************************************************************************
4 | * Copyright (c) 2020 Alexander Kapralov and Contributors
5 | * This program and the accompanying materials are made available under
6 | * the terms of the BSD 3-Clause License which is available at
7 | * https://spdx.org/licenses/BSD-3-Clause.html#licenseText
8 | *
9 | * SPDX-License-Identifier: BSD-3-Clause
10 | *
11 | * Contributors:
12 | *
13 | *
14 | ******************************************************************************/
15 |
16 | метод Скрипт()
17 | пер имяКоманды = ""
18 | пер параметрыПроцесса = новый Массив()
19 |
20 | знч версияОС = ИспользуемаяОС()
21 | выбор версияОС
22 | когда ОперационныеСистемы.Windows
23 | имяКоманды = "ring.cmd"
24 | иначе
25 | имяКоманды = "ring.sh"
26 | ;
27 |
28 | параметрыПроцесса.Добавить("-l")
29 | параметрыПроцесса.Добавить("error")
30 | параметрыПроцесса.Добавить("edt")
31 | параметрыПроцесса.Добавить("platform-versions")
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 | возврат "Cp1251"
61 | ;
62 |
63 |
64 | перечисление ОперационныеСистемы
65 | Windows,
66 | MacOS,
67 | Linux
68 | ;
69 |
70 |
71 | метод ИспользуемаяОС(): ОперационныеСистемы
72 | знч имяОС = СредаИсполнения.ПолучитьСвойство("os.name")
73 |
74 | выбор когда имяОС.НачинаетсяС("windows", Истина)
75 | возврат ОперационныеСистемы.Windows
76 |
77 | когда имяОС.Содержит("mac", Истина)
78 | возврат ОперационныеСистемы.MacOS
79 |
80 | когда имяОС.Содержит("nux", Истина)
81 | возврат ОперационныеСистемы.Linux
82 |
83 | иначе
84 | выбросить новый ИсключениеНедопустимоеСостояние("Неизвестная ОС")
85 | ;
86 | ;
--------------------------------------------------------------------------------
/VA-Тесты/steps/Отчеты.feature:
--------------------------------------------------------------------------------
1 | #language: ru
2 |
3 | @tree
4 | @ExportScenarios
5 |
6 | Функциональность: Проверка Отчетов
7 |
8 | Сценарий: Отсутствует право "ИмяПрава" для отчета "ИмяОтчета"
9 | Если объект "Отчет.[ИмяОтчета]" недоступен по функциональным опциям
10 | Тогда я останавливаю выполнение сценария "Skipped"
11 |
12 | Если есть право "ИмяПрава" к объекту "Отчет.[ИмяОтчета]" тогда
13 | Тогда я вызываю исключение "Ошибочно установлено право [ИмяПрава] для отчета [ИмяОтчета]"
14 |
15 | Сценарий: Формирование всех вариантов отчета "ИмяОтчета"
16 | Если объект "Отчет.[ИмяОтчета]" недоступен по функциональным опциям
17 | Тогда я останавливаю выполнение сценария "Skipped"
18 |
19 | Если нет права "Использование" к объекту "Отчет.[ИмяОтчета]" тогда
20 | Тогда я останавливаю выполнение сценария "Skipped"
21 |
22 | Дано я получаю список вариантов отчета "ИмяОтчета" в переменную "СписокВариантовОтчета"
23 |
24 | Дано я закрыл все окна клиентского приложения
25 | И я очищаю окно сообщений пользователю
26 |
27 | Дано я открываю основную форму отчета "ИмяОтчета"
28 | Если появилось предупреждение тогда
29 | Тогда я вызываю исключение "Не удалось открыть форму отчета [ИмяОтчета]"
30 |
31 | Если '$СписокВариантовОтчета$.Количество() = 0' Тогда
32 | Если элемент с заголовком "Организация" присутствует на форме Тогда
33 | И я открываю выпадающий список "Организация"
34 | И я сохраняю выпадающий список "Организация" как "ДоступныеОрганизации"
35 | И я закрываю выпадающий список "Организация"
36 | И для каждого значения "ОтборОрганизация" из таблицы в памяти "ДоступныеОрганизации"
37 | И из выпадающего списка "Организация" я выбираю точное значение "$ОтображаемыйТекст$"
38 | И я нажимаю на кнопку "Сформировать"
39 | И я жду заполнение табличного документа 'ОтчетТабличныйДокумент' отчета "ИмяОтчета" в течение 10 секунд
40 | Если появилось предупреждение тогда
41 | Тогда я вызываю исключение "Не удалось сформировать отчет [ИмяОтчета]"
42 |
43 | Иначе
44 | И я нажимаю на кнопку "Сформировать"
45 | И я жду заполнение табличного документа 'ОтчетТабличныйДокумент' отчета "ИмяОтчета" в течение 10 секунд
46 | Если появилось предупреждение тогда
47 | Тогда я вызываю исключение "Не удалось сформировать отчет [ИмяОтчета]"
48 |
49 | Иначе
50 | И для каждого значения "ВариантОтчета" из массива "$СписокВариантовОтчета$"
51 | Тогда я запоминаю значение выражения '$ВариантОтчета$.Представление' в переменную "НаименованиеВарианта"
52 | И я нажимаю на кнопку "$НаименованиеВарианта$"
53 |
54 | Если элемент с заголовком "Организация" присутствует на форме Тогда
55 | И я открываю выпадающий список "Организация"
56 | И я сохраняю выпадающий список "Организация" как "ДоступныеОрганизации"
57 | И я закрываю выпадающий список "Организация"
58 | И для каждого значения "ОтборОрганизация" из таблицы в памяти "ДоступныеОрганизации"
59 | И из выпадающего списка "Организация" я выбираю точное значение "$ОтображаемыйТекст$"
60 | И я нажимаю на кнопку "Сформировать"
61 | И я жду заполнение табличного документа 'ОтчетТабличныйДокумент' отчета "ИмяОтчета" в течение 60 секунд
62 | Если появилось предупреждение тогда
63 | Тогда я вызываю исключение "Не удалось сформировать отчет [ИмяОтчета]"
64 |
65 | Иначе
66 | И я нажимаю на кнопку "Сформировать"
67 | И я жду заполнение табличного документа 'ОтчетТабличныйДокумент' отчета "ИмяОтчета" в течение 60 секунд
68 | Если появилось предупреждение тогда
69 | Тогда я вызываю исключение "Не удалось сформировать отчет [ИмяОтчета]"
70 |
71 | И я закрыл все окна клиентского приложения
72 |
--------------------------------------------------------------------------------
/GitLab-CI/.gitlab-ci.yml:
--------------------------------------------------------------------------------
1 | before_script:
2 | - CHCP 65001
3 |
4 | stages:
5 | - build
6 | - test
7 | - report
8 | - release
9 |
10 | buildMaster:
11 | stage: build
12 | tags:
13 | - 1c-edt
14 | only:
15 | - master
16 | except:
17 | - schedules
18 | script:
19 | - executor_j11 -s $env:CI_SCRIPTS/1cicd.sbsl buildMaster
20 | artifacts:
21 | name: build
22 | paths:
23 | - build/
24 | - ci/
25 |
26 | buildMergeRequest:
27 | stage: build
28 | tags:
29 | - 1c-edt
30 | only:
31 | - merge_requests
32 | script:
33 | - executor_j11 -s $env:CI_SCRIPTS/1cicd.sbsl buildMergeRequest
34 | artifacts:
35 | name: build
36 | paths:
37 | - build/
38 | - ci/
39 |
40 | buildRelease:
41 | stage: build
42 | tags:
43 | - 1c-edt
44 | only:
45 | - schedules
46 | script:
47 | - executor_j11 -s $env:CI_SCRIPTS/1cicd.sbsl buildRelease
48 | artifacts:
49 | name: build
50 | paths:
51 | - build/
52 | - ci/
53 |
54 | testCore:
55 | stage: test
56 | tags:
57 | - 1c-edt
58 | only:
59 | - master
60 | - schedules
61 | - merge_requests
62 | dependencies:
63 | - buildMaster
64 | - buildMergeRequest
65 | - buildRelease
66 | script:
67 | - executor_j11 -s $env:CI_SCRIPTS/1cicd.sbsl testCore
68 | artifacts:
69 | name: test
70 | reports:
71 | junit: test/junit/*.xml
72 | paths:
73 | - test/
74 | - ci/
75 |
76 | testUI:
77 | stage: test
78 | tags:
79 | - 1c-ui
80 | only:
81 | - schedules
82 | - merge_requests
83 | dependencies:
84 | - buildRelease
85 | - buildMergeRequest
86 | script:
87 | - executor_j11 -s $env:CI_SCRIPTS/1cicd.sbsl testUI
88 | artifacts:
89 | name: test
90 | reports:
91 | junit: test/junit/*.xml
92 | paths:
93 | - test/
94 | - ci/
95 |
96 | code_quality:
97 | stage: report
98 | tags:
99 | - 1c-edt
100 | only:
101 | - master
102 | - merge_requests
103 | except:
104 | - schedules
105 | dependencies:
106 | - testCore
107 | script:
108 | - executor_j11 -s $env:CI_SCRIPTS/1cicd.sbsl qualityCode
109 | artifacts:
110 | reports:
111 | codequality: test/codequality/*.json
112 | paths:
113 | - test/
114 | - ci/
115 |
116 | sonarQube:
117 | stage: report
118 | tags:
119 | - 1c-edt
120 | only:
121 | - master
122 | except:
123 | - schedules
124 | dependencies:
125 | - testCore
126 | script:
127 | - executor_j11 -s $env:CI_SCRIPTS/1cicd.sbsl sonarQube
128 | artifacts:
129 | paths:
130 | - test/
131 | - ci/
132 |
133 | pages:
134 | stage: report
135 | tags:
136 | - 1c-edt
137 | only:
138 | - schedules
139 | - merge_requests
140 | dependencies:
141 | - testUI
142 | script:
143 | - executor_j11 -s $env:CI_SCRIPTS/1cicd.sbsl pages
144 | artifacts:
145 | paths:
146 | - ci/
147 | - public/
148 | environment:
149 | name: allure
150 | url: https://${CI_SERVER_HOST}/${CI_PROJECT_PATH}/-/jobs/${CI_JOB_ID}/artifacts/file/public/index.html
151 |
152 | release:
153 | stage: release
154 | tags:
155 | - 1c-edt
156 | only:
157 | - schedules
158 | dependencies:
159 | - testCore
160 | - testUI
161 | - pages
162 | script:
163 | - executor_j11 -s $env:CI_SCRIPTS/1cicd.sbsl release
164 |
--------------------------------------------------------------------------------
/Библиотеки/ЗапускСкриптов.sbsl:
--------------------------------------------------------------------------------
1 | /*******************************************************************************
2 | * Copyright (c) 2020 Alexander Kapralov and Contributors
3 | * This program and the accompanying materials are made available under
4 | * the terms of the BSD 3-Clause License which is available at
5 | * https://spdx.org/licenses/BSD-3-Clause.html#licenseText
6 | *
7 | * SPDX-License-Identifier: BSD-3-Clause
8 | *
9 | * Contributors:
10 | *
11 | *
12 | ******************************************************************************/
13 |
14 | /*
15 | * Методы для вызова других скриптов. Необходимо копировать в свой скрипт
16 | */
17 |
18 | метод ВыполнитьСкрипт(имяФайлаСкрипта: Строка, имяКомандыСкрипта: Строка, параметрыСкрипта: Массив): ПотокЧтения
19 | пер расширениеИсполнителя: Строка
20 | знч имяОС = СредаИсполнения.ПолучитьСвойство("os.name")
21 | выбор когда имяОС.НачинаетсяС("windows", Истина)
22 | расширениеИсполнителя = "cmd"
23 | иначе
24 | расширениеИсполнителя = "sh"
25 | ;
26 | знч путьКИсполнителю = СредаИсполнения.ПолучитьСвойство("logback.configurationFile").Удалить("config" + Файлы.СимволРазделителя
27 | + "logback.xml") + "bin/executor_j11." + расширениеИсполнителя
28 |
29 | знч командаТекущегоСкрипта = СредаИсполнения.ПолучитьСвойство("sun.java.command")
30 | пер имяФайлаТекущегоСкрипта = командаТекущегоСкрипта.Подстрока(0, командаТекущегоСкрипта.Найти(".sbsl") + 5)
31 | имяФайлаТекущегоСкрипта = имяФайлаТекущегоСкрипта.Подстрока(имяФайлаТекущегоСкрипта.Найти(" ") + 1)
32 | имяФайлаТекущегоСкрипта = имяФайлаТекущегоСкрипта.Подстрока(имяФайлаТекущегоСкрипта.Найти(" ") + 1)
33 | знч файлТекущегоСкрипта = новый Файл(имяФайлаТекущегоСкрипта)
34 | пер путьТекущегоСкрипта = ""
35 | если файлТекущегоСкрипта.Каталог != Неопределено
36 | путьТекущегоСкрипта = файлТекущегоСкрипта.Каталог.Путь + Файлы.СимволРазделителя
37 | ;
38 |
39 | пер аргументыПроцессаОс = ["-s", путьТекущегоСкрипта + имяФайлаСкрипта, "-m", имяКомандыСкрипта]
40 | если не параметрыСкрипта.Пусто()
41 | аргументыПроцессаОс.ДобавитьВсе(параметрыСкрипта)
42 | ;
43 |
44 | знч библиотека = новый ПроцессОс(путьКИсполнителю, аргументыПроцессаОс, Ложь)
45 |
46 | библиотека.Запустить()
47 | библиотека.ОжидатьЗавершения()
48 |
49 | знч ошибкиВыполненияСкрипта = библиотека.ПолучитьПотокОшибок()
50 | знч текстОшибок = ошибкиВыполненияСкрипта.ПрочитатьКакТекст(КодировкаПотокаВыводаСкриптов())
51 | если не текстОшибок.Пусто()
52 | выбросить новый ИсключениеНедопустимоеСостояние(текстОшибок)
53 | ;
54 |
55 | возврат библиотека.ПотокВывода
56 | ;
57 |
58 | метод КодировкаПотокаВыводаСкриптов(): Строка
59 | возврат СредаИсполнения.ПолучитьСвойство("file.encoding")
60 | ;
61 |
62 | метод НастройкиПотокаВыводаСкриптов(): НастройкиЧтенияДанных
63 | пер настройкиПотокаВывода = новый НастройкиЧтенияДанных()
64 | настройкиПотокаВывода.Кодировка = КодировкаПотокаВыводаСкриптов()
65 |
66 | возврат настройкиПотокаВывода
67 | ;
68 |
69 | метод ОбъектИзПотокаВывода(потокВывода: ПотокЧтения): Строка|Массив|Соответствие
70 | пер массивСтрок: Массив
71 |
72 | знч результатВыполненияСкрипта = новый ЧтениеДанных(потокВывода, НастройкиПотокаВыводаСкриптов())
73 | пока не результатВыполненияСкрипта.ЧтениеЗавершено()
74 | знч прочитаннаяСтрока = результатВыполненияСкрипта.ПрочитатьСтроку()
75 |
76 | если прочитаннаяСтрока.Пусто()
77 | продолжить
78 | ;
79 |
80 | выбор прочитаннаяСтрока[0]
81 | когда "["
82 | знч результатМассивом = МассивИзСтроки(прочитаннаяСтрока)
83 | если результатМассивом.Размер() == 1
84 | массивСтрок.Добавить(результатМассивом[0])
85 | иначе
86 | возврат результатМассивом
87 | ;
88 | когда "{"
89 | возврат СоответствиеИзСтроки(прочитаннаяСтрока)
90 |
91 | иначе
92 | массивСтрок.Добавить(прочитаннаяСтрока)
93 | ;
94 | ;
95 | возврат массивСтрок
96 | ;
97 |
98 | метод МассивИзСтроки(строкаПотокаВывода: Строка): Массив
99 | знч результатСтрокой = строкаПотокаВывода.Подстрока(1, строкаПотокаВывода.Длина() - 1)
100 | знч результатМассивом = результатСтрокой.Разделить(", ", Ложь)
101 | возврат результатМассивом
102 | ;
103 |
104 | метод СоответствиеИзСтроки(строкаПотокаВывода: Строка): Соответствие
105 | пер результатСоответствием: Соответствие
106 |
107 | знч результатСтрокой = строкаПотокаВывода.Подстрока(1, строкаПотокаВывода.Длина() - 1)
108 |
109 | знч результатМассивом = результатСтрокой.Разделить(", ")
110 | для строкаРезультата из результатМассивом
111 | знч ключИЗначение = строкаРезультата.Разделить("=")
112 |
113 | результатСоответствием.Вставить(ключИЗначение[0], ключИЗначение[1])
114 | ;
115 |
116 | возврат результатСоответствием
117 | ;
--------------------------------------------------------------------------------
/VA-Тесты/steps/ПВР.feature:
--------------------------------------------------------------------------------
1 | #language: ru
2 |
3 | @tree
4 | @ExportScenarios
5 |
6 | Функциональность: Проверка ПВР
7 |
8 | Сценарий: Отсутствует право "ИмяПрава" для ПВР "ИмяПВР"
9 | Если объект "ПланВидовРасчета.[ИмяПВР]" недоступен по функциональным опциям
10 | Тогда я останавливаю выполнение сценария "Skipped"
11 |
12 | Если есть право "ИмяПрава" к объекту "ПланВидовРасчета.[ИмяПВР]" тогда
13 | Тогда я вызываю исключение "Ошибочно установлено право [ИмяПрава] для ПВР [ИмяПВР]"
14 |
15 | Сценарий: Открытие формы списка ПВР "ИмяПВР"
16 | Если объект "ПланВидовРасчета.[ИмяПВР]" недоступен по функциональным опциям
17 | Тогда я останавливаю выполнение сценария "Skipped"
18 |
19 | Если нет права "Просмотр" к объекту "ПланВидовРасчета.[ИмяПВР]" тогда
20 | Тогда я останавливаю выполнение сценария "Skipped"
21 |
22 | Дано я закрыл все окна клиентского приложения
23 | И я очищаю окно сообщений пользователю
24 |
25 | Дано я открываю основную форму списка плана видов расчета "ИмяПВР"
26 | Если появилось предупреждение тогда
27 | Тогда я вызываю исключение "Не удалось открыть форму списка ПВР [ИмяПВР]"
28 |
29 | И я закрыл все окна клиентского приложения
30 |
31 | Сценарий: Открытие формы существующего элемента ПВР "ИмяПВР"
32 | Если объект "ПланВидовРасчета.[ИмяПВР]" недоступен по функциональным опциям
33 | Тогда я останавливаю выполнение сценария "Skipped"
34 |
35 | Если нет права "Просмотр" к объекту "ПланВидовРасчета.[ИмяПВР]" тогда
36 | Тогда я останавливаю выполнение сценария "Skipped"
37 |
38 | Дано я ищу последние 5 элементов объекта "ПланВидовРасчета.[ИмяПВР]" в переменную "СписокЭлементов"
39 | Если '$СписокЭлементов$.Количество() = 0' Тогда
40 | Тогда я останавливаю выполнение сценария "Skipped"
41 |
42 | И для каждого значения "СсылкаПВР" из массива "$СписокЭлементов$"
43 | Дано я закрыл все окна клиентского приложения
44 | И я очищаю окно сообщений пользователю
45 |
46 | Тогда я запоминаю значение выражения 'ПолучитьНавигационнуюСсылку($СсылкаПВР$)' в переменную "НавигационнаяСсылкаПВР"
47 | Затем я открываю навигационную ссылку "$НавигационнаяСсылкаПВР$"
48 | Если появилось предупреждение тогда
49 | Тогда я вызываю исключение "Не удалось открыть навигационную ссылку $НавигационнаяСсылкаПВР$"
50 |
51 | И я закрыл все окна клиентского приложения
52 |
53 | Сценарий: Открытие формы нового элемента ПВР "ИмяПВР"
54 | Если объект "ПланВидовРасчета.[ИмяПВР]" недоступен по функциональным опциям
55 | Тогда я останавливаю выполнение сценария "Skipped"
56 |
57 | Если нет права "ИнтерактивноеДобавление" к объекту "ПланВидовРасчета.[ИмяПВР]" тогда
58 | Тогда я останавливаю выполнение сценария "Skipped"
59 |
60 | Дано я закрыл все окна клиентского приложения
61 | И я очищаю окно сообщений пользователю
62 |
63 | Дано я открываю основную форму плана видов расчета "ИмяПВР"
64 | Если появилось предупреждение тогда
65 | Тогда я вызываю исключение "Не удалось открыть основную форму элемента ПВР [ИмяПВР]"
66 |
67 | И я закрыл все окна клиентского приложения
68 |
69 | Сценарий: Перезапись существующего элемента ПВР "ИмяПВР"
70 | Если объект "ПланВидовРасчета.[ИмяПВР]" недоступен по функциональным опциям
71 | Тогда я останавливаю выполнение сценария "Skipped"
72 |
73 | Если нет права "ИнтерактивноеДобавление" к объекту "ПланВидовРасчета.[ИмяПВР]" тогда
74 | Тогда я останавливаю выполнение сценария "Skipped"
75 |
76 | Дано я ищу последние 5 элементов объекта "ПланВидовРасчета.[ИмяПВР]" в переменную "СписокЭлементов"
77 | Если '$СписокЭлементов$.Количество() = 0' Тогда
78 | Тогда я останавливаю выполнение сценария "Skipped"
79 |
80 | И для каждого значения "СсылкаПВР" из массива "$СписокЭлементов$"
81 | Дано я закрыл все окна клиентского приложения
82 | И я очищаю окно сообщений пользователю
83 |
84 | Тогда я запоминаю значение выражения 'ПолучитьНавигационнуюСсылку($СсылкаПВР$)' в переменную "НавигационнаяСсылкаПВР"
85 | Затем я открываю навигационную ссылку "$НавигационнаяСсылкаПВР$"
86 | Если появилось предупреждение тогда
87 | Тогда я вызываю исключение "Не удалось открыть навигационную ссылку $НавигационнаяСсылкаПВР$"
88 | И я нажимаю на кнопку "Записать и закрыть"
89 | Если появилось предупреждение тогда
90 | Тогда я вызываю исключение "Не удалось перезаписать элемент ПВР $НавигационнаяСсылкаПВР$"
91 | Если в текущем окне есть сообщения пользователю Тогда
92 | Тогда я вызываю исключение с текстом сообщения
93 |
94 | И я закрыл все окна клиентского приложения
95 |
96 | Сценарий: Печать существующего элемента ПВР "ИмяПВР"
97 | Если объект "ПланВидовРасчета.[ИмяПВР]" недоступен по функциональным опциям
98 | Тогда я останавливаю выполнение сценария "Skipped"
99 |
100 | Если нет права "Просмотр" к объекту "ПланВидовРасчета.[ИмяПВР]" тогда
101 | Тогда я останавливаю выполнение сценария "Skipped"
102 |
103 | Дано я получаю список команд печати для объекта метаданных "ПланВидовРасчета.[ИмяПВР]" в переменную "СписокПечатныхФорм"
104 | Если '$СписокПечатныхФорм$.Количество() = 0' Тогда
105 | Тогда я останавливаю выполнение сценария "Skipped"
106 |
107 | Дано я ищу последние 5 элементов объекта "ПланВидовРасчета.[ИмяПВР]" в переменную "СписокЭлементов"
108 | Если '$СписокЭлементов$.Количество() = 0' Тогда
109 | Тогда я останавливаю выполнение сценария "Skipped"
110 |
111 | И для каждого значения "СсылкаПВР" из массива "$СписокЭлементов$"
112 | Дано я закрыл все окна клиентского приложения
113 | И я очищаю окно сообщений пользователю
114 |
115 | Тогда я запоминаю значение выражения 'ПолучитьНавигационнуюСсылку($СсылкаПВР$)' в переменную "НавигационнаяСсылкаПВР"
116 | Затем я открываю навигационную ссылку "$НавигационнаяСсылкаПВР$"
117 | Если появилось предупреждение тогда
118 | Тогда я вызываю исключение "Не удалось открыть навигационную ссылку $НавигационнаяСсылкаПВР$"
119 | И для каждого значения "ПечатнаяФормаОбъекта" из массива "$СписокПечатныхФорм$"
120 | Тогда я запоминаю значение выражения '$ПечатнаяФормаОбъекта$.Представление' в переменную "НаименованиеПечатнойФормы"
121 | Если элемент с заголовком "$НаименованиеПечатнойФормы$" присутствует на форме тогда
122 | Тогда я нажимаю на кнопку "$НаименованиеПечатнойФормы$"
123 | Если появилось предупреждение тогда
124 | Тогда я вызываю исключение "Не удалось напечатать форму $НаименованиеПечатнойФормы$ для элемента ПВР $НавигационнаяСсылкаПВР$"
125 | И я закрываю текущее окно
126 |
127 | И я закрыл все окна клиентского приложения
128 |
--------------------------------------------------------------------------------
/VA-Тесты/steps/Справочники.feature:
--------------------------------------------------------------------------------
1 | #language: ru
2 |
3 | @tree
4 | @ExportScenarios
5 |
6 | Функциональность: Проверка Справочников
7 |
8 | Сценарий: Отсутствует право "ИмяПрава" для справочника "ИмяСправочника"
9 | Если объект "Справочник.[ИмяСправочника]" недоступен по функциональным опциям
10 | Тогда я останавливаю выполнение сценария "Skipped"
11 |
12 | Если есть право "ИмяПрава" к объекту "Справочник.[ИмяСправочника]" тогда
13 | Тогда я вызываю исключение "Ошибочно установлено право [ИмяПрава] для справочника [ИмяСправочника]"
14 |
15 | Сценарий: Открытие формы списка справочника "ИмяСправочника"
16 | Если объект "Справочник.[ИмяСправочника]" недоступен по функциональным опциям
17 | Тогда я останавливаю выполнение сценария "Skipped"
18 |
19 | Если нет права "Просмотр" к объекту "Справочник.[ИмяСправочника]" тогда
20 | Тогда я останавливаю выполнение сценария "Skipped"
21 |
22 | Дано я закрыл все окна клиентского приложения
23 | И я очищаю окно сообщений пользователю
24 |
25 | Дано я открываю основную форму списка справочника "ИмяСправочника"
26 | Если появилось предупреждение тогда
27 | Тогда я вызываю исключение "Не удалось открыть форму списка справочника [ИмяСправочника]"
28 |
29 | И я закрыл все окна клиентского приложения
30 |
31 | Сценарий: Открытие формы существующего элемента справочника "ИмяСправочника"
32 | Если объект "Справочник.[ИмяСправочника]" недоступен по функциональным опциям
33 | Тогда я останавливаю выполнение сценария "Skipped"
34 |
35 | Если нет права "Просмотр" к объекту "Справочник.[ИмяСправочника]" тогда
36 | Тогда я останавливаю выполнение сценария "Skipped"
37 |
38 | Дано я ищу последние 5 элементов объекта "Справочник.[ИмяСправочника]" в переменную "СписокЭлементов"
39 | Если '$СписокЭлементов$.Количество() = 0' Тогда
40 | Тогда я останавливаю выполнение сценария "Skipped"
41 |
42 | И для каждого значения "СсылкаСправочника" из массива "$СписокЭлементов$"
43 | Дано я закрыл все окна клиентского приложения
44 | И я очищаю окно сообщений пользователю
45 |
46 | Тогда я запоминаю значение выражения 'ПолучитьНавигационнуюСсылку($СсылкаСправочника$)' в переменную "НавигационнаяСсылкаСправочника"
47 | Затем я открываю навигационную ссылку "$НавигационнаяСсылкаСправочника$"
48 | Если появилось предупреждение тогда
49 | Тогда я вызываю исключение "Не удалось открыть навигационную ссылку $НавигационнаяСсылкаСправочника$"
50 |
51 | И я закрыл все окна клиентского приложения
52 |
53 | Сценарий: Открытие формы нового элемента справочника "ИмяСправочника"
54 | Если объект "Справочник.[ИмяСправочника]" недоступен по функциональным опциям
55 | Тогда я останавливаю выполнение сценария "Skipped"
56 |
57 | Если нет права "ИнтерактивноеДобавление" к объекту "Справочник.[ИмяСправочника]" тогда
58 | Тогда я останавливаю выполнение сценария "Skipped"
59 |
60 | Дано я закрыл все окна клиентского приложения
61 | И я очищаю окно сообщений пользователю
62 |
63 | Дано я открываю основную форму справочника "ИмяСправочника"
64 | Если появилось предупреждение тогда
65 | Тогда я вызываю исключение "Не удалось открыть основную форму элемента справочника [ИмяСправочника]"
66 |
67 | И я закрыл все окна клиентского приложения
68 |
69 | Сценарий: Перезапись существующего элемента справочника "ИмяСправочника"
70 | Если объект "Справочник.[ИмяСправочника]" недоступен по функциональным опциям
71 | Тогда я останавливаю выполнение сценария "Skipped"
72 |
73 | Если нет права "ИнтерактивноеДобавление" к объекту "Справочник.[ИмяСправочника]" тогда
74 | Тогда я останавливаю выполнение сценария "Skipped"
75 |
76 | Дано я ищу последние 5 элементов объекта "Справочник.[ИмяСправочника]" в переменную "СписокЭлементов"
77 | Если '$СписокЭлементов$.Количество() = 0' Тогда
78 | Тогда я останавливаю выполнение сценария "Skipped"
79 |
80 | И для каждого значения "СсылкаСправочника" из массива "$СписокЭлементов$"
81 | Дано я закрыл все окна клиентского приложения
82 | И я очищаю окно сообщений пользователю
83 |
84 | Тогда я запоминаю значение выражения 'ПолучитьНавигационнуюСсылку($СсылкаСправочника$)' в переменную "НавигационнаяСсылкаСправочника"
85 | Затем я открываю навигационную ссылку "$НавигационнаяСсылкаСправочника$"
86 | Если появилось предупреждение тогда
87 | Тогда я вызываю исключение "Не удалось открыть навигационную ссылку $НавигационнаяСсылкаСправочника$"
88 | И я нажимаю на кнопку "Записать и закрыть"
89 | Если появилось предупреждение тогда
90 | Тогда я вызываю исключение "Не удалось перезаписать элемент справочника $НавигационнаяСсылкаСправочника$"
91 | Если в текущем окне есть сообщения пользователю Тогда
92 | Тогда я вызываю исключение с текстом сообщения
93 |
94 | И я закрыл все окна клиентского приложения
95 |
96 | Сценарий: Печать существующего элемента справочника "ИмяСправочника"
97 | Если объект "Справочник.[ИмяСправочника]" недоступен по функциональным опциям
98 | Тогда я останавливаю выполнение сценария "Skipped"
99 |
100 | Если нет права "Просмотр" к объекту "Справочник.[ИмяСправочника]" тогда
101 | Тогда я останавливаю выполнение сценария "Skipped"
102 |
103 | Дано я получаю список команд печати для объекта метаданных "Справочник.[ИмяСправочника]" в переменную "СписокПечатныхФорм"
104 | Если '$СписокПечатныхФорм$.Количество() = 0' Тогда
105 | Тогда я останавливаю выполнение сценария "Skipped"
106 |
107 | Дано я ищу последние 5 элементов объекта "Справочник.[ИмяСправочника]" в переменную "СписокЭлементов"
108 | Если '$СписокЭлементов$.Количество() = 0' Тогда
109 | Тогда я останавливаю выполнение сценария "Skipped"
110 |
111 | И для каждого значения "СсылкаСправочника" из массива "$СписокЭлементов$"
112 | Дано я закрыл все окна клиентского приложения
113 | И я очищаю окно сообщений пользователю
114 |
115 | Тогда я запоминаю значение выражения 'ПолучитьНавигационнуюСсылку($СсылкаСправочника$)' в переменную "НавигационнаяСсылкаСправочника"
116 | Затем я открываю навигационную ссылку "$НавигационнаяСсылкаСправочника$"
117 | Если появилось предупреждение тогда
118 | Тогда я вызываю исключение "Не удалось открыть навигационную ссылку $НавигационнаяСсылкаСправочника$"
119 | И для каждого значения "ПечатнаяФормаОбъекта" из массива "$СписокПечатныхФорм$"
120 | Тогда я запоминаю значение выражения '$ПечатнаяФормаОбъекта$.Представление' в переменную "НаименованиеПечатнойФормы"
121 | Если элемент с заголовком "$НаименованиеПечатнойФормы$" присутствует на форме тогда
122 | Тогда я нажимаю на кнопку "$НаименованиеПечатнойФормы$"
123 | Если появилось предупреждение тогда
124 | Тогда я вызываю исключение "Не удалось напечатать форму $НаименованиеПечатнойФормы$ для элемента справочника $НавигационнаяСсылкаСправочника$"
125 | И я закрываю текущее окно
126 |
127 | И я закрыл все окна клиентского приложения
128 |
--------------------------------------------------------------------------------
/Библиотеки/ПутьКПлатформеПроекта.sbsl:
--------------------------------------------------------------------------------
1 | #!/usr/bin/executor
2 |
3 | /*******************************************************************************
4 | * Copyright (c) 2020 Alexander Kapralov and Contributors
5 | * This program and the accompanying materials are made available under
6 | * the terms of the BSD 3-Clause License which is available at
7 | * https://spdx.org/licenses/BSD-3-Clause.html#licenseText
8 | *
9 | * SPDX-License-Identifier: BSD-3-Clause
10 | *
11 | * Contributors:
12 | *
13 | *
14 | ******************************************************************************/
15 |
16 | метод Скрипт(путьККонфигурацииЕДТ: Строка): Строка
17 | знч версияПлатформы = ВерсияПлатформыПроекта(путьККонфигурацииЕДТ)
18 |
19 | возврат ПутьКПлатформеПоМаксимальнойСборке(версияПлатформы)
20 | ;
21 |
22 | метод ВерсияПлатформыПроекта(путьККонфигурацииЕДТ: Строка): Строка
23 | пер версияПлатформы: Строка = ""
24 |
25 | знч файлПроекта = новый Файл(путьККонфигурацииЕДТ + Файлы.СимволРазделителя + "DT-INF/PROJECT.PMF")
26 | если не файлПроекта.Существует()
27 | знч текстОшибки = "В указанном каталоге не найден файл PROJECT.PMF"
28 | выбросить новый ИсключениеНедопустимоеСостояние(текстОшибки)
29 | ;
30 |
31 | знч чтение = новый ЧтениеДанных(файлПроекта.ОткрытьПотокЧтения())
32 | пока не чтение.ЧтениеЗавершено()
33 | знч строкаФайла = чтение.ПрочитатьСтроку()
34 | знч ключИЗначение = строкаФайла.Разделить(": ")
35 | если ключИЗначение[0] == "Runtime-Version"
36 | версияПлатформы = ключИЗначение[1]
37 | прервать
38 | ;
39 | ;
40 |
41 | возврат версияПлатформы
42 | ;
43 |
44 | метод ПутьКПлатформеПоМаксимальнойСборке(версияПлатформы: Строка): Строка
45 | знч максимальныеПлатформы = МаксимальныеПлатформы()
46 |
47 | пер путьКПлатформе = максимальныеПлатформы.Получить(версияПлатформы)
48 | если путьКПлатформе == Неопределено
49 | знч текстОшибки = Строки.Шаблон("Не найдена установленная платформа $0", версияПлатформы)
50 | выбросить новый ИсключениеНедопустимоеСостояние(текстОшибки)
51 | ;
52 | путьКПлатформе = путьКПлатформе + "/bin/1cv8"
53 |
54 | возврат путьКПлатформе
55 | ;
56 |
57 | метод МаксимальныеПлатформы(): Соответствие
58 | знч потокВывода = ВыполнитьСкрипт("УстановленныеПлатформы83.sbsl", "МаксимальныеПлатформы", [])
59 | знч максимальныеПлатформы = ОбъектИзПотокаВывода(потокВывода) как Соответствие
60 |
61 | возврат максимальныеПлатформы
62 | ;
63 |
64 | /*
65 | * Методы для вызова других скриптов. Необходимо копировать в свой скрипт
66 | */
67 | метод ВыполнитьСкрипт(имяФайлаСкрипта: Строка, имяКомандыСкрипта: Строка, параметрыСкрипта: Массив): ПотокЧтения
68 | пер расширениеИсполнителя: Строка
69 | знч имяОС = СредаИсполнения.ПолучитьСвойство("os.name")
70 | выбор когда имяОС.НачинаетсяС("windows", Истина)
71 | расширениеИсполнителя = "cmd"
72 | иначе
73 | расширениеИсполнителя = "sh"
74 | ;
75 | знч путьКИсполнителю = СредаИсполнения.ПолучитьСвойство("logback.configurationFile").Удалить("config" + Файлы.СимволРазделителя
76 | + "logback.xml") + "bin/executor_j11." + расширениеИсполнителя
77 |
78 | знч командаТекущегоСкрипта = СредаИсполнения.ПолучитьСвойство("sun.java.command")
79 | пер имяФайлаТекущегоСкрипта = командаТекущегоСкрипта.Подстрока(0, командаТекущегоСкрипта.Найти(".sbsl") + 5)
80 | имяФайлаТекущегоСкрипта = имяФайлаТекущегоСкрипта.Подстрока(имяФайлаТекущегоСкрипта.Найти(" ") + 1)
81 | имяФайлаТекущегоСкрипта = имяФайлаТекущегоСкрипта.Подстрока(имяФайлаТекущегоСкрипта.Найти(" ") + 1)
82 | знч файлТекущегоСкрипта = новый Файл(имяФайлаТекущегоСкрипта)
83 | пер путьТекущегоСкрипта = ""
84 | если файлТекущегоСкрипта.Каталог != Неопределено
85 | путьТекущегоСкрипта = файлТекущегоСкрипта.Каталог.Путь + Файлы.СимволРазделителя
86 | ;
87 |
88 | пер аргументыПроцессаОс = ["-s", путьТекущегоСкрипта + имяФайлаСкрипта, "-m", имяКомандыСкрипта]
89 | если не параметрыСкрипта.Пусто()
90 | аргументыПроцессаОс.ДобавитьВсе(параметрыСкрипта)
91 | ;
92 |
93 | знч библиотека = новый ПроцессОс(путьКИсполнителю, аргументыПроцессаОс, Ложь)
94 |
95 | библиотека.Запустить()
96 | библиотека.ОжидатьЗавершения()
97 |
98 | знч ошибкиВыполненияСкрипта = библиотека.ПолучитьПотокОшибок()
99 | знч текстОшибок = ошибкиВыполненияСкрипта.ПрочитатьКакТекст(КодировкаПотокаВыводаСкриптов())
100 | если не текстОшибок.Пусто()
101 | выбросить новый ИсключениеНедопустимоеСостояние(текстОшибок)
102 | ;
103 |
104 | возврат библиотека.ПотокВывода
105 | ;
106 |
107 | метод КодировкаПотокаВыводаСкриптов(): Строка
108 | возврат СредаИсполнения.ПолучитьСвойство("file.encoding")
109 | ;
110 |
111 | метод НастройкиПотокаВыводаСкриптов(): НастройкиЧтенияДанных
112 | пер настройкиПотокаВывода = новый НастройкиЧтенияДанных()
113 | настройкиПотокаВывода.Кодировка = КодировкаПотокаВыводаСкриптов()
114 |
115 | возврат настройкиПотокаВывода
116 | ;
117 |
118 | метод ОбъектИзПотокаВывода(потокВывода: ПотокЧтения): Строка|Массив|Соответствие
119 | пер массивСтрок: Массив
120 |
121 | знч результатВыполненияСкрипта = новый ЧтениеДанных(потокВывода, НастройкиПотокаВыводаСкриптов())
122 | пока не результатВыполненияСкрипта.ЧтениеЗавершено()
123 | знч прочитаннаяСтрока = результатВыполненияСкрипта.ПрочитатьСтроку()
124 |
125 | если прочитаннаяСтрока.Пусто()
126 | продолжить
127 | ;
128 |
129 | выбор прочитаннаяСтрока[0]
130 | когда "["
131 | знч результатМассивом = МассивИзСтроки(прочитаннаяСтрока)
132 | если результатМассивом.Размер() == 1
133 | массивСтрок.Добавить(результатМассивом[0])
134 | иначе
135 | возврат результатМассивом
136 | ;
137 | когда "{"
138 | возврат СоответствиеИзСтроки(прочитаннаяСтрока)
139 |
140 | иначе
141 | массивСтрок.Добавить(прочитаннаяСтрока)
142 | ;
143 | ;
144 | возврат массивСтрок
145 | ;
146 |
147 | метод МассивИзСтроки(строкаПотокаВывода: Строка): Массив
148 | знч результатСтрокой = строкаПотокаВывода.Подстрока(1, строкаПотокаВывода.Длина() - 1)
149 | знч результатМассивом = результатСтрокой.Разделить(", ", Ложь)
150 | возврат результатМассивом
151 | ;
152 |
153 | метод СоответствиеИзСтроки(строкаПотокаВывода: Строка): Соответствие
154 | пер результатСоответствием: Соответствие
155 |
156 | знч результатСтрокой = строкаПотокаВывода.Подстрока(1, строкаПотокаВывода.Длина() - 1)
157 |
158 | знч результатМассивом = результатСтрокой.Разделить(", ")
159 | для строкаРезультата из результатМассивом
160 | знч ключИЗначение = строкаРезультата.Разделить("=")
161 |
162 | результатСоответствием.Вставить(ключИЗначение[0], ключИЗначение[1])
163 | ;
164 |
165 | возврат результатСоответствием
166 | ;
--------------------------------------------------------------------------------
/Библиотеки/СписокИнформационныхБаз.sbsl:
--------------------------------------------------------------------------------
1 | /*******************************************************************************
2 | * Copyright (c) 2020 Alexander Kapralov and Contributors
3 | * This program and the accompanying materials are made available under
4 | * the terms of the BSD 3-Clause License which is available at
5 | * https://spdx.org/licenses/BSD-3-Clause.html#licenseText
6 | *
7 | * SPDX-License-Identifier: BSD-3-Clause
8 | *
9 | * Contributors:
10 | *
11 | *
12 | ******************************************************************************/
13 |
14 | перечисление ОперационныеСистемы
15 | Windows,
16 | MacOS,
17 | Linux
18 | ;
19 |
20 | перечисление ClientConnectionSpeed
21 | Normal,
22 | Low
23 | ;
24 |
25 | перечисление WA
26 | OS,
27 | Login
28 | ;
29 |
30 | перечисление App
31 | Auto,
32 | ThinClient,
33 | ThickClient,
34 | WebClient
35 | ;
36 |
37 |
38 | структура ОписаниеБазы
39 | пер connect: Строка = ""
40 | пер id: Ууид
41 | пер folder: Строка = ""
42 | пер clientConnectionSpeed: ClientConnectionSpeed = ClientConnectionSpeed.Normal
43 | пер wa: WA = WA.Login
44 | пер app: App = App.Auto
45 | пер version: Строка = ""
46 | пер additionalParameters: Строка = ""
47 |
48 | знч __свойства: Массив = ["connect", "id", "folder", "clientConnectionSpeed", "wa", "app", "version", "additionalParameters"]
49 |
50 | конструктор()
51 | ;
52 |
53 |
54 | метод ИспользуемаяОС(): ОперационныеСистемы
55 | знч имяОС = СредаИсполнения.ПолучитьСвойство("os.name")
56 |
57 | выбор
58 | когда имяОС.НачинаетсяС("windows", Истина)
59 | возврат ОперационныеСистемы.Windows
60 |
61 | когда имяОС.Содержит("mac", Истина)
62 | возврат ОперационныеСистемы.MacOS
63 |
64 | когда имяОС.Содержит("nux", Истина)
65 | возврат ОперационныеСистемы.Linux
66 |
67 | иначе
68 | выбросить новый ИсключениеНедопустимоеСостояние("Неизвестная ОС")
69 | ;
70 | ;
71 |
72 | метод ПутьКСпискуБаз(): Строка
73 | знч текущаяОС = ИспользуемаяОС()
74 |
75 | пер путьКСпискуБаз = Файлы.ПолучитьДомашнийКаталог().Путь
76 |
77 | выбор текущаяОС
78 | когда ОперационныеСистемы.Windows
79 | путьКСпискуБаз += "\\AppData\\Roaming\\1C\\1CEStart\\"
80 |
81 | когда ОперационныеСистемы.MacOS
82 | путьКСпискуБаз += "/.1C/1cestart/"
83 |
84 | когда ОперационныеСистемы.Linux
85 | путьКСпискуБаз += "/.1C/1cestart/"
86 | иначе
87 | выбросить новый ИсключениеНедопустимоеСостояние("Неподдерживаемая ОС")
88 | ;
89 |
90 | возврат путьКСпискуБаз
91 | ;
92 |
93 | метод СписокБаз(): Соответствие
94 | пер списокБаз: Соответствие
95 |
96 | знч файлСпискаБаз = новый Файл(ПутьКСпискуБаз() + "ibases.v8i")
97 |
98 | знч данныеСпискаБаз = новый ЧтениеДанных(файлСпискаБаз.ОткрытьПотокЧтения())
99 |
100 | данныеСпискаБаз.ПрочитатьСтроку(, "[")
101 | пока не данныеСпискаБаз.ЧтениеЗавершено()
102 | знч описаниеБазыСтрокой = данныеСпискаБаз.ПрочитатьСтроку(, "[")
103 |
104 | знч имяИПараметрыБазы = описаниеБазыСтрокой.Разделить("]", Ложь)
105 |
106 | знч имяБазы = имяИПараметрыБазы[0]
107 | знч параметрыБазы = имяИПараметрыБазы[1].ПолучитьСтроки()
108 |
109 | пер описаниеБазы = новый ОписаниеБазы()
110 |
111 | для параметрБазы из параметрыБазы
112 | знч позицияРазделителя = параметрБазы.Найти("=")
113 |
114 | если позицияРазделителя == -1
115 | продолжить
116 | ;
117 |
118 | знч имяПараметра = параметрБазы.ПодстрокаСНачала(позицияРазделителя)
119 | знч значениеПараметра = параметрБазы.Подстрока(позицияРазделителя + 1)
120 |
121 | выбор имяПараметра
122 | когда "Connect"
123 | описаниеБазы.connect = значениеПараметра
124 |
125 | когда "ID"
126 | описаниеБазы.id = новый Ууид(значениеПараметра)
127 |
128 | когда "OrderInList"
129 | // Нечего делать
130 | когда "Folder"
131 | описаниеБазы.folder = значениеПараметра
132 |
133 | когда "OrderInTree"
134 | // Нечего делать
135 | когда "External"
136 | // Нечего делать
137 | когда "ClientConnectionSpeed"
138 | выбор значениеПараметра
139 | когда "Normal"
140 | описаниеБазы.clientConnectionSpeed = ClientConnectionSpeed.Normal
141 | когда "Low"
142 | описаниеБазы.clientConnectionSpeed = ClientConnectionSpeed.Low
143 | иначе
144 | выбросить новый ИсключениеНедопустимоеСостояние(
145 | "Неизвестный ClientConnectionSpeed: %значениеПараметра")
146 | ;
147 |
148 | когда "App"
149 | выбор значениеПараметра
150 | когда "Auto"
151 | описаниеБазы.app = App.Auto
152 | когда "ThickClient"
153 | описаниеБазы.app = App.ThickClient
154 | когда "ThinClient"
155 | описаниеБазы.app = App.ThinClient
156 | когда "WebClient"
157 | описаниеБазы.app = App.WebClient
158 | иначе
159 | выбросить новый ИсключениеНедопустимоеСостояние("Неизвестный App: %значениеПараметра")
160 | ;
161 |
162 | когда "WA"
163 | выбор значениеПараметра
164 | когда "0"
165 | описаниеБазы.wa = WA.Login
166 | когда "1"
167 | описаниеБазы.wa = WA.OS
168 | иначе
169 | выбросить новый ИсключениеНедопустимоеСостояние(
170 | "Неизвестный ClientConnectionSpeed: %значениеПараметра")
171 | ;
172 |
173 | когда "Version"
174 | описаниеБазы.version = значениеПараметра
175 |
176 | когда "AdditionalParameters"
177 | описаниеБазы.additionalParameters = значениеПараметра
178 |
179 | когда "DefaultApp"
180 | // Нечего делать
181 | когда "AppArch"
182 | // Нечего делать
183 | когда "DefaultVersion"
184 | // Нечего делать
185 | когда "UseProxy"
186 | // Нечего делать
187 | когда "HttpsCA"
188 | // Нечего делать
189 | когда "HttpsCert"
190 | // Нечего делать
191 | когда "HttpsCertSelect"
192 | // Нечего делать
193 | когда "WSA"
194 | // Нечего делать
195 | иначе
196 | выбросить новый ИсключениеНедопустимоеСостояние("Неизвестный параметр: %имяПараметра")
197 | ;
198 | ;
199 |
200 | списокБаз.Вставить(имяБазы, описаниеБазы)
201 | ;
202 |
203 | возврат списокБаз
204 | ;
205 |
206 | метод ИспользуемыеВерсии(): Множество
207 | знч списокБаз = СписокБаз()
208 |
209 | пер списокВерсий: Множество
210 |
211 | для база из списокБаз
212 | знч версия = база.Значение.version
213 |
214 | если версия == "" или версия.ЧислоВхождений(".") != 3
215 | продолжить
216 | ;
217 |
218 | списокВерсий.Добавить(база.Ключ + "|" + версия)
219 | ;
220 |
221 | возврат списокВерсий
222 | ;
223 |
224 | метод ДоступныеБазы()
225 | знч списокБаз = СписокБаз()
226 |
227 | для база из списокБаз
228 | Консоль.Записать(база.Ключ)
229 |
230 | знч описаниеБазы: ОписаниеБазы = база.Значение
231 |
232 | для параметр из описаниеБазы.__свойства
233 | Консоль.Записать(" " + параметр + "|" + описаниеБазы[параметр])
234 | ;
235 | ;
236 | ;
--------------------------------------------------------------------------------
/Библиотеки/АгентКонфигуратора.sbsl:
--------------------------------------------------------------------------------
1 | #!/usr/bin/executor
2 |
3 | /*******************************************************************************
4 | * Copyright (c) 2020 Alexander Kapralov and Contributors
5 | * This program and the accompanying materials are made available under
6 | * the terms of the BSD 3-Clause License which is available at
7 | * https://spdx.org/licenses/BSD-3-Clause.html#licenseText
8 | *
9 | * SPDX-License-Identifier: BSD-3-Clause
10 | *
11 | * Contributors:
12 | *
13 | *
14 | ******************************************************************************/
15 |
16 | метод ОбработатьРезультатВыводаАгента(поток: ПотокЧтения, консольАгента: КонсольSsh, процессАгента: ПроцессОс)
17 | пер естьОшибки = Ложь
18 |
19 | знч результаты = СериализацияJson.ПрочитатьМассив(поток)
20 |
21 | пер сообщенияLog = новый Массив()
22 |
23 | для результат из результаты
24 | знч типСообщения = результат.Получить("type") как Строка
25 | знч текстСообщения = результат.Получить("message") как Строка
26 |
27 | если не текстСообщения.Пусто()
28 | если типСообщения == "log"
29 | сообщенияLog.Добавить(текстСообщения)
30 | иначе
31 | Консоль.Записать("%типСообщения: %текстСообщения")
32 | ;
33 | ;
34 | если типСообщения != "success" и типСообщения != "progress"
35 | естьОшибки = Истина
36 | ;
37 | ;
38 |
39 | если не сообщенияLog.Пусто()
40 | Консоль.Записать("Лог:")
41 | для строкаСообщения из сообщенияLog
42 | Консоль.Записать(строкаСообщения)
43 | ;
44 | ;
45 |
46 | если естьОшибки
47 | AgentDisconnectDB(консольАгента, процессАгента)
48 | ЗавершитьПроцессАгента(процессАгента)
49 | выбросить новый ИсключениеНедопустимоеСостояние()
50 | ;
51 | ;
52 |
53 | метод ВыполнитьКомандуАгента(команда: Строка, консольАгента: КонсольSsh, процессАгента: ПроцессОс)
54 | знч CI_PROJECT_DIR = СредаИсполнения.ПолучитьПеременную("CI_PROJECT_DIR")
55 | команда = команда.Заменить(CI_PROJECT_DIR, "")
56 |
57 | пер результаты = консольАгента.Выполнить(команда)
58 |
59 | ОбработатьРезультатВыводаАгента(результаты, консольАгента, процессАгента)
60 |
61 | результаты.Закрыть()
62 | ;
63 |
64 | метод ВыполнитьСОжиданиемКомандуАгента(команда: Строка, консольАгента: КонсольSsh, процессАгента: ПроцессОс)
65 | знч CI_PROJECT_DIR = СредаИсполнения.ПолучитьПеременную("CI_PROJECT_DIR")
66 | команда = команда.Заменить(CI_PROJECT_DIR, "")
67 |
68 | консольАгента.Отправить(команда)
69 |
70 | пока не консольАгента.ОжидатьПриглашение(60с)
71 | ОбработатьРезультатВыводаАгента(консольАгента.Вывод, консольАгента, процессАгента)
72 | ;
73 |
74 | ОбработатьРезультатВыводаАгента(консольАгента.Вывод, консольАгента, процессАгента)
75 | ;
76 |
77 | метод ЗапуститьПроцессАгента(путьКИБ: Строка, имяФайлаПлатформы: Строка, рабочийКаталог: Строка): ПроцессОс
78 | пер параметрыПроцесса = новый Массив()
79 | параметрыПроцесса.Добавить("DESIGNER")
80 | параметрыПроцесса.Добавить("/IBConnectionString")
81 | параметрыПроцесса.Добавить("File=\"%путьКИБ\"")
82 | параметрыПроцесса.Добавить("/AgentMode")
83 | параметрыПроцесса.Добавить("/AgentSSHHostKeyAuto")
84 | параметрыПроцесса.Добавить("/AgentBaseDir ")
85 | параметрыПроцесса.Добавить(рабочийКаталог)
86 | параметрыПроцесса.Добавить("/Visible")
87 |
88 | пер процессАгента = новый ПроцессОс(имяФайлаПлатформы, параметрыПроцесса)
89 | процессАгента.Запустить()
90 | Консоль.Записать("Процесс агента запущен.")
91 |
92 | возврат процессАгента
93 | ;
94 |
95 | метод ПередатьФайлАгенту(консольАгента: КонсольSsh, имяФайла: Строка, путьНаСервере: Строка): Строка
96 | знч файл = новый Файл(имяФайла)
97 | исп фтп = консольАгента.СоединениеSsh.ОткрытьСоединениеSftp()
98 | фтп.Поместить(имяФайла, путьНаСервере)
99 |
100 | возврат файл.Имя
101 | ;
102 |
103 | метод AgentConnectDB(процессАгента: ПроцессОс, имяПользователя: Строка = "", пароль: Строка = ""): КонсольSsh
104 | знч соединениеАгента = новый СоединениеSsh("127.0.0.1", 1543, имяПользователя, пароль)
105 |
106 | пер консольАгента = соединениеАгента.ОткрытьКонсоль()
107 | консольАгента.СтрокаПриглашения = "designer> "
108 |
109 | ВыполнитьКомандуАгента("options set --notify-progress yes --output-format json", консольАгента, процессАгента)
110 | ВыполнитьКомандуАгента("common connect-ib", консольАгента, процессАгента)
111 | Консоль.Записать("Успешное соединение с ИБ.")
112 |
113 | возврат консольАгента
114 | ;
115 |
116 | метод AgentDisconnectDB(консольАгента: КонсольSsh, процессАгента: ПроцессОс)
117 | ВыполнитьКомандуАгента("common disconnect-ib", консольАгента, процессАгента)
118 | консольАгента.СоединениеSsh.Закрыть()
119 | Консоль.Записать("Успешное отключение от ИБ.")
120 | ;
121 |
122 | метод ЗавершитьПроцессАгента(процессАгента: ПроцессОс)
123 | процессАгента.Остановить()
124 | Консоль.Записать("Процесс агента остановлен.")
125 | ;
126 |
127 | метод AgentLoadCfg(путьКФайлуCF: Строка, консольАгента: КонсольSsh, процессАгента: ПроцессОс)
128 | ВыполнитьСОжиданиемКомандуАгента("config load-cfg --file=%путьКФайлуCF", консольАгента, процессАгента)
129 |
130 | Консоль.Записать("CF файл конфигурации успешно загружен в ИБ.")
131 | ;
132 |
133 | метод AgentLoadCfgFromFiles(путьКФайламКонфигурации: Строка, консольАгента: КонсольSsh, процессАгента: ПроцессОс)
134 | ВыполнитьСОжиданиемКомандуАгента("config load-config-from-files --dir=%путьКФайламКонфигурации", консольАгента,
135 | процессАгента)
136 | Консоль.Записать("XML файлы конфигурации успешно загружены в ИБ.")
137 | ;
138 |
139 | метод AgentUpdateDBCfg(консольАгента: КонсольSsh, процессАгента: ПроцессОс)
140 | ВыполнитьСОжиданиемКомандуАгента("config update-db-cfg", консольАгента, процессАгента)
141 | Консоль.Записать("Конфигурация БД успешно обновлена для конфигурации в ИБ.")
142 | ;
143 |
144 | метод AgentDumpCfg(путьКФайлуCF: Строка, консольАгента: КонсольSsh, процессАгента: ПроцессОс)
145 | ВыполнитьСОжиданиемКомандуАгента("config dump-cfg --file=%путьКФайлуCF", консольАгента, процессАгента)
146 | Консоль.Записать("CF Файл конфигурации успешно создан.")
147 | ;
148 |
149 | метод AgentRestoreDB(путьКДТ: Строка, консольАгента: КонсольSsh, процессАгента: ПроцессОс)
150 | ВыполнитьКомандуАгента("infobase-tools restore-ib --file=%путьКДТ", консольАгента, процессАгента)
151 | Консоль.Записать("DT Файл успешно загружен.")
152 | ;
153 |
154 | метод AgentLoadExt(путьКФайлуCFE: Строка, имяРасширения: Строка, консольАгента: КонсольSsh, процессАгента: ПроцессОс)
155 | ВыполнитьСОжиданиемКомандуАгента("config load-cfg --file=%путьКФайлуCFE --extension=%имяРасширения", консольАгента,
156 | процессАгента)
157 | Консоль.Записать("CFE файл расширения успешно загружен в ИБ.")
158 | ;
159 |
160 | метод AgentLoadExtFromFiles(путьКФайламКонфигурации: Строка, имяРасширения: Строка, консольАгента: КонсольSsh,
161 | процессАгента: ПроцессОс)
162 | ВыполнитьСОжиданиемКомандуАгента(
163 | "config load-config-from-files --dir %путьКФайламКонфигурации --extension=%имяРасширения", консольАгента,
164 | процессАгента)
165 | Консоль.Записать("XML файлы расширения успешно загружены в ИБ.")
166 | ;
167 |
168 | метод AgentUpdateDBExt(имяРасширения: Строка, консольАгента: КонсольSsh, процессАгента: ПроцессОс)
169 | ВыполнитьСОжиданиемКомандуАгента("config update-db-cfg --extension=%имяРасширения", консольАгента, процессАгента)
170 | Консоль.Записать("Конфигурация БД успешно обновлена для расширения в ИБ.")
171 | ;
172 |
173 | метод AgentDumpExt(путьКФайлуCFE: Строка, имяРасширения: Строка, консольАгента: КонсольSsh, процессАгента: ПроцессОс)
174 | ВыполнитьСОжиданиемКомандуАгента("config dump-cfg --file %путьКФайлуCFE --extension=%имяРасширения", консольАгента,
175 | процессАгента)
176 | Консоль.Записать("CFE Файл расширения успешно создан.")
177 | ;
178 |
179 | метод AgentDeleteAllExt(консольАгента: КонсольSsh, процессАгента: ПроцессОс)
180 | ВыполнитьКомандуАгента("config extensions delete --all-extensions", консольАгента, процессАгента)
181 | Консоль.Записать("Все расширения удалены из ИБ.")
182 | ;
183 |
184 | метод AgentSetExtSafeMode(безопасныйРежим: Булево, имяРасширения: Строка, консольАгента: КонсольSsh,
185 | процессАгента: ПроцессОс)
186 | пер режим = "yes"
187 | если не безопасныйРежим
188 | режим = "no"
189 | ;
190 | ВыполнитьКомандуАгента(
191 | "config extensions --extension %имяРасширения --safe-mode=%режим --unsafe-action-protection=%режим",
192 | консольАгента, процессАгента)
193 | Консоль.Записать("Для расширений успешно установлен безопасный режим и защита от опасных действий в режим %режим.")
194 | ;
195 |
--------------------------------------------------------------------------------
/Библиотеки/СериализацияФорматов.xbsl:
--------------------------------------------------------------------------------
1 | /*******************************************************************************
2 | * Copyright (c) 2023 Aleksandr Kapralov and Contributors
3 | * This program and the accompanying materials are made available under
4 | * the terms of the BSD 3-Clause License which is available at
5 | * https://spdx.org/licenses/BSD-3-Clause.html#licenseText
6 | *
7 | * SPDX-License-Identifier: BSD-3-Clause
8 | *
9 | * Contributors:
10 | * Aleksandr Kapralov - Initial API and implementation
11 | *
12 | ******************************************************************************/
13 |
14 | метод XmlКакСоответствие(xml: ЧтениеXml, типПоследнегоЭлемента: ВидУзлаXml? =
15 | Неопределено): ЧитаемоеСоответствие<Строка, Объект?>|Строка
16 | знч ветка = новый Соответствие<Строка, Объект?>()
17 |
18 | пока xml.Следующий()
19 | знч типУзла = xml.ВидУзла
20 | если типУзла == ВидУзлаXml.НачалоЭлемента
21 | типПоследнегоЭлемента = ВидУзлаXml.НачалоЭлемента
22 |
23 | знч имя = xml.Имя
24 |
25 | пер значение: Соответствие<Строка, Объект?>|Строка|?
26 |
27 | знч аттрибуты = новый Соответствие<Строка, Объект?>()
28 | для индекс = 0 по xml.КоличествоАтрибутов() - 1
29 | знч имяАтрибута = xml.ИмяАтрибута(индекс)
30 | аттрибуты.Вставить(имяАтрибута, xml.ЗначениеАтрибута(имяАтрибута))
31 | ;
32 |
33 | знч вложенныеЗначения = XmlКакСоответствие(xml, типПоследнегоЭлемента)
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 | иначе если типУзла == ВидУзлаXml.КонецЭлемента
68 | типПоследнегоЭлемента = ВидУзлаXml.КонецЭлемента
69 | возврат не ветка.Пусто() ? ветка : ""
70 |
71 | иначе если типУзла == ВидУзлаXml.Текст и типПоследнегоЭлемента != ВидУзлаXml.Текст
72 | типПоследнегоЭлемента = ВидУзлаXml.Текст
73 | знч текст = xml.Значение
74 | xml.Следующий()
75 | возврат текст
76 | ;
77 | ;
78 |
79 | возврат ветка
80 | ;
81 |
82 | метод YamlКакСоответствие(текст: ЧитаемыйМассив<Строка>): ЧитаемоеСоответствие<Строка, Объект?>
83 | знч стекСкобок = новый Массив<Строка>()
84 | стекСкобок.Добавить("}")
85 |
86 | знч стекСдвигов = новый Массив<Число>()
87 | стекСдвигов.Добавить(0)
88 |
89 | пер результат = "{"
90 | для строка из текст
91 | если строка.Пусто() или строка.Сократить().ПодстрокаСНачала(1) == "#"
92 | продолжить
93 | ;
94 |
95 | пер сдвинутоНа = 0
96 | пока строка.Подстрока(сдвинутоНа, сдвинутоНа + 2) == " " или строка.Подстрока(сдвинутоНа, сдвинутоНа + 2)
97 | == "- "
98 | сдвинутоНа = сдвинутоНа + 2
99 | ;
100 |
101 | если стекСдвигов[стекСдвигов.Размер() - 1] == сдвинутоНа
102 | иначе если стекСдвигов[стекСдвигов.Размер() - 1] < сдвинутоНа
103 | стекСдвигов.Добавить(сдвинутоНа)
104 | если строка.Подстрока(сдвинутоНа - 2, сдвинутоНа) == "- "
105 | стекСкобок.Добавить("]")
106 | результат += "["
107 |
108 | иначе
109 | если не строка.Содержит(":")
110 | стекСкобок.Добавить("]")
111 | результат += "["
112 | иначе
113 | стекСкобок.Добавить("}")
114 | результат += "{"
115 | ;
116 | ;
117 | иначе
118 |
119 | пер добавитьЗапятую = Ложь
120 | пока стекСдвигов[стекСдвигов.Размер() - 1] > сдвинутоНа
121 | результат = результат + стекСкобок[стекСкобок.Размер() - 1]
122 | стекСкобок.УдалитьПоИндексу(стекСкобок.Размер() - 1)
123 | стекСдвигов.УдалитьПоИндексу(стекСдвигов.Размер() - 1)
124 | добавитьЗапятую = Истина
125 | ;
126 |
127 | если добавитьЗапятую
128 | результат += ","
129 | ;
130 | ;
131 |
132 | пер подстрока = строка.Подстрока(стекСдвигов[стекСдвигов.Размер() - 1])
133 |
134 | знч позицияСимволаДвоеточие = подстрока.Найти(":")
135 | если позицияСимволаДвоеточие != -1
136 | пер первый = подстрока.Подстрока(0, позицияСимволаДвоеточие).Сократить()
137 | первый = первый.Заменить("\"", "").Заменить("'", "")
138 | первый = ЭкранированиеСтроки(первый)
139 |
140 | пер второй = подстрока.Подстрока(позицияСимволаДвоеточие + 1).Сократить()
141 |
142 | если второй.Пусто()
143 | если стекСкобок[стекСкобок.Размер() - 1].ПодстрокаСНачала(1) == "]"
144 | подстрока = "{\"%первый\":"
145 | стекСкобок[стекСкобок.Размер() - 1] = "}" + стекСкобок[стекСкобок.Размер() - 1]
146 | иначе
147 | подстрока = "\"%первый\":"
148 | ;
149 | иначе
150 |
151 | если не (второй.ПодстрокаСНачала(1) == "{" или второй.ПодстрокаСНачала(1) == "[")
152 | второй = второй.Заменить("\"", "").Заменить("'", "")
153 | второй = ЭкранированиеСтроки(второй)
154 |
155 | если второй.ВНижнийРегистр() == "true" или второй.ВНижнийРегистр() == "false"
156 | подстрока = "\"%первый\":%второй"
157 | иначе
158 | подстрока = "\"%первый\":\"%второй\""
159 | ;
160 |
161 | если стекСкобок[стекСкобок.Размер() - 1].ПодстрокаСНачала(1) == "]"
162 | подстрока = "{%подстрока}"
163 | ;
164 | иначе
165 | подстрока = "\"%первый\":%второй"
166 | если стекСкобок[стекСкобок.Размер() - 1].ПодстрокаСНачала(1) == "]"
167 | подстрока = "{%подстрока}"
168 | ;
169 | ;
170 | ;
171 |
172 | иначе
173 | пер первый = подстрока.Сократить()
174 | первый = первый.Заменить("\"", "").Заменить("'", "")
175 |
176 | первый = ЭкранированиеСтроки(первый)
177 |
178 | подстрока = "\"%первый\""
179 | ;
180 |
181 | результат += подстрока + (":{[".Содержит(подстрока.Подстрока(подстрока.Длина() - 1)) ? "" : ",")
182 | результат += Символы.НОВАЯ_СТРОКА
183 | ;
184 |
185 | пока не стекСкобок.Пусто()
186 | результат += стекСкобок[стекСкобок.Размер() - 1]
187 | стекСкобок.УдалитьПоИндексу(стекСкобок.Размер() - 1)
188 | ;
189 |
190 | результат = результат.Заменить(",\н}", "\н}")
191 | результат = результат.Заменить(",\н]", "\н]")
192 |
193 | возврат СериализацияJson.ПрочитатьСоответствие(результат)
194 | ;
195 |
196 | метод ЭкранированиеСтроки(текст: Строка): Строка
197 | пер результат = ""
198 | для индекс = 0 по текст.Длина() - 1
199 | знч текущийСимвол = текст.Символ(индекс)
200 |
201 | если текущийСимвол == "\\"
202 | результат += "\\\\"
203 | иначе
204 | знч кодСимвола = Символы.ПолучитьКод(текущийСимвол)
205 | если кодСимвола < 255
206 | результат += текущийСимвол
207 | иначе
208 | результат += "\\u0" + кодСимвола.ВСтроку(16)
209 | ;
210 | ;
211 | ;
212 | возврат результат
213 | ;
214 |
--------------------------------------------------------------------------------
/Библиотеки/УстановленныеПлатформы83.sbsl:
--------------------------------------------------------------------------------
1 | /*******************************************************************************
2 | * Copyright (c) 2020 Alexander Kapralov and Contributors
3 | * This program and the accompanying materials are made available under
4 | * the terms of the BSD 3-Clause License which is available at
5 | * https://spdx.org/licenses/BSD-3-Clause.html#licenseText
6 | *
7 | * SPDX-License-Identifier: BSD-3-Clause
8 | *
9 | * Contributors:
10 | *
11 | *
12 | ******************************************************************************/
13 |
14 | метод УстановленныеПлатформы(): Соответствие
15 | пер установленныеПлатформы: Соответствие
16 |
17 | знч каталогиПлатформы = КаталогиПлатформы()
18 |
19 | знч настройкиПоискаФайлов = новый НастройкиПоискаФайлов()
20 | настройкиПоискаФайлов.ИсключитьФайлы(Истина)
21 | настройкиПоискаФайлов.МаксимальнаяГлубина(1)
22 |
23 | для каталогПлатформы из каталогиПлатформы
24 | знч найденныеФайлы = Файлы.Найти(каталогПлатформы, настройкиПоискаФайлов)
25 | для найденныйФайл из найденныеФайлы
26 | если не найденныйФайл.Имя.НачинаетсяС("8.3")
27 | продолжить
28 | ;
29 | установленныеПлатформы.Вставить(найденныйФайл.Имя, найденныйФайл.Путь)
30 | ;
31 | ;
32 |
33 | возврат установленныеПлатформы
34 | ;
35 |
36 | метод МаксимальныеПлатформы(): Соответствие
37 | знч установленныеПлатформы = УстановленныеПлатформы()
38 |
39 | пер максимальныеПлатформы: Соответствие
40 |
41 | для платформа из установленныеПлатформы
42 | знч разложенныйТекущийРелиз = платформа.Ключ.Разделить(".")
43 |
44 | пер релизБезВерсииМассивом = новый Массив(разложенныйТекущийРелиз)
45 | релизБезВерсииМассивом.УдалитьПоИндексу(3)
46 |
47 | знч релизБезВерсии = Строки.Соединить(релизБезВерсииМассивом, ".")
48 |
49 | если не максимальныеПлатформы.СодержитКлюч(релизБезВерсии)
50 | максимальныеПлатформы.Вставить(релизБезВерсии, платформа.Значение)
51 | продолжить
52 | ;
53 |
54 | знч последнийРелиз = максимальныеПлатформы.Получить(релизБезВерсии)
55 | знч разложенныйПоследнийРелиз = последнийРелиз.Разделить(".")
56 |
57 | если разложенныйТекущийРелиз[3] > разложенныйПоследнийРелиз[3]
58 | максимальныеПлатформы.Вставить(релизБезВерсии, платформа.Значение)
59 | ;
60 | ;
61 |
62 | возврат максимальныеПлатформы
63 | ;
64 |
65 | метод УстановитьПлатформу(имяДистрибутива: Строка, версияПлатформы: Строка): Булево
66 | знч используемаяОС = ИспользуемаяОС()
67 |
68 | выбор используемаяОС
69 | когда ОперационныеСистемы.Windows
70 | знч имяВременногоКаталога = Файлы.СоздатьВременныйКаталог(, Ложь)
71 |
72 | ВыполнитьКомандуСистемы("C:/Program Files/7-Zip/7z", ["x", "-o%имяВременногоКаталога", имяДистрибутива])
73 |
74 | ВыполнитьMsiExec(["/package", "\"%имяВременногоКаталога\\1CEnterprise 8 (x86-64).msi\""])
75 |
76 | Файлы.Удалить(имяВременногоКаталога)
77 |
78 | когда ОперационныеСистемы.MacOS
79 | ВыполнитьКомандуСистемы("hdiutil", ["attach", имяДистрибутива])
80 |
81 | знч смонтированныйДиск = "/Volumes/1C Enterprise %версияПлатформы client for macOS/"
82 |
83 | ВыполнитьКомандуСистемы("installer", ["-pkg", "\"%{смонтированныйДиск}1cv8-client-%версияПлатформы.pkg" + "\"",
84 | "-target", "/opt"])
85 |
86 | ВыполнитьКомандуСистемы("hdiutil", ["unmount", "\"%смонтированныйДиск\""])
87 |
88 | когда ОперационныеСистемы.Linux
89 | выбросить новый ИсключениеНедопустимоеСостояние("Установка под Linux не поддерживается")
90 | ;
91 |
92 | возврат Истина
93 | ;
94 |
95 | метод УдалитьПлатформу(версияПлатформы: Строка): Булево
96 | знч используемаяОС = ИспользуемаяОС()
97 |
98 | выбор используемаяОС
99 | когда ОперационныеСистемы.Windows
100 | знч результат = ВыполнитьPowershell(["get-wmiobject", "Win32_Product", "-Filter", "'Name", "LIKE", "''\%(%версияПлатформы)'''"])
101 |
102 | пер гуидУстановки = результат[0].Разделить(": ")[1]
103 |
104 | ВыполнитьMsiExec(["/uninstall", "%гуидУстановки"])
105 |
106 | когда ОперационныеСистемы.MacOS
107 | выбросить новый ИсключениеНедопустимоеСостояние("Удаление под MacOS не поддерживается")
108 |
109 | когда ОперационныеСистемы.Linux
110 | выбросить новый ИсключениеНедопустимоеСостояние("Удаление под Linux не поддерживается")
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 | метод ВыполнитьPowershell(параметры: Массив): Массив
153 | знч команда = новый ПроцессОс("powershell", параметры, Ложь)
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 | метод ВыполнитьMsiExec(параметры: Массив)
187 | знч временныйФайлЛога = Файлы.СоздатьВременныйФайл(, ".log")
188 |
189 | параметры.Добавить("/quiet")
190 | параметры.Добавить("/norestart")
191 | параметры.Добавить("/Leo+")
192 | параметры.Добавить("\"%временныйФайлЛога\"")
193 | знч команда = новый ПроцессОс("msiexec", параметры, Ложь)
194 | команда.Запустить()
195 | команда.ОжидатьЗавершения()
196 |
197 | пер списокОшибок = временныйФайлЛога.ОткрытьПотокЧтения().ПрочитатьКакТекст("UTF-16").Разделить("\в\н")
198 | списокОшибок.Удалить(списокОшибок.Последний())
199 | списокОшибок.Удалить(списокОшибок.Первый())
200 | если не списокОшибок.Пусто()
201 | знч текстОшибки = Строки.Соединить(списокОшибок, "\в\н")
202 | выбросить новый ИсключениеНедопустимоеСостояние(текстОшибки)
203 | ;
204 | ;
205 |
206 | метод НастройкиПотокаВывода(): НастройкиЧтенияДанных
207 | пер настройкиПотокаВывода = новый НастройкиЧтенияДанных()
208 | настройкиПотокаВывода.Кодировка = СредаИсполнения.ПолучитьСвойство("file.encoding")
209 |
210 | возврат настройкиПотокаВывода
211 | ;
212 |
213 |
214 | перечисление ОперационныеСистемы
215 | Windows,
216 | MacOS,
217 | Linux
218 | ;
219 |
220 |
221 | метод ИспользуемаяОС(): ОперационныеСистемы
222 | знч имяОС = СредаИсполнения.ПолучитьСвойство("os.name")
223 |
224 | выбор когда имяОС.НачинаетсяС("windows", Истина)
225 | возврат ОперационныеСистемы.Windows
226 |
227 | когда имяОС.Содержит("mac", Истина)
228 | возврат ОперационныеСистемы.MacOS
229 |
230 | когда имяОС.Содержит("nux", Истина)
231 | возврат ОперационныеСистемы.Linux
232 |
233 | иначе
234 | выбросить новый ИсключениеНедопустимоеСостояние("Неизвестная ОС")
235 | ;
236 | ;
237 |
238 | метод КаталогиПлатформы(): Массив
239 | пер списокКаталогов: Массив
240 |
241 | знч используемаяОС = ИспользуемаяОС()
242 |
243 | выбор используемаяОС
244 | когда ОперационныеСистемы.Windows
245 | знч каталог32 = СредаИсполнения.ПолучитьПеременную("ProgramFiles(x86)")
246 | списокКаталогов.Добавить(каталог32 + "\\1Cv8")
247 | знч каталог64 = СредаИсполнения.ПолучитьПеременную("ProgramFiles")
248 | списокКаталогов.Добавить(каталог64 + "\\1Cv8")
249 | когда ОперационныеСистемы.MacOS
250 | списокКаталогов.Добавить("/opt/1Cv8")
251 | когда ОперационныеСистемы.Linux
252 | списокКаталогов.Добавить("/opt/1C/v8.3/x86_64")
253 | ;
254 |
255 | возврат списокКаталогов
256 | ;
--------------------------------------------------------------------------------
/Скрипты/ОбновлениеПлатформ.sbsl:
--------------------------------------------------------------------------------
1 | #!/usr/bin/executor
2 |
3 | /*******************************************************************************
4 | * Copyright (c) 2020 Alexander Kapralov and Contributors
5 | * This program and the accompanying materials are made available under
6 | * the terms of the BSD 3-Clause License which is available at
7 | * https://spdx.org/licenses/BSD-3-Clause.html#licenseText
8 | *
9 | * SPDX-License-Identifier: BSD-3-Clause
10 | *
11 | * Contributors:
12 | *
13 | *
14 | ******************************************************************************/
15 |
16 | конст ИСПОЛЬЗУЕМЫЕ_ВЕРСИИ_ПЛАТФОРМЫ = ["10", "12", "14", "15", "16", "17", "18"]
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 | знч потокВывода = ВыполнитьСкрипт("../Библиотеки/СписокИнформационныхБаз.sbsl", "ИспользуемыеВерсии", [])
82 | знч версииПлатформы = ОбъектИзПотокаВывода(потокВывода) как Массив
83 |
84 | пер используемыеВерсииПлатформы: Множество
85 | для версияПлатформы из версииПлатформы
86 | знч версияМассивом = версияПлатформы.Разделить("|")
87 |
88 | Консоль.Записать("База " + версияМассивом[0] + " использует версию " + версияМассивом[1])
89 | используемыеВерсииПлатформы.Добавить(версияМассивом[1])
90 | ;
91 |
92 | возврат используемыеВерсииПлатформы
93 | ;
94 |
95 | метод УстановленныеВерсииПлатформы(): Множество
96 | знч потокВывода = ВыполнитьСкрипт("../Библиотеки/УстановленныеПлатформы83.sbsl", "УстановленныеПлатформы", [])
97 | знч версииПлатформы = ОбъектИзПотокаВывода(потокВывода) как Соответствие
98 |
99 | пер установленныеВерсииПлатформы: Множество
100 | для версияПлатформы из версииПлатформы
101 | установленныеВерсииПлатформы.Добавить(версияПлатформы.Ключ)
102 | ;
103 |
104 | возврат установленныеВерсииПлатформы
105 | ;
106 |
107 | метод ПоследниеВерсииПлатформы(имяПользователя: Строка, парольПользователя: Строка): Множество
108 | знч потокВывода = ВыполнитьСкрипт("../Библиотеки/ОпубликованныеПлатформы83.sbsl", "ПоследниеРелизы", [имяПользователя,
109 | парольПользователя])
110 | знч версииПлатформы = ОбъектИзПотокаВывода(потокВывода) как Массив
111 |
112 | пер последниеВерсииПлатформы: Множество
113 | знч результатВыполненияСкрипта = новый ЧтениеДанных(потокВывода)
114 | для версияПлатформы из версииПлатформы
115 | знч разложеннаяВерсияПлатформы = версияПлатформы.Разделить(".")
116 |
117 | если не ИСПОЛЬЗУЕМЫЕ_ВЕРСИИ_ПЛАТФОРМЫ.Содержит(разложеннаяВерсияПлатформы[2])
118 | продолжить
119 | ;
120 |
121 | последниеВерсииПлатформы.Добавить(версияПлатформы)
122 | ;
123 |
124 | возврат последниеВерсииПлатформы
125 | ;
126 |
127 | метод СкачатьПлатформу(версияПлатформы: Строка, имяПользователя: Строка, парольПользователя: Строка): Строка
128 | знч используемаяОС = ИспользуемаяОС()
129 |
130 | пер целеваяПлатформа: Строка
131 | выбор используемаяОС
132 | когда ОперационныеСистемы.Windows
133 | целеваяПлатформа = "platform-win64"
134 | когда ОперационныеСистемы.MacOS
135 | целеваяПлатформа = "platform-osx"
136 | когда ОперационныеСистемы.Linux
137 | целеваяПлатформа = "platform-deb64"
138 | ;
139 |
140 | знч потокВывода = ВыполнитьСкрипт("../Библиотеки/dl-1c.sbsl", "main", [имяПользователя, парольПользователя, целеваяПлатформа,
141 | версияПлатформы])
142 | знч имяДистрибутива = ОбъектИзПотокаВывода(потокВывода) как Строка
143 |
144 | возврат имяДистрибутива
145 | ;
146 |
147 | метод УстановитьПлатформу(имяДистрибутива: Строка, версияПлатформы: Строка): Булево
148 | знч используемаяОС = ИспользуемаяОС()
149 |
150 | ВыполнитьСкрипт("../Библиотеки/УстановленныеПлатформы83.sbsl", "УстановитьПлатформу", [имяДистрибутива, версияПлатформы])
151 |
152 | возврат Истина
153 | ;
154 |
155 | метод УдалитьПлатформу(версияПлатформы: Строка): Булево
156 | знч используемаяОС = ИспользуемаяОС()
157 |
158 | ВыполнитьСкрипт("../Библиотеки/УстановленныеПлатформы83.sbsl", "УдалитьПлатформу", [версияПлатформы])
159 |
160 | возврат Истина
161 | ;
162 |
163 |
164 | перечисление ОперационныеСистемы
165 | Windows,
166 | MacOS,
167 | Linux
168 | ;
169 |
170 |
171 | метод ИспользуемаяОС(): ОперационныеСистемы
172 | знч имяОС = СредаИсполнения.ПолучитьСвойство("os.name")
173 |
174 | выбор когда имяОС.НачинаетсяС("windows", Истина)
175 | возврат ОперационныеСистемы.Windows
176 |
177 | когда имяОС.Содержит("mac", Истина)
178 | возврат ОперационныеСистемы.MacOS
179 |
180 | когда имяОС.Содержит("nux", Истина)
181 | возврат ОперационныеСистемы.Linux
182 |
183 | иначе
184 | выбросить новый ИсключениеНедопустимоеСостояние("Неизвестная ОС")
185 | ;
186 | ;
187 |
188 | /*
189 | * Методы для вызова других скриптов. Необходимо копировать в свой скрипт
190 | */
191 | метод ВыполнитьСкрипт(имяФайлаСкрипта: Строка, имяКомандыСкрипта: Строка, параметрыСкрипта: Массив): ПотокЧтения
192 | пер расширениеИсполнителя: Строка
193 | знч имяОС = СредаИсполнения.ПолучитьСвойство("os.name")
194 | выбор когда имяОС.НачинаетсяС("windows", Истина)
195 | расширениеИсполнителя = "cmd"
196 | иначе
197 | расширениеИсполнителя = "sh"
198 | ;
199 | знч путьКИсполнителю = СредаИсполнения.ПолучитьСвойство("logback.configurationFile").Удалить("config" + Файлы.СимволРазделителя
200 | + "logback.xml") + "bin/executor_j11." + расширениеИсполнителя
201 |
202 | знч командаТекущегоСкрипта = СредаИсполнения.ПолучитьСвойство("sun.java.command")
203 | пер имяФайлаТекущегоСкрипта = командаТекущегоСкрипта.Подстрока(0, командаТекущегоСкрипта.Найти(".sbsl") + 5)
204 | имяФайлаТекущегоСкрипта = имяФайлаТекущегоСкрипта.Подстрока(имяФайлаТекущегоСкрипта.Найти(" ") + 1)
205 | имяФайлаТекущегоСкрипта = имяФайлаТекущегоСкрипта.Подстрока(имяФайлаТекущегоСкрипта.Найти(" ") + 1)
206 | знч файлТекущегоСкрипта = новый Файл(имяФайлаТекущегоСкрипта)
207 | пер путьТекущегоСкрипта = ""
208 | если файлТекущегоСкрипта.Каталог != Неопределено
209 | путьТекущегоСкрипта = файлТекущегоСкрипта.Каталог.Путь + Файлы.СимволРазделителя
210 | ;
211 |
212 | пер аргументыПроцессаОс = ["-s", путьТекущегоСкрипта + имяФайлаСкрипта, "-m", имяКомандыСкрипта]
213 | если не параметрыСкрипта.Пусто()
214 | аргументыПроцессаОс.ДобавитьВсе(параметрыСкрипта)
215 | ;
216 |
217 | знч библиотека = новый ПроцессОс(путьКИсполнителю, аргументыПроцессаОс, Ложь)
218 |
219 | библиотека.Запустить()
220 | библиотека.ОжидатьЗавершения()
221 |
222 | знч ошибкиВыполненияСкрипта = библиотека.ПолучитьПотокОшибок()
223 | знч текстОшибок = ошибкиВыполненияСкрипта.ПрочитатьКакТекст(КодировкаПотокаВыводаСкриптов())
224 | если не текстОшибок.Пусто()
225 | выбросить новый ИсключениеНедопустимоеСостояние(текстОшибок)
226 | ;
227 |
228 | возврат библиотека.ПотокВывода
229 | ;
230 |
231 | метод КодировкаПотокаВыводаСкриптов(): Строка
232 | возврат СредаИсполнения.ПолучитьСвойство("file.encoding")
233 | ;
234 |
235 | метод НастройкиПотокаВыводаСкриптов(): НастройкиЧтенияДанных
236 | пер настройкиПотокаВывода = новый НастройкиЧтенияДанных()
237 | настройкиПотокаВывода.Кодировка = КодировкаПотокаВыводаСкриптов()
238 |
239 | возврат настройкиПотокаВывода
240 | ;
241 |
242 | метод ОбъектИзПотокаВывода(потокВывода: ПотокЧтения): Строка|Массив|Соответствие
243 | пер массивСтрок: Массив
244 |
245 | знч результатВыполненияСкрипта = новый ЧтениеДанных(потокВывода, НастройкиПотокаВыводаСкриптов())
246 | пока не результатВыполненияСкрипта.ЧтениеЗавершено()
247 | знч прочитаннаяСтрока = результатВыполненияСкрипта.ПрочитатьСтроку()
248 |
249 | если прочитаннаяСтрока.Пусто()
250 | продолжить
251 | ;
252 |
253 | выбор прочитаннаяСтрока[0]
254 | когда "["
255 | знч результатМассивом = МассивИзСтроки(прочитаннаяСтрока)
256 | если результатМассивом.Размер() == 1
257 | массивСтрок.Добавить(результатМассивом[0])
258 | иначе
259 | возврат результатМассивом
260 | ;
261 | когда "{"
262 | возврат СоответствиеИзСтроки(прочитаннаяСтрока)
263 |
264 | иначе
265 | возврат прочитаннаяСтрока
266 | ;
267 | ;
268 | возврат массивСтрок
269 | ;
270 |
271 | метод МассивИзСтроки(строкаПотокаВывода: Строка): Массив
272 | знч результатСтрокой = строкаПотокаВывода.Подстрока(1, строкаПотокаВывода.Длина() - 1)
273 | знч результатМассивом = результатСтрокой.Разделить(", ", Ложь)
274 | возврат результатМассивом
275 | ;
276 |
277 | метод СоответствиеИзСтроки(строкаПотокаВывода: Строка): Соответствие
278 | пер результатСоответствием: Соответствие
279 |
280 | знч результатСтрокой = строкаПотокаВывода.Подстрока(1, строкаПотокаВывода.Длина() - 1)
281 |
282 | знч результатМассивом = результатСтрокой.Разделить(", ")
283 | для строкаРезультата из результатМассивом
284 | знч ключИЗначение = строкаРезультата.Разделить("=")
285 |
286 | результатСоответствием.Вставить(ключИЗначение[0], ключИЗначение[1])
287 | ;
288 |
289 | возврат результатСоответствием
290 | ;
--------------------------------------------------------------------------------
/Библиотеки/dl-1c.sbsl:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////////////////////////////////////////////////
2 | // MIT License
3 | //
4 | // Copyright (c) 2020 Dmitry Klimenko
5 | //
6 | // Permission is hereby granted, free of charge, to any person obtaining a copy
7 | // of this software and associated documentation files (the "Software"), to deal
8 | // in the Software without restriction, including without limitation the rights
9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | // copies of the Software, and to permit persons to whom the Software is
11 | // furnished to do so, subject to the following conditions:
12 | //
13 | // The above copyright notice and this permission notice shall be included in all
14 | // copies or substantial portions of the Software.
15 | //
16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | // SOFTWARE.
23 | ///////////////////////////////////////////////////////////////////////////////////////////////////////
24 |
25 | const URL_RELEASE = "https://releases.1c.ru"
26 | const URL_LOGIN = "https://login.1c.ru"
27 | const URL_DOWNLOAD = "%URL_RELEASE/version_file"
28 |
29 |
30 | exception ExceptionDL1C
31 | ;
32 |
33 |
34 | method updateCookies(cookies: Map, host: String, setCookie: String|Undefined)
35 | if setCookie is Undefined
36 | return
37 | ;
38 |
39 | val thisCookies = new Map()
40 |
41 | for cookie in setCookie.Split(";")
42 | val pair = cookie.Split("=")
43 | val key = pair[0].Trim()
44 | if key == "Path" or key == "Expires" or pair.Size() == 1 // don't worry
45 | continue
46 | ;
47 | val value = pair.Size() == 1 ? "" : pair[1].Trim()
48 | thisCookies.Insert(key, value)
49 | ;
50 |
51 | var realHost = thisCookies.ContainsKey("Domain") ? thisCookies.Get("Domain") : host
52 | if not realHost.StartsWith(".")
53 | realHost = "." + realHost
54 | ;
55 |
56 | val hostCookies = cookies.ContainsKey(realHost) ? cookies.Get(realHost) : new Map()
57 | if not cookies.ContainsKey(realHost)
58 | cookies.Insert(realHost, hostCookies)
59 | ;
60 |
61 | for item in thisCookies
62 | if item.Key == "Domain"
63 | continue
64 | ;
65 | hostCookies.Insert(item.Key, item.Value)
66 | ;
67 | ;
68 |
69 | method getCookie(cookies: Map, host: String): String
70 | var result = ""
71 |
72 | val realHost = "." + host
73 |
74 | for hostItem in cookies
75 | if not realHost.EndsWith(hostItem.Key)
76 | continue
77 | ;
78 |
79 | for cookie in hostItem.Value
80 | result = result + "; " + cookie.Key + (cookie.Value.IsEmpty() ? "" : "=" + cookie.Value)
81 | ;
82 | ;
83 |
84 | return result.IsEmpty() ? result : result.Substring(2)
85 | ;
86 |
87 | method getHost(url: String): String
88 | var result = ""
89 |
90 | if url.StartsWith("http://")
91 | result = url.Substring("http://".Length())
92 | else if url.StartsWith("https://")
93 | result = url.Substring("https://".Length())
94 | else
95 | throw new ExceptionDL1C("Bad URL: %url")
96 | ;
97 |
98 | if result.Contains("/")
99 | result = result.SubstringFromBegin(result.Find("/"))
100 | ;
101 |
102 | return result
103 | ;
104 |
105 | method baseUrl(url: String): String
106 | var result = ""
107 |
108 | if url.StartsWith("http://")
109 | result = "http://"
110 | else if url.StartsWith("https://")
111 | result = "https://"
112 | else
113 | throw new ExceptionDL1C("Bad URL: %url")
114 | ;
115 |
116 | return result + getHost(url)
117 | ;
118 |
119 | method extract(text: String, startPattern: String, endPattern: String): String
120 | val start = text.Find(startPattern)
121 | val end = text.Find(endPattern, start + startPattern.Length())
122 | return text.Substring(start + startPattern.Length(), end)
123 | ;
124 |
125 | method exploreWeb(request: HttpRequest, cookies: Map): HttpResponse
126 | val requests = [request]
127 | val responses = [request.Execute()]
128 | updateCookies(cookies, getHost(request.AbsoluteUrl), responses.Last().Headers.GetFirst("Set-Cookie"))
129 |
130 | while responses.Last().StatusCode == 301 or responses.Last().StatusCode == 302
131 | var location = responses.Last().Headers.GetFirst("Location") as String
132 | if location.StartsWith("/")
133 | location = baseUrl(requests.Last().AbsoluteUrl) + location
134 | ;
135 | // https://github.com/klimenko-1c/dl-1c/issues/1
136 | requests.Add(HttpClient.GetRequest(location).SetCookies(getCookie(cookies, getHost(location))).SetMaxRedirect(0))
137 |
138 | responses.Add(requests.Last().Execute())
139 | updateCookies(cookies, getHost(location), responses.Last().Headers.GetFirst("Set-Cookie"))
140 | ;
141 |
142 | for i = 0 to responses.Bound() - 1
143 | responses[i].Close()
144 | ;
145 |
146 | return responses.Last()
147 | ;
148 |
149 | method auth(username: String, password: String): Map
150 | val cookies = new Map()
151 | use response1 = HttpClient.GetRequest(URL_RELEASE).Execute()
152 | updateCookies(cookies, getHost(URL_RELEASE), response1.Headers.GetFirst("Set-Cookie"))
153 | val src = response1.Body.ReadAsText()
154 | response1.Close()
155 |
156 | val action = extract(src, "form method=\"post\" id=\"loginForm\" action=\"", "\"")
157 | val execution = extract(src, "input type=\"hidden\" name=\"execution\" value=\"", "\"")
158 |
159 | val body = "inviteCode=" + "&" + "inviteType=" + "&" + "username=%username" + "&" + "password=%password" + "&" + "rememberMe=on"
160 | + "&" + "execution=" + execution.Replace("=", "\%3D") + "&" + "_eventId=submit" + "&" + "geolocation=" + "&"
161 | + "submit=\%D0\%92\%D0\%BE\%D0\%B9\%D1\%82\%D0\%B8"
162 |
163 | // https://github.com/klimenko-1c/dl-1c/issues/1
164 | val request = HttpClient.PostRequest(URL_LOGIN + action).SetContentType("application/x-www-form-urlencoded")
165 | .SetCookies(getCookie(cookies, getHost(URL_LOGIN))).SetBody(body).SetMaxRedirect(0)
166 |
167 | exploreWeb(request, cookies).Close()
168 |
169 | if not cookies.Get("." + getHost(URL_LOGIN)).ContainsKey("TGC")
170 | throw new ExceptionDL1C("Auth failed")
171 | ;
172 |
173 | return cookies
174 | ;
175 |
176 | method webBodyAsText(url: String, cookies: Map): String
177 | // https://github.com/klimenko-1c/dl-1c/issues/1
178 | val request = HttpClient.GetRequest(url).SetCookies(getCookie(cookies, getHost(url))).SetMaxRedirect(0)
179 |
180 | use response = exploreWeb(request, cookies)
181 |
182 | return response.Body.ReadAsText()
183 | ;
184 |
185 | method webBodyToFile(url: String, cookies: Map, filename: String)
186 | // https://github.com/klimenko-1c/dl-1c/issues/1
187 | val request = HttpClient.GetRequest(url).SetCookies(getCookie(cookies, getHost(url))).SetMaxRedirect(0)
188 |
189 | use response = exploreWeb(request, cookies)
190 |
191 | use write = new File(filename).OpenWritableStream()
192 | response.Body.CopyTo(write)
193 | ;
194 |
195 | method download(cookies: Map, nick: String, ver: String, path_folder: String, path_version: String, path_filename: String): String
196 | // https://github.com/klimenko-1c/dl-1c/issues/2
197 | val url1 = "%URL_DOWNLOAD?nick=%nick&ver=%ver&path=%path_folder\%5C%path_version\%5C%path_filename"
198 |
199 | val src = webBodyAsText(url1, cookies)
200 |
201 | val end = src.Find(">Скачать дистрибутив<")
202 | val start = src.FindFromEnd("\"", , end - 1)
203 | val url2 = src.Substring(start + 1, end - 1)
204 |
205 | val tmpDir = Files.СоздатьВременныйКаталог(, Ложь)
206 | webBodyToFile(url2, cookies, "%tmpDir/%path_filename")
207 |
208 | return "%tmpDir/%path_filename"
209 | ;
210 |
211 | method downloadPlatform(cookies: Map, version: String, prefix: String, extension: String): String
212 | val path_folder = "Platform"
213 | val path_version = version.Replace(".", "_")
214 | val path_filename = "%{prefix}_%path_version.%extension"
215 |
216 | val nick = path_folder + version.Split(".")[0] + version.Split(".")[1]
217 |
218 | return download(cookies, nick, version, path_folder, path_version, path_filename)
219 | ;
220 |
221 | method downloadPostgres(cookies: Map, version: String, postfix: String, extension: String): String
222 | val prefix = "postgresql"
223 |
224 | val path_folder = "AddCompPostgre"
225 | val path_version = version.Replace(".", "_").Replace("-", "_")
226 | val path_filename = prefix + "_" + version.Replace("-", "_") + "_" + postfix + "." + extension
227 |
228 | val nick = path_folder
229 |
230 | download(cookies, nick, version, path_folder, path_version, path_filename)
231 |
232 | return path_filename
233 | ;
234 |
235 | method downloadConfiguration(cookies: Map, version: String, target: String, isUpdate: Boolean): String
236 | val postfix = isUpdate ? "updsetup" : "setup1c"
237 |
238 | val path_folder = target
239 | val path_version = version.Replace(".", "_")
240 | val path_filename = path_folder + "_" + path_version + "_" + postfix + ".exe"
241 |
242 | val nick = path_folder
243 |
244 | download(cookies, nick, version, path_folder, path_version, path_filename)
245 |
246 | return path_filename
247 | ;
248 |
249 | method main(username: String, password: String, target: String, version: String): String
250 | val cookies = auth(username, password)
251 |
252 | var path_filename: String
253 | if target.StartsWith("config-") or target.StartsWith("update-")
254 | path_filename = downloadConfiguration(cookies, version, target.Substring(7), target.StartsWith("update-"))
255 |
256 | else
257 |
258 | case target
259 | when "platform-win64"
260 | path_filename = downloadPlatform(cookies, version, "windows64full", "rar")
261 | when "platform-win32"
262 | path_filename = downloadPlatform(cookies, version, "windows", "rar")
263 | when "platform-osx"
264 | path_filename = downloadPlatform(cookies, version, "clientosx", "dmg")
265 | when "platform-deb64"
266 | path_filename = downloadPlatform(cookies, version, "client", "tar.gz")
267 | when "server-win64"
268 | path_filename = downloadPlatform(cookies, version, "windows64", "rar")
269 | when "server-deb64"
270 | path_filename = downloadPlatform(cookies, version, "deb64", "tar.gz")
271 | when "thinclient-win64"
272 | path_filename = downloadPlatform(cookies, version, "setuptc64", "tar.gz")
273 | when "thinclient-win32"
274 | path_filename = downloadPlatform(cookies, version, "setuptc", "tar.gz")
275 | when "thinclient-osx"
276 | path_filename = downloadPlatform(cookies, version, "thin.osx", "dmg")
277 | when "postgres-win"
278 | path_filename = downloadPostgres(cookies, version, "x64", "zip")
279 | when "postgres-deb"
280 | path_filename = downloadPostgres(cookies, version, "amd64_deb", "tar.bz2")
281 | else
282 | throw new ExceptionDL1C("Bad target")
283 | ;
284 | ;
285 |
286 | return path_filename
287 | ;
288 |
289 | method Script(username: String, password: String, target: String, version: String): Number
290 | try
291 | main(username, password, target, version)
292 | return 0
293 | catch exception: any
294 | Console.WriteError(exception.Info())
295 | return 1
296 | ;
297 | ;
--------------------------------------------------------------------------------
/Библиотеки/GitLabAPI.sbsl:
--------------------------------------------------------------------------------
1 | #!/usr/bin/executor
2 |
3 | /*******************************************************************************
4 | * Copyright (c) 2020 Alexander Kapralov and Contributors
5 | * This program and the accompanying materials are made available under
6 | * the terms of the BSD 3-Clause License which is available at
7 | * https://spdx.org/licenses/BSD-3-Clause.html#licenseText
8 | *
9 | * SPDX-License-Identifier: BSD-3-Clause
10 | *
11 | * Contributors:
12 | *
13 | *
14 | ******************************************************************************/
15 |
16 | структура Commits_List_Data
17 | пер id: Строка
18 | пер ref_name: Строка
19 | пер since: Строка
20 | пер until: Строка
21 | пер path: Строка
22 | пер all: Булево
23 | пер with_stats: Булево
24 | пер first_parent: Булево
25 | пер order: Строка = "default"
26 |
27 | конструктор(id)
28 | ;
29 |
30 | структура Releases_Create_Data
31 | пер id: Строка
32 | пер name: Строка
33 | пер tag_name: Строка
34 | пер description: Строка
35 | пер ref: Строка
36 | пер assets: Releases_Create_Assets_Data
37 |
38 | конструктор(id, tag_name, ref, assets)
39 | ;
40 |
41 |
42 | перечисление Releases_Create_Asset_LinkType
43 | other умолчание,
44 | runbook,
45 | image,
46 | package
47 | ;
48 |
49 |
50 | структура Releases_Create_Assets_Data
51 | пер links: Массив
52 | ;
53 |
54 | структура Releases_Create_Assets_Link_Data
55 | пер name: Строка
56 | пер url: Строка
57 | // пер filepath: Строка
58 | пер link_type: Releases_Create_Asset_LinkType
59 |
60 | конструктор(name, url)
61 | ;
62 |
63 | структура ОписаниеАссетов
64 | пер имяПроекта: Строка
65 | пер идЗадания: Строка
66 | пер списокДвоичныхФайлов: Массив
67 | ;
68 |
69 |
70 | метод Commits_List(датаС: Строка, имяВетки: Строка, имяПроекта: Строка, токен: Строка, адресСервера: Строка): Массив
71 | знч имяПроектаКодированное = имяПроекта.Заменить("/", "\%2F")
72 |
73 | знч строкаЗапроса = Строки.Шаблон("https://$0/api/v4/projects/$1/repository/commits?ref_name=$2&since=$3", [адресСервера,
74 | имяПроектаКодированное, имяВетки, датаС])
75 | пер запрос = КлиентHttp.ЗапросGet(строкаЗапроса)
76 | запрос.ДобавитьЗаголовок("PRIVATE-TOKEN", токен)
77 |
78 | исп ответ = запрос.Выполнить()
79 |
80 | если ответ.КодСостояния != 200
81 | знч текстОшибки = Строки.Шаблон("Строка запроса: $0\в\нКод состояния: $1, причина: $2\в\нТекст ответа:\в\н$3\в\н",
82 | [строкаЗапроса, ответ.КодСостояния, ответ.Причина, ответ.Тело.ПрочитатьКакТекст()])
83 | выбросить новый ИсключениеНедопустимоеСостояние(текстОшибки)
84 | ;
85 |
86 | знч данные = СериализацияJson.ПрочитатьМассив(ответ.Тело)
87 |
88 | возврат данные
89 | ;
90 |
91 | метод Commits_Exists(датаС: Строка, имяВетки: Строка, имяПроекта: Строка, токен: Строка, адресСервера: Строка): Булево
92 | знч коммиты = Commits_List(датаС, имяВетки, имяПроекта, токен, адресСервера)
93 |
94 | возврат не коммиты.Пусто()
95 | ;
96 |
97 | метод Jobs_Cancel(идЗадания: Строка, идПроекта: Строка, токен: Строка, адресСервера: Строка)
98 | знч строкаЗапроса = Строки.Шаблон("https://$0/api/v4/projects/$1/jobs/$2/cancel", [адресСервера, идПроекта, идЗадания])
99 | пер запрос = КлиентHttp.ЗапросPost(строкаЗапроса)
100 | запрос.ДобавитьЗаголовок("PRIVATE-TOKEN", токен)
101 |
102 | исп ответ = запрос.Выполнить()
103 |
104 | если ответ.КодСостояния != 201
105 | знч текстОшибки = Строки.Шаблон("Строка запроса: $0\в\нКод состояния: $1, причина: $2\в\нТекст ответа:\в\н$3\в\н",
106 | [строкаЗапроса, ответ.КодСостояния, ответ.Причина, ответ.Тело.ПрочитатьКакТекст()])
107 | выбросить новый ИсключениеНедопустимоеСостояние(текстОшибки)
108 | ;
109 |
110 | Консоль.Записать("Задание прервано.")
111 | ;
112 |
113 | метод JobArtifacts_DownloadFile(имяФайла: Строка, имяЗадания: Строка, имяВетки: Строка, идПроекта: Строка,
114 | токен: Строка, адресСервера: Строка)
115 | знч строкаЗапроса = Строки.Шаблон("https://$0/api/v4/projects/$1/jobs/artifacts/$2/raw/$3?job=$4", [адресСервера,
116 | идПроекта, имяВетки, имяФайла, имяЗадания])
117 | пер запрос = КлиентHttp.ЗапросGet(строкаЗапроса)
118 | запрос.ДобавитьЗаголовок("PRIVATE-TOKEN", токен)
119 |
120 | пер ответ = запрос.Выполнить()
121 |
122 | если ответ.КодСостояния != 200 и ответ.КодСостояния != 404
123 | пер текстОтвета = ""
124 | попытка
125 | текстОтвета = ответ.Тело.ПрочитатьКакТекст()
126 | поймать исключение: любой
127 | Консоль.Записать("Было исключение %исключение")
128 | ;
129 |
130 | знч текстОшибки = Строки.Шаблон("Строка запроса: $0\в\нКод состояния: $1, причина: $2\в\нТекст ответа:\в\н$3\в\н",
131 | [строкаЗапроса, ответ.КодСостояния, ответ.Причина, текстОтвета])
132 | выбросить новый ИсключениеНедопустимоеСостояние(текстОшибки)
133 | ;
134 |
135 | если ответ.КодСостояния == 200
136 | исп потокЗаписи = новый Файл(имяФайла).ОткрытьПотокЗаписи()
137 | ответ.Тело.КопироватьВ(потокЗаписи)
138 |
139 | Консоль.Записать("Файл загружен.")
140 | иначе
141 | Консоль.Записать("Файл для загрузки отсутствует.")
142 | ;
143 |
144 | попытка
145 | ответ.Закрыть()
146 | поймать исключение: любой
147 | Консоль.Записать("Было исключение %исключение")
148 | ;
149 | ;
150 |
151 | метод Pipelines_ListJobs(идСборочнойЛинии: Строка, идПроекта: Строка, токен: Строка, адресСервера: Строка)
152 | знч строкаЗапроса = Строки.Шаблон("https://$0/api/v4/projects/$1/pipelines/$2/jobs?scope[]=success", [адресСервера, идПроекта,
153 | идСборочнойЛинии])
154 | пер запрос = КлиентHttp.ЗапросGet(строкаЗапроса)
155 | запрос.ДобавитьЗаголовок("PRIVATE-TOKEN", токен)
156 |
157 | исп ответ = запрос.Выполнить()
158 |
159 | если ответ.КодСостояния != 200
160 | знч текстОшибки = Строки.Шаблон("Строка запроса: $0\в\нКод состояния: $1, причина: $2\в\нТекст ответа:\в\н$3\в\н",
161 | [строкаЗапроса, ответ.КодСостояния, ответ.Причина, ответ.Тело.ПрочитатьКакТекст()])
162 | выбросить новый ИсключениеНедопустимоеСостояние(текстОшибки)
163 | ;
164 |
165 | знч данные = СериализацияJson.ПрочитатьОбъект(ответ.Тело)
166 |
167 | Консоль.Записать("Список заданий получен.")
168 | ;
169 |
170 | метод Releases_Create(тег: Строка, имя: Строка, описание: Строка, файлОписанияАссертов: Строка, идКоммита: Строка, идПроекта: Строка,
171 | токен: Строка, адресСервера: Строка)
172 | пер ссылки = новый Массив()
173 | знч описаниеАссетов = ПрочитатьОписаниеАссетов(файлОписанияАссертов)
174 | для имяФайла из описаниеАссетов.списокДвоичныхФайлов
175 | знч файлДляУрл = имяФайла.Заменить("\\", "/")
176 | знч файл = новый Файл(имяФайла)
177 | знч урлАссерта = Строки.Шаблон("https://$0/$1/-/jobs/$2/artifacts/raw$3", [адресСервера, описаниеАссетов.имяПроекта,
178 | описаниеАссетов.идЗадания, файлДляУрл])
179 | знч ассерт = новый Releases_Create_Assets_Link_Data(файл.Имя, урлАссерта)
180 | ссылки.Добавить(ассерт)
181 | ;
182 |
183 | пер ассеты = новый Releases_Create_Assets_Data(ссылки)
184 | пер параметры = новый Releases_Create_Data(идПроекта, тег, идКоммита, ассеты)
185 | параметры.name = имя
186 | параметры.description = описание
187 |
188 | исп поток = новый СтроковыйПотокЗаписи()
189 | СериализацияJson.ЗаписатьОбъект(поток, параметры)
190 |
191 | знч строкаЗапроса = Строки.Шаблон("https://$0/api/v4/projects/$1/releases", [адресСервера, идПроекта])
192 | пер запрос = КлиентHttp.ЗапросPost(строкаЗапроса)
193 | запрос.ДобавитьЗаголовок("JOB-TOKEN", токен)
194 |
195 | запрос.УстановитьТипСодержимого("application/json")
196 | запрос.УстановитьТело(поток.ВСтроку())
197 |
198 | исп ответ = запрос.Выполнить()
199 |
200 | если ответ.КодСостояния != 201
201 | знч текстОшибки = Строки.Шаблон("Строка запроса: $0\в\нКод состояния: $1, причина: $2\в\нТекст ответа:\в\н$3\в\нТекст запроса:\в\н$4",
202 | [строкаЗапроса, ответ.КодСостояния, ответ.Причина, ответ.Тело.ПрочитатьКакТекст(), поток.ВСтроку()])
203 | выбросить новый ИсключениеНедопустимоеСостояние(текстОшибки)
204 | ;
205 |
206 | Консоль.Записать("Релиз создан.")
207 | ;
208 |
209 | метод Releases_List(идПроекта: Строка, токен: Строка, адресСервера: Строка): Массив
210 | знч строкаЗапроса = Строки.Шаблон("https://$0/api/v4/projects/$1/releases", [адресСервера, идПроекта])
211 | пер запрос = КлиентHttp.ЗапросGet(строкаЗапроса)
212 | запрос.ДобавитьЗаголовок("PRIVATE-TOKEN", токен)
213 |
214 | исп ответ = запрос.Выполнить()
215 |
216 | если ответ.КодСостояния != 200
217 | знч текстОшибки = Строки.Шаблон("Строка запроса: $0\в\нКод состояния: $1, причина: $2\в\нТекст ответа:\в\н$3\в\н",
218 | [строкаЗапроса, ответ.КодСостояния, ответ.Причина, ответ.Тело.ПрочитатьКакТекст()])
219 | выбросить новый ИсключениеНедопустимоеСостояние(текстОшибки)
220 | ;
221 |
222 | знч данные = СериализацияJson.ПрочитатьМассив(ответ.Тело)
223 |
224 | возврат данные
225 | ;
226 |
227 | метод Releases_LastDate(идПроекта: Строка, токен: Строка, адресСервера: Строка): ДатаВремя
228 | знч релизы = Releases_List(идПроекта, токен, адресСервера)
229 |
230 | если релизы.Пусто()
231 | возврат новый ДатаВремя(1, 1, 1)
232 | ;
233 |
234 | возврат новый ДатаВремя(релизы[0]["created_at"].Подстрока(0, 19))
235 | ;
236 |
237 | метод ЗаписатьОписаниеАссетов(файлОписанияАссертов: Строка, путьКФайлам: Строка, путьСборкиПроекта: Строка,
238 | идЗадания: Строка, имяПроекта: Строка)
239 | пер списокДвоичныхФайлов = новый Массив()
240 |
241 | знч каталогСборкиПроекта = новый Файл(путьСборкиПроекта)
242 |
243 | для файл из Файлы.Найти(путьКФайлам)
244 | знч путьВнутриСборки = файл.Путь.Удалить(каталогСборкиПроекта.Путь)
245 | списокДвоичныхФайлов.Добавить(путьВнутриСборки)
246 | ;
247 |
248 | знч файлПараметров = новый Файл(файлОписанияАссертов)
249 | исп поток = файлПараметров.ОткрытьПотокЗаписи()
250 |
251 | знч описаниеАссетов = новый ОписаниеАссетов(имяПроекта, идЗадания, списокДвоичныхФайлов)
252 |
253 | СериализацияJson.ЗаписатьОбъект(поток, описаниеАссетов)
254 | ;
255 |
256 | метод ПрочитатьОписаниеАссетов(файлОписанияАссертов: Строка): ОписаниеАссетов
257 | знч файл = новый Файл(файлОписанияАссертов)
258 | исп поток = файл.ОткрытьПотокЧтения()
259 |
260 | возврат СериализацияJson.ПрочитатьОбъект(поток, Тип(ОписаниеАссетов)) как ОписаниеАссетов
261 | ;
262 |
263 | метод Commits_List_Data_НастройкиЗаписиJson(данные: Commits_List_Data): НастройкиЗаписиОбъектовJson
264 | пер настройки = новый НастройкиЗаписиОбъектовJson()
265 |
266 | пер игнорируемыеСвойства = новый Массив()
267 | знч всеСтроковыеСвойства = ["ref_name", "since", "until", "path"]
268 | для свойство из всеСтроковыеСвойства
269 | если (данные[свойство] как Строка).Пусто()
270 | игнорируемыеСвойства.Добавить(свойство)
271 | ;
272 | ;
273 | знч всеБулевоСвойства = ["all", "with_stats", "first_parent"]
274 | для свойство из всеБулевоСвойства
275 | если не (данные[свойство] как Булево)
276 | игнорируемыеСвойства.Добавить(свойство)
277 | ;
278 | ;
279 |
280 | настройки.ИгнорируемыеСвойства = {Тип(Commits_List_Data) : новый Множество(игнорируемыеСвойства)}
281 |
282 | возврат настройки
283 | ;
--------------------------------------------------------------------------------
/Библиотеки/ПакетныйРежимПлатформы.sbsl:
--------------------------------------------------------------------------------
1 | #!/usr/bin/executor
2 |
3 | /*******************************************************************************
4 | * Copyright (c) 2020 Alexander Kapralov and Contributors
5 | * This program and the accompanying materials are made available under
6 | * the terms of the BSD 3-Clause License which is available at
7 | * https://spdx.org/licenses/BSD-3-Clause.html#licenseText
8 | *
9 | * SPDX-License-Identifier: BSD-3-Clause
10 | *
11 | * Contributors:
12 | *
13 | *
14 | ******************************************************************************/
15 |
16 | метод CreateInfobase(путьКИБ: Строка, имяФайлаПлатформы: Строка)
17 | пер параметрыПроцесса = новый Массив()
18 | параметрыПроцесса.Добавить("CREATEINFOBASE")
19 | параметрыПроцесса.Добавить("File=\"%путьКИБ\"")
20 |
21 | ВыполнитьКомандуПлатформы(имяФайлаПлатформы, параметрыПроцесса)
22 | Консоль.Записать("ИБ успешно создана.")
23 | ;
24 |
25 | метод CreateInfobaseFromTemplate(путьКДТ: Строка, путьКИБ: Строка, имяФайлаПлатформы: Строка)
26 | пер параметрыПроцесса = новый Массив()
27 | параметрыПроцесса.Добавить("CREATEINFOBASE")
28 | параметрыПроцесса.Добавить("File=\"%путьКИБ\"")
29 | параметрыПроцесса.Добавить("/UseTemplate")
30 | параметрыПроцесса.Добавить(путьКДТ)
31 |
32 | ВыполнитьКомандуПлатформы(имяФайлаПлатформы, параметрыПроцесса)
33 | Консоль.Записать("ИБ успешно создана.")
34 | ;
35 |
36 | метод LoadConfigFromFiles(путьКФайламКонфигурации: Строка, путьКИБ: Строка, имяФайлаПлатформы: Строка,
37 | имяПользователя: Строка = "", пароль: Строка = "")
38 | пер параметрыПроцесса = новый Массив()
39 | параметрыПроцесса.Добавить("DESIGNER")
40 | параметрыПроцесса.Добавить("/LoadConfigFromFiles")
41 | параметрыПроцесса.Добавить(путьКФайламКонфигурации)
42 | параметрыПроцесса.Добавить("/IBConnectionString")
43 | параметрыПроцесса.Добавить("File=\"%путьКИБ\"")
44 | параметрыПроцесса.Добавить("/DisableStartupDialogs")
45 | параметрыПроцесса.Добавить("/WA-")
46 | если не имяПользователя.Пусто()
47 | параметрыПроцесса.Добавить("/N")
48 | параметрыПроцесса.Добавить("\"%имяПользователя\"")
49 | ;
50 | если не пароль.Пусто()
51 | параметрыПроцесса.Добавить("/P")
52 | параметрыПроцесса.Добавить(пароль)
53 | ;
54 |
55 | ВыполнитьКомандуПлатформы(имяФайлаПлатформы, параметрыПроцесса)
56 | Консоль.Записать("XML файлы конфигурации успешно загружены в ИБ.")
57 | ;
58 |
59 | метод LoadCfg(путьКФайлуCF: Строка, путьКИБ: Строка, имяФайлаПлатформы: Строка, имяПользователя: Строка = "",
60 | пароль: Строка = "")
61 | пер параметрыПроцесса = новый Массив()
62 | параметрыПроцесса.Добавить("DESIGNER")
63 | параметрыПроцесса.Добавить("/LoadCfg")
64 | параметрыПроцесса.Добавить(путьКФайлуCF)
65 | параметрыПроцесса.Добавить("-force")
66 | параметрыПроцесса.Добавить("/IBConnectionString")
67 | параметрыПроцесса.Добавить("File=\"%путьКИБ\"")
68 | параметрыПроцесса.Добавить("/DisableStartupDialogs")
69 | параметрыПроцесса.Добавить("/WA-")
70 | если не имяПользователя.Пусто()
71 | параметрыПроцесса.Добавить("/N")
72 | параметрыПроцесса.Добавить("\"%имяПользователя\"")
73 | ;
74 | если не пароль.Пусто()
75 | параметрыПроцесса.Добавить("/P")
76 | параметрыПроцесса.Добавить(пароль)
77 | ;
78 |
79 | ВыполнитьКомандуПлатформы(имяФайлаПлатформы, параметрыПроцесса)
80 | Консоль.Записать("CF файл конфигурации успешно загружен в ИБ.")
81 | ;
82 |
83 | метод UpdateDBCfg(путьКИБ: Строка, имяФайлаПлатформы: Строка, имяПользователя: Строка = "", пароль: Строка = "")
84 | пер параметрыПроцесса = новый Массив()
85 | параметрыПроцесса.Добавить("DESIGNER")
86 | параметрыПроцесса.Добавить("/UpdateDBCfg")
87 | параметрыПроцесса.Добавить("/IBConnectionString")
88 | параметрыПроцесса.Добавить("File=\"%путьКИБ\"")
89 | параметрыПроцесса.Добавить("/DisableStartupDialogs")
90 | параметрыПроцесса.Добавить("/WA-")
91 | если не имяПользователя.Пусто()
92 | параметрыПроцесса.Добавить("/N")
93 | параметрыПроцесса.Добавить("\"%имяПользователя\"")
94 | ;
95 | если не пароль.Пусто()
96 | параметрыПроцесса.Добавить("/P")
97 | параметрыПроцесса.Добавить(пароль)
98 | ;
99 |
100 | ВыполнитьКомандуПлатформы(имяФайлаПлатформы, параметрыПроцесса)
101 | Консоль.Записать("Конфигурация БД успешно обновлена для конфигурации в ИБ.")
102 | ;
103 |
104 | метод CreateDistributionFiles(путьКФайлуCF: Строка, путьКИБ: Строка, имяФайлаПлатформы: Строка,
105 | имяПользователя: Строка = "", пароль: Строка = "")
106 | пер параметрыПроцесса = новый Массив()
107 | параметрыПроцесса.Добавить("DESIGNER")
108 | параметрыПроцесса.Добавить("/CreateDistributionFiles")
109 | параметрыПроцесса.Добавить("-cffile")
110 | параметрыПроцесса.Добавить(путьКФайлуCF)
111 | параметрыПроцесса.Добавить("/IBConnectionString")
112 | параметрыПроцесса.Добавить("File=\"%путьКИБ\"")
113 | параметрыПроцесса.Добавить("/DisableStartupDialogs")
114 | параметрыПроцесса.Добавить("/WA-")
115 | если не имяПользователя.Пусто()
116 | параметрыПроцесса.Добавить("/N")
117 | параметрыПроцесса.Добавить("\"%имяПользователя\"")
118 | ;
119 | если не пароль.Пусто()
120 | параметрыПроцесса.Добавить("/P")
121 | параметрыПроцесса.Добавить(пароль)
122 | ;
123 |
124 | ВыполнитьКомандуПлатформы(имяФайлаПлатформы, параметрыПроцесса)
125 | Консоль.Записать("CF Файл поставки успешно создан.")
126 | ;
127 |
128 | метод LoadExtFromFiles(путьКФайламРасширения: Строка, имяРасширения: Строка, путьКИБ: Строка, имяФайлаПлатформы: Строка,
129 | имяПользователя: Строка = "", пароль: Строка = "")
130 | пер параметрыПроцесса = новый Массив()
131 | параметрыПроцесса.Добавить("DESIGNER")
132 | параметрыПроцесса.Добавить("/LoadConfigFromFiles")
133 | параметрыПроцесса.Добавить(путьКФайламРасширения)
134 | параметрыПроцесса.Добавить("-Extension")
135 | параметрыПроцесса.Добавить(имяРасширения)
136 | параметрыПроцесса.Добавить("/IBConnectionString")
137 | параметрыПроцесса.Добавить("File=\"%путьКИБ\"")
138 | параметрыПроцесса.Добавить("/DisableStartupDialogs")
139 | параметрыПроцесса.Добавить("/WA-")
140 | если не имяПользователя.Пусто()
141 | параметрыПроцесса.Добавить("/N")
142 | параметрыПроцесса.Добавить("\"%имяПользователя\"")
143 | ;
144 | если не пароль.Пусто()
145 | параметрыПроцесса.Добавить("/P")
146 | параметрыПроцесса.Добавить(пароль)
147 | ;
148 |
149 | ВыполнитьКомандуПлатформы(имяФайлаПлатформы, параметрыПроцесса)
150 | Консоль.Записать("XML файлы расширения успешно загружены в ИБ.")
151 | ;
152 |
153 | метод LoadExt(путьКФайлуCFE: Строка, имяРасширения: Строка, путьКИБ: Строка, имяФайлаПлатформы: Строка,
154 | имяПользователя: Строка = "", пароль: Строка = "")
155 | пер параметрыПроцесса = новый Массив()
156 | параметрыПроцесса.Добавить("DESIGNER")
157 | параметрыПроцесса.Добавить("/LoadCfg")
158 | параметрыПроцесса.Добавить(путьКФайлуCFE)
159 | параметрыПроцесса.Добавить("-Extension")
160 | параметрыПроцесса.Добавить(имяРасширения)
161 | параметрыПроцесса.Добавить("-force")
162 | параметрыПроцесса.Добавить("/IBConnectionString")
163 | параметрыПроцесса.Добавить("File=\"%путьКИБ\"")
164 | параметрыПроцесса.Добавить("/DisableStartupDialogs")
165 | параметрыПроцесса.Добавить("/WA-")
166 | если не имяПользователя.Пусто()
167 | параметрыПроцесса.Добавить("/N")
168 | параметрыПроцесса.Добавить("\"%имяПользователя\"")
169 | ;
170 | если не пароль.Пусто()
171 | параметрыПроцесса.Добавить("/P")
172 | параметрыПроцесса.Добавить(пароль)
173 | ;
174 |
175 | ВыполнитьКомандуПлатформы(имяФайлаПлатформы, параметрыПроцесса)
176 | Консоль.Записать("CFE файл расширения успешно загружен в ИБ.")
177 | ;
178 |
179 | метод UpdateDBExt(имяРасширения: Строка, путьКИБ: Строка, имяФайлаПлатформы: Строка, имяПользователя: Строка = "",
180 | пароль: Строка = "")
181 | пер параметрыПроцесса = новый Массив()
182 | параметрыПроцесса.Добавить("DESIGNER")
183 | параметрыПроцесса.Добавить("/UpdateDBCfg")
184 | параметрыПроцесса.Добавить("-Extension")
185 | параметрыПроцесса.Добавить(имяРасширения)
186 | параметрыПроцесса.Добавить("/IBConnectionString")
187 | параметрыПроцесса.Добавить("File=\"%путьКИБ\"")
188 | параметрыПроцесса.Добавить("/DisableStartupDialogs")
189 | параметрыПроцесса.Добавить("/WA-")
190 | если не имяПользователя.Пусто()
191 | параметрыПроцесса.Добавить("/N")
192 | параметрыПроцесса.Добавить("\"%имяПользователя\"")
193 | ;
194 | если не пароль.Пусто()
195 | параметрыПроцесса.Добавить("/P")
196 | параметрыПроцесса.Добавить(пароль)
197 | ;
198 |
199 | ВыполнитьКомандуПлатформы(имяФайлаПлатформы, параметрыПроцесса)
200 | Консоль.Записать("Конфигурация БД успешно обновлена для расширения в ИБ.")
201 | ;
202 |
203 | метод DumpExt(путьКФайлуCFE: Строка, имяРасширения: Строка, путьКИБ: Строка, имяФайлаПлатформы: Строка,
204 | имяПользователя: Строка = "", пароль: Строка = "")
205 | пер параметрыПроцесса = новый Массив()
206 | параметрыПроцесса.Добавить("DESIGNER")
207 | параметрыПроцесса.Добавить("/DumpCfg")
208 | параметрыПроцесса.Добавить(путьКФайлуCFE)
209 | параметрыПроцесса.Добавить("-Extension")
210 | параметрыПроцесса.Добавить(имяРасширения)
211 | параметрыПроцесса.Добавить("/IBConnectionString")
212 | параметрыПроцесса.Добавить("File=\"%путьКИБ\"")
213 | параметрыПроцесса.Добавить("/DisableStartupDialogs")
214 | параметрыПроцесса.Добавить("/WA-")
215 | если не имяПользователя.Пусто()
216 | параметрыПроцесса.Добавить("/N")
217 | параметрыПроцесса.Добавить("\"%имяПользователя\"")
218 | ;
219 | если не пароль.Пусто()
220 | параметрыПроцесса.Добавить("/P")
221 | параметрыПроцесса.Добавить(пароль)
222 | ;
223 |
224 | ВыполнитьКомандуПлатформы(имяФайлаПлатформы, параметрыПроцесса)
225 | Консоль.Записать("CFE Файл расширения успешно создан.")
226 | ;
227 |
228 | метод DeleteCfgAllExt(путьКИБ: Строка, имяФайлаПлатформы: Строка, имяПользователя: Строка = "", пароль: Строка =
229 | "")
230 | пер параметрыПроцесса = новый Массив()
231 | параметрыПроцесса.Добавить("DESIGNER")
232 | параметрыПроцесса.Добавить("/DeleteCfg")
233 | параметрыПроцесса.Добавить("-AllExtensions")
234 | параметрыПроцесса.Добавить("/IBConnectionString")
235 | параметрыПроцесса.Добавить("File=\"%путьКИБ\"")
236 | параметрыПроцесса.Добавить("/DisableStartupDialogs")
237 | параметрыПроцесса.Добавить("/WA-")
238 | если не имяПользователя.Пусто()
239 | параметрыПроцесса.Добавить("/N")
240 | параметрыПроцесса.Добавить("\"%имяПользователя\"")
241 | ;
242 | если не пароль.Пусто()
243 | параметрыПроцесса.Добавить("/P")
244 | параметрыПроцесса.Добавить(пароль)
245 | ;
246 |
247 | ВыполнитьКомандуПлатформы(имяФайлаПлатформы, параметрыПроцесса)
248 | Консоль.Записать("Конфигурация и все расширения удалены из ИБ.")
249 | ;
250 |
251 | метод ExecuteCommand(именаКоманд: Строка, путьКИБ: Строка, имяФайлаПлатформы: Строка, имяПользователя: Строка = "",
252 | пароль: Строка = "")
253 | пер параметрыПроцесса = новый Массив()
254 | параметрыПроцесса.Добавить("ENTERPRISE")
255 | параметрыПроцесса.Добавить("/C")
256 | параметрыПроцесса.Добавить(именаКоманд)
257 | параметрыПроцесса.Добавить("/AllowExecuteScheduledJobs")
258 | параметрыПроцесса.Добавить("-Off")
259 | параметрыПроцесса.Добавить("/IBConnectionString")
260 | параметрыПроцесса.Добавить("File=\"%путьКИБ\"")
261 | параметрыПроцесса.Добавить("/DisableStartupDialogs")
262 | параметрыПроцесса.Добавить("/WA-")
263 | если не имяПользователя.Пусто()
264 | параметрыПроцесса.Добавить("/N")
265 | параметрыПроцесса.Добавить("\"%имяПользователя\"")
266 | ;
267 | если не пароль.Пусто()
268 | параметрыПроцесса.Добавить("/P")
269 | параметрыПроцесса.Добавить(пароль)
270 | ;
271 |
272 | ВыполнитьКомандуПлатформы(имяФайлаПлатформы, параметрыПроцесса)
273 | Консоль.Записать("Команда выполнена.")
274 | ;
275 |
276 | метод ExecuteDataProcessor(имяВнешнейОбработки: Строка, вспомогательныеПараметры: Строка, путьКИБ: Строка, имяФайлаПлатформы: Строка,
277 | имяПользователя: Строка = "", пароль: Строка = "")
278 | пер параметрыПроцесса = новый Массив()
279 | параметрыПроцесса.Добавить("ENTERPRISE")
280 | параметрыПроцесса.Добавить("/Execute")
281 | параметрыПроцесса.Добавить(имяВнешнейОбработки)
282 | если не вспомогательныеПараметры.Пусто()
283 | параметрыПроцесса.Добавить("/C")
284 | параметрыПроцесса.Добавить(вспомогательныеПараметры)
285 | ;
286 | параметрыПроцесса.Добавить("/IBConnectionString")
287 | параметрыПроцесса.Добавить("File=\"%путьКИБ\"")
288 | параметрыПроцесса.Добавить("/DisableStartupDialogs")
289 | параметрыПроцесса.Добавить("/WA-")
290 | если не имяПользователя.Пусто()
291 | параметрыПроцесса.Добавить("/N")
292 | параметрыПроцесса.Добавить("\"%имяПользователя\"")
293 | ;
294 | если не пароль.Пусто()
295 | параметрыПроцесса.Добавить("/P")
296 | параметрыПроцесса.Добавить(пароль)
297 | ;
298 |
299 | ВыполнитьКомандуПлатформы(имяФайлаПлатформы, параметрыПроцесса)
300 | Консоль.Записать("Обработка запущена.")
301 | ;
302 |
303 | перечисление ОперационныеСистемы
304 | Windows,
305 | MacOS,
306 | Linux
307 | ;
308 |
309 |
310 | метод ИспользуемаяОС(): ОперационныеСистемы
311 | знч имяОС = СредаИсполнения.ПолучитьСвойство("os.name")
312 |
313 | выбор когда имяОС.НачинаетсяС("windows", Истина)
314 | возврат ОперационныеСистемы.Windows
315 |
316 | когда имяОС.Содержит("mac", Истина)
317 | возврат ОперационныеСистемы.MacOS
318 |
319 | когда имяОС.Содержит("nux", Истина)
320 | возврат ОперационныеСистемы.Linux
321 |
322 | иначе
323 | выбросить новый ИсключениеНедопустимоеСостояние("Неизвестная ОС")
324 | ;
325 | ;
326 |
327 | метод КодировкаПотокаВыводаПлатформы(): Строка
328 | если ИспользуемаяОС() == ОперационныеСистемы.Windows
329 | возврат "windows-1251"
330 | ;
331 |
332 | возврат "UTF-8"
333 | ;
334 |
335 | метод ВыполнитьКомандуПлатформы(имяКоманды: Строка, параметры: Массив, выводитьОшибки: Булево = Истина)
336 | знч временныйФайлЛогов = Файлы.СоздатьВременныйФайл()
337 |
338 | параметры.Добавить("/Out")
339 | параметры.Добавить(временныйФайлЛогов.Путь)
340 |
341 | пер процесс = новый ПроцессОс(имяКоманды, параметры)
342 | процесс.Запустить()
343 | процесс.ОжидатьЗавершения()
344 |
345 | исп результатВыполненияСкрипта = процесс.ПолучитьПотокВывода()
346 | знч текстРезультата = результатВыполненияСкрипта.ПрочитатьКакТекст()
347 | если не текстРезультата.Пусто()
348 | Консоль.Записать(текстРезультата)
349 | ;
350 |
351 | знч кодВозврата = процесс.ПолучитьКодВозврата()
352 |
353 | если кодВозврата == 0
354 | возврат
355 | ;
356 |
357 | пер текстОшибки = "Код возврата: %кодВозврата"
358 | если не выводитьОшибки
359 | выбросить новый ИсключениеНедопустимоеСостояние(текстОшибки)
360 | ;
361 |
362 | текстОшибки += Строки.Шаблон("\в\нКоманда: $0\в\нПараметры: $1", [имяКоманды, Строки.Соединить(параметры, " ")])
363 |
364 | исп ошибкиВыполненияСкрипта = временныйФайлЛогов.ОткрытьПотокЧтения()
365 | текстОшибки += "\в\н" + ошибкиВыполненияСкрипта.ПрочитатьКакТекст(КодировкаПотокаВыводаПлатформы())
366 | выбросить новый ИсключениеНедопустимоеСостояние(текстОшибки)
367 | ;
368 |
--------------------------------------------------------------------------------
/Библиотеки/ОпубликованныеПлатформы83.sbsl:
--------------------------------------------------------------------------------
1 | /*******************************************************************************
2 | * Copyright (c) 2020 Alexander Kapralov and Contributors
3 | * This program and the accompanying materials are made available under
4 | * the terms of the BSD 3-Clause License which is available at
5 | * https://spdx.org/licenses/BSD-3-Clause.html#licenseText
6 | *
7 | * SPDX-License-Identifier: BSD-3-Clause
8 | *
9 | * Contributors:
10 | *
11 | *
12 | ******************************************************************************/
13 |
14 | конст URL_ПЛАТФОРМЫ = "https://releases.1c.ru/project/Platform83"
15 |
16 |
17 | метод ВсеРелизы(имяПользователя: Строка, парольПользователя: Строка): Множество
18 | пер списокВерсий: Множество
19 |
20 | знч свойстваАутентификации = auth(имяПользователя, парольПользователя)
21 |
22 | знч текстСтраницы = webBodyAsText(URL_ПЛАТФОРМЫ, свойстваАутентификации)
23 |
24 | знч списокСтрок = текстСтраницы.ПолучитьСтроки()
25 | для строкаТела из списокСтрок
26 | если не строкаТела.Сократить().НачинаетсяС("", "")
31 |
32 | списокВерсий.Добавить(строкаВерсии)
33 | ;
34 |
35 | возврат списокВерсий
36 | ;
37 |
38 | метод ПоследниеРелизы(имяПользователя: Строка, парольПользователя: Строка): Множество
39 | знч всеРелизы = ВсеРелизы(имяПользователя, парольПользователя)
40 |
41 | пер соответствиеРелизов: Соответствие
42 |
43 | для релиз из всеРелизы
44 | знч разложенныйТекущийРелиз = релиз.Разделить(".")
45 |
46 | если не соответствиеРелизов.СодержитКлюч(разложенныйТекущийРелиз[2])
47 | соответствиеРелизов.Вставить(разложенныйТекущийРелиз[2], релиз)
48 | продолжить
49 | ;
50 |
51 | знч последнийРелиз = соответствиеРелизов.Получить(разложенныйТекущийРелиз[2])
52 | знч разложенныйПоследнийРелиз = последнийРелиз.Разделить(".")
53 |
54 | если разложенныйТекущийРелиз[3] > разложенныйПоследнийРелиз[3]
55 | соответствиеРелизов.Вставить(разложенныйТекущийРелиз[2], релиз)
56 | ;
57 | ;
58 |
59 | пер последниеВерсииПлатформы: Множество
60 |
61 | для релиз из соответствиеРелизов
62 | последниеВерсииПлатформы.Добавить(релиз.Значение)
63 | ;
64 |
65 | возврат последниеВерсииПлатформы
66 | ;
67 |
68 | ///////////////////////////////////////////////////////////////////////////////////////////////////////
69 | // MIT License
70 | //
71 | // Copyright (c) 2020 Dmitry Klimenko
72 | //
73 | // Permission is hereby granted, free of charge, to any person obtaining a copy
74 | // of this software and associated documentation files (the "Software"), to deal
75 | // in the Software without restriction, including without limitation the rights
76 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
77 | // copies of the Software, and to permit persons to whom the Software is
78 | // furnished to do so, subject to the following conditions:
79 | //
80 | // The above copyright notice and this permission notice shall be included in all
81 | // copies or substantial portions of the Software.
82 | //
83 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
84 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
85 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
86 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
87 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
88 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
89 | // SOFTWARE.
90 | ///////////////////////////////////////////////////////////////////////////////////////////////////////
91 |
92 | const URL_RELEASE ="https://releases.1c.ru"
93 | const URL_LOGIN ="https://login.1c.ru"
94 | const URL_DOWNLOAD ="%URL_RELEASE/version_file"
95 |
96 | exception ExceptionDL1C;
97 |
98 | method updateCookies(cookies: Map, host: String, setCookie: String|Undefined)
99 |
100 | if setCookie is Undefined
101 | return;
102 |
103 | val thisCookies = new Map()
104 |
105 | for cookie in setCookie.Split(";")
106 | val pair = cookie.Split("=")
107 | val key = pair[0].Trim()
108 | if key == "Path" or key == "Expires" or pair.Size() == 1 // don't worry
109 | continue;
110 | val value = pair.Size() == 1 ? "" : pair[1].Trim()
111 | thisCookies.Insert(key, value)
112 | ;
113 |
114 | var realHost = thisCookies.ContainsKey("Domain") ? thisCookies.Get("Domain") : host
115 | if not realHost.StartsWith(".")
116 | realHost = "." + realHost
117 | ;
118 |
119 | val hostCookies = cookies.ContainsKey(realHost) ? cookies.Get(realHost) : new Map()
120 | if not cookies.ContainsKey(realHost)
121 | cookies.Insert(realHost, hostCookies)
122 | ;
123 |
124 | for item in thisCookies
125 | if item.Key == "Domain"
126 | continue;
127 | hostCookies.Insert(item.Key, item.Value)
128 | ;
129 |
130 | ;
131 |
132 | method getCookie(cookies: Map, host: String): String
133 |
134 | var result = ""
135 |
136 | val realHost = "." + host
137 |
138 | for hostItem in cookies
139 | if not realHost.EndsWith(hostItem.Key)
140 | continue;
141 |
142 | for cookie in hostItem.Value
143 | result = result + "; " + cookie.Key + (cookie.Value.IsEmpty() ? "" : "=" + cookie.Value)
144 | ;
145 | ;
146 |
147 | return result.IsEmpty() ? result : result.Substring(2)
148 | ;
149 |
150 | method getHost(url: String): String
151 |
152 | var result = ""
153 |
154 | if url.StartsWith("http://")
155 | result = url.Substring("http://".Length())
156 | else if url.StartsWith("https://")
157 | result = url.Substring("https://".Length())
158 | else
159 | throw new ExceptionDL1C("Bad URL: %url")
160 | ;
161 |
162 | if result.Contains("/")
163 | result = result.SubstringFromBegin(result.Find("/"))
164 | ;
165 |
166 | return result
167 | ;
168 |
169 | method baseUrl(url: String): String
170 |
171 | var result = ""
172 |
173 | if url.StartsWith("http://")
174 | result = "http://"
175 | else if url.StartsWith("https://")
176 | result = "https://"
177 | else
178 | throw new ExceptionDL1C("Bad URL: %url")
179 | ;
180 |
181 | return result + getHost(url)
182 | ;
183 |
184 | method extract(text: String, startPattern: String, endPattern: String): String
185 | val start = text.Find(startPattern)
186 | val end = text.Find(endPattern, start + startPattern.Length())
187 | return text.Substring(start + startPattern.Length(), end)
188 | ;
189 |
190 | method exploreWeb(request: HttpRequest, cookies: Map): HttpResponse
191 |
192 | val requests = [request]
193 | val responses = [request.Execute()]
194 | updateCookies(cookies, getHost(request.AbsoluteUrl), responses.Last().Headers.GetFirst("Set-Cookie"))
195 |
196 | while responses.Last().StatusCode == 302
197 | var location = responses.Last().Headers.GetFirst("Location") as String
198 | if location.StartsWith("/")
199 | location = baseUrl(requests.Last().AbsoluteUrl) + location
200 | ;
201 | requests.Add(
202 | HttpClient.GetRequest(location)
203 | .SetCookies(getCookie(cookies, getHost(location)))
204 | .SetMaxRedirect(0) // https://github.com/klimenko-1c/dl-1c/issues/1
205 | )
206 | responses.Add(
207 | requests.Last()
208 | .Execute()
209 | )
210 | updateCookies(cookies, getHost(location), responses.Last().Headers.GetFirst("Set-Cookie"))
211 | ;
212 |
213 | for i = 0 to responses.Bound() - 1
214 | responses[i].Close()
215 | ;
216 |
217 | return responses.Last()
218 | ;
219 |
220 | method auth(username: String, password: String): Map
221 |
222 | val cookies = new Map()
223 | use response1 = HttpClient.GetRequest(URL_RELEASE).Execute()
224 | updateCookies(cookies, getHost(URL_RELEASE), response1.Headers.GetFirst("Set-Cookie"))
225 | val src = response1.Body.ReadAsText()
226 | response1.Close()
227 |
228 | val action = extract(src, "form method=\"post\" id=\"loginForm\" action=\"", "\"")
229 | val execution = extract(src, "input type=\"hidden\" name=\"execution\" value=\"", "\"")
230 |
231 | val body = "inviteCode="
232 | + "&" + "inviteType="
233 | + "&" + "username=%username"
234 | + "&" + "password=%password"
235 | + "&" + "rememberMe=on"
236 | + "&" + "execution=" + execution.Replace("=", "\%3D")
237 | + "&" + "_eventId=submit"
238 | + "&" + "geolocation="
239 | + "&" + "submit=\%D0\%92\%D0\%BE\%D0\%B9\%D1\%82\%D0\%B8"
240 |
241 | val request = HttpClient.PostRequest(URL_LOGIN + action)
242 | .SetContentType("application/x-www-form-urlencoded")
243 | .SetCookies(getCookie(cookies, getHost(URL_LOGIN)))
244 | .SetBody(body)
245 | .SetMaxRedirect(0) // https://github.com/klimenko-1c/dl-1c/issues/1
246 |
247 | exploreWeb(request, cookies).Close()
248 |
249 | if not cookies.Get("." + getHost(URL_LOGIN)).ContainsKey("TGC")
250 | throw new ExceptionDL1C("Auth failed")
251 | ;
252 |
253 | return cookies
254 | ;
255 |
256 | method webBodyAsText(url: String, cookies: Map): String
257 | val request = HttpClient.GetRequest(url)
258 | .SetCookies(getCookie(cookies, getHost(url)))
259 | .SetMaxRedirect(0)
260 |
261 | use response = exploreWeb(request, cookies)
262 |
263 | return response.Body.ReadAsText()
264 | ;
265 |
266 | method webBodyToFile(url: String, cookies: Map, filename: String)
267 | val request = HttpClient.GetRequest(url)
268 | .SetCookies(getCookie(cookies, getHost(url)))
269 | .SetMaxRedirect(0)
270 |
271 | use response = exploreWeb(request, cookies)
272 |
273 | use write = new File(filename).OpenWritableStream()
274 | response.Body.CopyTo(write)
275 | ;
276 |
277 | method download(cookies: Map, nick: String, ver: String, path_folder: String, path_version: String, path_filename: String)
278 |
279 | val url1 = URL_DOWNLOAD
280 | + "?" + "nick=" + nick
281 | + "&" + "ver=" + ver
282 | + "&" + "path=" + path_folder + "\%5C" + path_version + "\%5C" + path_filename // https://github.com/klimenko-1c/dl-1c/issues/2
283 |
284 | val src = webBodyAsText(url1, cookies)
285 |
286 | val end = src.Find(">Скачать дистрибутив<")
287 | val start = src.FindFromEnd("\"",, end - 1)
288 | val url2 = src.Substring(start + 1, end - 1)
289 |
290 | webBodyToFile(url2, cookies, path_filename)
291 | ;
292 |
293 | method downloadPlatform(cookies: Map, version: String, prefix: String, extension: String): String
294 |
295 | val path_folder = "Platform"
296 | val path_version = version.Replace(".", "_")
297 | val path_filename = prefix + "_" + path_version + "." + extension
298 |
299 | val nick = path_folder + version.Split(".")[0] + version.Split(".")[1]
300 |
301 | download(cookies, nick, version, path_folder, path_version, path_filename)
302 |
303 | return path_filename
304 | ;
305 |
306 | method downloadPostgres(cookies: Map, version: String, postfix: String, extension: String): String
307 |
308 | val prefix = "postgresql"
309 |
310 | val path_folder = "AddCompPostgre"
311 | val path_version = version.Replace(".", "_").Replace("-", "_")
312 | val path_filename = prefix + "_" + version.Replace("-", "_") + "_" + postfix + "." + extension
313 |
314 | val nick = path_folder
315 |
316 | download(cookies, nick, version, path_folder, path_version, path_filename)
317 |
318 | return path_filename
319 | ;
320 |
321 | method downloadConfiguration(cookies: Map, version: String, target: String, isUpdate: Boolean): String
322 |
323 | val postfix = isUpdate ? "updsetup" : "setup1c"
324 |
325 | val path_folder = target
326 | val path_version = version.Replace(".", "_")
327 | val path_filename = path_folder + "_" + path_version + "_" + postfix + ".exe"
328 |
329 | val nick = path_folder
330 |
331 | download(cookies, nick, version, path_folder, path_version, path_filename)
332 |
333 | return path_filename
334 | ;
335 |
336 | method main(username: String, password: String, target: String, version: String): String
337 |
338 | val cookies = auth(username, password)
339 |
340 | var path_filename: String
341 | if target.StartsWith("config-") or target.StartsWith("update-")
342 | path_filename = downloadConfiguration(cookies, version, target.Substring(7), target.StartsWith("update-"))
343 |
344 | else
345 |
346 | case target
347 | when "platform-win64"
348 | path_filename = downloadPlatform(cookies, version, "windows64full", "rar")
349 | when "platform-win32"
350 | path_filename = downloadPlatform(cookies, version, "windows", "rar")
351 | when "platform-osx"
352 | path_filename = downloadPlatform(cookies, version, "clientosx", "dmg")
353 | when "platform-deb64"
354 | path_filename = downloadPlatform(cookies, version, "client", "tar.gz")
355 | when "server-win64"
356 | path_filename = downloadPlatform(cookies, version, "windows64", "rar")
357 | when "server-deb64"
358 | path_filename = downloadPlatform(cookies, version, "deb64", "tar.gz")
359 | when "thinclient-win64"
360 | path_filename = downloadPlatform(cookies, version, "setuptc64", "tar.gz")
361 | when "thinclient-win32"
362 | path_filename = downloadPlatform(cookies, version, "setuptc", "tar.gz")
363 | when "thinclient-osx"
364 | path_filename = downloadPlatform(cookies, version, "thin.osx", "dmg")
365 | when "postgres-win"
366 | path_filename = downloadPostgres(cookies, version, "x64", "zip")
367 | when "postgres-deb"
368 | path_filename = downloadPostgres(cookies, version, "amd64_deb", "tar.bz2")
369 | else
370 | throw new ExceptionDL1C("Bad target")
371 | ;
372 | ;
373 |
374 | return path_filename
375 | ;
376 |
377 | method Script(username: String, password: String, target: String, version: String): Number
378 |
379 | try
380 | main(username, password, target, version)
381 | return 0
382 | catch exception: any
383 | Console.WriteError(exception.Info())
384 | return 1
385 | ;
386 | ;
--------------------------------------------------------------------------------
/Библиотеки/ПакетныйРежимЕДТ.sbsl:
--------------------------------------------------------------------------------
1 | #!/usr/bin/executor
2 |
3 | /*******************************************************************************
4 | * Copyright (c) 2020 Alexander Kapralov and Contributors
5 | * This program and the accompanying materials are made available under
6 | * the terms of the BSD 3-Clause License which is available at
7 | * https://spdx.org/licenses/BSD-3-Clause.html#licenseText
8 | *
9 | * SPDX-License-Identifier: BSD-3-Clause
10 | *
11 | * Contributors:
12 | *
13 | *
14 | ******************************************************************************/
15 |
16 | метод PlatformVersions(версияЕДТ: Строка = "")
17 | пер имяКоманды = ""
18 | пер параметрыПроцесса = новый Массив()
19 |
20 | знч версияОС = ИспользуемаяОС()
21 | выбор версияОС
22 | когда ОперационныеСистемы.Windows
23 | имяКоманды = "ring.cmd"
24 | иначе
25 | имяКоманды = "ring.sh"
26 | ;
27 |
28 | параметрыПроцесса.Добавить("-l")
29 | параметрыПроцесса.Добавить("error")
30 | если версияЕДТ.Пусто()
31 | параметрыПроцесса.Добавить("edt")
32 | иначе
33 | параметрыПроцесса.Добавить("edt@" + версияЕДТ)
34 | ;
35 | параметрыПроцесса.Добавить("platform-versions")
36 |
37 | знч кодВозврата = ВыполнитьКомандуСистемы(имяКоманды, параметрыПроцесса, Ложь)
38 |
39 | если кодВозврата != 0
40 | знч текстОшибки = Строки.Шаблон("Код возврата: $0", кодВозврата)
41 | выбросить новый ИсключениеНедопустимоеСостояние(текстОшибки)
42 | ;
43 | ;
44 |
45 | метод WorkspaceExport(путьККонфигурацииЕДТ: Строка, путьККонфигурацииПлатформы: Строка, путьКРабочейОбласти: Строка, версияЕДТ: Строка =
46 | "")
47 | пер имяКоманды = ""
48 | пер параметрыПроцесса = новый Массив()
49 |
50 | знч версияОС = ИспользуемаяОС()
51 | выбор версияОС
52 | когда ОперационныеСистемы.Windows
53 | имяКоманды = "powershell"
54 | параметрыПроцесса.Добавить("/c")
55 | иначе
56 | имяКоманды = "zsh"
57 | параметрыПроцесса.Добавить("-c")
58 | ;
59 |
60 | параметрыПроцесса.Добавить("ring")
61 | параметрыПроцесса.Добавить("-l")
62 | параметрыПроцесса.Добавить("error")
63 | если версияЕДТ.Пусто()
64 | параметрыПроцесса.Добавить("edt")
65 | иначе
66 | параметрыПроцесса.Добавить("edt@" + версияЕДТ)
67 | ;
68 | параметрыПроцесса.Добавить("workspace")
69 | параметрыПроцесса.Добавить("export")
70 | параметрыПроцесса.Добавить("--project")
71 | параметрыПроцесса.Добавить(путьККонфигурацииЕДТ)
72 | параметрыПроцесса.Добавить("--configuration-files")
73 | параметрыПроцесса.Добавить(путьККонфигурацииПлатформы)
74 | параметрыПроцесса.Добавить("--workspace-location")
75 | параметрыПроцесса.Добавить(путьКРабочейОбласти)
76 |
77 | знч кодВозврата = ВыполнитьКомандуСистемы(имяКоманды, параметрыПроцесса, Ложь)
78 |
79 | если кодВозврата != 0
80 | знч текстОшибки = Строки.Шаблон("Код возврата: $0", кодВозврата)
81 | выбросить новый ИсключениеНедопустимоеСостояние(текстОшибки)
82 | ;
83 | ;
84 |
85 | метод ВыполнитьКомандуСистемы(имяКоманды: Строка, параметры: Массив, выводитьОшибки: Булево = Истина): Число
86 | знч процесс = новый ПроцессОс(имяКоманды, параметры, Ложь)
87 | процесс.Запустить()
88 | процесс.ОжидатьЗавершения()
89 |
90 | знч кодВозврата = процесс.ПолучитьКодВозврата()
91 | если кодВозврата != 0
92 | Консоль.Записать("Код возврата:" + кодВозврата)
93 | ;
94 |
95 | пер результатВыполненияСкрипта = процесс.ПолучитьПотокВывода()
96 | знч текстРезультата = результатВыполненияСкрипта.ПрочитатьКакТекст(КодировкаПотокаВывода())
97 | если не текстРезультата.Пусто()
98 | Консоль.Записать(текстРезультата)
99 | ;
100 |
101 | если кодВозврата == 0 или не выводитьОшибки
102 | возврат кодВозврата
103 | ;
104 |
105 | пер ошибкиВыполненияСкрипта = процесс.ПолучитьПотокОшибок()
106 | знч текстОшибок = ошибкиВыполненияСкрипта.ПрочитатьКакТекст(КодировкаПотокаВывода())
107 | если не текстОшибок.Пусто()
108 | Консоль.Записать("Ошибки при выполнении процесса:")
109 | Консоль.Записать(текстОшибок)
110 | ;
111 |
112 | возврат кодВозврата
113 | ;
114 |
115 | метод КодировкаПотокаВывода(): Строка
116 | возврат "Cp1251"
117 | ;
118 |
119 |
120 | перечисление ОперационныеСистемы
121 | Windows,
122 | MacOS,
123 | Linux
124 | ;
125 |
126 |
127 | метод ИспользуемаяОС(): ОперационныеСистемы
128 | знч имяОС = СредаИсполнения.ПолучитьСвойство("os.name")
129 |
130 | выбор когда имяОС.НачинаетсяС("windows", Истина)
131 | возврат ОперационныеСистемы.Windows
132 |
133 | когда имяОС.Содержит("mac", Истина)
134 | возврат ОперационныеСистемы.MacOS
135 |
136 | когда имяОС.Содержит("nux", Истина)
137 | возврат ОперационныеСистемы.Linux
138 |
139 | иначе
140 | выбросить новый ИсключениеНедопустимоеСостояние("Неизвестная ОС")
141 | ;
142 | ;
143 |
144 | структура ОписаниеСтрокиCodeQuality
145 | знч begin: Число
146 | ;
147 |
148 | структура ОписаниеРасположенияCodeQuality
149 | знч path: Строка
150 | знч lines: ОписаниеСтрокиCodeQuality
151 | ;
152 |
153 | перечисление ОшибкаCodeQualityКритичность
154 | blocker,
155 | critical,
156 | major,
157 | minor,
158 | info
159 | ;
160 |
161 | структура ОписаниеОшибкиCodeQuality
162 | знч description: Строка
163 | знч fingerprint: Строка
164 | знч severity: ОшибкаCodeQualityКритичность
165 | знч location: ОписаниеРасположенияCodeQuality
166 | ;
167 |
168 | метод ЗаписатьОшибкиВФорматCodeQuality(файлCodeQuality: Строка, ошибкиEDT: Массив)
169 | знч CI_PROJECT_DIR = "D:\\Разработка\\1ce-git\\so-ups\\zup"
170 |
171 | пер ошибкиCodeQuality = новый Массив()
172 |
173 | для ошибка из ошибкиEDT
174 | пер путьКОбъекту = ПутьКФайлуПоОбъекту(ошибка).Заменить("\\", "/")
175 | путьКОбъекту = "%{ошибка.проект}/%путьКОбъекту"
176 |
177 | знч файлМодуля = новый Файл("%CI_PROJECT_DIR/%путьКОбъекту")
178 | если не файлМодуля.Существует()
179 | продолжить
180 | ;
181 |
182 | пер относительноеПоложение = 0
183 | пер родитель = ""
184 |
185 | исп поток = файлМодуля.ОткрытьПотокЧтения()
186 | знч строкиМодуля = поток.ПрочитатьКакСтроку().Разделить(Символы.НоваяСтрока)
187 | для номерСтроки = 1 по ошибка.положение
188 | знч строкаМодуля = строкиМодуля[ошибка.положение - номерСтроки]
189 | если строкаМодуля.НачинаетсяС("Процедура", Истина)
190 | или строкаМодуля.НачинаетсяС("Функция", Истина)
191 | или строкаМодуля.НачинаетсяС("Procedure", Истина)
192 | или строкаМодуля.НачинаетсяС("Function", Истина)
193 | или строкаМодуля.НачинаетсяС("#Область", Истина)
194 | родитель = строкаМодуля
195 | относительноеПоложение = номерСтроки - 1
196 | прервать
197 | ;
198 | ;
199 |
200 | знч отпечатокОшибки = Строка(новый ХешированиеДанных(АлгоритмХеширования.Sha256)
201 | .ДобавитьДанные(ошибка.объект.ВБайты())
202 | .ДобавитьДанные(родитель.ВБайты())
203 | .ДобавитьДанные(ошибка.ид.ВБайты())
204 | .ДобавитьДанные(Строка(относительноеПоложение).ВБайты())
205 | .Результат)
206 |
207 | пер критичность = ОшибкаCodeQualityКритичность.info
208 | выбор ошибка.критичность
209 | когда ОшибкаEDTКритичность.Блокирующая
210 | критичность = ОшибкаCodeQualityКритичность.blocker
211 |
212 | когда ОшибкаEDTКритичность.Критическая
213 | критичность = ОшибкаCodeQualityКритичность.critical
214 |
215 | когда ОшибкаEDTКритичность.Значительная
216 | критичность = ОшибкаCodeQualityКритичность.major
217 |
218 | когда ОшибкаEDTКритичность.Незначительная
219 | критичность = ОшибкаCodeQualityКритичность.minor
220 |
221 | ;
222 |
223 | знч номерСтроки = новый ОписаниеСтрокиCodeQuality(ошибка.положение)
224 | знч положение = новый ОписаниеРасположенияCodeQuality(путьКОбъекту, номерСтроки)
225 | знч описаниеОшибки = новый ОписаниеОшибкиCodeQuality(
226 | ошибка.описание, отпечатокОшибки, критичность, положение)
227 |
228 | ошибкиCodeQuality.Добавить(описаниеОшибки)
229 | ;
230 |
231 | знч файлПараметров = новый Файл(файлCodeQuality)
232 | исп поток = файлПараметров.ОткрытьПотокЗаписи()
233 | СериализацияJson.ЗаписатьОбъект(поток, ошибкиCodeQuality)
234 | ;
235 |
236 | метод ОшибкиEDT(файлРезультатовВалидации: Строка): Массив
237 | пер ошибки = новый Массив()
238 |
239 | знч файл = новый Файл(файлРезультатовВалидации)
240 | исп поток = файл.ОткрытьПотокЧтения()
241 |
242 | знч чтение = новый ЧтениеДанных(поток)
243 | пока не чтение.ЧтениеЗавершено()
244 | знч строкаДанных = чтение.ПрочитатьСтроку()
245 | если строкаДанных.Пусто()
246 | продолжить
247 | ;
248 |
249 | знч описаниеОшибки = ОшибкаEDT(строкаДанных)
250 | если описаниеОшибки == Неопределено
251 | продолжить
252 | ;
253 |
254 | ошибки.Добавить(описаниеОшибки)
255 | ;
256 |
257 | возврат ошибки
258 | ;
259 |
260 | перечисление ОшибкаEDTКритичность
261 | Блокирующая,
262 | Критическая,
263 | Значительная,
264 | Незначительная,
265 | Тривиальная
266 | ;
267 |
268 | перечисление ОшибкаEDTТип
269 | Предупреждение,
270 | Производительность,
271 | РазработкаИИспользованиеБиблиотек,
272 | СтандартыРазработкиИнтерфейсов,
273 | Безопасность,
274 | Переносимость,
275 | СтандартыКодирования,
276 | Орфография
277 | ;
278 |
279 |
280 | структура ОписаниеОшибкиEDT
281 | знч создано: ДатаВремя
282 | знч критичность: ОшибкаEDTКритичность
283 | знч тип: ОшибкаEDTТип
284 | знч проект: Строка
285 | знч объект: Строка
286 | знч положение: Число
287 | знч описание: Строка
288 | пер источник: Строка
289 | пер ид: Строка
290 | пер контекст: Массив
291 |
292 | конструктор(создано, критичность, тип, проект, ид, объект, положение, описание)
293 | ;
294 |
295 |
296 | метод ОшибкаEDT(строкаДанных: Строка): ОписаниеОшибкиEDT?
297 | знч массивДанных = строкаДанных.Разделить(Символы.Таб, Истина)
298 |
299 | если массивДанных[5].Пусто() или не массивДанных[5].НачинаетсяС("строка")
300 | возврат Неопределено
301 | ;
302 |
303 | знч создано = новый ДатаВремя(массивДанных[0].Подстрока(0, 19))
304 | знч положение = Число(массивДанных[5].Подстрока(7))
305 |
306 | пер критичность = ОшибкаEDTКритичность.Тривиальная
307 | выбор массивДанных[1]
308 | когда "Блокирующая"
309 | критичность = ОшибкаEDTКритичность.Блокирующая
310 |
311 | когда "Критическая"
312 | критичность = ОшибкаEDTКритичность.Критическая
313 |
314 | когда "Значительная"
315 | критичность = ОшибкаEDTКритичность.Значительная
316 |
317 | когда "Незначительная"
318 | критичность = ОшибкаEDTКритичность.Незначительная
319 |
320 | когда "Тривиальная"
321 | критичность = ОшибкаEDTКритичность.Тривиальная
322 |
323 | иначе
324 | критичность = ОшибкаEDTКритичность.Значительная
325 | // выбросить новый ИсключениеНедопустимоеСостояние("Неизвестная критичность %{массивДанных[1]}")
326 |
327 | ;
328 |
329 | пер тип = ОшибкаEDTТип.СтандартыКодирования
330 |
331 | пер ид = массивДанных[3]
332 | если ид.Пусто()
333 | ид = "edt-legacy"
334 | ;
335 |
336 | пер описаниеОшибки = новый ОписаниеОшибкиEDT(создано, критичность, тип, массивДанных[2], ид, массивДанных[4],
337 | положение, массивДанных[6])
338 | описаниеОшибки.источник = "EDT"
339 |
340 | возврат описаниеОшибки
341 | ;
342 |
343 | метод ПутьКФайлуПоОбъекту(описаниеОшибки: ОписаниеОшибкиEDT): Строка
344 | пер массивОбъекта = описаниеОшибки.объект.Разделить(".")
345 |
346 | пер объектМетаданных = массивОбъекта[0]
347 | выбор объектМетаданных
348 | когда "РегистрБухгалтерии"
349 | объектМетаданных = "AccountingRegisters"
350 | когда "РегистрНакопления"
351 | объектМетаданных = "AccumulationRegisters"
352 | когда "БизнесПроцесс"
353 | объектМетаданных = "BusinessProcesses"
354 | когда "РегистрРасчета"
355 | объектМетаданных = "CalculationRegisters"
356 | когда "Справочник"
357 | объектМетаданных = "Catalogs"
358 | когда "ПланСчетов"
359 | объектМетаданных = "ChartsOfAccounts"
360 | когда "ПланВидовРасчета"
361 | объектМетаданных = "ChartsOfCalculationTypes"
362 | когда "ПланВидовХарактеристик"
363 | объектМетаданных = "ChartsOfCharacteristicTypes"
364 | когда "ГруппаКоманд"
365 | объектМетаданных = "CommandGroups"
366 | когда "ОбщаяКоманда"
367 | объектМетаданных = "CommonCommands"
368 | когда "ОбщаяФорма"
369 | объектМетаданных = "CommonForms"
370 | когда "ОбщийМодуль"
371 | объектМетаданных = "CommonModules"
372 | когда "Конфигурация"
373 | объектМетаданных = "Configuration"
374 | когда "Константа"
375 | объектМетаданных = "Constants"
376 | когда "Обработка"
377 | объектМетаданных = "DataProcessors"
378 | когда "ЖурналДокумента"
379 | объектМетаданных = "DocumentJournals"
380 | когда "Документ"
381 | объектМетаданных = "Documents"
382 | когда "Перечисление"
383 | объектМетаданных = "Enums"
384 | когда "ПодпискаНаСобытие"
385 | объектМетаданных = "EventSubscriptions"
386 | когда "ПланОбмена"
387 | объектМетаданных = "ExchangePlans"
388 | когда "КритерийОтбора"
389 | объектМетаданных = "FilterCriteria"
390 | когда "HTTPСервис"
391 | объектМетаданных = "HTTPServices"
392 | когда "РегистрСведений"
393 | объектМетаданных = "InformationRegisters"
394 | когда "Отчет"
395 | объектМетаданных = "Reports"
396 | когда "ХранилищеНастроек"
397 | объектМетаданных = "SettingsStorages"
398 | когда "Задача"
399 | объектМетаданных = "Tasks"
400 | когда "WebСервис"
401 | объектМетаданных = "WebServices"
402 | когда "WSСсылка"
403 | объектМетаданных = "WSReferences"
404 | иначе
405 | выбросить новый ИсключениеНедопустимоеСостояние("Неизвестный объект метаданных %{описаниеОшибки.объект}")
406 | ;
407 |
408 | пер имяМодуля = массивОбъекта[массивОбъекта.Размер() - 1]
409 | выбор имяМодуля
410 | когда "МодульКоманды"
411 | имяМодуля = "CommandModule"
412 | когда "МодульУправляемогоПриложения"
413 | имяМодуля = "ManagedApplicationModule"
414 | когда "МодульМенеджера"
415 | имяМодуля = "ManagerModule"
416 | когда "Модуль"
417 | имяМодуля = "Module"
418 | когда "МодульОбъекта"
419 | имяМодуля = "ObjectModule"
420 | когда "МодульОбычногоПриложения"
421 | имяМодуля = "OrdinaryApplicationModule"
422 | когда "МодульНабораЗаписей"
423 | имяМодуля = "RecordSetModule"
424 | когда "МодульСеанса"
425 | имяМодуля = "SessionModule"
426 | когда "МодульМенеджераЗначения"
427 | имяМодуля = "ValueManagerModule"
428 | иначе
429 | выбросить новый ИсключениеНедопустимоеСостояние("Неизвестный модуль %{описаниеОшибки.объект}")
430 | ;
431 |
432 | массивОбъекта.УдалитьПоИндексу(0)
433 | массивОбъекта.УдалитьПоИндексу(массивОбъекта.Размер() - 1)
434 | пер наименованиеОбъекта = массивОбъекта[0]
435 | массивОбъекта.УдалитьПоИндексу(0)
436 | если массивОбъекта.Размер() == 1
437 | если массивОбъекта[0] != "Форма"
438 | выбросить новый ИсключениеНедопустимоеСостояние("Не удалось определить объект %{описаниеОшибки.объект}")
439 | ;
440 |
441 | иначе если массивОбъекта.Размер() > 1
442 | выбор массивОбъекта[0]
443 | когда "Форма"
444 | наименованиеОбъекта += "\\Forms\\%{массивОбъекта[1]}"
445 | когда "Команда"
446 | наименованиеОбъекта += "\\Commands\\%{массивОбъекта[1]}"
447 | иначе
448 | выбросить новый ИсключениеНедопустимоеСостояние("Неизвестный вид объекта %{массивОбъекта[0]}")
449 | ;
450 |
451 | ;
452 |
453 | возврат "src\\%объектМетаданных\\%наименованиеОбъекта\\%имяМодуля.bsl"
454 | ;
455 |
456 | метод Скрипт(файлCodeQuality: Строка, файлРезультатовВалидации: Строка)
457 | знч ошибкиEDT = ОшибкиEDT(файлРезультатовВалидации)
458 | ЗаписатьОшибкиВФорматCodeQuality(файлCodeQuality, ошибкиEDT)
459 | ;
--------------------------------------------------------------------------------
/VA-Тесты/steps/Документы.feature:
--------------------------------------------------------------------------------
1 | #language: ru
2 |
3 | @tree
4 | @ExportScenarios
5 |
6 | Функциональность: Проверка Документов
7 |
8 | Сценарий: Отсутствует право "ИмяПрава" для документа "ИмяДокумента"
9 | Если объект "Документ.[ИмяДокумента]" недоступен по функциональным опциям
10 | Тогда я останавливаю выполнение сценария "Skipped"
11 |
12 | Если есть право "ИмяПрава" к объекту "Документ.[ИмяДокумента]" тогда
13 | Тогда я вызываю исключение "Ошибочно установлено право [ИмяПрава] для документа [ИмяДокумента]"
14 |
15 | Сценарий: Открытие формы списка документа "ИмяДокумента"
16 | Если объект "Документ.[ИмяДокумента]" недоступен по функциональным опциям
17 | Тогда я останавливаю выполнение сценария "Skipped"
18 |
19 | Если нет права "Просмотр" к объекту "Документ.[ИмяДокумента]" тогда
20 | Тогда я останавливаю выполнение сценария "Skipped"
21 |
22 | Дано я закрыл все окна клиентского приложения
23 | И я очищаю окно сообщений пользователю
24 |
25 | Дано я открываю основную форму списка документа "ИмяДокумента"
26 | Если появилось предупреждение тогда
27 | Тогда я вызываю исключение "Не удалось открыть форму списка документа [ИмяДокумента]"
28 |
29 | И я закрыл все окна клиентского приложения
30 |
31 | Сценарий: Открытие формы существующего документа "ИмяДокумента"
32 | Если объект "Документ.[ИмяДокумента]" недоступен по функциональным опциям
33 | Тогда я останавливаю выполнение сценария "Skipped"
34 |
35 | Если нет права "Просмотр" к объекту "Документ.[ИмяДокумента]" тогда
36 | Тогда я останавливаю выполнение сценария "Skipped"
37 |
38 | Дано я ищу последние 5 документов "ИмяДокумента" по каждой организации в переменную "СписокДокументов"
39 | Если '$СписокДокументов$.Количество() = 0' Тогда
40 | Тогда я останавливаю выполнение сценария "Skipped"
41 |
42 | И для каждого значения "СсылкаДокумента" из массива "$СписокДокументов$"
43 | Дано я закрыл все окна клиентского приложения
44 | И я очищаю окно сообщений пользователю
45 |
46 | Тогда я запоминаю значение выражения 'ПолучитьНавигационнуюСсылку($СсылкаДокумента$)' в переменную "НавигационнаяСсылкаДокумента"
47 | Затем я открываю навигационную ссылку "$НавигационнаяСсылкаДокумента$"
48 | Если появилось предупреждение тогда
49 | Тогда я вызываю исключение "Не удалось открыть навигационную ссылку $НавигационнаяСсылкаДокумента$"
50 |
51 | И я закрыл все окна клиентского приложения
52 |
53 | Сценарий: Открытие формы нового документа "ИмяДокумента"
54 | Если объект "Документ.[ИмяДокумента]" недоступен по функциональным опциям
55 | Тогда я останавливаю выполнение сценария "Skipped"
56 |
57 | Если нет права "ИнтерактивноеДобавление" к объекту "Документ.[ИмяДокумента]" тогда
58 | Тогда я останавливаю выполнение сценария "Skipped"
59 |
60 | Дано я закрыл все окна клиентского приложения
61 | И я очищаю окно сообщений пользователю
62 |
63 | Дано я открываю основную форму документа "ИмяДокумента"
64 | Если появилось предупреждение тогда
65 | Тогда я вызываю исключение "Не удалось открыть основную форму документа [ИмяДокумента]"
66 |
67 | И я закрыл все окна клиентского приложения
68 |
69 | Сценарий: Перезапись существующего документа "ИмяДокумента"
70 | Если объект "Документ.[ИмяДокумента]" недоступен по функциональным опциям
71 | Тогда я останавливаю выполнение сценария "Skipped"
72 |
73 | Если нет права "Редактирование" к объекту "Документ.[ИмяДокумента]" тогда
74 | Тогда я останавливаю выполнение сценария "Skipped"
75 |
76 | Дано я ищу последние 5 документов "ИмяДокумента" по каждой организации в переменную "СписокДокументов"
77 | Если '$СписокДокументов$.Количество() = 0' Тогда
78 | Тогда я останавливаю выполнение сценария "Skipped"
79 |
80 | И для каждого значения "СсылкаДокумента" из массива "$СписокДокументов$"
81 | Дано я закрыл все окна клиентского приложения
82 | И я очищаю окно сообщений пользователю
83 |
84 | Тогда я запоминаю значение выражения 'ПолучитьНавигационнуюСсылку($СсылкаДокумента$)' в переменную "НавигационнаяСсылкаДокумента"
85 | Затем я открываю навигационную ссылку "$НавигационнаяСсылкаДокумента$"
86 | Если появилось предупреждение тогда
87 | Тогда я вызываю исключение "Не удалось открыть навигационную ссылку $НавигационнаяСсылкаДокумента$"
88 | И я нажимаю на кнопку "Записать и закрыть"
89 | Если появилось предупреждение тогда
90 | Тогда я вызываю исключение "Не удалось перезаписать документ $НавигационнаяСсылкаДокумента$"
91 | Если в текущем окне есть сообщения пользователю Тогда
92 | Тогда я вызываю исключение с текстом сообщения
93 |
94 | И я закрыл все окна клиентского приложения
95 |
96 | Сценарий: Перепроведение существующего документа "ИмяДокумента"
97 | Если объект "Документ.[ИмяДокумента]" недоступен по функциональным опциям
98 | Тогда я останавливаю выполнение сценария "Skipped"
99 |
100 | Если нет права "ИнтерактивноеПроведение" к объекту "Документ.[ИмяДокумента]" тогда
101 | Тогда я останавливаю выполнение сценария "Skipped"
102 |
103 | Дано я ищу последние 5 документов "ИмяДокумента" по каждой организации в переменную "СписокДокументов"
104 | Если '$СписокДокументов$.Количество() = 0' Тогда
105 | Тогда я останавливаю выполнение сценария "Skipped"
106 |
107 | И для каждого значения "СсылкаДокумента" из массива "$СписокДокументов$"
108 | Дано я закрыл все окна клиентского приложения
109 | И я очищаю окно сообщений пользователю
110 |
111 | Тогда я запоминаю значение выражения 'ПолучитьНавигационнуюСсылку($СсылкаДокумента$)' в переменную "НавигационнаяСсылкаДокумента"
112 | Затем я открываю навигационную ссылку "$НавигационнаяСсылкаДокумента$"
113 | Если появилось предупреждение тогда
114 | Тогда я вызываю исключение "Не удалось открыть навигационную ссылку $НавигационнаяСсылкаДокумента$"
115 | И я нажимаю на кнопку "Провести и закрыть"
116 | Если появилось предупреждение тогда
117 | Тогда я вызываю исключение "Не удалось перепровести документ $НавигационнаяСсылкаДокумента$"
118 | Если в текущем окне есть сообщения пользователю Тогда
119 | Тогда я вызываю исключение с текстом сообщения
120 |
121 | И я закрыл все окна клиентского приложения
122 |
123 | Сценарий: Исправление существующего документа "ИмяДокумента"
124 | Если объект "Документ.[ИмяДокумента]" недоступен по функциональным опциям
125 | Тогда я останавливаю выполнение сценария "Skipped"
126 |
127 | Если нет права "ИнтерактивноеДобавление" к объекту "Документ.[ИмяДокумента]" тогда
128 | Тогда я останавливаю выполнение сценария "Skipped"
129 |
130 | Дано я ищу последние 5 документов "ИмяДокумента" по каждой организации в переменную "СписокДокументов"
131 | Если '$СписокДокументов$.Количество() = 0' Тогда
132 | Тогда я останавливаю выполнение сценария "Skipped"
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 | Тогда я останавливаю выполнение сценария "Skipped"
163 |
164 | Если нет права "Просмотр" к объекту "Документ.[ИмяДокумента]" тогда
165 | Тогда я останавливаю выполнение сценария "Skipped"
166 |
167 | Дано я получаю список команд печати для объекта метаданных "Документ.[ИмяДокумента]" в переменную "СписокПечатныхФорм"
168 | Если '$СписокПечатныхФорм$.Количество() = 0' Тогда
169 | Тогда я останавливаю выполнение сценария "Skipped"
170 |
171 | И я ищу последние 5 документов "ИмяДокумента" по каждой организации в переменную "СписокДокументов"
172 | Если '$СписокДокументов$.Количество() = 0' Тогда
173 | Тогда я останавливаю выполнение сценария "Skipped"
174 |
175 | И для каждого значения "СсылкаДокумента" из массива "$СписокДокументов$"
176 | Дано я закрыл все окна клиентского приложения
177 | И я очищаю окно сообщений пользователю
178 |
179 | Тогда я запоминаю значение выражения 'ПолучитьНавигационнуюСсылку($СсылкаДокумента$)' в переменную "НавигационнаяСсылкаДокумента"
180 | Затем я открываю навигационную ссылку "$НавигационнаяСсылкаДокумента$"
181 | Если появилось предупреждение тогда
182 | Тогда я вызываю исключение "Не удалось открыть навигационную ссылку $НавигационнаяСсылкаДокумента$"
183 | И для каждого значения "ПечатнаяФормаОбъекта" из массива "$СписокПечатныхФорм$"
184 | Тогда я запоминаю значение выражения '$ПечатнаяФормаОбъекта$.Представление' в переменную "НаименованиеПечатнойФормы"
185 | Если элемент с заголовком "$НаименованиеПечатнойФормы$" присутствует на форме тогда
186 | Тогда я нажимаю на кнопку "$НаименованиеПечатнойФормы$"
187 | Если появилось предупреждение, содержащее текст 'Для выполнения команды "$НаименованиеПечатнойФормы$" документ будет проведен. Продолжить?' тогда
188 | Тогда я нажимаю на кнопку "Провести и продолжить"
189 | Если появилось предупреждение тогда
190 | Тогда я вызываю исключение "Не удалось напечатать форму $НаименованиеПечатнойФормы$ для документа $НавигационнаяСсылкаДокумента$"
191 | И я закрываю текущее окно
192 |
193 | И я закрыл все окна клиентского приложения
194 |
195 | Сценарий: Заполнение нового документа "ИмяДокумента"
196 | Если объект "Документ.[ИмяДокумента]" недоступен по функциональным опциям
197 | Тогда я останавливаю выполнение сценария "Skipped"
198 |
199 | Если нет права "ИнтерактивноеДобавление" к объекту "Документ.[ИмяДокумента]" тогда
200 | Тогда я останавливаю выполнение сценария "Skipped"
201 |
202 | Дано я закрыл все окна клиентского приложения
203 | И я очищаю окно сообщений пользователю
204 |
205 | Дано я выполняю код и вставляю в переменную 'Новый Массив' "ДоступныеОрганизацииПодразделения"
206 | И я выполняю код встроенного языка 'Контекст.ДоступныеОрганизацииПодразделения.Добавить(Новый Структура("Организация, Подразделение", "Организация", "Подразделение"))'
207 |
208 | Дано я открываю основную форму списка справочника "Организации"
209 | Если появилось предупреждение тогда
210 | Тогда я вызываю исключение "Не удалось открыть основную форму списка справочника Организации"
211 | И я запоминаю значение таблицы "Список" как "ДоступныеОрганизации"
212 | | 'Наименование' |
213 | Дано я открываю основную форму списка справочника "ПодразделенияОрганизаций"
214 | Если появилось предупреждение тогда
215 | Тогда я вызываю исключение "Не удалось открыть основную форму списка справочника ПодразделенияОрганизаций"
216 | И для каждой строки таблицы '$ДоступныеОрганизации$' я выполняю
217 | Дано из выпадающего списка с именем "КомпоновщикНастроекПользовательскиеНастройкиЭлемент4Значение" я выбираю точное значение "$Наименование$"
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 | Тогда я останавливаю выполнение сценария "Skipped"
257 |
258 | Если нет права "Редактирование" к объекту "Документ.[ИмяДокумента]" тогда
259 | Тогда я останавливаю выполнение сценария "Skipped"
260 |
261 | Дано я ищу последние 5 документов "ИмяДокумента" по каждой организации в переменную "СписокДокументов"
262 | Если '$СписокДокументов$.Количество() = 0' Тогда
263 | Тогда я останавливаю выполнение сценария "Skipped"
264 |
265 | И для каждого значения "СсылкаДокумента" из массива "$СписокДокументов$"
266 | Дано я закрыл все окна клиентского приложения
267 | И я очищаю окно сообщений пользователю
268 |
269 | Тогда я запоминаю значение выражения 'ПолучитьНавигационнуюСсылку($СсылкаДокумента$)' в переменную "НавигационнаяСсылкаДокумента"
270 | Затем я открываю навигационную ссылку "$НавигационнаяСсылкаДокумента$"
271 | Если появилось предупреждение тогда
272 | Тогда я вызываю исключение "Не удалось открыть навигационную ссылку $НавигационнаяСсылкаДокумента$"
273 | И я нажимаю на кнопку "Заполнить"
274 | Если появилось предупреждение содержащее текст "*родолжить?" по шаблону тогда
275 | Тогда я нажимаю на кнопку "Да"
276 | Если появилось предупреждение тогда
277 | Тогда я вызываю исключение "Не удалось перезаполнить документ $НавигационнаяСсылкаДокумента$"
278 | Если в текущем окне есть сообщения пользователю Тогда
279 | Тогда я вызываю исключение с текстом сообщения
280 |
281 | И я закрыл все окна клиентского приложения
282 |
283 |
--------------------------------------------------------------------------------
/Библиотеки/ПакетныйРежимSonarQube.sbsl:
--------------------------------------------------------------------------------
1 | #!/usr/bin/executor
2 |
3 | /*******************************************************************************
4 | * Copyright (c) 2021 Alexander Kapralov and Contributors
5 | * This program and the accompanying materials are made available under
6 | * the terms of the BSD 3-Clause License which is available at
7 | * https://spdx.org/licenses/BSD-3-Clause.html#licenseText
8 | *
9 | * SPDX-License-Identifier: BSD-3-Clause
10 | *
11 | * Contributors:
12 | *
13 | *
14 | ******************************************************************************/
15 |
16 | метод ПреобразоватьОшибкиВФорматSonarCube(файлSonarQube: Строка, файлРезультатовВалидации: Строка)
17 | знч данныеОшибок = ОшибкиВФорматеSonarCube(файлРезультатовВалидации)
18 |
19 | ЗаписатьОшибкиВФорматSonarCube(файлSonarQube, данныеОшибок)
20 | ;
21 |
22 | метод ОшибкиВФорматеSonarCube(файлРезультатовВалидации: Строка): SonarqubeGenericFormat
23 | знч файл = новый Файл(файлРезультатовВалидации)
24 | исп поток = файл.ОткрытьПотокЧтения()
25 |
26 | пер issues = новый Массив()
27 | пер rules = новый Массив()
28 | пер соответствиеПравил = новый Соответствие()
29 |
30 | знч чтение = новый ЧтениеДанных(поток)
31 | пока не чтение.ЧтениеЗавершено()
32 | знч строкаДанных = чтение.ПрочитатьСтроку()
33 | если строкаДанных.Пусто()
34 | продолжить
35 | ;
36 |
37 | знч описаниеОшибки = ОшибкаEDT(строкаДанных)
38 | если описаниеОшибки == Неопределено
39 | продолжить
40 | ;
41 |
42 | знч issue = IssueИзСтрокиTSV(описаниеОшибки)
43 | issues.Добавить(issue)
44 |
45 | соответствиеПравил.Вставить(issue.ruleId, RuleИзIssue(issue))
46 | ;
47 |
48 | для правило из соответствиеПравил
49 | rules.Добавить(правило.Значение)
50 | ;
51 |
52 | возврат новый SonarqubeGenericFormat(issues, rules)
53 | ;
54 |
55 | метод ЗаписатьОшибкиВФорматSonarCube(файлSonarQube: Строка, данныеОшибок: SonarqubeGenericFormat)
56 | знч файлПараметров = новый Файл(файлSonarQube)
57 | исп поток = файлПараметров.ОткрытьПотокЗаписи()
58 |
59 | СериализацияJson.ЗаписатьОбъект(поток, данныеОшибок)
60 | ;
61 |
62 |
63 | /*
64 | * Sonarqube API
65 | */
66 | структура SonarqubeGenericFormat
67 | знч issues: Массив
68 | знч rules: Массив
69 | ;
70 |
71 | структура SonarqubeTextRange
72 | знч startLine: Число
73 |
74 | // пер endLine: Число = 0
75 | // пер startColumn: Число = 0
76 | // пер endColumn: Число = 0
77 | конструктор(startLine)
78 | ;
79 |
80 | структура SonarqubeLocation
81 | знч message: Строка
82 | знч filePath: Строка
83 | пер textRange: SonarqubeTextRange?
84 |
85 | конструктор(message, filePath)
86 | ;
87 |
88 |
89 | перечисление SonarqubeType
90 | BUG,
91 | VULNERABILITY,
92 | CODE_SMELL
93 | ;
94 |
95 | перечисление SonarqubeSeverity
96 | BLOCKER,
97 | CRITICAL,
98 | MAJOR,
99 | MINOR,
100 | INFO
101 | ;
102 |
103 |
104 | структура SonarqubeIssue
105 | знч engineId: Строка
106 | знч ruleId: Строка
107 | знч primaryLocation: SonarqubeLocation
108 | знч type: SonarqubeType
109 | знч severity: SonarqubeSeverity
110 |
111 | // пер effortMinutes: Число = 0
112 | // пер secondaryLocations: SonarqubeLocation?
113 | конструктор(engineId, ruleId, primaryLocation, type, severity)
114 | ;
115 |
116 | структура BslLsRule
117 | знч engineId: Строка
118 | знч ruleId: Строка
119 | знч name: Строка
120 | знч type: SonarqubeType
121 | знч severity: SonarqubeSeverity
122 | знч description: Строка
123 | ;
124 |
125 |
126 | метод DecToHex(десятичноеЧисло: Число): Строка
127 | пер база = 16
128 |
129 | пер результат = ""
130 |
131 | пока десятичноеЧисло != 0
132 | пер поз = десятичноеЧисло % база
133 |
134 | результат = "0123456789ABCDEF".Символ(поз) + результат
135 |
136 | десятичноеЧисло = (десятичноеЧисло / база).ЦелаяЧасть()
137 | ;
138 | результат = "0000" + результат
139 |
140 | возврат результат.ПодстрокаСКонца(4)
141 | ;
142 |
143 | метод СтрокуВUnicode(исходнаяСтрока: Строка): Строка
144 | пер результат = ""
145 |
146 | пер кодыДопустимыхСимволов = новый Массив()
147 | кодыДопустимыхСимволов.Добавить(1105) // "ё"
148 | кодыДопустимыхСимволов.Добавить(1025) // "Ё"
149 |
150 | для номер = 0 по исходнаяСтрока.Длина() - 1
151 | знч кодСимвола = Символы.ПолучитьКод(исходнаяСтрока.Символ(номер))
152 | знч оставить = ((кодСимвола < 1040) или (кодСимвола > 1103)) и (кодыДопустимыхСимволов.Найти(кодСимвола) == Неопределено)
153 | если оставить
154 | результат += исходнаяСтрока.Символ(номер)
155 | иначе
156 | результат += "\\u" + DecToHex(кодСимвола)
157 | ;
158 | ;
159 |
160 | возврат результат
161 | ;
162 |
163 | метод СохранитьНастройкиСканера(имяФайлаПараметров: Строка, сервер: Строка, ключПроекта: Строка,
164 | наименованиеПроекта: Строка, версияПроекта: Строка, путьКонфигурацииЕДТ: Строка, файлSonarQube: Строка)
165 | знч файлПараметров = новый Файл(имяФайлаПараметров)
166 | исп поток = файлПараметров.ОткрытьПотокЗаписи()
167 |
168 | пер запись = новый ЗаписьДанных(поток)
169 |
170 | знч наименованиеПроектаUnicode = СтрокуВUnicode(наименованиеПроекта)
171 | знч путьКонфигурацииЕДТUnicode = СтрокуВUnicode(путьКонфигурацииЕДТ.Заменить("\\", "/"))
172 | знч файлSonarQubeUnicode = СтрокуВUnicode(файлSonarQube.Заменить("\\", "/"))
173 |
174 | запись.ЗаписатьСтроку("sonar.host.url=%сервер")
175 | запись.ЗаписатьСтроку("sonar.projectKey=%ключПроекта")
176 | запись.ЗаписатьСтроку("sonar.projectName=%наименованиеПроектаUnicode (%ключПроекта)")
177 | запись.ЗаписатьСтроку("sonar.projectVersion=%версияПроекта")
178 | запись.ЗаписатьСтроку("sonar.sourceEncoding=UTF-8")
179 | запись.ЗаписатьСтроку("sonar.inclusions=**/*.bsl")
180 | запись.ЗаписатьСтроку("sonar.sources=src")
181 | запись.ЗаписатьСтроку("sonar.projectBaseDir=%путьКонфигурацииЕДТUnicode")
182 | запись.ЗаписатьСтроку("sonar.scm.enabled=true")
183 | запись.ЗаписатьСтроку("sonar.scm.provider=git")
184 | запись.ЗаписатьСтроку("sonar.externalIssuesReportPaths=%файлSonarQubeUnicode")
185 | запись.ЗаписатьСтроку("sonar.bsl.languageserver.enabled=false")
186 | ;
187 |
188 | метод ЗапуститьSonarScanner(имяФайлаПараметров: Строка, токен: Строка, путьSonarScanner: Строка)
189 | пер имяКоманды = ""
190 | знч версияОС = ИспользуемаяОС()
191 | выбор версияОС
192 | когда ОперационныеСистемы.Windows
193 | имяКоманды = "%путьSonarScanner/bin/sonar-scanner.bat"
194 | иначе
195 | имяКоманды = "%путьSonarScanner/bin/sonar-scanner"
196 | ;
197 |
198 | знч временныйФайлЛогов = Файлы.СоздатьВременныйФайл()
199 |
200 | пер параметры = новый Массив()
201 | параметры.Добавить("-Dproject.settings=\"%имяФайлаПараметров\"")
202 | параметры.Добавить("-D\"sonar.login=%токен\"")
203 | параметры.Добавить(">%{временныйФайлЛогов.Путь}")
204 |
205 | пер процесс = новый ПроцессОс(имяКоманды, параметры, Ложь)
206 | процесс.Запустить()
207 | пер количествоВыведенныхСтрок = 0
208 | пока не процесс.ОжидатьЗавершения(60с) и процесс.Живой()
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 | если кодВозврата == 0
238 | Консоль.Записать("SonarQube Scanner успешно запущен.")
239 | возврат
240 | ;
241 |
242 | пер текстОшибки = "Код возврата: %кодВозврата"
243 |
244 | текстОшибки += Строки.Шаблон("\в\нКоманда: $0\в\нПараметры: $1", [имяКоманды, Строки.Соединить(параметры, " ")])
245 |
246 | исп ошибкиВыполненияСкрипта = процесс.ПолучитьПотокОшибок()
247 | текстОшибки += "\в\н" + ошибкиВыполненияСкрипта.ПрочитатьКакСтроку(КодировкаПотокаВыводаПлатформы())
248 | выбросить новый ИсключениеНедопустимоеСостояние(текстОшибки)
249 | ;
250 |
251 | метод КодировкаПотокаВыводаПлатформы(): Строка
252 | если ИспользуемаяОС() == ОперационныеСистемы.Windows
253 | возврат "windows-1251"
254 | ;
255 |
256 | возврат "UTF-8"
257 | ;
258 |
259 |
260 | перечисление ОперационныеСистемы
261 | Windows,
262 | MacOS,
263 | Linux
264 | ;
265 |
266 |
267 | метод ИспользуемаяОС(): ОперационныеСистемы
268 | знч имяОС = СредаИсполнения.ПолучитьСвойство("os.name")
269 |
270 | выбор когда имяОС.НачинаетсяС("windows", Истина)
271 | возврат ОперационныеСистемы.Windows
272 |
273 | когда имяОС.Содержит("mac", Истина)
274 | возврат ОперационныеСистемы.MacOS
275 |
276 | когда имяОС.Содержит("nux", Истина)
277 | возврат ОперационныеСистемы.Linux
278 |
279 | иначе
280 | выбросить новый ИсключениеНедопустимоеСостояние("Неизвестная ОС")
281 | ;
282 | ;
283 |
284 |
285 | перечисление ОшибкаEDTКритичность
286 | Блокирующая,
287 | Критическая,
288 | Значительная,
289 | Незначительная,
290 | Тривиальная
291 | ;
292 |
293 |
294 | структура ОписаниеОшибкиEDT
295 | знч создано: ДатаВремя
296 | знч критичность: ОшибкаEDTКритичность
297 | знч проект: Строка
298 | знч объект: Строка
299 | знч положение: Число
300 | знч описание: Строка
301 | пер источник: Строка
302 | пер ид: Строка
303 | пер контекст: Массив
304 |
305 | конструктор(создано, критичность, проект, ид, объект, положение, описание)
306 | ;
307 |
308 |
309 | метод ОшибкаEDT(строкаДанных: Строка): ОписаниеОшибкиEDT?
310 | знч массивДанных = строкаДанных.Разделить(Символы.Таб, Истина)
311 |
312 | если массивДанных[3].Пусто() или массивДанных[5].Пусто() или не массивДанных[5].НачинаетсяС("строка")
313 | возврат Неопределено
314 | ;
315 |
316 | знч создано = новый ДатаВремя(массивДанных[0].Подстрока(0, 19))
317 | знч положение = Число(массивДанных[5].Подстрока(7))
318 |
319 | пер критичность = ОшибкаEDTКритичность.Тривиальная
320 | выбор массивДанных[1]
321 | когда "Блокирующая"
322 | критичность = ОшибкаEDTКритичность.Блокирующая
323 |
324 | когда "Критическая"
325 | критичность = ОшибкаEDTКритичность.Критическая
326 |
327 | когда "Значительная"
328 | критичность = ОшибкаEDTКритичность.Значительная
329 |
330 | когда "Незначительная"
331 | критичность = ОшибкаEDTКритичность.Незначительная
332 |
333 | когда "Тривиальная"
334 | критичность = ОшибкаEDTКритичность.Тривиальная
335 |
336 | иначе
337 | критичность = ОшибкаEDTКритичность.Значительная
338 | // выбросить новый ИсключениеНедопустимоеСостояние("Неизвестная критичность %{массивДанных[1]}")
339 |
340 | ;
341 |
342 | пер описаниеОшибки = новый ОписаниеОшибкиEDT(создано, критичность, массивДанных[2], массивДанных[3], массивДанных[4],
343 | положение, массивДанных[6])
344 | описаниеОшибки.источник = "EDT"
345 |
346 | возврат описаниеОшибки
347 | ;
348 |
349 | метод IssueИзСтрокиTSV(описаниеОшибки: ОписаниеОшибкиEDT): SonarqubeIssue
350 | знч engineId = описаниеОшибки.источник
351 | знч ruleId = описаниеОшибки.ид
352 | пер primaryLocation = новый SonarqubeLocation(описаниеОшибки.описание, ПутьКФайлуПоОбъекту(описаниеОшибки))
353 | primaryLocation.textRange = новый SonarqubeTextRange(описаниеОшибки.положение)
354 |
355 | пер type = SonarqubeType.CODE_SMELL
356 |
357 | пер severity = SonarqubeSeverity.INFO
358 | выбор описаниеОшибки.критичность
359 | когда ОшибкаEDTКритичность.Блокирующая
360 | severity = SonarqubeSeverity.BLOCKER
361 | type = SonarqubeType.BUG
362 |
363 | когда ОшибкаEDTКритичность.Критическая
364 | severity = SonarqubeSeverity.CRITICAL
365 | type = SonarqubeType.BUG
366 |
367 | когда ОшибкаEDTКритичность.Значительная
368 | severity = SonarqubeSeverity.MAJOR
369 | type = SonarqubeType.BUG
370 |
371 | когда ОшибкаEDTКритичность.Незначительная
372 | severity = SonarqubeSeverity.MINOR
373 | type = SonarqubeType.BUG
374 |
375 | ;
376 |
377 | знч issue = новый SonarqubeIssue(engineId, ruleId, primaryLocation, type, severity)
378 |
379 | возврат issue
380 | ;
381 |
382 | метод RuleИзIssue(issue: SonarqubeIssue): BslLsRule
383 | возврат новый BslLsRule(issue.engineId, issue.ruleId, issue.ruleId, issue.type, issue.severity, issue.ruleId)
384 | ;
385 |
386 | метод ПутьКФайлуПоОбъекту(описаниеОшибки: ОписаниеОшибкиEDT): Строка
387 | пер массивОбъекта = описаниеОшибки.объект.Разделить(".")
388 |
389 | пер объектМетаданных = массивОбъекта[0]
390 | выбор объектМетаданных
391 | когда "РегистрБухгалтерии"
392 | объектМетаданных = "AccountingRegisters"
393 | когда "РегистрНакопления"
394 | объектМетаданных = "AccumulationRegisters"
395 | когда "БизнесПроцесс"
396 | объектМетаданных = "BusinessProcesses"
397 | когда "РегистрРасчета"
398 | объектМетаданных = "CalculationRegisters"
399 | когда "Справочник"
400 | объектМетаданных = "Catalogs"
401 | когда "ПланСчетов"
402 | объектМетаданных = "ChartsOfAccounts"
403 | когда "ПланВидовРасчета"
404 | объектМетаданных = "ChartsOfCalculationTypes"
405 | когда "ПланВидовХарактеристик"
406 | объектМетаданных = "ChartsOfCharacteristicTypes"
407 | когда "ГруппаКоманд"
408 | объектМетаданных = "CommandGroups"
409 | когда "ОбщаяКоманда"
410 | объектМетаданных = "CommonCommands"
411 | когда "ОбщаяФорма"
412 | объектМетаданных = "CommonForms"
413 | когда "ОбщийМодуль"
414 | объектМетаданных = "CommonModules"
415 | когда "Конфигурация"
416 | объектМетаданных = "Configuration"
417 | когда "Константа"
418 | объектМетаданных = "Constants"
419 | когда "Обработка"
420 | объектМетаданных = "DataProcessors"
421 | когда "ЖурналДокумента"
422 | объектМетаданных = "DocumentJournals"
423 | когда "Документ"
424 | объектМетаданных = "Documents"
425 | когда "Перечисление"
426 | объектМетаданных = "Enums"
427 | когда "ПодпискаНаСобытие"
428 | объектМетаданных = "EventSubscriptions"
429 | когда "ПланОбмена"
430 | объектМетаданных = "ExchangePlans"
431 | когда "КритерийОтбора"
432 | объектМетаданных = "FilterCriteria"
433 | когда "HTTPСервис"
434 | объектМетаданных = "HTTPServices"
435 | когда "РегистрСведений"
436 | объектМетаданных = "InformationRegisters"
437 | когда "Отчет"
438 | объектМетаданных = "Reports"
439 | когда "ХранилищеНастроек"
440 | объектМетаданных = "SettingsStorages"
441 | когда "Задача"
442 | объектМетаданных = "Tasks"
443 | когда "WebСервис"
444 | объектМетаданных = "WebServices"
445 | когда "WSСсылка"
446 | объектМетаданных = "WSReferences"
447 | иначе
448 | выбросить новый ИсключениеНедопустимоеСостояние("Неизвестный объект метаданных %{описаниеОшибки.объект}")
449 | ;
450 |
451 | пер имяМодуля = массивОбъекта[массивОбъекта.Размер() - 1]
452 | выбор имяМодуля
453 | когда "МодульКоманды"
454 | имяМодуля = "CommandModule"
455 | когда "МодульУправляемогоПриложения"
456 | имяМодуля = "ManagedApplicationModule"
457 | когда "МодульМенеджера"
458 | имяМодуля = "ManagerModule"
459 | когда "Модуль"
460 | имяМодуля = "Module"
461 | когда "МодульОбъекта"
462 | имяМодуля = "ObjectModule"
463 | когда "МодульОбычногоПриложения"
464 | имяМодуля = "OrdinaryApplicationModule"
465 | когда "МодульНабораЗаписей"
466 | имяМодуля = "RecordSetModule"
467 | когда "МодульСеанса"
468 | имяМодуля = "SessionModule"
469 | когда "МодульМенеджераЗначения"
470 | имяМодуля = "ValueManagerModule"
471 | иначе
472 | выбросить новый ИсключениеНедопустимоеСостояние("Неизвестный модуль %{описаниеОшибки.объект}")
473 | ;
474 |
475 | массивОбъекта.УдалитьПоИндексу(0)
476 | массивОбъекта.УдалитьПоИндексу(массивОбъекта.Размер() - 1)
477 | пер наименованиеОбъекта = массивОбъекта[0]
478 | массивОбъекта.УдалитьПоИндексу(0)
479 | если массивОбъекта.Размер() == 1
480 | если массивОбъекта[0] != "Форма"
481 | выбросить новый ИсключениеНедопустимоеСостояние("Не удалось определить объект %{описаниеОшибки.объект}")
482 | ;
483 |
484 | иначе если массивОбъекта.Размер() > 1
485 | выбор массивОбъекта[0]
486 | когда "Форма"
487 | наименованиеОбъекта += "\\Forms\\%{массивОбъекта[1]}"
488 | когда "Команда"
489 | наименованиеОбъекта += "\\Commands\\%{массивОбъекта[1]}"
490 | иначе
491 | выбросить новый ИсключениеНедопустимоеСостояние("Неизвестный вид объекта %{массивОбъекта[0]}")
492 | ;
493 |
494 | ;
495 |
496 | возврат "src\\%объектМетаданных\\%наименованиеОбъекта\\%имяМодуля.bsl"
497 | ;
--------------------------------------------------------------------------------