From 3deb9120b6786e84034b28aa5bb0530dbf68951a Mon Sep 17 00:00:00 2001 From: Michael BAG Date: Fri, 3 Jul 2026 14:22:15 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82:=20RunBsl?= =?UTF-8?q?=20=E2=80=94=20=D0=BF=D0=B0=D0=BA=D0=B5=D1=82=D0=BD=D0=BE=D0=B5?= =?UTF-8?q?=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20.bsl.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Внешняя обработка-обёртка для ENTERPRISE /Execute с передачей пути к BSL в /C. Co-authored-by: Cursor --- .editorconfig | 19 ++++++ .gitattributes | 34 +++++++++++ .gitignore | 10 +++ README.md | 28 +++++++++ RunBsl.xml | 30 +++++++++ RunBsl/Ext/ObjectModule.bsl | 36 +++++++++++ RunBsl/Forms/Форма.xml | 21 +++++++ RunBsl/Forms/Форма/Ext/Form.xml | 15 +++++ RunBsl/Forms/Форма/Ext/Form/Module.bsl | 85 ++++++++++++++++++++++++++ 9 files changed, 278 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 README.md create mode 100644 RunBsl.xml create mode 100644 RunBsl/Ext/ObjectModule.bsl create mode 100644 RunBsl/Forms/Форма.xml create mode 100644 RunBsl/Forms/Форма/Ext/Form.xml create mode 100644 RunBsl/Forms/Форма/Ext/Form/Module.bsl diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..6b124fa --- /dev/null +++ b/.editorconfig @@ -0,0 +1,19 @@ +# Единые правила редактора для репозиториев выгрузки 1С. +# Согласовано с tools/git_1c/.gitattributes (LF в репозитории). + +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.{bsl,os}] +indent_style = tab + +[*.xml] +indent_style = tab + +[VERSION] +insert_final_newline = true diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..b90a7e2 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,34 @@ +# Единые правила для репозиториев выгрузки 1С (Configurator / EDT). +# Канонический формат в git: UTF-8, LF. См. tools/git_1c/README.md + +* text=auto + +# Текстовые файлы выгрузки 1С +*.bsl text eol=lf +*.os text eol=lf +*.xml text eol=lf +*.txt text eol=lf +*.md text eol=lf +*.json text eol=lf +*.ini text eol=lf +*.conf text eol=lf +VERSION text eol=lf + +# Бинарные артефакты 1С +*.cf binary +*.cfe binary +*.epf binary +*.erf binary +*.ef binary +*.bin binary +*.cf.binary binary +*.mxl binary + +# Справка и графика +*.html binary +*.htm binary +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.ico binary diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b9f3539 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +# Сборка +*.epf +*.erf +*.log + +# 1C / OS +Thumbs.db +Desktop.ini +*.bak +*.tmp diff --git a/README.md b/README.md new file mode 100644 index 0000000..8b3bef2 --- /dev/null +++ b/README.md @@ -0,0 +1,28 @@ +# RunBsl — обёртка для пакетного выполнения `.bsl` + +Внешняя обработка `RunBsl.epf` запускается через `ENTERPRISE /Execute`; путь к линейному BSL передаётся в `/C` (или через маркер `.run_bsl_path.txt`). + +## Сборка + +```bash +scripts/build_run_bsl.sh +``` + +Исходники: `RunBsl.xml`, каталог `RunBsl/`. Лог сборки: `build_RunBsl.log`. + +**Пересобирать после изменений** в `RunBsl/Ext/ObjectModule.bsl` или `RunBsl/Forms/`. + +## Запуск + +```bash +scripts/run_bsl.sh <файл.bsl> [файл_лога] +``` + +## Поведение + +1. Клиент читает `.bsl` с локального диска (`ПараметрЗапуска` / маркер). +2. Сервер выполняет текст через `Выполнить()`. +3. Вывод и ошибки — в лог `/Out` (без модальных окон клиента). +4. Сеанс завершается автоматически. + +Подробнее: документация в репозитории [crm3-migration](https://git.p7net.ru/rhana/crm3-migration.git) — `docs/meta/Скрипты_1С_пакетный_режим.md`. diff --git a/RunBsl.xml b/RunBsl.xml new file mode 100644 index 0000000..52434c4 --- /dev/null +++ b/RunBsl.xml @@ -0,0 +1,30 @@ + + + + + + c3831ec8-d8d5-4f93-8a22-f9bfae07327f + b2c3d4e5-f6a7-8901-bcde-f12345678901 + + + c3d4e5f6-a7b8-9012-cdef-123456789012 + d4e5f6a7-b8c9-0123-def0-234567890123 + + + + RunBsl + + + ru + Run BSL + + + Выполнение линейного BSL-файла в пакетном режиме (/Execute + /C) + ExternalDataProcessor.RunBsl.Form.Форма + + + +
Форма
+
+
+
diff --git a/RunBsl/Ext/ObjectModule.bsl b/RunBsl/Ext/ObjectModule.bsl new file mode 100644 index 0000000..f4a9cad --- /dev/null +++ b/RunBsl/Ext/ObjectModule.bsl @@ -0,0 +1,36 @@ + +// Обёртка: текст BSL передаётся с клиента, выполнение — на сервере ИБ. + +Процедура ВыполнитьТекстBSL(ТекстКода, ПутьКФайлу = "") Экспорт + + Если ПустаяСтрока(СокрЛП(ТекстКода)) Тогда + Суффикс = ?(ЗначениеЗаполнено(ПутьКФайлу), ": " + ПутьКФайлу, ""); + ВызватьИсключение "BSL-файл пуст" + Суффикс; + КонецЕсли; + + Попытка + Выполнить(ТекстКода); + Исключение + ТекстОшибки = "ОШИБКА выполнения BSL" + + ?(ЗначениеЗаполнено(ПутьКФайлу), " (" + ПутьКФайлу + ")", "") + + ": " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ОбщегоНазначения.СообщитьПользователю(ТекстОшибки); + КонецПопытки; + +КонецПроцедуры + +Функция НормализоватьПутьЗапуска(ПутьКФайлу) Экспорт + + Результат = СокрЛП(ПутьКФайлу); + + Если СтрДлина(Результат) >= 2 И Лев(Результат, 1) = """" И Прав(Результат, 1) = """" Тогда + Результат = Сред(Результат, 2, СтрДлина(Результат) - 2); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ПутьФайлаЗапускаПоУмолчанию() Экспорт + Возврат "/Users/kma/projects/crm3-26/data_transfer/crm3-26/.run_bsl_path.txt"; +КонецФункции diff --git a/RunBsl/Forms/Форма.xml b/RunBsl/Forms/Форма.xml new file mode 100644 index 0000000..f90e634 --- /dev/null +++ b/RunBsl/Forms/Форма.xml @@ -0,0 +1,21 @@ + + +
+ + Форма + + + ru + Run BSL + + + + Managed + false + + PlatformApplication + + + +
+
diff --git a/RunBsl/Forms/Форма/Ext/Form.xml b/RunBsl/Forms/Форма/Ext/Form.xml new file mode 100644 index 0000000..517c52a --- /dev/null +++ b/RunBsl/Forms/Форма/Ext/Form.xml @@ -0,0 +1,15 @@ + +
+ + + ПриОткрытии + + + + + cfg:ExternalDataProcessorObject.RunBsl + + true + + + diff --git a/RunBsl/Forms/Форма/Ext/Form/Module.bsl b/RunBsl/Forms/Форма/Ext/Form/Module.bsl new file mode 100644 index 0000000..836aa47 --- /dev/null +++ b/RunBsl/Forms/Форма/Ext/Form/Module.bsl @@ -0,0 +1,85 @@ + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + Попытка + // /C из командной строки; файл читается на клиенте (локальный путь Mac/Windows). + ПутьКФайлу = НормализоватьПутьКлиент(ПараметрЗапуска); + + Если НЕ ЗначениеЗаполнено(ПутьКФайлу) Тогда + ПутьКФайлу = ПрочитатьПутьМаркераКлиент(); + КонецЕсли; + + ТекстКода = ПрочитатьФайлКлиент(ПутьКФайлу); + ВыполнитьТекстBSLНаСервере(ТекстКода, ПутьКФайлу); + Исключение + // В пакетном режиме — в лог /Out, без модального окна клиента. + Сообщить("ОШИБКА: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + Закрыть(); + ЗавершитьРаботуСистемы(Ложь); + +КонецПроцедуры + +&НаКлиенте +Функция НормализоватьПутьКлиент(ПутьКФайлу) + + Результат = СокрЛП(ПутьКФайлу); + + Если СтрДлина(Результат) >= 2 И Лев(Результат, 1) = """" И Прав(Результат, 1) = """" Тогда + Результат = Сред(Результат, 2, СтрДлина(Результат) - 2); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Функция ПрочитатьПутьМаркераКлиент() + + ПутьМаркера = ПутьМаркераЗапускаКлиент(); + Файл = Новый Файл(ПутьМаркера); + + Если НЕ Файл.Существует() Тогда + Возврат ""; + КонецЕсли; + + ТекстовыйДокумент = Новый ТекстовыйДокумент; + ТекстовыйДокумент.Прочитать(ПутьМаркера, КодировкаТекста.UTF8); + + Возврат НормализоватьПутьКлиент(ТекстовыйДокумент.ПолучитьТекст()); + +КонецФункции + +&НаКлиенте +Функция ПутьМаркераЗапускаКлиент() + Возврат "/Users/kma/projects/crm3-26/data_transfer/crm3-26/.run_bsl_path.txt"; +КонецФункции + +&НаКлиенте +Функция ПрочитатьФайлКлиент(ПутьКФайлу) + + Если НЕ ЗначениеЗаполнено(ПутьКФайлу) Тогда + ВызватьИсключение "Не задан путь к BSL-файлу (/C или .run_bsl_path.txt)"; + КонецЕсли; + + Файл = Новый Файл(ПутьКФайлу); + Если НЕ Файл.Существует() Тогда + ВызватьИсключение "BSL-файл не найден (клиент): " + ПутьКФайлу; + КонецЕсли; + + ТекстовыйДокумент = Новый ТекстовыйДокумент; + ТекстовыйДокумент.Прочитать(ПутьКФайлу, КодировкаТекста.UTF8); + + Возврат ТекстовыйДокумент.ПолучитьТекст(); + +КонецФункции + +&НаСервере +Процедура ВыполнитьТекстBSLНаСервере(Знач ТекстКода, Знач ПутьКФайлу) + + ОбъектОбработки = РеквизитФормыВЗначение("Объект"); + ОбъектОбработки.ВыполнитьТекстBSL(ТекстКода, ПутьКФайлу); + +КонецПроцедуры