├── 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 | ; --------------------------------------------------------------------------------