-
Notifications
You must be signed in to change notification settings - Fork 53
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
468 / cборка простых внешних обработок. #472
Conversation
WalkthroughЭтот обзор представляет значительные изменения в инфраструктуре тестирования YAXUnit, включающие новые модули, служебные функции и утилиты для работы с внешними обработками и файлами. Основные нововведения включают расширение функциональности модулей логирования, работы с файлами, определение платформозависимых функций и введение новых служебных модулей для компиляции и управления внешними обработками. Changes
Poem
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
SonarQube Quality Gate failed!
0 Bugs
0 Vulnerabilities
2 Code Smells
No data Coverage
0.00% Duplication
Если КодВозврата <> 0 Тогда | ||
Сообщение = СтрШаблон("%1 завершилась с ошибкой. Команда: `%2`; рабочий каталог: `%3`", Описание, Команда, РабочийКаталог); | ||
Если ЮТФайлы.Существует(ФайлЛога) Тогда | ||
Сообщение = СтрШаблон("%1 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🔗Уберите инициализацию параметров метода "СтрШаблон" вложенными методами
standard
badpractice
brainoverload
parameters
Why is this an issue?
ИдентификаторМодуляОбъекта = "00ab4620-8498-4b18-a4f8-18b53138fcb5.0"; | ||
ИдентификаторФормы = "a10cd1fd-c4ba-437c-9925-b7354192a1ea.0"; | ||
|
||
РабочийКаталог = ЮТФайлы.ОбъединитьПути(КаталогВременныхФайлов(), "yaxunit-v8unpack"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🔗Не рекомендуемый вызов функции КаталогВременныхФайлов()
standard
badpractice
Why is this an issue?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 4
🧹 Nitpick comments (11)
exts/yaxunit/src/CommonModules/ЮТВнешниеОбработкиСлужебныйСервер/Module.bsl (4)
21-56
: Уточнить обрабатываемые ошибки при неуспешной сборке
В случае, если при сборке внешней обработки произойдёт ошибка, логика метода сейчас прервётся исключением, но при этом не выполнится дополнительная диагностика. Рассмотрите возможность перехвата исключения или детального журнала, чтобы оператору было проще отследить и устранить сбой.
28-39
: Рассмотреть освобождение ресурсов после использования
Текущий код не показывает явной очистки временных директорий после успешной сборки. Для избежания переполнения диска и конфликтов с повторами сборки рекомендуется очищать временные файлы, когда они больше не нужны.
104-130
: Перенести часть логики в отдельные методы
Метод ВыполнитьКомандуСистемы содержит несколько этапов (формирование команды, запуск, чтение лога и т. д.). Для улучшения читабельности и тестируемости кода имеет смысл вынести логику анализа лога или формирования сообщения об ошибке в отдельные процедуры.
118-128
: Обработка кода возврата в нестандартных случаях
Если команда возвращает нестандартный код не равный 0 (например, не 1 или 2), желательно иметь отдельную обработку, чтобы быстро понимать характер проблемы.exts/yaxunit/src/CommonModules/ЮТИсполнительСлужебныйКлиент/Module.bsl (1)
502-508
: Рассмотреть расширенный лог перед выполнением тестов
Строка с выводом данных о модуле выводит минимум сведений (имя расширения, имя модуля). Для более удобной диагностики при ошибках можно расширить лог, указывая количество тестовых наборов, сложность или иные дополнительные параметры тестируемого модуля.exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl (1)
163-164
: Упростить логику, используя прямой вызов новой реализации
Учитывая, что здесь фактически вызывается ЮТФайлы.ДанныеТекстовогоФайла(…), можно рассмотреть удаление промежуточного вызова в будущем, когда устаревание станет окончательным. Это повысит читаемость и уменьшит цепочки вызовов.tests/src/CommonModules/ОМ_ЮТВнешниеОбработкиСлужебныйСервер/Module.bsl (2)
21-27
: Отразить в названии сценария суть проверяемой функциональности
Название «СкомпилирватьВнешнуюОбработку» не даёт понять, что именно этот сценарий тестирует, например: проверку корректной компиляции, запись модуля формы и т. д. Рекомендуется структурировать имена тестов с учётом конкретной цели проверки.
53-60
: Дополнительно проверить корректность конфигурации внешней обработки
Функция Обработка() возвращает новый экземпляр внешней обработки. Рассмотрите возможность проверять корректность не только одного реквизита, но и других сущностей (форм, процедур), чтобы убедиться, что всё собралось корректно.exts/yaxunit/src/CommonModules/ЮТОкружение/Module.bsl (1)
88-119
: Оптимизация создания СистемнаяИнформацияРекомендуется кэшировать экземпляр СистемнаяИнформация в приватной переменной модуля для избежания повторного создания объекта при каждом вызове функций.
Предлагаемая реализация:
+#Область ПеременныеМодуля +Перем КэшСистемнойИнформации; +#КонецОбласти + +#Область ИнициализацияМодуля +КэшСистемнойИнформации = Новый СистемнаяИнформация(); +#КонецОбласти + Функция ЭтоWindows() Экспорт - Информация = Новый СистемнаяИнформация(); - Возврат Информация.ТипПлатформы = ТипПлатформы.Windows_x86 Или Информация.ТипПлатформы = ТипПлатформы.Windows_x86_64; + Возврат КэшСистемнойИнформации.ТипПлатформы = ТипПлатформы.Windows_x86 + Или КэшСистемнойИнформации.ТипПлатформы = ТипПлатформы.Windows_x86_64; КонецФункцииexts/yaxunit/src/CommonModules/ЮТПараметрыЗапускаСлужебный/Module.bsl (1)
193-193
: Изменение механизма чтения файлов.Использование
ЮТФайлы.ДанныеТекстовогоФайла
вместоЮТОбщий.ДанныеТекстовогоФайла
улучшает организацию кода, централизуя операции с файлами в специализированном модуле.exts/yaxunit/src/CommonModules/ЮТФайлы/Module.bsl (1)
151-169
: Добавьте обработку ошибокФункция корректно выполняет рекурсивное копирование, но рекомендуется добавить обработку возможных ошибок при операциях с файловой системой.
Процедура СкопироватьКаталог(КаталогИсточник, КаталогПриемник) Экспорт + Попытка Если НЕ Существует(КаталогПриемник) Тогда СоздатьКаталог(КаталогПриемник); КонецЕсли; Для Каждого Файл Из НайтиФайлы(КаталогИсточник, "*") Цикл Если СтрСравнить(Файл.ПолноеИмя, КаталогИсточник) = 0 Тогда Продолжить; ИначеЕсли Файл.ЭтоКаталог() Тогда СкопироватьКаталог(Файл.ПолноеИмя, ОбъединитьПути(КаталогПриемник, Файл.Имя)); Иначе КопироватьФайл(Файл.ПолноеИмя, ОбъединитьПути(КаталогПриемник, Файл.Имя)); КонецЕсли; КонецЦикла; + Исключение + ВызватьИсключение НСтр("ru='Ошибка при копировании каталога: %1'") + ОписаниеОшибки(); + КонецПопытки КонецПроцедуры
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (2)
exts/yaxunit/src/CommonTemplates/ЮТV8UnpackWS/Template.bin
is excluded by!**/*.bin
tools/v8unpack/v8unpack.exe
is excluded by!**/*.exe
📒 Files selected for processing (21)
exts/yaxunit/src/CommonModules/ЮТВнешниеОбработкиСлужебныйСервер/Module.bsl
(1 hunks)exts/yaxunit/src/CommonModules/ЮТВнешниеОбработкиСлужебныйСервер/ЮТВнешниеОбработкиСлужебныйСервер.mdo
(1 hunks)exts/yaxunit/src/CommonModules/ЮТИсполнительСлужебныйКлиент/Module.bsl
(1 hunks)exts/yaxunit/src/CommonModules/ЮТЛогированиеСлужебный/Module.bsl
(0 hunks)exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl
(1 hunks)exts/yaxunit/src/CommonModules/ЮТОкружение/Module.bsl
(1 hunks)exts/yaxunit/src/CommonModules/ЮТПараметрыЗапускаСлужебный/Module.bsl
(1 hunks)exts/yaxunit/src/CommonModules/ЮТФайлы/Module.bsl
(2 hunks)exts/yaxunit/src/CommonTemplates/ЮТV8UnpackWS/ЮТV8UnpackWS.mdo
(1 hunks)exts/yaxunit/src/Configuration/Configuration.mdo
(2 hunks)tests/src/CommonModules/ОМ_ЮТВнешниеОбработкиСлужебныйСервер/Module.bsl
(1 hunks)tests/src/CommonModules/ОМ_ЮТВнешниеОбработкиСлужебныйСервер/ОМ_ЮТВнешниеОбработкиСлужебныйСервер.mdo
(1 hunks)tests/src/CommonModules/ОМ_ЮТЗависимостиСлужебный/Module.bsl
(1 hunks)tests/src/CommonModules/ОМ_ЮТИсполнительСлужебныйКлиент/Module.bsl
(1 hunks)tests/src/CommonModules/ОМ_ЮТЧитательСлужебный/Module.bsl
(1 hunks)tests/src/Configuration/Configuration.mdo
(1 hunks)tools/build-template.sh
(1 hunks)tools/v8unpack/build-epf.bat
(1 hunks)tools/v8unpack/build-epf.sh
(1 hunks)tools/v8unpack/unpack-epf.bat
(1 hunks)tools/v8unpack/unpack-epf.sh
(1 hunks)
💤 Files with no reviewable changes (1)
- exts/yaxunit/src/CommonModules/ЮТЛогированиеСлужебный/Module.bsl
✅ Files skipped from review due to trivial changes (7)
- tools/v8unpack/unpack-epf.bat
- tools/v8unpack/build-epf.sh
- tools/v8unpack/build-epf.bat
- exts/yaxunit/src/CommonModules/ЮТВнешниеОбработкиСлужебныйСервер/ЮТВнешниеОбработкиСлужебныйСервер.mdo
- exts/yaxunit/src/CommonTemplates/ЮТV8UnpackWS/ЮТV8UnpackWS.mdo
- tests/src/CommonModules/ОМ_ЮТВнешниеОбработкиСлужебныйСервер/ОМ_ЮТВнешниеОбработкиСлужебныйСервер.mdo
- tools/v8unpack/unpack-epf.sh
🧰 Additional context used
🪛 Shellcheck (0.10.0)
tools/build-template.sh
[warning] 4-4: Use 'cd ... || exit' or 'cd ... || return' in case cd fails.
(SC2164)
[warning] 6-6: Use 'cd ... || exit' or 'cd ... || return' in case cd fails.
(SC2164)
[warning] 10-10: Use 'cd ... || exit' or 'cd ... || return' in case cd fails.
(SC2164)
🔇 Additional comments (8)
exts/yaxunit/src/CommonModules/ЮТВнешниеОбработкиСлужебныйСервер/Module.bsl (1)
34-35
: Проверка результата вызова УдалитьФайлы
Хотя метод УдалитьФайлы обычно не возвращает код ошибки, в ошибочных ситуациях он может завершиться неудачей (например, при отсутствии прав). Рекомендуется логгировать результат или отлавливать исключения, чтобы при невозможности очистить каталог программа могла продолжить отработку или сообщить об этом.
exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl (1)
163-164
: Убедиться в корректности вызова устаревшего метода
Вызов метода ЮТМетодыСлужебный.ВызовУстаревшегоМетода корректно ссылается на «ЮТОбщий.ДанныеТекстовогоФайла». Проверьте, что передаваемая дата устаревания ("24.12") согласуется с документацией, чтобы избежать путаницы в сроках и совместимости.
tests/src/CommonModules/ОМ_ЮТИсполнительСлужебныйКлиент/Module.bsl (1)
107-107
: Корректное изменение метода чтения файла!
Переход на использование ЮТФайлы.ДанныеТекстовогоФайла соответствует общей стратегии централизации файловых операций.
exts/yaxunit/src/CommonModules/ЮТОкружение/Module.bsl (1)
88-119
: Корректная реализация функций определения ОС!
Функции корректно определяют тип операционной системы с учетом как 32-битных, так и 64-битных версий.
tests/src/CommonModules/ОМ_ЮТЗависимостиСлужебный/Module.bsl (1)
66-66
: Корректное изменение метода чтения файла!
Переход на использование ЮТФайлы.ДанныеТекстовогоФайла соответствует общей стратегии централизации файловых операций.
tests/src/Configuration/Configuration.mdo (1)
41-41
: Добавление нового общего модуля для работы с внешними обработками.
Модуль ОМ_ЮТВнешниеОбработкиСлужебныйСервер
добавлен в конфигурацию, что расширяет функциональность для работы с внешними обработками.
tests/src/CommonModules/ОМ_ЮТЧитательСлужебный/Module.bsl (1)
93-93
: Обновление количества ожидаемых тестовых наборов.
Увеличение ожидаемого количества тестовых наборов с 40 до 41 предполагает добавление нового функционала. Убедитесь, что это изменение соответствует фактическому количеству добавленных тестов.
✅ Verification successful
Let me gather more specific information about the test sets.
Let me check the actual test sets in more detail.
Let me try a different approach to find the test methods.
Изменение количества тестовых наборов подтверждено.
Проверка кода показала, что значение 41 является корректным. В методе ЗагрузитьТесты
явно проверяется количество прочитанных наборов расширения tests:
ЮТест.ОжидаетЧто(Наборы, "Прочитанные наборы расширения tests")
.ИмеетДлину(41);
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Проверка количества тестовых наборов
rg -l "ДобавитьТестовыйНабор\(" tests/src/CommonModules/ | wc -l
Length of output: 68
Script:
#!/bin/bash
# Поиск всех вызовов ДобавитьТестовыйНабор в конкретном модуле
rg "ДобавитьТестовыйНабор\(" tests/src/CommonModules/ОМ_ЮТЧитательСлужебный/Module.bsl -n
Length of output: 437
Script:
#!/bin/bash
# Поиск всех тестовых методов в модуле
rg "Процедура\s+Тест" tests/src/CommonModules/ОМ_ЮТЧитательСлужебный/Module.bsl -n -A 1
Length of output: 239
Script:
#!/bin/bash
# Показать содержимое файла для анализа тестовых методов
cat tests/src/CommonModules/ОМ_ЮТЧитательСлужебный/Module.bsl
Length of output: 7362
exts/yaxunit/src/Configuration/Configuration.mdo (1)
58-58
: Конфигурация корректно дополнена
Добавление нового шаблона и модуля выполнено корректно.
Also applies to: 68-68
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (12)
exts/yaxunit/src/CommonModules/ЮТВнешниеОбработкиСлужебныйСервер/Module.bsl (6)
21-56
: Удобная капсулированная функция для компиляции внешней обработки
Функция эффективно собирает внешнюю обработку, учитывая разные окружения и корректно формируя итоговый файл “out.epf”. Желательно добавить краткие комментарии по аргументам (например, когда “ТекстМодуляОбъект” или “ТекстМодуляФормы” не заданы).
28-28
: Рассмотрите переход на асинхронные аналоги для работы с файлами
Код использует синхронные методы “КаталогВременныхФайлов”, “УдалитьФайлы”, “СоздатьКаталог”, что отмечено как BSLLS:UsingSynchronousCalls-off. По возможности стоит перейти на асинхронные аналоги, чтобы не блокировать выполнение при работе с файловой системой в масштабируемых сценариях.Also applies to: 34-35
62-74
: Корректная подготовка рабочего каталога
Процедура “ПодготовитьРабочийКаталог” аккуратно проверяет существование каталога, а при отсутствии извлекает нужные файлы из zip-архива. В то же время по возможности используйте методы асинхронного поиска и создания каталогов, чтобы соответствовать рекомендациям статического анализатора и не блокировать основной поток.
76-90
: Процедура “РаспаковатьОбработку”
Логика проверки существования каталога “unpack” и выбор компроманд для Windows или Linux окружения выглядит последовательно. Обратите внимание, что путь “/bin/bash” помечен как hardcode. Если возможно, реализуйте более универсальный механизм определения пути к оболочке в Unix-системах.
92-102
: Процедура “СобратьОбработку”
Аналогично “РаспаковатьОбработку” здесь жёстко прописан “/bin/bash”. Желательно обеспечить определение необходимых путей в конфигурационных настройках или вынести путь к bash в параметры, дабы повысить переносимость решения.
132-143
: Платформозависимый вызов COM-объекта
При использовании “COMОбъект(“WScript.Shell”)” важно учитывать, что такой вызов недоступен в Unix. В блоке #Если НЕ ВебКлиент для Windows это оправдано, но в дальнейшем, возможно, стоит предусмотреть альтернативный путь для других платформ.exts/yaxunit/src/CommonModules/ЮТФайлы/Module.bsl (5)
134-134
: Использование синхронного метода “УдалитьФайлы”
Команда “УдалитьФайлы” помечена как синхронный вызов. Если в будущем потребуется более масштабная или параллельная работа с файловой системой, рассмотрите асинхронный метод, дабы избежать потенциальных блокировок.
151-174
: Процедура “СкопироватьКаталог”
Отличная реализация рекурсивного копирования каталога, однако видим синхронные вызовы “СоздатьКаталог”, “НайтиФайлы”, “КопироватьФайл”. Статический анализатор рекомендует использовать их асинхронные аналоги для повышения отзывчивости системы.
186-186
: Асинхронные методы vs. “СоздатьКаталог”
Так же, как и выше, метод “СоздатьКаталог” продолжает использоваться синхронно. Если асинхронная работа с ФС не критична — можно оставить, но выполняйте тщательное тестирование, чтобы избежать задержек, когда вызывается в циклах.
202-223
: Функция “ДанныеТекстовогоФайла”
Реализовано чтение файла в кодировке UTF-8 с обработкой сценария веб-клиента (#Если НЕ ВебКлиент). Это верно с точки зрения безопасности и совместимости. Рекомендуется добавить короткий комментарий об объёме файлов, который вы ожидаете прочитать, чтобы избежать проблем с большим содержимым.
224-241
: Процедура “ЗаписатьТекстВФайла”
Аналогично чтению файла, запись в кодировке UTF-8 корректна, и есть защита для веб-клиента. Если ожидается частая перезапись файлов большого размера, подумайте о контроле возможных ошибок (достаточно места на диске, права доступа и т.д.)..github/workflows/step-export-xml.yml (1)
35-43
: Рекомендуется добавить документацию о использовании merge refХотя логика checkout корректна, стоит добавить комментарий, объясняющий почему используется refs/pull/*/merge для PR событий.
Предлагаемое дополнение:
- name: Извлечение исходников PR if: github.event_name == 'pull_request_target' || github.event_name == 'pull_request' uses: actions/checkout@v4 with: + # Используем merge ref для проверки результата слияния PR с целевой веткой ref: refs/pull/${{ github.event.number }}/merge
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (4)
.github/workflows/step-export-xml.yml
(3 hunks)exts/yaxunit/src/CommonModules/ЮТВнешниеОбработкиСлужебныйСервер/Module.bsl
(1 hunks)exts/yaxunit/src/CommonModules/ЮТФайлы/Module.bsl
(4 hunks)tests/src/CommonModules/ОМ_ЮТВнешниеОбработкиСлужебныйСервер/Module.bsl
(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
- tests/src/CommonModules/ОМ_ЮТВнешниеОбработкиСлужебныйСервер/Module.bsl
🔇 Additional comments (6)
exts/yaxunit/src/CommonModules/ЮТВнешниеОбработкиСлужебныйСервер/Module.bsl (2)
1-18
: Лицензионное соглашение корректно оформлено
Публикация лицензии Apache 2.0 в кодовой базе выглядит стандартно и не вызывает вопросов.
104-130
: Использование синхронного метода “ЗапуститьПриложение”
Согласно существующему комментарию GitHub Actions, следует заменить “ЗапуститьПриложение” на асинхронный аналог для недопущения блокирующего вызова. Эта рекомендация уже упоминалась ранее.
.github/workflows/step-export-xml.yml (4)
8-22
: Корректное добавление входных и выходных параметров!
Изменения улучшают переиспользуемость рабочего процесса за счет конфигурируемого имени артефакта и опционального режима только движка.
66-70
: Увеличение таймаута установки EDT
Увеличение таймаута до 30 минут для установки EDT выглядит обоснованным, учитывая возможные задержки при загрузке.
Line range hint 116-122
: Корректная настройка публикации артефакта!
Настройки публикации оптимальны:
- Динамическое имя артефакта
- Однодневное хранение
- Обработка ошибок при отсутствии файлов
78-108
: Проверить достаточность таймаутов для конвертации
Установлены одинаковые таймауты (15 минут) для всех операций конвертации. Необходимо убедиться, что этого времени достаточно для больших конфигураций.
✅ Verification successful
Таймаут в 15 минут является достаточным
Анализ размера каталогов показывает относительно небольшой объем данных для конвертации:
- exts/yaxunit: 3.5 МБ
- tests: 698 КБ
- exts/smoke: 66 КБ
Общее количество файлов (481) и размер каталогов указывают на то, что установленного таймаута в 15 минут более чем достаточно для выполнения операций конвертации. Стандартная конвертация файлов такого объема обычно занимает не более 2-3 минут.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Проверка истории выполнения workflow для анализа времени выполнения
gh run list --workflow=step-export-xml.yml --limit 10 --json durationInMinutes \
| jq -r '.[] | .durationInMinutes'
Length of output: 358
Script:
#!/bin/bash
# Проверка истории выполнения workflow с использованием доступных полей
gh run list --workflow=step-export-xml.yml --limit 10 --json startedAt,updatedAt \
| jq -r '.[] | (.updatedAt | fromdateiso8601 | strftime("%Y-%m-%d %H:%M:%S")) as $end | (.startedAt | fromdateiso8601 | strftime("%Y-%m-%d %H:%M:%S")) as $start | "Начало: \($start) Окончание: \($end)"'
Length of output: 681
Script:
#!/bin/bash
# Проверка размера исходных каталогов для оценки объема конвертации
echo "Размер каталога exts/yaxunit:"
du -sh exts/yaxunit 2>/dev/null || echo "Каталог не найден"
echo -e "\nРазмер каталога tests:"
du -sh tests 2>/dev/null || echo "Каталог не найден"
echo -e "\nРазмер каталога exts/smoke:"
du -sh exts/smoke 2>/dev/null || echo "Каталог не найден"
echo -e "\nСписок файлов в каталогах:"
find exts/yaxunit tests exts/smoke -type f 2>/dev/null | wc -l
Length of output: 427
Описание изменений
Close #468
Summary by CodeRabbit
Новые функции
ЭтоWindows()
,ЭтоLinux()
,ЭтоMac()
.СкопироватьКаталог()
,ЗаписатьТекстВФайла()
, и функцияДанныеТекстовогоФайла()
.ИсполняемыеСценарии()
иСкомпилироватьВнешнююОбработку()
.build-template.sh
для автоматизации создания zip-архивов.Исправления ошибок
Документация
Рефакторинг