Начальный импорт: RunBsl — пакетное выполнение .bsl.

Внешняя обработка-обёртка для ENTERPRISE /Execute с передачей пути к BSL в /C.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
9 changed files with 278 additions and 0 deletions
+19
View File
@@ -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
+34
View File
@@ -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
+10
View File
@@ -0,0 +1,10 @@
# Сборка
*.epf
*.erf
*.log
# 1C / OS
Thumbs.db
Desktop.ini
*.bak
*.tmp
+28
View File
@@ -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> <build_epf.conf> [файл_лога]
```
## Поведение
1. Клиент читает `.bsl` с локального диска (`ПараметрЗапуска` / маркер).
2. Сервер выполняет текст через `Выполнить()`.
3. Вывод и ошибки — в лог `/Out` (без модальных окон клиента).
4. Сеанс завершается автоматически.
Подробнее: документация в репозитории [crm3-migration](https://git.p7net.ru/rhana/crm3-migration.git) — `docs/meta/Скрипты_1С_пакетный_режим.md`.
+30
View File
@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.20">
<ExternalDataProcessor uuid="a1b2c3d4-e5f6-7890-abcd-ef1234567890">
<InternalInfo>
<xr:ContainedObject>
<xr:ClassId>c3831ec8-d8d5-4f93-8a22-f9bfae07327f</xr:ClassId>
<xr:ObjectId>b2c3d4e5-f6a7-8901-bcde-f12345678901</xr:ObjectId>
</xr:ContainedObject>
<xr:GeneratedType name="ExternalDataProcessorObject.RunBsl" category="Object">
<xr:TypeId>c3d4e5f6-a7b8-9012-cdef-123456789012</xr:TypeId>
<xr:ValueId>d4e5f6a7-b8c9-0123-def0-234567890123</xr:ValueId>
</xr:GeneratedType>
</InternalInfo>
<Properties>
<Name>RunBsl</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Run BSL</v8:content>
</v8:item>
</Synonym>
<Comment>Выполнение линейного BSL-файла в пакетном режиме (/Execute + /C)</Comment>
<DefaultForm>ExternalDataProcessor.RunBsl.Form.Форма</DefaultForm>
<AuxiliaryForm/>
</Properties>
<ChildObjects>
<Form>Форма</Form>
</ChildObjects>
</ExternalDataProcessor>
</MetaDataObject>
+36
View File
@@ -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";
КонецФункции
+21
View File
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.20">
<Form uuid="e5f6a7b8-c9d0-1234-ef01-345678901234">
<Properties>
<Name>Форма</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Run BSL</v8:content>
</v8:item>
</Synonym>
<Comment/>
<FormType>Managed</FormType>
<IncludeHelpInContents>false</IncludeHelpInContents>
<UsePurposes>
<v8:Value xsi:type="app:ApplicationUsePurpose">PlatformApplication</v8:Value>
</UsePurposes>
<ExtendedPresentation/>
</Properties>
</Form>
</MetaDataObject>
+15
View File
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<Form xmlns="http://v8.1c.ru/8.3/xcf/logform" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:dcscor="http://v8.1c.ru/8.1/data-composition-system/core" xmlns:dcsset="http://v8.1c.ru/8.1/data-composition-system/settings" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.20">
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1"/>
<Events>
<Event name="OnOpen">ПриОткрытии</Event>
</Events>
<Attributes>
<Attribute name="Объект" id="1">
<Type>
<v8:Type>cfg:ExternalDataProcessorObject.RunBsl</v8:Type>
</Type>
<MainAttribute>true</MainAttribute>
</Attribute>
</Attributes>
</Form>
@@ -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(ТекстКода, ПутьКФайлу);
КонецПроцедуры