├── .gitattributes ├── .gitignore ├── .vscode ├── c_cpp_properties.json ├── launch.json ├── settings.json └── tasks.json ├── CMakeLists.txt ├── Compile.bat ├── Decompile.bat ├── Example.xml ├── Example ├── Features │ └── НажатиеМыши.feature ├── Forms │ ├── Clone.xml │ ├── Clone │ │ └── Ext │ │ │ ├── Form.xml │ │ │ └── Form │ │ │ └── Module.bsl │ ├── Form.xml │ ├── Form │ │ └── Ext │ │ │ ├── Form.xml │ │ │ └── Form │ │ │ ├── Items │ │ │ ├── ExplorerFileCreateDir │ │ │ │ └── Picture.png │ │ │ ├── ExplorerFileCreateNew │ │ │ │ └── Picture.png │ │ │ ├── ExplorerFileOpen │ │ │ │ └── Picture.png │ │ │ ├── FindFiles │ │ │ │ └── Picture.png │ │ │ ├── FormCloseFolder │ │ │ │ └── Picture.png │ │ │ ├── FormFileCreateDir │ │ │ │ └── Picture.png │ │ │ ├── FormFileCreateNew │ │ │ │ └── Picture.png │ │ │ ├── FormFileSave │ │ │ │ └── Picture.png │ │ │ ├── FormFileSaveAs │ │ │ │ └── Picture.png │ │ │ ├── FormHistory │ │ │ │ └── Picture.png │ │ │ ├── FormOpenFolder │ │ │ │ └── Picture.png │ │ │ ├── FormSettings │ │ │ │ └── Picture.png │ │ │ ├── FormShowControl │ │ │ │ └── Picture.png │ │ │ ├── FormShowExplorer │ │ │ │ └── Picture.png │ │ │ ├── FormShowSearch │ │ │ │ └── Picture.png │ │ │ ├── RepoBranch │ │ │ │ └── Picture.png │ │ │ ├── RepoPull │ │ │ │ └── Picture.png │ │ │ ├── RepoPush │ │ │ │ └── Picture.png │ │ │ ├── StatusIndexAdd │ │ │ │ └── Picture.png │ │ │ ├── StatusIndexDiscard │ │ │ │ └── Picture.png │ │ │ ├── StatusIndexOpen │ │ │ │ └── Picture.png │ │ │ ├── StatusIndexReset │ │ │ │ └── Picture.png │ │ │ ├── StatusOpenFile │ │ │ │ └── Picture.png │ │ │ ├── StatusRefreshStatus │ │ │ │ └── Picture.png │ │ │ └── StatusRepoCommit │ │ │ │ └── Picture.png │ │ │ └── Module.bsl │ ├── History.xml │ ├── History │ │ └── Ext │ │ │ ├── Form.xml │ │ │ └── Form │ │ │ └── Module.bsl │ ├── Settings.xml │ ├── Settings │ │ └── Ext │ │ │ ├── Form.xml │ │ │ └── Form │ │ │ └── Module.bsl │ ├── Sign.xml │ ├── Sign │ │ └── Ext │ │ │ ├── Form.xml │ │ │ └── Form │ │ │ └── Module.bsl │ ├── Test.xml │ └── Test │ │ └── Ext │ │ ├── Form.xml │ │ └── Form │ │ └── Module.bsl ├── Templates │ ├── GitFor1C.xml │ └── VAEditor.xml └── filename ├── LICENSE ├── README.md ├── appveyor.ps1 ├── appveyor.yml ├── include ├── .gitattributes ├── AddInDefBase.h ├── ComponentBase.h ├── IMemoryManager.h ├── com.h └── types.h ├── lib ├── packages.json ├── packages.os └── packages.ps1 ├── manifest.ps1 ├── src ├── AddInNative.cpp ├── AddInNative.def ├── AddInNative.h ├── AddInNative.rc ├── FileFinder.cpp ├── FileFinder.h ├── GitManager.cpp ├── GitManager.h ├── cpp.hint ├── json.hpp └── stdafx.h ├── tools ├── Compile.os ├── Decompile.os ├── LICENSE ├── MakePack.os └── README.md └── version.h /.gitattributes: -------------------------------------------------------------------------------- 1 | #1C 2 | *.xml text eol=lf 3 | *.bsl text eol=crlf 4 | 5 | #sources 6 | *.c text 7 | *.cc text 8 | *.cxx text 9 | *.cpp text 10 | *.c++ text 11 | *.hpp text 12 | *.h text 13 | *.h++ text 14 | *.hh text 15 | 16 | # Compiled Object files 17 | *.slo binary 18 | *.lo binary 19 | *.o binary 20 | *.obj binary 21 | 22 | # Precompiled Headers 23 | *.gch binary 24 | *.pch binary 25 | 26 | # Compiled Dynamic libraries 27 | *.so binary 28 | *.dylib binary 29 | *.dll binary 30 | 31 | # Compiled Static libraries 32 | *.lai binary 33 | *.la binary 34 | *.a binary 35 | *.lib binary 36 | 37 | # Executables 38 | *.exe binary 39 | *.out binary 40 | *.app binary 41 | ############################################################################### 42 | # Set default behavior to automatically normalize line endings. 43 | ############################################################################### 44 | * text=auto 45 | 46 | ############################################################################### 47 | # Set the merge driver for project and solution files 48 | # 49 | # Merging from the command prompt will add diff markers to the files if there 50 | # are conflicts (Merging from VS is not affected by the settings below, in VS 51 | # the diff markers are never inserted). Diff markers may cause the following 52 | # file extensions to fail to load in VS. An alternative would be to treat 53 | # these files as binary and thus will always conflict and require user 54 | # intervention with every merge. To do so, just comment the entries below and 55 | # uncomment the group further below 56 | ############################################################################### 57 | 58 | *.sh text eol=lf 59 | *.sln text eol=crlf 60 | *.csproj text eol=crlf 61 | *.vbproj text eol=crlf 62 | *.vcxproj text eol=crlf 63 | *.vcproj text eol=crlf 64 | *.dbproj text eol=crlf 65 | *.fsproj text eol=crlf 66 | *.lsproj text eol=crlf 67 | *.wixproj text eol=crlf 68 | *.modelproj text eol=crlf 69 | *.sqlproj text eol=crlf 70 | *.wmaproj text eol=crlf 71 | 72 | *.xproj text eol=crlf 73 | *.props text eol=crlf 74 | *.filters text eol=crlf 75 | *.vcxitems text eol=crlf 76 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # Данный GITIGNORE-файл был автоматически создан Microsoft(R) Visual Studio. 3 | ################################################################################ 4 | 5 | /build64Win 6 | /build32Win 7 | /build64Lin 8 | /build32Lin 9 | /build64 10 | /build32 11 | /build 12 | /bin64 13 | /bin32 14 | /bin 15 | /.vc 16 | /.vs 17 | /libgit2-* 18 | /libssh2-* 19 | /Example/fileversion 20 | /Example/Templates/GitFor1C/Ext/Template.bin 21 | /Example/Templates/VAEditor/Ext/Template.bin 22 | AddIn.zip 23 | XxCompile.bat 24 | *.tmp 25 | *.epf 26 | *.o 27 | *.d 28 | *.so 29 | -------------------------------------------------------------------------------- /.vscode/c_cpp_properties.json: -------------------------------------------------------------------------------- 1 | { 2 | "configurations": [ 3 | { 4 | "name": "Linux", 5 | "includePath": [ 6 | "/usr/include", 7 | "/usr/local/include/", 8 | "/usr/lib/gcc/x86_64-linux-gnu/7/include", 9 | "${workspaceFolder}/**", 10 | "/usr/lib/gcc/x86_64-linux-gnu/7/include-fixed" 11 | ], 12 | "defines": [], 13 | "compilerPath": "/usr/bin/gcc", 14 | "cStandard": "c11", 15 | "cppStandard": "c++17", 16 | "intelliSenseMode": "clang-x64", 17 | "configurationProvider": "vector-of-bool.cmake-tools", 18 | "compilerArgs": [ 19 | "-D CMAKE_BUILD_TYPE:STRING=RelWithDebInfo ", 20 | "-D TARGET_PLATFORM_32:BOOL=OFF ", 21 | "--build build" 22 | ] 23 | } 24 | ], 25 | "version": 4 26 | } -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "C++ Debug (gdb)", 6 | "type": "cppdbg", 7 | "request": "launch", 8 | "program": "${workspaceFolder}/bin/test", 9 | "preLaunchTask": "Build Test", 10 | "args": [], 11 | "stopAtEntry": false, 12 | "cwd": "${workspaceFolder}", 13 | "environment": [], 14 | "externalConsole": true, 15 | "MIMode": "gdb", 16 | "miDebuggerPath": "/usr/bin/gdb", 17 | "setupCommands": [ 18 | { 19 | "description": "Enable pretty-printing for gdb", 20 | "text": "-enable-pretty-printing", 21 | "ignoreFailures": true 22 | } 23 | ] 24 | } 25 | ] 26 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.exclude": { 3 | "LICENSE": true, 4 | "Example.xml": true, 5 | "*/MANIFEST.XML": true, 6 | "*/dllmain.cpp": true, 7 | "*/resource.*": true, 8 | "build64": true, 9 | "build32": true, 10 | "build": true, 11 | "bind64": true, 12 | "bind32": true, 13 | "bin64": true, 14 | "bin32": true, 15 | "bin": true, 16 | "AddIn.zip": true, 17 | "*.bat": true, 18 | "*.sln": true, 19 | "*/*.def": true, 20 | "*/*.d": true, 21 | "*/*.o": true, 22 | "*/*.vcxproj*": true 23 | }, 24 | "files.associations": { 25 | "sstream": "cpp", 26 | "functional": "cpp", 27 | "iosfwd": "cpp", 28 | "array": "cpp", 29 | "atomic": "cpp", 30 | "*.tcc": "cpp", 31 | "cctype": "cpp", 32 | "clocale": "cpp", 33 | "cmath": "cpp", 34 | "cstdarg": "cpp", 35 | "cstddef": "cpp", 36 | "cstdint": "cpp", 37 | "cstdio": "cpp", 38 | "cstdlib": "cpp", 39 | "cstring": "cpp", 40 | "ctime": "cpp", 41 | "cwchar": "cpp", 42 | "cwctype": "cpp", 43 | "deque": "cpp", 44 | "forward_list": "cpp", 45 | "unordered_map": "cpp", 46 | "vector": "cpp", 47 | "exception": "cpp", 48 | "algorithm": "cpp", 49 | "iterator": "cpp", 50 | "map": "cpp", 51 | "memory": "cpp", 52 | "memory_resource": "cpp", 53 | "numeric": "cpp", 54 | "optional": "cpp", 55 | "string": "cpp", 56 | "string_view": "cpp", 57 | "system_error": "cpp", 58 | "tuple": "cpp", 59 | "type_traits": "cpp", 60 | "utility": "cpp", 61 | "fstream": "cpp", 62 | "initializer_list": "cpp", 63 | "iostream": "cpp", 64 | "istream": "cpp", 65 | "limits": "cpp", 66 | "new": "cpp", 67 | "ostream": "cpp", 68 | "stdexcept": "cpp", 69 | "streambuf": "cpp", 70 | "typeinfo": "cpp", 71 | "valarray": "cpp", 72 | "chrono": "cpp", 73 | "condition_variable": "cpp", 74 | "random": "cpp", 75 | "ratio": "cpp", 76 | "iomanip": "cpp", 77 | "mutex": "cpp", 78 | "thread": "cpp", 79 | "cinttypes": "cpp" 80 | }, 81 | "cmake.configureOnOpen": false 82 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=733558 3 | // for the documentation about the tasks.json format 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "label": "Build 1cWinCtrl64", 8 | "type": "shell", 9 | "command": "${workspaceRoot}/build.sh", 10 | "args": [ "64" ], 11 | "group": { 12 | "kind": "build", 13 | "isDefault": true 14 | } 15 | }, 16 | { 17 | "label": "Build Test", 18 | "type": "shell", 19 | "command": "make", 20 | } 21 | ] 22 | } -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.12) 2 | 3 | project(GitFor1C) 4 | set(TARGET GitFor1C) 5 | 6 | add_library(${TARGET} SHARED 7 | src/AddInNative.cpp 8 | src/AddInNative.def 9 | src/AddInNative.h 10 | src/FileFinder.cpp 11 | src/FileFinder.h 12 | src/GitManager.cpp 13 | src/GitManager.h 14 | src/stdafx.h) 15 | 16 | target_compile_definitions(${TARGET} PRIVATE UNICODE _UNICODE) 17 | 18 | target_include_directories(${TARGET} PRIVATE include) 19 | 20 | if (UNIX) 21 | set(MySuffix1 "Lin") 22 | if (APPLE) 23 | set(MySuffix1 "Mac") 24 | endif(APPLE) 25 | if (TARGET_PLATFORM_32) 26 | set(MySuffix2 "32") 27 | else() 28 | set(MySuffix2 "64") 29 | endif() 30 | else(UNIX) 31 | if (NOT MSVC) 32 | message(FATAL_ERROR "Must be compiled with MSVC on Windows") 33 | endif(NOT MSVC) 34 | set(MyPrefix "lib") 35 | set(MySuffix1 "Win") 36 | endif(UNIX) 37 | 38 | set (LIBRARY_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/bin${MySuffix2}) 39 | set (EXECUTABLE_OUTPUT_PATH ${LIBRARY_OUTPUT_PATH}) 40 | set (CMAKE_COMPILE_PDB_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH}) 41 | 42 | set_target_properties( ${PROJECT_NAME} PROPERTIES 43 | OUTPUT_NAME ${MyPrefix}${PROJECT_NAME}${MySuffix1}${MySuffix2} 44 | POSITION_INDEPENDENT_CODE ON 45 | CXX_STANDARD_REQUIRED ON 46 | CXX_STANDARD 17 47 | ) 48 | 49 | if (UNIX) 50 | if (TARGET_PLATFORM_32) 51 | set(CMAKE_LIBRARY_PATH "/usr/lib/i386-linux-gnu" CACHE PATH "") 52 | SET(ARCH_FLAG "-m32") 53 | else() 54 | SET(ARCH_FLAG "-m64") 55 | endif() 56 | foreach(flag 57 | CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS CMAKE_C_FLAGS CMAKE_CXX_FLAGS ) 58 | if(NOT ${flag} MATCHES ${ARCH_FLAG}) 59 | set(${flag} ${${flag}} ${ARCH_FLAG} CACHE "STRING" "Linker flags" FORCE) 60 | endif() 61 | endforeach() 62 | set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s") 63 | set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s") 64 | else(UNIX) 65 | add_definitions(/MT) 66 | set(CMAKE_SUPPRESS_REGENERATION 1) 67 | set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "" FORCE) 68 | target_compile_definitions(${TARGET} PRIVATE _WINDOWS 69 | _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING) 70 | target_compile_options(${TARGET} PRIVATE /utf-8) 71 | endif(UNIX) 72 | 73 | set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE) 74 | set(BUILD_CLAR OFF CACHE BOOL "" FORCE) 75 | set(STATIC_CRT ON CACHE BOOL "" FORCE) 76 | set(CMAKE_POSITION_INDEPENDENT_CODE ON) 77 | 78 | target_include_directories(${TARGET} PRIVATE libgit2-1.1.0/include) 79 | set(EMBED_SSH_PATH "${CMAKE_SOURCE_DIR}/libssh2-1.9.0" CACHE PATH "" FORCE) 80 | add_subdirectory(./libgit2-1.1.0) 81 | target_link_libraries(${TARGET} git2) 82 | add_definitions(-DUSE_LIBGIT2) 83 | -------------------------------------------------------------------------------- /Compile.bat: -------------------------------------------------------------------------------- 1 | SET libgit2v="1.1.0" 2 | SET libssh2v="1.9.0" 3 | 4 | if NOT EXIST "%CD%\libgit2-%libgit2v%" bitsadmin /transfer mydownloadjob /download /priority FOREGROUND "https://github.com/libgit2/libgit2/archive/v%libgit2v%.zip" "%CD%\libgit2-%libgit2v%.zip" 5 | if NOT EXIST "%CD%\libgit2-%libgit2v%" powershell Expand-Archive "%CD%\libgit2-%libgit2v%.zip" -DestinationPath "%CD%" 6 | 7 | if NOT EXIST "%CD%\libssh2-%libssh2v% " bitsadmin /transfer mydownloadjob /download /priority FOREGROUND "https://github.com/libssh2/libssh2/archive/libssh2-%libssh2v%.zip" "%CD%\libssh2-%libssh2v%.zip" 8 | if NOT EXIST "%CD%\libssh2-%libssh2v%" powershell Expand-Archive "%CD%\libssh2-%libssh2v%.zip" -DestinationPath "%CD%" 9 | ren libssh2-libssh2-1.9.0 libssh2-1.9.0 10 | 11 | mkdir build32 12 | cd build32 13 | cmake .. -A Win32 -DMySuffix2=32 14 | cmake --build . --config Release --target GitFor1C 15 | cd .. 16 | 17 | mkdir build64 18 | cd build64 19 | cmake .. -A x64 -DMySuffix2=64 20 | cmake --build . --config Release --target GitFor1C 21 | cd .. 22 | 23 | oscript .\tools\MakePack.os 24 | 25 | mkdir .\Example\Templates\GitFor1C 26 | mkdir .\Example\Templates\GitFor1C\Ext 27 | copy /b .\AddIn.zip .\Example\Templates\GitFor1C\Ext\Template.bin 28 | 29 | oscript .\lib\packages.os download 30 | 31 | oscript .\tools\Compile.os .\ -------------------------------------------------------------------------------- /Decompile.bat: -------------------------------------------------------------------------------- 1 | oscript .\tools\Decompile.os .\ -------------------------------------------------------------------------------- /Example.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | c3831ec8-d8d5-4f93-8a22-f9bfae07327f 7 | 5267e5af-3d55-4a5e-98c4-ec316b940f2c 8 | 9 | 10 | 1d9d9001-8785-40db-8737-66da8ae9fa29 11 | 39e66793-640a-4d6c-8aff-6897c033c033 12 | 13 | 14 | 15 | Example 16 | 17 | 18 | ru 19 | GIT for 1C 20 | 21 | 22 | 23 | ExternalDataProcessor.Example.Form.Form 24 | 25 | 26 | 27 |
Form
28 |
Test
29 |
Clone
30 |
History
31 |
Settings
32 | 33 | 34 |
35 |
36 |
-------------------------------------------------------------------------------- /Example/Features/НажатиеМыши.feature: -------------------------------------------------------------------------------- 1 | # language: ru 2 | # encoding: utf-8 3 | #parent uf: 4 | @UF9_Вспомогательные_фичи 5 | #parent ua: 6 | @UA30_Прочие_макеты 7 | 8 | @IgnoreOnCIMainBuild 9 | 10 | 11 | Функциональность: Видеоэффекты 12 | 13 | Контекст: 14 | Дано Я запускаю сценарий открытия TestClient или подключаю уже существующий 15 | 16 | Сценарий: Видеоэффект нажатия мыши 17 | 18 | #[autodoc.ignorestep] 19 | И я активизирую браузер и устанавливаю полноэкранный режим 20 | 21 | И я показываю нажатие мыши в браузере 22 | |'color'|'red'| 23 | |'duration'|'2000'| 24 | |'radius'|'24'| 25 | |'width'|'12'| 26 | |'left'|'180'| 27 | |'top'|'50'| 28 | 29 | И Пауза 3 30 | 31 | И я показываю нажатие мыши в браузере 32 | |'color'|'red'| 33 | |'duration'|'1000'| 34 | |'radius'|'24'| 35 | |'width'|'8'| 36 | 37 | И Пауза 3 -------------------------------------------------------------------------------- /Example/Forms/Clone.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 |
4 | 5 | Clone 6 | 7 | 8 | ru 9 | Clone 10 | 11 | 12 | 13 | Managed 14 | false 15 | 16 | PersonalComputer 17 | MobileDevice 18 | 19 | 20 | 21 |
22 |
-------------------------------------------------------------------------------- /Example/Forms/Clone/Ext/Form.xml: -------------------------------------------------------------------------------- 1 |  2 |
3 | LockOwnerWindow 4 | Bottom 5 | 6 | false 7 | 8 | 14 | 25 | 26 | 27 | 28 | OnCreateAtServer 29 | 30 | 31 | 32 | RemoteURL 33 | true 34 | true 35 | 36 | 37 | 38 | 39 | LocalPath 40 | 41 | <v8:item> 42 | <v8:lang>ru</v8:lang> 43 | <v8:content>Path</v8:content> 44 | </v8:item> 45 | 46 | 30 47 | true 48 | true 49 | true 50 | 51 | 52 | 53 | PathStartChoice 54 | 55 | 56 | 57 | 58 | 59 | 60 | <v8:item> 61 | <v8:lang>ru</v8:lang> 62 | <v8:content>Local path</v8:content> 63 | </v8:item> 64 | 65 | 66 | xs:string 67 | 68 | 0 69 | Variable 70 | 71 | 72 | ShowError 73 | 74 | 75 | 76 | <v8:item> 77 | <v8:lang>ru</v8:lang> 78 | <v8:content>URL</v8:content> 79 | </v8:item> 80 | 81 | 82 | xs:string 83 | 84 | 0 85 | Variable 86 | 87 | 88 | ShowError 89 | 90 | 91 | 92 | 93 | 94 | <v8:item> 95 | <v8:lang>ru</v8:lang> 96 | <v8:content>Clone Repository</v8:content> 97 | </v8:item> 98 | 99 | 100 | 101 | ru 102 | Repo clone 103 | 104 | 105 | RepoClone 106 | 107 | 108 |
-------------------------------------------------------------------------------- /Example/Forms/Clone/Ext/Form/Module.bsl: -------------------------------------------------------------------------------- 1 | &AtServer 2 | Procedure OnCreateAtServer(Cancel, StandardProcessing) 3 | RemoteURL = "https://github.com/lintest/GitFor1C"; 4 | EndProcedure 5 | 6 | &AtClient 7 | Procedure PathStartChoice(Item, ChoiceData, StandardProcessing) 8 | 9 | NotifyDescription = New NotifyDescription("PathEndChoice", ThisForm); 10 | FileDialog = New FileDialog(FileDialogMode.ChooseDirectory); 11 | FileDialog.Show(NotifyDescription); 12 | 13 | EndProcedure 14 | 15 | &AtClient 16 | Procedure PathEndChoice(SelectedFiles, AdditionalParameters) Export 17 | 18 | If SelectedFiles <> Undefined Then 19 | LocalPath = SelectedFiles[0]; 20 | EndIf; 21 | 22 | EndProcedure 23 | 24 | &AtClient 25 | Procedure RepoClone(Command) 26 | 27 | If CheckFilling() Then 28 | NotifyDescription = New NotifyDescription("EndCloneRepo", ThisForm); 29 | FormOwner.git.BeginCallingClone(NotifyDescription, RemoteURL, LocalPath); 30 | EndIf; 31 | 32 | EndProcedure 33 | 34 | &AtClient 35 | Procedure EndCloneRepo(ResultCall, ParametersCall, AdditionalParameters) Export 36 | 37 | JsonData = FormOwner.JsonLoad(ResultCall); 38 | If JsonData.success Then 39 | FileArray = New Array; 40 | FileArray.Add(LocalPath); 41 | FormOwner.OpenFolderEnd(FileArray, Undefined); 42 | Close(True); 43 | Else 44 | ShowMessageBox( , JsonData.Error.Message, 10); 45 | EndIf; 46 | 47 | EndProcedure -------------------------------------------------------------------------------- /Example/Forms/Form.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 |
4 | 5 | Form 6 | 7 | 8 | ru 9 | Form 10 | 11 | 12 | 13 | Managed 14 | false 15 | 16 | PersonalComputer 17 | MobileDevice 18 | 19 | 20 | 21 |
22 |
-------------------------------------------------------------------------------- /Example/Forms/Form/Ext/Form/Items/ExplorerFileCreateDir/Picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lintest/GitFor1C/ee4b45cf09caa3ce610302def92ef2beeb9439af/Example/Forms/Form/Ext/Form/Items/ExplorerFileCreateDir/Picture.png -------------------------------------------------------------------------------- /Example/Forms/Form/Ext/Form/Items/ExplorerFileCreateNew/Picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lintest/GitFor1C/ee4b45cf09caa3ce610302def92ef2beeb9439af/Example/Forms/Form/Ext/Form/Items/ExplorerFileCreateNew/Picture.png -------------------------------------------------------------------------------- /Example/Forms/Form/Ext/Form/Items/ExplorerFileOpen/Picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lintest/GitFor1C/ee4b45cf09caa3ce610302def92ef2beeb9439af/Example/Forms/Form/Ext/Form/Items/ExplorerFileOpen/Picture.png -------------------------------------------------------------------------------- /Example/Forms/Form/Ext/Form/Items/FindFiles/Picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lintest/GitFor1C/ee4b45cf09caa3ce610302def92ef2beeb9439af/Example/Forms/Form/Ext/Form/Items/FindFiles/Picture.png -------------------------------------------------------------------------------- /Example/Forms/Form/Ext/Form/Items/FormCloseFolder/Picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lintest/GitFor1C/ee4b45cf09caa3ce610302def92ef2beeb9439af/Example/Forms/Form/Ext/Form/Items/FormCloseFolder/Picture.png -------------------------------------------------------------------------------- /Example/Forms/Form/Ext/Form/Items/FormFileCreateDir/Picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lintest/GitFor1C/ee4b45cf09caa3ce610302def92ef2beeb9439af/Example/Forms/Form/Ext/Form/Items/FormFileCreateDir/Picture.png -------------------------------------------------------------------------------- /Example/Forms/Form/Ext/Form/Items/FormFileCreateNew/Picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lintest/GitFor1C/ee4b45cf09caa3ce610302def92ef2beeb9439af/Example/Forms/Form/Ext/Form/Items/FormFileCreateNew/Picture.png -------------------------------------------------------------------------------- /Example/Forms/Form/Ext/Form/Items/FormFileSave/Picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lintest/GitFor1C/ee4b45cf09caa3ce610302def92ef2beeb9439af/Example/Forms/Form/Ext/Form/Items/FormFileSave/Picture.png -------------------------------------------------------------------------------- /Example/Forms/Form/Ext/Form/Items/FormFileSaveAs/Picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lintest/GitFor1C/ee4b45cf09caa3ce610302def92ef2beeb9439af/Example/Forms/Form/Ext/Form/Items/FormFileSaveAs/Picture.png -------------------------------------------------------------------------------- /Example/Forms/Form/Ext/Form/Items/FormHistory/Picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lintest/GitFor1C/ee4b45cf09caa3ce610302def92ef2beeb9439af/Example/Forms/Form/Ext/Form/Items/FormHistory/Picture.png -------------------------------------------------------------------------------- /Example/Forms/Form/Ext/Form/Items/FormOpenFolder/Picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lintest/GitFor1C/ee4b45cf09caa3ce610302def92ef2beeb9439af/Example/Forms/Form/Ext/Form/Items/FormOpenFolder/Picture.png -------------------------------------------------------------------------------- /Example/Forms/Form/Ext/Form/Items/FormSettings/Picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lintest/GitFor1C/ee4b45cf09caa3ce610302def92ef2beeb9439af/Example/Forms/Form/Ext/Form/Items/FormSettings/Picture.png -------------------------------------------------------------------------------- /Example/Forms/Form/Ext/Form/Items/FormShowControl/Picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lintest/GitFor1C/ee4b45cf09caa3ce610302def92ef2beeb9439af/Example/Forms/Form/Ext/Form/Items/FormShowControl/Picture.png -------------------------------------------------------------------------------- /Example/Forms/Form/Ext/Form/Items/FormShowExplorer/Picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lintest/GitFor1C/ee4b45cf09caa3ce610302def92ef2beeb9439af/Example/Forms/Form/Ext/Form/Items/FormShowExplorer/Picture.png -------------------------------------------------------------------------------- /Example/Forms/Form/Ext/Form/Items/FormShowSearch/Picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lintest/GitFor1C/ee4b45cf09caa3ce610302def92ef2beeb9439af/Example/Forms/Form/Ext/Form/Items/FormShowSearch/Picture.png -------------------------------------------------------------------------------- /Example/Forms/Form/Ext/Form/Items/RepoBranch/Picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lintest/GitFor1C/ee4b45cf09caa3ce610302def92ef2beeb9439af/Example/Forms/Form/Ext/Form/Items/RepoBranch/Picture.png -------------------------------------------------------------------------------- /Example/Forms/Form/Ext/Form/Items/RepoPull/Picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lintest/GitFor1C/ee4b45cf09caa3ce610302def92ef2beeb9439af/Example/Forms/Form/Ext/Form/Items/RepoPull/Picture.png -------------------------------------------------------------------------------- /Example/Forms/Form/Ext/Form/Items/RepoPush/Picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lintest/GitFor1C/ee4b45cf09caa3ce610302def92ef2beeb9439af/Example/Forms/Form/Ext/Form/Items/RepoPush/Picture.png -------------------------------------------------------------------------------- /Example/Forms/Form/Ext/Form/Items/StatusIndexAdd/Picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lintest/GitFor1C/ee4b45cf09caa3ce610302def92ef2beeb9439af/Example/Forms/Form/Ext/Form/Items/StatusIndexAdd/Picture.png -------------------------------------------------------------------------------- /Example/Forms/Form/Ext/Form/Items/StatusIndexDiscard/Picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lintest/GitFor1C/ee4b45cf09caa3ce610302def92ef2beeb9439af/Example/Forms/Form/Ext/Form/Items/StatusIndexDiscard/Picture.png -------------------------------------------------------------------------------- /Example/Forms/Form/Ext/Form/Items/StatusIndexOpen/Picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lintest/GitFor1C/ee4b45cf09caa3ce610302def92ef2beeb9439af/Example/Forms/Form/Ext/Form/Items/StatusIndexOpen/Picture.png -------------------------------------------------------------------------------- /Example/Forms/Form/Ext/Form/Items/StatusIndexReset/Picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lintest/GitFor1C/ee4b45cf09caa3ce610302def92ef2beeb9439af/Example/Forms/Form/Ext/Form/Items/StatusIndexReset/Picture.png -------------------------------------------------------------------------------- /Example/Forms/Form/Ext/Form/Items/StatusOpenFile/Picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lintest/GitFor1C/ee4b45cf09caa3ce610302def92ef2beeb9439af/Example/Forms/Form/Ext/Form/Items/StatusOpenFile/Picture.png -------------------------------------------------------------------------------- /Example/Forms/Form/Ext/Form/Items/StatusRefreshStatus/Picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lintest/GitFor1C/ee4b45cf09caa3ce610302def92ef2beeb9439af/Example/Forms/Form/Ext/Form/Items/StatusRefreshStatus/Picture.png -------------------------------------------------------------------------------- /Example/Forms/Form/Ext/Form/Items/StatusRepoCommit/Picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lintest/GitFor1C/ee4b45cf09caa3ce610302def92ef2beeb9439af/Example/Forms/Form/Ext/Form/Items/StatusRepoCommit/Picture.png -------------------------------------------------------------------------------- /Example/Forms/History.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 |
4 | 5 | History 6 | 7 | 8 | ru 9 | History 10 | 11 | 12 | 13 | Managed 14 | false 15 | 16 | PersonalComputer 17 | MobileDevice 18 | 19 | 20 | 21 |
22 |
-------------------------------------------------------------------------------- /Example/Forms/History/Ext/Form.xml: -------------------------------------------------------------------------------- 1 |  2 |
3 | None 4 | 5 | false 6 | 7 | 8 | OnOpen 9 | 10 | 11 | 12 | 13 | <v8:item> 14 | <v8:lang>ru</v8:lang> 15 | <v8:content>Main group</v8:content> 16 | </v8:item> 17 | 18 | 19 | 20 | ru 21 | Main group 22 | 23 | 24 | Vertical 25 | None 26 | false 27 | 28 | 29 | 30 | List 31 | None 32 | 3 33 | true 34 | true 35 | true 36 | History 37 | 38 | 39 | 40 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | History 52 | SearchStringRepresentation 53 | 54 | 55 | 56 | 57 | 58 | 59 | History 60 | ViewStatusRepresentation 61 | 62 | 63 | 64 | 65 | 66 | 67 | History 68 | SearchControl 69 | 70 | 71 | 72 | 73 | 74 | HistoryOnActivateRow 75 | 76 | 77 | 78 | History.Date 79 | EnterOnInput 80 | 81 | 82 | 83 | 84 | 85 | <v8:item> 86 | <v8:lang>ru</v8:lang> 87 | <v8:content>Author</v8:content> 88 | </v8:item> 89 | 90 | 91 | 92 | ru 93 | History group author 94 | 95 | 96 | InCell 97 | true 98 | 99 | 100 | 101 | History.AuthorName 102 | EnterOnInput 103 | false 104 | 14 105 | 106 | 107 | 108 | 109 | History.AuthorEMail 110 | EnterOnInput 111 | false 112 | 14 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | <v8:item> 121 | <v8:lang>ru</v8:lang> 122 | <v8:content>Commiter</v8:content> 123 | </v8:item> 124 | 125 | 126 | 127 | ru 128 | History group commiter 129 | 130 | 131 | InCell 132 | true 133 | 134 | 135 | 136 | History.CommitterName 137 | EnterOnInput 138 | false 139 | 14 140 | 141 | 142 | 143 | 144 | History.CommitterEMail 145 | EnterOnInput 146 | false 147 | 14 148 | 149 | 150 | 151 | 152 | 153 | 154 | History.Message 155 | EnterOnInput 156 | 157 | 158 | 159 | 160 | History.Id 161 | 162 | false 163 | 164 | EnterOnInput 165 | 166 | 167 | 168 | 169 |
170 | 171 | 172 | <v8:item> 173 | <v8:lang>ru</v8:lang> 174 | <v8:content>Body group</v8:content> 175 | </v8:item> 176 | 177 | 178 | 179 | ru 180 | Body group 181 | 182 | 183 | None 184 | false 185 | 186 | 187 | 188 | Tree 189 | None 190 | true 191 | false 192 | false 193 | Row 194 |
false
195 | false 196 | false 197 | true 198 | true 199 | true 200 | Tree 201 | 202 | 203 | 204 | 205 | 206 | Tree 207 | SearchStringRepresentation 208 | 209 | 210 | 211 | 212 | 213 | 214 | Tree 215 | ViewStatusRepresentation 216 | 217 | 218 | 219 | 220 | 221 | 222 | Tree 223 | SearchControl 224 | 225 | 226 | 227 | 228 | 229 | 230 | Tree.Name 231 | EnterOnInput 232 | 233 | 234 | 235 | 236 |
237 | 238 | Editor 239 | None 240 | 241 | 242 | 243 |
244 |
245 |
246 |
247 |
248 | 249 | 250 | 251 | <v8:item> 252 | <v8:lang>ru</v8:lang> 253 | <v8:content>History</v8:content> 254 | </v8:item> 255 | 256 | 257 | v8:ValueTable 258 | 259 | 260 | 261 | 262 | <v8:item> 263 | <v8:lang>ru</v8:lang> 264 | <v8:content>Name</v8:content> 265 | </v8:item> 266 | 267 | 268 | xs:string 269 | 270 | 0 271 | Variable 272 | 273 | 274 | 275 | 276 | 277 | <v8:item> 278 | <v8:lang>ru</v8:lang> 279 | <v8:content>E-mail</v8:content> 280 | </v8:item> 281 | 282 | 283 | xs:string 284 | 285 | 0 286 | Variable 287 | 288 | 289 | 290 | 291 | 292 | <v8:item> 293 | <v8:lang>ru</v8:lang> 294 | <v8:content>Message</v8:content> 295 | </v8:item> 296 | 297 | 298 | xs:string 299 | 300 | 0 301 | Variable 302 | 303 | 304 | 305 | 306 | 307 | <v8:item> 308 | <v8:lang>ru</v8:lang> 309 | <v8:content>Date</v8:content> 310 | </v8:item> 311 | 312 | 313 | xs:dateTime 314 | 315 | DateTime 316 | 317 | 318 | 319 | 320 | 321 | <v8:item> 322 | <v8:lang>ru</v8:lang> 323 | <v8:content>Name</v8:content> 324 | </v8:item> 325 | 326 | 327 | xs:string 328 | 329 | 0 330 | Variable 331 | 332 | 333 | 334 | 335 | 336 | <v8:item> 337 | <v8:lang>ru</v8:lang> 338 | <v8:content>E-Mail</v8:content> 339 | </v8:item> 340 | 341 | 342 | xs:string 343 | 344 | 0 345 | Variable 346 | 347 | 348 | 349 | 350 | 351 | <v8:item> 352 | <v8:lang>ru</v8:lang> 353 | <v8:content>Id</v8:content> 354 | </v8:item> 355 | 356 | 357 | xs:string 358 | 359 | 0 360 | Variable 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | <v8:item> 369 | <v8:lang>ru</v8:lang> 370 | <v8:content>Tree</v8:content> 371 | </v8:item> 372 | 373 | 374 | v8:ValueTree 375 | 376 | 377 | 378 | 379 | <v8:item> 380 | <v8:lang>ru</v8:lang> 381 | <v8:content>Name</v8:content> 382 | </v8:item> 383 | 384 | 385 | xs:string 386 | 387 | 0 388 | Variable 389 | 390 | 391 | 392 | 393 | 394 | <v8:item> 395 | <v8:lang>ru</v8:lang> 396 | <v8:content>Type</v8:content> 397 | </v8:item> 398 | 399 | 400 | xs:string 401 | 402 | 0 403 | Variable 404 | 405 | 406 | 407 | 408 | 409 | <v8:item> 410 | <v8:lang>ru</v8:lang> 411 | <v8:content>Root</v8:content> 412 | </v8:item> 413 | 414 | 415 | xs:string 416 | 417 | 0 418 | Variable 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | <v8:item> 427 | <v8:lang>ru</v8:lang> 428 | <v8:content>Editor</v8:content> 429 | </v8:item> 430 | 431 | 432 | xs:string 433 | 434 | 0 435 | Variable 436 | 437 | 438 | 439 | 440 |
-------------------------------------------------------------------------------- /Example/Forms/History/Ext/Form/Module.bsl: -------------------------------------------------------------------------------- 1 | &AtClient 2 | Procedure OnOpen(Cancel) 3 | 4 | History.Clear(); 5 | NotifyDescription = New NotifyDescription("EndCallingHistory", ThisForm); 6 | FormOwner.git.BeginCallingHistory(NotifyDescription); 7 | 8 | EndProcedure 9 | 10 | &AtClient 11 | Procedure EndCallingHistory(ResultCall, ParametersCall, AdditionalParameters) Export 12 | 13 | History.Clear(); 14 | JsonData = FormOwner.JsonLoad(ResultCall); 15 | if JsonData.Success Then 16 | For Each Item In JsonData.result Do 17 | Row = History.Add(); 18 | FillPropertyValues(Row, Item); 19 | Row.Date = ToLocalTime('19700101' + Item.time); 20 | EndDo; 21 | EndIf 22 | 23 | EndProcedure 24 | 25 | &AtClient 26 | Procedure HistoryOnActivateRow(Item) 27 | 28 | AttachIdleHandler("BeginLoadTree", 0.1, True); 29 | 30 | EndProcedure 31 | 32 | &AtClient 33 | Procedure BeginLoadTree() Export 34 | 35 | Tree.GetItems().Clear(); 36 | Data = Items.History.CurrentData; 37 | If Data <> Undefined Then 38 | NotifyDescription = New NotifyDescription("EndLoadTree", ThisForm); 39 | FormOwner.git.BeginCallingTree(NotifyDescription, Data.Id); 40 | EndIf; 41 | 42 | EndProcedure 43 | 44 | &AtClient 45 | Procedure EndLoadTree(ResultCall, ParametersCall, AdditionalParameters) Export 46 | 47 | Tree.GetItems().Clear(); 48 | JsonData = FormOwner.JsonLoad(ResultCall); 49 | if JsonData.Success Then 50 | For Each Item In JsonData.result Do 51 | Names = StrSplit(Item.Root + Item.Name, "/", False); 52 | CurrentItems = Tree.GetItems(); 53 | While Names.Count() > 0 Do 54 | CurrentName = Names[0]; 55 | CurrentRow = Undefined; 56 | For Each ChildItem In CurrentItems Do 57 | If ChildItem.Name = CurrentName Then 58 | CurrentRow = ChildItem; 59 | Break; 60 | EndIf; 61 | EndDo; 62 | If CurrentRow = Undefined Then 63 | CurrentRow = CurrentItems.Add(); 64 | CurrentRow.Name = CurrentName; 65 | EndIf; 66 | CurrentItems = CurrentRow.GetItems(); 67 | Names.Delete(0); 68 | EndDo; 69 | EndDo; 70 | EndIf; 71 | 72 | EndProcedure -------------------------------------------------------------------------------- /Example/Forms/Settings.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 |
4 | 5 | Settings 6 | 7 | 8 | ru 9 | Settings 10 | 11 | 12 | 13 | Managed 14 | false 15 | 16 | PersonalComputer 17 | MobileDevice 18 | 19 | 20 | 21 |
22 |
-------------------------------------------------------------------------------- /Example/Forms/Settings/Ext/Form.xml: -------------------------------------------------------------------------------- 1 |  2 |
3 | LockOwnerWindow 4 | Bottom 5 | 6 | Right 7 | false 8 | 9 | 20 | 21 | 22 | 23 | OnOpen 24 | 25 | 26 | 27 | 28 | <v8:item> 29 | <v8:lang>ru</v8:lang> 30 | <v8:content>Main pages</v8:content> 31 | </v8:item> 32 | 33 | 34 | 35 | ru 36 | Main pages 37 | 38 | 39 | 40 | 41 | 42 | 43 | <v8:item> 44 | <v8:lang>ru</v8:lang> 45 | <v8:content>Remote</v8:content> 46 | </v8:item> 47 | 48 | 49 | 50 | ru 51 | Remote page 52 | 53 | 54 | 55 | 56 | 57 | List 58 | true 59 | false 60 | false 61 | 3 62 |
false
63 | true 64 | true 65 | true 66 | RemoteList 67 | 68 | 69 | 70 | 71 | 72 | 73 | RemoteList 74 | SearchStringRepresentation 75 | 76 | 77 | 78 | 79 | 80 | 81 | RemoteList 82 | ViewStatusRepresentation 83 | 84 | 85 | 86 | 87 | 88 | 89 | RemoteList 90 | SearchControl 91 | 92 | 93 | 94 | 95 | 96 | 97 | RemoteList.Name 98 | EnterOnInput 99 | 10 100 | 101 | 102 | 103 | 104 | RemoteList.Url 105 | EnterOnInput 106 | 20 107 | 108 | 109 | 110 | 111 |
112 |
113 |
114 | 115 | 116 | <v8:item> 117 | <v8:lang>ru</v8:lang> 118 | <v8:content>Signature</v8:content> 119 | </v8:item> 120 | 121 | 122 | 123 | ru 124 | Signature page 125 | 126 | 127 | 128 | 129 | 130 | 131 | <v8:item> 132 | <v8:lang>ru</v8:lang> 133 | <v8:content>Group author</v8:content> 134 | </v8:item> 135 | 136 | 137 | 138 | ru 139 | Group author 140 | 141 | 142 | Vertical 143 | None 144 | false 145 | 146 | 147 | 148 | 149 | <v8:item> 150 | <v8:lang>ru</v8:lang> 151 | <v8:content>Signature panel</v8:content> 152 | </v8:item> 153 | 154 | 155 | 156 | ru 157 | Signature panel 158 | 159 | 160 | 161 | 162 | 167 | 168 | 169 | <v8:item> 170 | <v8:lang>ru</v8:lang> 171 | <v8:content>Group set signature</v8:content> 172 | </v8:item> 173 | 174 | 175 | 176 | ru 177 | Group set signature 178 | 179 | 180 | Compact 181 | 182 | 183 | 188 | 193 | 194 | 195 | 196 | 197 | 198 | SignatureName 199 | 200 | 201 | 202 | 203 | SignatureEmail 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 |
212 |
213 |
214 | 215 | 216 | 217 | <v8:item> 218 | <v8:lang>ru</v8:lang> 219 | <v8:content>E-Mail</v8:content> 220 | </v8:item> 221 | 222 | 223 | xs:string 224 | 225 | 0 226 | Variable 227 | 228 | 229 | 230 | 231 | 232 | <v8:item> 233 | <v8:lang>ru</v8:lang> 234 | <v8:content>Name</v8:content> 235 | </v8:item> 236 | 237 | 238 | xs:string 239 | 240 | 0 241 | Variable 242 | 243 | 244 | 245 | 246 | 247 | <v8:item> 248 | <v8:lang>ru</v8:lang> 249 | <v8:content>Remote list</v8:content> 250 | </v8:item> 251 | 252 | 253 | v8:ValueTable 254 | 255 | 256 | 257 | 258 | <v8:item> 259 | <v8:lang>ru</v8:lang> 260 | <v8:content>Name</v8:content> 261 | </v8:item> 262 | 263 | 264 | xs:string 265 | 266 | 0 267 | Variable 268 | 269 | 270 | 271 | 272 | 273 | <v8:item> 274 | <v8:lang>ru</v8:lang> 275 | <v8:content>Url</v8:content> 276 | </v8:item> 277 | 278 | 279 | xs:string 280 | 281 | 0 282 | Variable 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | <v8:item> 293 | <v8:lang>ru</v8:lang> 294 | <v8:content>Set committer</v8:content> 295 | </v8:item> 296 | 297 | 298 | 299 | ru 300 | Set signature committer 301 | 302 | 303 | SetSignatureCommitter 304 | 305 | 306 | 307 | <v8:item> 308 | <v8:lang>ru</v8:lang> 309 | <v8:content>Set author</v8:content> 310 | </v8:item> 311 | 312 | 313 | 314 | ru 315 | Set signature author 316 | 317 | 318 | SetSignatureAuthor 319 | 320 | 321 | 322 | <v8:item> 323 | <v8:lang>ru</v8:lang> 324 | <v8:content>Get default</v8:content> 325 | </v8:item> 326 | 327 | 328 | 329 | ru 330 | Get default signature 331 | 332 | 333 | GetDefaultSignature 334 | 335 | 336 |
-------------------------------------------------------------------------------- /Example/Forms/Settings/Ext/Form/Module.bsl: -------------------------------------------------------------------------------- 1 | &AtClient 2 | Procedure OnOpen(Cancel) 3 | 4 | NotifyDescription = New NotifyDescription("EndRemoteList", ThisForm); 5 | FormOwner.git.BeginGettingRemotes(NotifyDescription); 6 | 7 | EndProcedure 8 | 9 | &AtClient 10 | Procedure GetDefaultSignature(Command) 11 | 12 | NotifyDescription = New NotifyDescription("EndDefaultSignature", ThisForm); 13 | FormOwner.git.BeginGettingSignature(NotifyDescription); 14 | 15 | EndProcedure 16 | 17 | &AtClient 18 | Procedure EndRemoteList(Value, AdditionalParameters) Export 19 | 20 | RemoteList.Clear(); 21 | JsonData = FormOwner.JsonLoad(Value); 22 | If JsonData.success Then 23 | If TypeOf(JsonData.result) = Type("Array") Then 24 | For Each RemoteItem In JsonData.result Do 25 | FillPropertyValues(RemoteList.Add(), RemoteItem); 26 | EndDo; 27 | EndIf; 28 | EndIf; 29 | 30 | EndProcedure 31 | 32 | &AtClient 33 | Procedure EndDefaultSignature(Value, AdditionalParameters) Export 34 | 35 | JsonData = FormOwner.JsonLoad(Value); 36 | If JsonData.success Then 37 | SignatureName = JsonData.result.name; 38 | SignatureEmail = JsonData.result.email; 39 | EndIf; 40 | 41 | EndProcedure 42 | 43 | &AtClient 44 | Procedure SetSignatureAuthor(Command) 45 | 46 | FormOwner.git.BeginCallingSetAuthor(New NotifyDescription, SignatureName, SignatureEmail); 47 | 48 | EndProcedure 49 | 50 | &AtClient 51 | Procedure SetSignatureCommitter(Command) 52 | 53 | FormOwner.git.BeginCallingSetCommitter(New NotifyDescription, SignatureName, SignatureEmail); 54 | 55 | EndProcedure 56 | 57 | -------------------------------------------------------------------------------- /Example/Forms/Sign.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 |
4 | 5 | Sign 6 | 7 | 8 | ru 9 | Signature 10 | 11 | 12 | 13 | Managed 14 | false 15 | 16 | PersonalComputer 17 | MobileDevice 18 | 19 | 20 | 21 |
22 |
-------------------------------------------------------------------------------- /Example/Forms/Sign/Ext/Form.xml: -------------------------------------------------------------------------------- 1 |  2 |
3 | LockOwnerWindow 4 | Bottom 5 | 6 | Right 7 | false 8 | 9 | 20 | 21 | 22 | 23 | 24 | 25 | <v8:item> 26 | <v8:lang>ru</v8:lang> 27 | <v8:content>Main pages</v8:content> 28 | </v8:item> 29 | 30 | 31 | 32 | ru 33 | Main pages 34 | 35 | 36 | 37 | 38 | 39 | 40 | <v8:item> 41 | <v8:lang>ru</v8:lang> 42 | <v8:content>Signature page</v8:content> 43 | </v8:item> 44 | 45 | 46 | 47 | ru 48 | Signature page 49 | 50 | 51 | 52 | 53 | 54 | 55 | <v8:item> 56 | <v8:lang>ru</v8:lang> 57 | <v8:content>Signature</v8:content> 58 | </v8:item> 59 | 60 | 61 | 62 | ru 63 | Group signature 64 | 65 | 66 | 67 | 68 | 69 | 70 | <v8:item> 71 | <v8:lang>ru</v8:lang> 72 | <v8:content>Group author</v8:content> 73 | </v8:item> 74 | 75 | 76 | 77 | ru 78 | Group author 79 | 80 | 81 | Vertical 82 | None 83 | false 84 | 85 | 86 | 87 | 88 | <v8:item> 89 | <v8:lang>ru</v8:lang> 90 | <v8:content>Signature panel</v8:content> 91 | </v8:item> 92 | 93 | 94 | 95 | ru 96 | Signature panel 97 | 98 | 99 | 100 | 101 | 106 | 107 | 108 | <v8:item> 109 | <v8:lang>ru</v8:lang> 110 | <v8:content>Group set signature</v8:content> 111 | </v8:item> 112 | 113 | 114 | 115 | ru 116 | Group set signature 117 | 118 | 119 | Compact 120 | 121 | 122 | 127 | 132 | 133 | 134 | 135 | 136 | 137 | SignatureName 138 | 139 | 140 | 141 | 142 | SignatureEmail 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | <v8:item> 157 | <v8:lang>ru</v8:lang> 158 | <v8:content>E-Mail</v8:content> 159 | </v8:item> 160 | 161 | 162 | xs:string 163 | 164 | 0 165 | Variable 166 | 167 | 168 | 169 | 170 | 171 | <v8:item> 172 | <v8:lang>ru</v8:lang> 173 | <v8:content>Name</v8:content> 174 | </v8:item> 175 | 176 | 177 | xs:string 178 | 179 | 0 180 | Variable 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | <v8:item> 189 | <v8:lang>ru</v8:lang> 190 | <v8:content>Set committer</v8:content> 191 | </v8:item> 192 | 193 | 194 | 195 | ru 196 | Set signature committer 197 | 198 | 199 | SetSignatureCommitter 200 | 201 | 202 | 203 | <v8:item> 204 | <v8:lang>ru</v8:lang> 205 | <v8:content>Set author</v8:content> 206 | </v8:item> 207 | 208 | 209 | 210 | ru 211 | Set signature author 212 | 213 | 214 | SetSignatureAuthor 215 | 216 | 217 | 218 | <v8:item> 219 | <v8:lang>ru</v8:lang> 220 | <v8:content>Get default</v8:content> 221 | </v8:item> 222 | 223 | 224 | 225 | ru 226 | Get default signature 227 | 228 | 229 | GetDefaultSignature 230 | 231 | 232 |
-------------------------------------------------------------------------------- /Example/Forms/Sign/Ext/Form/Module.bsl: -------------------------------------------------------------------------------- 1 | &AtClient 2 | Procedure GetDefaultSignature(Command) 3 | 4 | 5 | NotifyDescription = New NotifyDescription("EndDefaultSignature", ThisForm); 6 | FormOwner.git.BeginGettingSignature(NotifyDescription); 7 | 8 | EndProcedure 9 | 10 | &AtClient 11 | Procedure EndDefaultSignature(Value, AdditionalParameters) Export 12 | 13 | JsonData = FormOwner.JsonLoad(Value); 14 | If JsonData.success Then 15 | SignatureName = JsonData.result.name; 16 | SignatureEmail = JsonData.result.email; 17 | EndIf; 18 | 19 | EndProcedure 20 | 21 | &AtClient 22 | Procedure SetSignatureAuthor(Command) 23 | 24 | FormOwner.git.BeginCallingSetAuthor(New NotifyDescription, SignatureName, SignatureEmail); 25 | 26 | EndProcedure 27 | 28 | &AtClient 29 | Procedure SetSignatureCommitter(Command) 30 | 31 | FormOwner.git.BeginCallingSetCommitter(New NotifyDescription, SignatureName, SignatureEmail); 32 | 33 | EndProcedure 34 | -------------------------------------------------------------------------------- /Example/Forms/Test.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 |
4 | 5 | Test 6 | 7 | 8 | ru 9 | Test 10 | 11 | 12 | 13 | Managed 14 | false 15 | 16 | PersonalComputer 17 | MobileDevice 18 | 19 | 20 | 21 |
22 |
-------------------------------------------------------------------------------- /Example/Forms/Test/Ext/Form.xml: -------------------------------------------------------------------------------- 1 |  2 |
3 | 4 | false 5 | 6 | 7 | ПриОткрытии 8 | ПриСозданииНаСервере 9 | 10 | 11 | 12 | 13 | cfg:ExternalDataProcessorObject.Example 14 | 15 | true 16 | 17 | 18 | 19 | <v8:item> 20 | <v8:lang>ru</v8:lang> 21 | <v8:content>Текущий каталог</v8:content> 22 | </v8:item> 23 | 24 | 25 | xs:string 26 | 27 | 0 28 | Variable 29 | 30 | 31 | 32 | 33 | 34 | <v8:item> 35 | <v8:lang>ru</v8:lang> 36 | <v8:content>Временная папка</v8:content> 37 | </v8:item> 38 | 39 | 40 | xs:string 41 | 42 | 0 43 | Variable 44 | 45 | 46 | 47 | 48 |
-------------------------------------------------------------------------------- /Example/Forms/Test/Ext/Form/Module.bsl: -------------------------------------------------------------------------------- 1 | &НаКлиенте 2 | Перем git; 3 | 4 | &AtClientAtServerNoContext 5 | Function JsonLoad(Json) Export 6 | 7 | JSONReader = New JSONReader; 8 | JSONReader.SetString(Json); 9 | Value = ReadJSON(JSONReader); 10 | JSONReader.Close(); 11 | Return Value; 12 | 13 | EndFunction 14 | 15 | &AtClientAtServerNoContext 16 | Function JsonDump(Value) Export 17 | 18 | JSONWriter = New JSONWriter; 19 | JSONWriter.SetString(); 20 | WriteJSON(JSONWriter, Value); 21 | Return JSONWriter.Close(); 22 | 23 | EndFunction 24 | 25 | &НаКлиенте 26 | Процедура ПриОткрытии(Отказ) 27 | 28 | Отказ = Истина; 29 | МассивФайлов = Новый Массив; 30 | МассивФайлов.Добавить(ВременнаяПапка); 31 | ВладелецФормы.OpenFolderEnd(МассивФайлов, Undefined); 32 | Сообщить(ВременнаяПапка); 33 | 34 | КонецПроцедуры 35 | 36 | &НаСервере 37 | Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) 38 | 39 | Если ПустаяСтрока(НСтр(СтрокаСоединенияИнформационнойБазы(), "File")) Тогда 40 | ВызватьИсключение "Автоматизированное тестирование доступно только для файлового варианта работы платформы 1С:Предприятие"; 41 | КонецЕсли; 42 | 43 | ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); 44 | ФайлОбработки = Новый Файл(ОбработкаОбъект.ИспользуемоеИмяФайла); 45 | ТекущийКаталог = ФайлОбработки.Путь; 46 | 47 | ИдентификаторКомпоненты = "_" + StrReplace(New UUID, "-", ""); 48 | ПодключитьВнешнююКомпоненту(Параметры.AddInURL, ИдентификаторКомпоненты, ТипВнешнейКомпоненты.Native); 49 | git = Новый("AddIn." + ИдентификаторКомпоненты + ".GitFor1C"); 50 | 51 | ИмяФайла = "Autotest"; 52 | ВременнаяПапка = ПолучитьИмяВременногоФайла("git"); 53 | УдалитьФайлы(ВременнаяПапка); 54 | СоздатьКаталог(ВременнаяПапка); 55 | ВременнаяПапка = ВременнаяПапка + "/" + ИмяФайла + "/"; 56 | СоздатьКаталог(ВременнаяПапка); 57 | СоздатьКаталог(ВременнаяПапка + "include"); 58 | СоздатьКаталог(ВременнаяПапка + "Empty"); 59 | СоздатьКаталог(ВременнаяПапка + "Example"); 60 | СоздатьКаталог(ВременнаяПапка + "Example/Features"); 61 | СоздатьКаталог(ВременнаяПапка + "Example/Forms"); 62 | СоздатьКаталог(ВременнаяПапка + "Example/Forms/Test"); 63 | СоздатьКаталог(ВременнаяПапка + "Example/Forms/Test/Ext"); 64 | СоздатьКаталог(ВременнаяПапка + "Example/Forms/Test/Ext/Form"); 65 | СоздатьКаталог(ВременнаяПапка + "src"); 66 | СоздатьКаталог(ВременнаяПапка + "tools"); 67 | 68 | МассивФайлов = Новый Массив; 69 | МассивФайлов.Добавить("LICENSE"); 70 | МассивФайлов.Добавить("Example.xml"); 71 | МассивФайлов.Добавить("Example/Features/НажатиеМыши.feature"); 72 | МассивФайлов.Добавить("include/ComponentBase.h"); 73 | МассивФайлов.Добавить("include/types.h"); 74 | МассивФайлов.Добавить("src/AddInNative.cpp"); 75 | МассивФайлов.Добавить("src/AddInNative.h"); 76 | МассивФайлов.Добавить("src/json.hpp"); 77 | МассивФайлов.Добавить("tools/Compile.os"); 78 | МассивФайлов.Добавить("tools/Decompile.os"); 79 | 80 | git.init(ВременнаяПапка); 81 | Для каждого ИмяФайла Из МассивФайлов Цикл 82 | КопироватьФайл(ТекущийКаталог + ИмяФайла, ВременнаяПапка + ИмяФайла); 83 | КонецЦикла; 84 | git.add(JsonDump(МассивФайлов)); 85 | 86 | ПодписьПоУмолчанию = JsonLoad(git.signature); 87 | Если Не ПодписьПоУмолчанию.success Тогда 88 | git.SetAuthor("Test User", "user@mail.com"); 89 | git.SetCommitter("Test Committer", "committer@mail.com"); 90 | КонецЕсли; 91 | git.commit("Инициализация"); 92 | git.checkout("develop", True); 93 | 94 | ИмяФайла = "tools/Decompile.os"; 95 | ПолноеИмя = ВременнаяПапка + ИмяФайла; 96 | УдалитьФайлы(ПолноеИмя); 97 | 98 | ИмяФайла = "Example.xml"; 99 | ПолноеИмя = ВременнаяПапка + ИмяФайла; 100 | УдалитьФайлы(ПолноеИмя); 101 | git.remove(ИмяФайла); 102 | 103 | ИмяФайла = "tools/Compile.os"; 104 | ПолноеИмя = ВременнаяПапка + ИмяФайла; 105 | ТекстовыйДокумент = Новый ТекстовыйДокумент; 106 | ТекстовыйДокумент.Прочитать(ПолноеИмя, КодировкаТекста.UTF8); 107 | Для НомерСтроки = 1 По 4 Цикл 108 | Стр = ТекстовыйДокумент.ПолучитьСтроку(7); 109 | ТекстовыйДокумент.ВставитьСтроку(70, Стр); 110 | ТекстовыйДокумент.УдалитьСтроку(7); 111 | КонецЦикла; 112 | ТекстовыйДокумент.Записать(ПолноеИмя, КодировкаТекста.UTF8); 113 | git.add(ИмяФайла); 114 | 115 | ИмяФайла = "Example/Forms/Form.xml"; 116 | КопироватьФайл(ТекущийКаталог + ИмяФайла, ВременнаяПапка + ИмяФайла); 117 | 118 | ИмяФайла = "Example/Forms/Test.xml"; 119 | КопироватьФайл(ТекущийКаталог + ИмяФайла, ВременнаяПапка + ИмяФайла); 120 | git.add(ИмяФайла); 121 | 122 | ИмяФайла = "Example/Forms/Test/Ext/Form/Module.bsl"; 123 | КопироватьФайл(ТекущийКаталог + ИмяФайла, ВременнаяПапка + ИмяФайла); 124 | git.add(ИмяФайла); 125 | 126 | ИмяФайла = "src/AddInNative.cpp"; 127 | ПолноеИмя = ВременнаяПапка + ИмяФайла; 128 | ТекстовыйДокумент = Новый ТекстовыйДокумент; 129 | ТекстовыйДокумент.Прочитать(ПолноеИмя, КодировкаТекста.UTF8); 130 | ТекстовыйДокумент.ВставитьСтроку(3, "// " + ЧислоПрописью(51243, "L=en_US")); 131 | ТекстовыйДокумент.ВставитьСтроку(4, "// " + ЧислоПрописью(24565, "L=en_US")); 132 | ТекстовыйДокумент.ВставитьСтроку(5, ""); 133 | ТекстовыйДокумент.Записать(ПолноеИмя, КодировкаТекста.UTF8); 134 | git.add(ИмяФайла); 135 | 136 | head = git.head; 137 | branches = git.branches; 138 | 139 | КонецПроцедуры -------------------------------------------------------------------------------- /Example/Templates/GitFor1C.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 16 | -------------------------------------------------------------------------------- /Example/Templates/VAEditor.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 16 | -------------------------------------------------------------------------------- /Example/filename: -------------------------------------------------------------------------------- 1 | GitFor1C.epf -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2019, Denis Kandrashin 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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GitFor1C - внешняя компонента 1С Native API 2 | 3 | Для сборки запустите **Compile.bat**, при этом будут скачаны необходимые библиотеки 4 | [libgit2-1.0.1](https://libgit2.org/) и [libssh2-1.9.0](https://www.libssh2.org/). 5 | -------------------------------------------------------------------------------- /appveyor.ps1: -------------------------------------------------------------------------------- 1 | param( 2 | [string]$account = $env:APPVEYOR_ACCOUNT_NAME, 3 | [string]$project = $env:APPVEYOR_PROJECT_NAME, 4 | [string]$name = $env:APPVEYOR_PROJECT_NAME 5 | ) 6 | 7 | $path = $env:APPVEYOR_BUILD_FOLDER 8 | $version = $env:APPVEYOR_BUILD_VERSION 9 | $postfix = '_' + $version -replace '\.', '-' 10 | 11 | Rename-Item "$path\lib${name}Win32.dll" "${name}Win32$postfix.dll" 12 | Rename-Item "$path\lib${name}Win64.dll" "${name}Win64$postfix.dll" 13 | 14 | $compress = @{ 15 | Path = "$path\$name*.dll", "$path\manifest.xml" 16 | DestinationPath = "$path\AddIn.zip" 17 | } 18 | Compress-Archive @compress 19 | 20 | New-Item -ItemType Directory -Force -Path "$path\Example\Templates\$name\Ext\" | Out-Null 21 | Copy-Item -Path "$path\AddIn.zip" -Destination "$path\Example\Templates\$name\Ext\Template.bin" 22 | -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | version: 1.1.0.{build} 2 | configuration: Release 3 | platform: x64 4 | 5 | branches: 6 | only: 7 | - develop 8 | - master 9 | 10 | skip_branch_with_pr: true 11 | 12 | environment: 13 | matrix: 14 | - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019 15 | job_depends_on: Linux 16 | job_name: Windows 17 | 18 | matrix: 19 | fast_finish: true 20 | 21 | install: 22 | - cmd: git clone -q --branch=platform https://github.com/lintest/tools1c.git bin 23 | - cmd: cd bin 24 | - cmd: 7z x tools1c.part01.rar -p%KEY_1CV8T% 25 | - cmd: cd .. 26 | 27 | - git clone -q --branch=main https://github.com/libgit2/libgit2.git libgit2-1.1.0 28 | - cd libgit2-1.1.0 29 | - git checkout -b version v1.1.0 30 | - cd .. 31 | 32 | - git clone -q --branch=master https://github.com/libssh2/libssh2.git libssh2-1.9.0 33 | - cd libssh2-1.9.0 34 | - git checkout -b version libssh2-1.9.0 35 | - cd .. 36 | 37 | - sh: sudo dpkg --add-architecture i386 38 | - sh: sudo apt -qq update 39 | --allow-unauthenticated 40 | --fix-missing 41 | - sh: sudo apt -qq -y install 42 | --allow-unauthenticated 43 | --fix-missing 44 | uuid-dev uuid-dev:i386 45 | libz-dev libz-dev:i386 46 | libssl-dev libssl-dev:i386 47 | gcc-multilib g++-multilib 48 | 49 | init: 50 | - cmd: cmake --version 51 | - cmd: msbuild /version 52 | - cmd: echo. 53 | 54 | build_script: 55 | - sh: echo "#define VERSION_FULL " ${APPVEYOR_BUILD_VERSION} > "version.h" 56 | - cmd: powershell -File manifest.ps1 57 | 58 | - mkdir build32 59 | - cd build32 60 | - sh: cmake -D CMAKE_BUILD_TYPE:STRING=Release -D TARGET_PLATFORM_32:BOOL=ON --build .. 61 | - cmd: cmake .. -A Win32 -DMySuffix2=32 62 | - cmake --build . --config Release --target GitFor1C 63 | - cd .. 64 | 65 | - mkdir build64 66 | - cd build64 67 | - sh: cmake -D CMAKE_BUILD_TYPE:STRING=Release -D TARGET_PLATFORM_32:BOOL=OFF --build .. 68 | - cmd: cmake .. -A x64 -DMySuffix2=64 69 | - cmake --build . --config Release --target GitFor1C 70 | - cd .. 71 | 72 | for: 73 | - matrix: 74 | only: 75 | - job_name: Windows 76 | 77 | after_build: 78 | - copy bin32\Release\lib%APPVEYOR_PROJECT_NAME%Win32.dll . 79 | - copy bin64\Release\lib%APPVEYOR_PROJECT_NAME%Win64.dll . 80 | - powershell -File appveyor.ps1 81 | - appveyor PushArtifact AddIn.zip 82 | - powershell -File lib\packages.ps1 83 | - mkdir database 84 | - bin\1cv8t.exe CREATEINFOBASE File=%CD%/database 85 | - bin\1cv8t.exe DESIGNER /F %CD%/database /LoadExternalDataProcessorOrReportFromFiles Example.xml %APPVEYOR_PROJECT_NAME%.epf /Out example.log 86 | 87 | artifacts: 88 | - path: AddIn.zip 89 | - path: ${APPVEYOR_PROJECT_NAME}.epf 90 | - path: autotest.log 91 | - path: example.log 92 | 93 | environment: 94 | KEY_1CV8T: 95 | secure: OolAVEKkEg1cGCpG/VK2FaM0LWrPgMR/Kn4nTLYyKR0= 96 | 97 | deploy: 98 | - provider: GitHub 99 | auth_token: 100 | secure: v7P89NQ2I5+WGNNdhpFrZEt6OCTPf8A8VSC5rttZMXh3DJ2fTChNEjZ1Wvm3kfBt 101 | repository: ${APPVEYOR_ACCOUNT_NAME}/${APPVEYOR_PROJECT_NAME} 102 | artifact: AddIn.zip, ${APPVEYOR_PROJECT_NAME}.epf 103 | draft: true 104 | prerelease: true 105 | force_update: true 106 | on: 107 | branch: master 108 | -------------------------------------------------------------------------------- /include/.gitattributes: -------------------------------------------------------------------------------- 1 | * -text 2 | -------------------------------------------------------------------------------- /include/AddInDefBase.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Warning!!! 3 | * DO NOT ALTER THIS FILE! 4 | */ 5 | 6 | #ifndef __ADAPTER_DEF_H__ 7 | #define __ADAPTER_DEF_H__ 8 | #include "types.h" 9 | 10 | struct IInterface 11 | { 12 | }; 13 | 14 | 15 | enum Interfaces 16 | { 17 | eIMsgBox = 0, 18 | eIPlatformInfo, 19 | 20 | #if defined(__ANDROID__) 21 | 22 | eIAndroidComponentHelper, 23 | 24 | #endif 25 | 26 | }; 27 | 28 | //////////////////////////////////////////////////////////////////////////////// 29 | /** 30 | * This class serves as representation of a platform for external 31 | * components External components use it to communicate with a platform. 32 | * 33 | */ 34 | /// Base interface for object components. 35 | class IAddInDefBase 36 | { 37 | public: 38 | virtual ~IAddInDefBase() {} 39 | /// Adds the error message 40 | /** 41 | * @param wcode - error code 42 | * @param source - source of error 43 | * @param descr - description of error 44 | * @param scode - error code (HRESULT) 45 | * @return the result of 46 | */ 47 | virtual bool ADDIN_API AddError(unsigned short wcode, const WCHAR_T* source, 48 | const WCHAR_T* descr, long scode) = 0; 49 | 50 | /// Reads a property value 51 | /** 52 | * @param wszPropName -property name 53 | * @param pVal - value being returned 54 | * @param pErrCode - error code (if any error occured) 55 | * @param errDescriptor - error description (if any error occured) 56 | * @return the result of read. 57 | */ 58 | virtual bool ADDIN_API Read(WCHAR_T* wszPropName, 59 | tVariant* pVal, 60 | long *pErrCode, 61 | WCHAR_T** errDescriptor) = 0; 62 | /// Writes a property value 63 | /** 64 | * @param wszPropName - property name 65 | * @param pVar - new property value 66 | * @return the result of write. 67 | */ 68 | virtual bool ADDIN_API Write(WCHAR_T* wszPropName, 69 | tVariant *pVar) = 0; 70 | 71 | ///Registers profile components 72 | /** 73 | * @param wszProfileName - profile name 74 | * @return the result of 75 | */ 76 | virtual bool ADDIN_API RegisterProfileAs(WCHAR_T* wszProfileName) = 0; 77 | 78 | /// Changes the depth of event buffer 79 | /** 80 | * @param lDepth - new depth of event buffer 81 | * @return the result of 82 | */ 83 | virtual bool ADDIN_API SetEventBufferDepth(long lDepth) = 0; 84 | /// Returns the depth of event buffer 85 | /** 86 | * @return the depth of event buffer 87 | */ 88 | virtual long ADDIN_API GetEventBufferDepth() = 0; 89 | /// Registers external event 90 | /** 91 | * @param wszSource - source of event 92 | * @param wszMessage - event message 93 | * @param wszData - message parameters 94 | * @return the result of 95 | */ 96 | virtual bool ADDIN_API ExternalEvent(WCHAR_T* wszSource, 97 | WCHAR_T* wszMessage, 98 | WCHAR_T* wszData) = 0; 99 | /// Clears event buffer 100 | /** 101 | */ 102 | virtual void ADDIN_API CleanEventBuffer() = 0; 103 | 104 | /// Sets status line contents 105 | /** 106 | * @param wszStatusLine - new status line contents 107 | * @return the result of 108 | */ 109 | virtual bool ADDIN_API SetStatusLine(WCHAR_T* wszStatusLine) = 0; 110 | /// Resets the status line contents 111 | /** 112 | * @return the result of 113 | */ 114 | virtual void ADDIN_API ResetStatusLine() = 0; 115 | }; 116 | 117 | class IAddInDefBaseEx : 118 | public IAddInDefBase 119 | { 120 | public: 121 | virtual ~IAddInDefBaseEx() {} 122 | 123 | virtual IInterface* ADDIN_API GetInterface(Interfaces iface) = 0; 124 | }; 125 | 126 | struct IMsgBox : 127 | public IInterface 128 | { 129 | virtual bool ADDIN_API Confirm(const WCHAR_T* queryText, tVariant* retVal) = 0; 130 | 131 | virtual bool ADDIN_API Alert(const WCHAR_T* text) = 0; 132 | }; 133 | 134 | struct IPlatformInfo : 135 | public IInterface 136 | { 137 | enum AppType 138 | { 139 | eAppUnknown = -1, 140 | eAppThinClient = 0, 141 | eAppThickClient, 142 | eAppWebClient, 143 | eAppServer, 144 | eAppExtConn, 145 | eAppMobileClient, 146 | eAppMobileServer, 147 | }; 148 | 149 | struct AppInfo 150 | { 151 | const WCHAR_T* AppVersion; 152 | const WCHAR_T* UserAgentInformation; 153 | AppType Application; 154 | }; 155 | 156 | virtual const AppInfo* ADDIN_API GetPlatformInfo() = 0; 157 | }; 158 | 159 | #endif //__ADAPTER_DEF_H__ 160 | -------------------------------------------------------------------------------- /include/ComponentBase.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Warning!!! 3 | * DO NOT ALTER THIS FILE! 4 | */ 5 | 6 | 7 | #ifndef __COMPONENT_BASE_H__ 8 | #define __COMPONENT_BASE_H__ 9 | 10 | #include "types.h" 11 | //////////////////////////////////////////////////////////////////////////////// 12 | /** 13 | * The given interface is intended for initialization and 14 | * uninitialization of component and its adjustments 15 | */ 16 | /// Interface of component initialization. 17 | class IInitDoneBase 18 | { 19 | public: 20 | virtual ~IInitDoneBase() {} 21 | /// Initializes component 22 | /** 23 | * @param disp - 1C:Enterpise interface 24 | * @return the result of 25 | */ 26 | virtual bool ADDIN_API Init(void* disp) = 0; 27 | /// Sets the memory manager 28 | /* 29 | * @param mem - pointer to memory manager interface. 30 | * @return the result of 31 | */ 32 | virtual bool ADDIN_API setMemManager(void* mem) = 0; 33 | 34 | /// Returns component version 35 | /** 36 | * @return - component version (2000 - version 2) 37 | */ 38 | virtual long ADDIN_API GetInfo() = 0; 39 | 40 | /// Uninitializes component 41 | /** 42 | * Component here should release all consumed resources. 43 | */ 44 | virtual void ADDIN_API Done() = 0; 45 | 46 | }; 47 | /////////////////////////////////////////////////////////////////////////// 48 | /** 49 | * The given interface defines methods that are intented to be used by the Platform 50 | */ 51 | /// Interface describing extension of language. 52 | class ILanguageExtenderBase 53 | { 54 | public: 55 | virtual ~ILanguageExtenderBase(){} 56 | /// Registers language extension 57 | /** 58 | * @param wsExtensionName - extension name 59 | * @return the result of 60 | */ 61 | virtual bool ADDIN_API RegisterExtensionAs(WCHAR_T** wsExtensionName) = 0; 62 | 63 | /// Returns number of component properties 64 | /** 65 | * @return number of properties 66 | */ 67 | virtual long ADDIN_API GetNProps() = 0; 68 | 69 | /// Finds property by name 70 | /** 71 | * @param wsPropName - property name 72 | * @return property index or -1, if it is not found 73 | */ 74 | virtual long ADDIN_API FindProp(const WCHAR_T* wsPropName) = 0; 75 | 76 | /// Returns property name 77 | /** 78 | * @param lPropNum - property index (starting with 0) 79 | * @param lPropAlias - 0 - international alias, 80 | * 1 - russian alias. (International alias is required) 81 | * @return proeprty name or 0 if it is not found 82 | */ 83 | virtual const WCHAR_T* ADDIN_API GetPropName(long lPropNum, 84 | long lPropAlias) = 0; 85 | 86 | /// Returns property value 87 | /** 88 | * @param lPropNum - property index (starting with 0) 89 | * @param pvarPropVal - the pointer to a variable for property value 90 | * @return the result of 91 | */ 92 | virtual bool ADDIN_API GetPropVal(const long lPropNum, 93 | tVariant* pvarPropVal) = 0; 94 | 95 | /// Sets the property value 96 | /** 97 | * @param lPropNum - property index (starting with 0) 98 | * @param varPropVal - the pointer to a variable for property value 99 | * @return the result of 100 | */ 101 | virtual bool ADDIN_API SetPropVal(const long lPropNum, 102 | tVariant* varPropVal) = 0; 103 | 104 | /// Is property readable? 105 | /** 106 | * @param lPropNum - property index (starting with 0) 107 | * @return true if property is readable 108 | */ 109 | virtual bool ADDIN_API IsPropReadable(const long lPropNum) = 0; 110 | 111 | /// Is property writable? 112 | /** 113 | * @param lPropNum - property index (starting with 0) 114 | * @return true if property is writable 115 | */ 116 | virtual bool ADDIN_API IsPropWritable(const long lPropNum) = 0; 117 | 118 | /// Returns number of component methods 119 | /** 120 | * @return number of component methods 121 | */ 122 | virtual long ADDIN_API GetNMethods() = 0; 123 | 124 | /// Finds a method by name 125 | /** 126 | * @param wsMethodName - method name 127 | * @return - method index 128 | */ 129 | virtual long ADDIN_API FindMethod(const WCHAR_T* wsMethodName) = 0; 130 | 131 | /// Returns method name 132 | /** 133 | * @param lMethodNum - method index(starting with 0) 134 | * @param lMethodAlias - 0 - international alias, 135 | * 1 - russian alias. (International alias is required) 136 | * @return method name or 0 if method is not found 137 | */ 138 | virtual const WCHAR_T* ADDIN_API GetMethodName(const long lMethodNum, 139 | const long lMethodAlias) = 0; 140 | 141 | /// Returns number of method parameters 142 | /** 143 | * @param lMethodNum - method index (starting with 0) 144 | * @return number of parameters 145 | */ 146 | virtual long ADDIN_API GetNParams(const long lMethodNum) = 0; 147 | 148 | /// Returns default value of method parameter 149 | /** 150 | * @param lMethodNum - method index(starting with 0) 151 | * @param lParamNum - parameter index (starting with 0) 152 | * @param pvarParamDefValue - the pointer to a variable for default value 153 | * @return the result of 154 | */ 155 | virtual bool ADDIN_API GetParamDefValue(const long lMethodNum, 156 | const long lParamNum, 157 | tVariant *pvarParamDefValue) = 0; 158 | 159 | /// Does the method have a return value? 160 | /** 161 | * @param lMethodNum - method index (starting with 0) 162 | * @return true if the method has a return value 163 | */ 164 | virtual bool ADDIN_API HasRetVal(const long lMethodNum) = 0; 165 | 166 | /// Calls the method as a procedure 167 | /** 168 | * @param lMethodNum - method index (starting with 0) 169 | * @param paParams - the pointer to array of method parameters 170 | * @param lSizeArray - the size of array 171 | * @return the result of 172 | */ 173 | virtual bool ADDIN_API CallAsProc(const long lMethodNum, 174 | tVariant* paParams, 175 | const long lSizeArray) = 0; 176 | 177 | /// Calls the method as a function 178 | /** 179 | * @param lMethodNum - method index (starting with 0) 180 | * @param pvarRetValue - the pointer to returned value 181 | * @param paParams - the pointer to array of method parameters 182 | * @param lSizeArray - the size of array 183 | * @return the result of 184 | */ 185 | virtual bool ADDIN_API CallAsFunc(const long lMethodNum, 186 | tVariant* pvarRetValue, 187 | tVariant* paParams, 188 | const long lSizeArray) = 0; 189 | }; 190 | /////////////////////////////////////////////////////////////////////////// 191 | /** 192 | * This interface is used to change component locale 193 | */ 194 | /// Base interface for component localization. 195 | class LocaleBase 196 | { 197 | public: 198 | virtual ~LocaleBase(){} 199 | /// Changes component locale 200 | /** 201 | * @param loc - new locale (for Windows - rus_RUS, 202 | * for Linux - ru_RU, etc...) 203 | */ 204 | virtual void ADDIN_API SetLocale(const WCHAR_T* loc) = 0; 205 | }; 206 | 207 | /////////////////////////////////////////////////////////////////////////// 208 | /** 209 | * The given interface is generalized, for its obligatory inheritance 210 | * in implementing components. 211 | */ 212 | /// Base interface describing object as a set of properties and methods. 213 | class IComponentBase : 214 | public IInitDoneBase, 215 | public ILanguageExtenderBase, 216 | public LocaleBase 217 | { 218 | public: 219 | virtual ~IComponentBase(){} 220 | }; 221 | 222 | enum AppCapabilities 223 | { 224 | eAppCapabilitiesInvalid = -1, 225 | eAppCapabilities1 = 1, 226 | eAppCapabilitiesLast = eAppCapabilities1, 227 | }; 228 | 229 | /// Announcements of exported functions 230 | /** 231 | * These functions should be implemented that component can be loaded and created. 232 | */ 233 | extern "C" long GetClassObject(const WCHAR_T*, IComponentBase** pIntf); 234 | extern "C" long DestroyObject(IComponentBase** pIntf); 235 | extern "C" const WCHAR_T* GetClassNames(); 236 | extern "C" AppCapabilities SetPlatformCapabilities(const AppCapabilities capabilities); 237 | 238 | typedef long (*GetClassObjectPtr)(const WCHAR_T* wsName, IComponentBase** pIntf); 239 | typedef long (*DestroyObjectPtr)(IComponentBase** pIntf); 240 | typedef const WCHAR_T* (*GetClassNamesPtr)(); 241 | typedef AppCapabilities (*SetPlatformCapabilitiesPtr)(const AppCapabilities capabilities); 242 | 243 | #endif //__COMPONENT_BASE_H__ 244 | -------------------------------------------------------------------------------- /include/IMemoryManager.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Warning!!! 3 | * DO NOT ALTER THIS FILE! 4 | */ 5 | 6 | 7 | #ifndef __IMEMORY_MANAGER_H__ 8 | #define __IMEMORY_MANAGER_H__ 9 | 10 | /////////////////////////////////////////////////////////////////////////////// 11 | /** 12 | * The given class allocates and releases memory for a component 13 | */ 14 | /// Interface representing memory manager. 15 | class IMemoryManager 16 | { 17 | public: 18 | virtual ~IMemoryManager() {} 19 | /// Allocates memory of specified size 20 | /** 21 | * @param pMemory - the double pointer to variable, that will hold newly 22 | * allocated block of memory of NULL if allocation fails. 23 | * @param ulCountByte - memory size 24 | * @return the result of 25 | */ 26 | virtual bool ADDIN_API AllocMemory (void** pMemory, unsigned long ulCountByte) = 0; 27 | /// Releases memory 28 | /** 29 | * @param pMemory - The double pointer to the memory block being released 30 | */ 31 | virtual void ADDIN_API FreeMemory (void** pMemory) = 0; 32 | }; 33 | 34 | #endif //__IMEMORY_MANAGER_H__ 35 | -------------------------------------------------------------------------------- /include/com.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef __COM_H__ 3 | #define __COM_H__ 4 | 5 | #if defined(__linux__) || defined(__APPLE__) || defined(__ANDROID__) 6 | 7 | #ifdef __ANDROID__ 8 | 9 | typedef struct { 10 | unsigned int Data1; 11 | unsigned short Data2; 12 | unsigned short Data3; 13 | unsigned char Data4[ 8 ]; 14 | } uuid_t; 15 | 16 | #else 17 | #include 18 | #endif //__ANDROID__ 19 | 20 | #ifndef __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ // iOS 21 | #include 22 | #endif //!__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ 23 | 24 | #pragma GCC system_header 25 | 26 | typedef long HRESULT; 27 | 28 | #ifdef __GNUC__ 29 | #define STDMETHODCALLTYPE __attribute__ ((__stdcall__)) 30 | #define DECLSPEC_NOTHROW __attribute__ ((nothrow)) 31 | #define STDMETHOD(method) virtual DECLSPEC_NOTHROW HRESULT STDMETHODCALLTYPE method 32 | #else 33 | #define STDMETHODCALLTYPE 34 | #endif 35 | 36 | #define __stdcall STDMETHODCALLTYPE 37 | #define near 38 | #define far 39 | #define CONST const 40 | #define FAR far 41 | 42 | typedef unsigned long DWORD; 43 | #ifndef __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ // iOS 44 | typedef int BOOL; 45 | #elif defined(__LP64__) 46 | typedef bool BOOL; 47 | #else 48 | typedef signed char BOOL; 49 | #endif //!__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ 50 | 51 | typedef void VOID; 52 | typedef short SHORT; 53 | typedef unsigned char BYTE; 54 | typedef unsigned short WORD; 55 | typedef float FLOAT; 56 | typedef FLOAT *PFLOAT; 57 | typedef BOOL near *PBOOL; 58 | typedef BOOL far *LPBOOL; 59 | typedef BYTE near *PBYTE; 60 | typedef BYTE far *LPBYTE; 61 | typedef int near *PINT; 62 | typedef int far *LPINT; 63 | typedef WORD near *PWORD; 64 | typedef WORD far *LPWORD; 65 | typedef long far *LPLONG; 66 | typedef DWORD near *PDWORD; 67 | typedef DWORD far *LPDWORD; 68 | typedef void far *LPVOID; 69 | typedef CONST void far *LPCVOID; 70 | typedef wchar_t *BSTR; 71 | typedef long SCODE; 72 | typedef int INT; 73 | typedef unsigned int UINT; 74 | typedef unsigned int *PUINT; 75 | typedef wchar_t WCHAR; 76 | typedef wchar_t OLECHAR; 77 | typedef wchar_t *LPOLESTR; 78 | typedef const wchar_t *LPCOLESTR; 79 | typedef DWORD LCID; 80 | typedef PDWORD PLCID; 81 | typedef long LONG; 82 | typedef unsigned long ULONG; 83 | typedef long long LONGLONG; 84 | typedef unsigned long long ULONGLONG; 85 | typedef LONG DISPID; 86 | typedef double DOUBLE; 87 | typedef double DATE; 88 | typedef short VARIANT_BOOL; 89 | typedef void *PVOID; 90 | typedef char CHAR; 91 | typedef CONST CHAR *LPCSTR; 92 | typedef unsigned short USHORT; 93 | typedef void *HMODULE; 94 | #define OLESTR(str) L##str 95 | 96 | typedef uuid_t GUID; 97 | typedef uuid_t IID; 98 | typedef uuid_t UUID; 99 | #define REFIID const IID & 100 | #define MAX_PATH 260 101 | 102 | #define IsEqualIID(x,y) uuid_compare((x),(y)) 103 | #ifdef __GNUC__ 104 | #define LoadLibraryA(x) dlopen((x), RTLD_LAZY) 105 | #define FreeLibrary(x) dlclose((x)) 106 | #define GetProcAddress(x, y) dlsym((x), (y)) 107 | #endif //__GNUC__ 108 | 109 | #define E_FAIL 0x80004005L 110 | #define S_OK 0L 111 | #define S_FALSE 1L 112 | #define E_NOINTERFACE 0x80004002L 113 | #define E_NOTIMPL 0x80004001L 114 | #define E_INVALIDARG 0x80070057L 115 | #define E_UNEXPECTED 0x8000FFFFL 116 | #define E_OUTOFMEMORY 0x8007000EL 117 | #define DISP_E_UNKNOWNNAME 0x80020006L 118 | #define DISPID_UNKNOWN ( -1 ) 119 | #define TRUE 1 120 | #define FALSE 0 121 | 122 | typedef long ITypeInfo; 123 | 124 | #if defined (__GNUC__) && !defined (NONAMELESSUNION) 125 | __extension__ /* no named members */ 126 | #endif 127 | union tCY { 128 | __extension__ struct 129 | { 130 | unsigned long Lo; 131 | long Hi; 132 | }; 133 | long long int64; 134 | }; 135 | typedef union tagCY CY; 136 | #define CLSIDFromString(x,y) uuid_parse((x),(unsigned char*)(y)) 137 | 138 | #endif //defined(__linux__) || defined(__APPLE__) 139 | 140 | #endif //__COM_H__ 141 | -------------------------------------------------------------------------------- /include/types.h: -------------------------------------------------------------------------------- 1 | 2 | #ifndef __CON_TYPES_H__ 3 | #define __CON_TYPES_H__ 4 | 5 | #if defined(_WINDOWS) || defined(WINAPI_FAMILY) 6 | #include 7 | #endif 8 | 9 | #if defined(WINAPI_FAMILY) 10 | #include 11 | #endif 12 | 13 | #if __GNUC__ >=3 14 | #pragma GCC system_header 15 | #endif 16 | 17 | #include "com.h" 18 | #include 19 | #include 20 | #include 21 | #include 22 | 23 | #define EXTERN_C extern "C" 24 | 25 | #ifdef __GNUC__ 26 | #define _ANONYMOUS_UNION __extension__ 27 | #define _ANONYMOUS_STRUCT __extension__ 28 | #else 29 | #define _ANONYMOUS_UNION 30 | #define _ANONYMOUS_STRUCT 31 | #endif //__GNUC__ 32 | 33 | #ifdef NONAMELESSUNION 34 | #define __VARIANT_NAME_1 u 35 | #define __VARIANT_NAME_2 iface 36 | #define __VARIANT_NAME_3 str 37 | #define __VARIANT_NAME_4 wstr 38 | #else 39 | #define __VARIANT_NAME_1 40 | #define __VARIANT_NAME_2 41 | #define __VARIANT_NAME_3 42 | #define __VARIANT_NAME_4 43 | #endif //NONAMELESSUNION 44 | 45 | #define RESULT_FROM_ERRNO(x) ((long)(x) <= 0 ? ((long)(x)) \ 46 | : ((long) (((x) & 0x0000FFFF) | (BASE_ERRNO << 16) | 0x80000000))) 47 | 48 | #define ADDIN_E_NONE 1000 49 | #define ADDIN_E_ORDINARY 1001 50 | #define ADDIN_E_ATTENTION 1002 51 | #define ADDIN_E_IMPORTANT 1003 52 | #define ADDIN_E_VERY_IMPORTANT 1004 53 | #define ADDIN_E_INFO 1005 54 | #define ADDIN_E_FAIL 1006 55 | #define ADDIN_E_MSGBOX_ATTENTION 1007 56 | #define ADDIN_E_MSGBOX_INFO 1008 57 | #define ADDIN_E_MSGBOX_FAIL 1009 58 | 59 | #ifndef ADDIN_API 60 | #ifdef _WINDOWS 61 | #define ADDIN_API __stdcall 62 | #else 63 | //#define ADDIN_API __attribute__ ((__stdcall__)) 64 | #define ADDIN_API 65 | #endif //_WINDOWS 66 | #endif //ADDIN_API 67 | 68 | #include 69 | 70 | #ifdef _WINDOWS 71 | #define WCHAR_T wchar_t 72 | #else 73 | #define WCHAR_T uint16_t 74 | #endif //_WINDOWS 75 | typedef unsigned short TYPEVAR; 76 | enum ENUMVAR 77 | { 78 | VTYPE_EMPTY = 0, 79 | VTYPE_NULL, 80 | VTYPE_I2, //int16_t 81 | VTYPE_I4, //int32_t 82 | VTYPE_R4, //float 83 | VTYPE_R8, //double 84 | VTYPE_DATE, //DATE (double) 85 | VTYPE_TM, //struct tm 86 | VTYPE_PSTR, //struct str string 87 | VTYPE_INTERFACE, //struct iface 88 | VTYPE_ERROR, //int32_t errCode 89 | VTYPE_BOOL, //bool 90 | VTYPE_VARIANT, //struct _tVariant * 91 | VTYPE_I1, //int8_t 92 | VTYPE_UI1, //uint8_t 93 | VTYPE_UI2, //uint16_t 94 | VTYPE_UI4, //uint32_t 95 | VTYPE_I8, //int64_t 96 | VTYPE_UI8, //uint64_t 97 | VTYPE_INT, //int Depends on architecture 98 | VTYPE_UINT, //unsigned int Depends on architecture 99 | VTYPE_HRESULT, //long hRes 100 | VTYPE_PWSTR, //struct wstr 101 | VTYPE_BLOB, //means in struct str binary data contain 102 | VTYPE_CLSID, //UUID 103 | VTYPE_STR_BLOB = 0xfff, 104 | VTYPE_VECTOR = 0x1000, 105 | VTYPE_ARRAY = 0x2000, 106 | VTYPE_BYREF = 0x4000, //Only with struct _tVariant * 107 | VTYPE_RESERVED = 0x8000, 108 | VTYPE_ILLEGAL = 0xffff, 109 | VTYPE_ILLEGALMASKED = 0xfff, 110 | VTYPE_TYPEMASK = 0xfff 111 | } ; 112 | #if defined (__GNUC__) && !defined (NONAMELESSUNION) 113 | __extension__ /* no named members */ 114 | #endif 115 | struct _tVariant 116 | { 117 | _ANONYMOUS_UNION union 118 | { 119 | int8_t i8Val; 120 | int16_t shortVal; 121 | int32_t lVal; 122 | int intVal; 123 | unsigned int uintVal; 124 | int64_t llVal; 125 | uint8_t ui8Val; 126 | uint16_t ushortVal; 127 | uint32_t ulVal; 128 | uint64_t ullVal; 129 | int32_t errCode; 130 | long hRes; 131 | float fltVal; 132 | double dblVal; 133 | bool bVal; 134 | char chVal; 135 | wchar_t wchVal; 136 | DATE date; 137 | IID IDVal; 138 | struct _tVariant *pvarVal; 139 | struct tm tmVal; 140 | _ANONYMOUS_STRUCT struct 141 | { 142 | void* pInterfaceVal; 143 | IID InterfaceID; 144 | } __VARIANT_NAME_2/*iface*/; 145 | _ANONYMOUS_STRUCT struct 146 | { 147 | char* pstrVal; 148 | uint32_t strLen; //count of bytes 149 | } __VARIANT_NAME_3/*str*/; 150 | _ANONYMOUS_STRUCT struct 151 | { 152 | WCHAR_T* pwstrVal; 153 | uint32_t wstrLen; //count of symbol 154 | } __VARIANT_NAME_4/*wstr*/; 155 | } __VARIANT_NAME_1; 156 | uint32_t cbElements; //Dimension for an one-dimensional array in pvarVal 157 | TYPEVAR vt; 158 | }; 159 | typedef struct _tVariant tVariant; 160 | typedef tVariant tVariantArg; 161 | 162 | 163 | #if defined(NONAMELESSUNION) 164 | #define TV_JOIN(X, Y) ((X)->u.Y) 165 | #else 166 | #define TV_JOIN(X, Y) ((X)->Y) 167 | #endif 168 | 169 | #define TV_VT(X) ((X)->vt) 170 | #define TV_ISBYREF(X) (TV_VT(X)&VT_BYREF) 171 | #define TV_ISARRAY(X) (TV_VT(X)&VT_ARRAY) 172 | #define TV_ISVECTOR(X) (TV_VT(X)&VT_VECTOR) 173 | #define TV_NONE(X) TV_I2(X) 174 | 175 | #define TV_UI1(X) TV_JOIN(X, ui8Val) 176 | #define TV_I2(X) TV_JOIN(X, shortVal) 177 | #define TV_I4(X) TV_JOIN(X, lVal) 178 | #define TV_I8(X) TV_JOIN(X, llVal) 179 | #define TV_R4(X) TV_JOIN(X, fltVal) 180 | #define TV_R8(X) TV_JOIN(X, dblVal) 181 | #define TV_I1(X) TV_JOIN(X, i8Val) 182 | #define TV_UI2(X) TV_JOIN(X, ushortVal) 183 | #define TV_UI4(X) TV_JOIN(X, ulVal) 184 | #define TV_UI8(X) TV_JOIN(X, ullVal) 185 | #define TV_INT(X) TV_JOIN(X, intVal) 186 | #define TV_UINT(X) TV_JOIN(X, uintVal) 187 | 188 | #ifdef _WIN64 189 | #define TV_INT_PTR(X) TV_JOIN(X, llVal) 190 | #define TV_UINT_PTR(X) TV_JOIN(X, ullVal) 191 | #else 192 | #define TV_INT_PTR(X) TV_JOIN(X, lVal) 193 | #define TV_UINT_PTR(X) TV_JOIN(X, ulVal) 194 | #endif 195 | 196 | 197 | #define TV_DATE(X) TV_JOIN(X, date) 198 | #define TV_STR(X) TV_JOIN(X, pstrVal) 199 | #define TV_WSTR(X) TV_JOIN(X, pwstrVal) 200 | #define TV_BOOL(X) TV_JOIN(X, bVal) 201 | #define TV_UNKNOWN(X) TV_JOIN(X, pInterfaceVal) 202 | #define TV_VARIANTREF(X) TV_JOIN(X, pvarVal) 203 | 204 | void tVarInit(tVariant* tvar); 205 | 206 | inline 207 | void tVarInit(tVariant* tvar) 208 | { 209 | assert(tvar != NULL); 210 | memset(tvar, 0, sizeof(tVariant)); 211 | TV_VT(tvar) = VTYPE_EMPTY; 212 | } 213 | //----------------------------------------------------------------------------// 214 | // static setter functions... 215 | 216 | #define DATA_SET_BEGIN(data_) \ 217 | tVarInit(data_); 218 | 219 | #define DATA_SET_END(data_, type_) \ 220 | TV_VT(data_) = type_; 221 | 222 | 223 | #define DATA_SET(data_, type_, member_, value_) \ 224 | DATA_SET_BEGIN(data_) \ 225 | TV_JOIN(data_, member_) = value_; \ 226 | DATA_SET_END(data_, type_) 227 | 228 | #define DATA_SET_WITH_CAST(data_, type_, member_, cast_, value_) \ 229 | DATA_SET_BEGIN(data_) \ 230 | TV_JOIN(data_, member_) = cast_ value_; \ 231 | DATA_SET_END(data_, type_) 232 | 233 | #endif //__CON_TYPES_H__ 234 | -------------------------------------------------------------------------------- /lib/packages.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "owner": "Pr-Mex", 4 | "repo": "VAEditor", 5 | "name": "VAEditor.zip", 6 | "path": "../Example/Templates/VAEditor/Ext/Template.bin", 7 | "url": "https://github.com/Pr-Mex/VAEditor/releases/download/1.2.0.26/VAEditor.zip", 8 | "hash": "04EC5963A270FDD1F4723D1549E2428DCAB67DCAF67450DE798FB048C61504A0", 9 | "version": "1.2.0.26" 10 | } 11 | ] -------------------------------------------------------------------------------- /lib/packages.os: -------------------------------------------------------------------------------- 1 | Перем Лог; 2 | Перем ТекущийКаталог; 3 | 4 | Процедура Информация(Текст) 5 | Сообщить("ИНФОРМАЦИЯ - " + Текст); 6 | КонецПроцедуры 7 | 8 | Процедура Ошибка(Текст) 9 | Сообщить("ОШИБКА - " + Текст); 10 | КонецПроцедуры 11 | 12 | Функция ЗагрузитьФайл(Гиперссылка) 13 | 14 | Информация("Скачивание файла: " + Гиперссылка); 15 | 16 | Поз = СтрНайти(Гиперссылка, "://"); 17 | Поз = СтрНайти(Гиперссылка, "/", НаправлениеПоиска.СНачала, Поз + 3); 18 | ИмяСервера = Лев(Гиперссылка, Поз); 19 | АдресРесурса = Сред(Гиперссылка, Поз); 20 | 21 | HTTPЗапрос = Новый HTTPЗапрос(Гиперссылка); 22 | HTTPСоединение = Новый HTTPСоединение(ИмяСервера); 23 | Возврат HTTPСоединение.Получить(HTTPЗапрос); 24 | 25 | КонецФункции 26 | 27 | Функция СкачатьФайлРелиза(Пакет, Данные) 28 | 29 | Гиперссылка = Данные.browser_download_url; 30 | HTTPОтвет = ЗагрузитьФайл(Гиперссылка); 31 | Если HTTPОтвет.КодСостояния = 200 Тогда 32 | ДвоичныеДанные = HTTPОтвет.ПолучитьТелоКакДвоичныеДанные(); 33 | ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.SHA256); 34 | ХешированиеДанных.Добавить(ДвоичныеДанные); 35 | ХешСумма = ХешированиеДанных.ХешСуммаСтрокой; 36 | Информация("Хеш сумма: " + ХешСумма); 37 | Пакет.Вставить("url", Гиперссылка); 38 | Пакет.Вставить("hash", ХешСумма); 39 | Возврат Истина; 40 | Иначе 41 | Ошибка("Ошибка HTTP: " + HTTPОтвет.КодСостояния); 42 | Возврат Ложь; 43 | КонецЕсли; 44 | 45 | КонецФункции 46 | 47 | Процедура ПолучитьРелизБиблиотеки(Пакет) 48 | 49 | ИмяСервера = "https://api.github.com"; 50 | АдресРесурса = "/repos/" + Пакет.owner + "/" + Пакет.repo + "/releases/latest"; 51 | Информация("Получение данных: " + ИмяСервера + АдресРесурса); 52 | Заголовки = Новый Соответствие(); 53 | Заголовки.Вставить("User-Agent", "OpenScript"); 54 | HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса); 55 | HTTPЗапрос.Заголовки = Заголовки; 56 | HTTPСоединение = Новый HTTPСоединение(ИмяСервера); 57 | HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос); 58 | Если HTTPОтвет.КодСостояния = 200 Тогда 59 | ТекстJSON = HTTPОтвет.ПолучитьТелоКакСтроку(); 60 | ЧтениеJSON = Новый ЧтениеJSON; 61 | ЧтениеJSON.УстановитьСтроку(ТекстJSON); 62 | СоставРелиза = ПрочитатьJSON(ЧтениеJSON); 63 | Для каждого Элемент Из СоставРелиза.assets Цикл 64 | Если Элемент.name = Пакет.name Тогда 65 | Если СкачатьФайлРелиза(Пакет, Элемент) Тогда 66 | Пакет.Вставить("version", СоставРелиза.name); 67 | КонецЕсли; 68 | КонецЕсли; 69 | КонецЦикла; 70 | Иначе 71 | Сообщить(АдресРесурса); 72 | Сообщить(HTTPОтвет.ПолучитьТелоКакСтроку()); 73 | КонецЕсли; 74 | 75 | КонецПроцедуры 76 | 77 | Функция НеобходимоЗагрузить(Пакет) 78 | 79 | ИмяФайла = ТекущийКаталог + Пакет.path; 80 | Файл = Новый Файл(ИмяФайла); 81 | Если Пакет.Свойство("hash") И Файл.Существует() Тогда 82 | ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.SHA256); 83 | ХешированиеДанных.Добавить(Новый ДвоичныеДанные(ИмяФайла)); 84 | ХешСумма = ХешированиеДанных.ХешСуммаСтрокой; 85 | Возврат ХешСумма <> Пакет.hash; 86 | Иначе 87 | Возврат Истина; 88 | КонецЕсли; 89 | 90 | КонецФункции 91 | 92 | Процедура ПолучитьОбновления() 93 | 94 | ИмяФайла = ТекущийКаталог + "packages.json"; 95 | ЧтениеJSON = Новый ЧтениеJSON; 96 | ЧтениеJSON.ОткрытьФайл(ИмяФайла); 97 | ВнешниеБиблиотеки = ПрочитатьJSON(ЧтениеJSON); 98 | Для каждого Пакет Из ВнешниеБиблиотеки Цикл 99 | ПолучитьРелизБиблиотеки(Пакет); 100 | КонецЦикла; 101 | 102 | ПараметрыЗаписи = Новый ПараметрыЗаписиJSON( 103 | ПереносСтрокJSON.Windows, Символы.Таб, Истина, ЭкранированиеСимволовJSON.Нет 104 | ); 105 | ЗаписьJSON = Новый ЗаписьJSON; 106 | ЗаписьJSON.ОткрытьФайл(ИмяФайла); 107 | ЗаписатьJSON(ЗаписьJSON, ВнешниеБиблиотеки); 108 | ЗаписьJSON.Закрыть(); 109 | 110 | КонецПроцедуры 111 | 112 | Процедура ЗагрузитьПакеты() 113 | 114 | ИмяФайла = ТекущийКаталог + "packages.json"; 115 | ЧтениеJSON = Новый ЧтениеJSON; 116 | ЧтениеJSON.ОткрытьФайл(ИмяФайла); 117 | ВнешниеБиблиотеки = ПрочитатьJSON(ЧтениеJSON); 118 | Для каждого Пакет Из ВнешниеБиблиотеки Цикл 119 | Если НеобходимоЗагрузить(Пакет) Тогда 120 | HTTPОтвет = ЗагрузитьФайл(Пакет.url); 121 | Если HTTPОтвет.КодСостояния = 200 Тогда 122 | ДвоичныеДанные = HTTPОтвет.ПолучитьТелоКакДвоичныеДанные(); 123 | ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.SHA256); 124 | ХешированиеДанных.Добавить(ДвоичныеДанные); 125 | Если ХешированиеДанных.ХешСуммаСтрокой = Пакет.hash Тогда 126 | ПолноеИмяФайла = ТекущийКаталог + Пакет.path; 127 | Информация("Сохранение файла: " + ПолноеИмяФайла); 128 | Файл = Новый Файл(ПолноеИмяФайла); 129 | СоздатьКаталог(Файл.Путь); 130 | ДвоичныеДанные.Записать(ПолноеИмяФайла); 131 | Иначе 132 | Ошибка("Хеш-сумма файла не совпадает с эталоном"); 133 | КонецЕсли; 134 | Иначе 135 | Ошибка("Ошибка HTTP: " + HTTPОтвет.КодСостояния); 136 | КонецЕсли; 137 | Иначе 138 | Информация("Загрузка не требуется: " + Пакет.name + " версия " + Пакет.version); 139 | КонецЕсли; 140 | КонецЦикла; 141 | 142 | КонецПроцедуры 143 | 144 | ТекущийКаталог = ТекущийСценарий().Каталог + "/"; 145 | ТекстПомощи = "Передайте параметр скрипта: ""download"" или ""upgrade"""; 146 | Если АргументыКоманднойСтроки.Количество() = 0 Тогда 147 | Ошибка("Не переданы параметры!"); 148 | Ошибка(ТекстПомощи); 149 | ИначеЕсли АргументыКоманднойСтроки.Количество() > 1 Тогда 150 | Ошибка("Скрипт принимает только один параметр!"); 151 | Ошибка(ТекстПомощи); 152 | ИначеЕсли АргументыКоманднойСтроки[0] = "upgrade" Тогда 153 | ПолучитьОбновления(); 154 | ИначеЕсли АргументыКоманднойСтроки[0] = "download" Тогда 155 | ЗагрузитьПакеты(); 156 | Иначе 157 | Ошибка("Неизвестный параметр: " + АргументыКоманднойСтроки[0]); 158 | Ошибка(ТекстПомощи); 159 | КонецЕсли; -------------------------------------------------------------------------------- /lib/packages.ps1: -------------------------------------------------------------------------------- 1 | $root = (Split-Path -Parent $PSCommandPath) + '\' 2 | $temp = $root + 'package.tmp' 3 | $json = Get-Content "$root\packages.json" | Out-String | ConvertFrom-Json 4 | ForEach ($package in $json) { 5 | $path = $root + $package.path | Split-Path 6 | Invoke-RestMethod -Method Get -Uri $package.url -OutFile $temp 7 | $hash = (get-filehash -Algorithm SHA256 $temp).Hash 8 | if ($hash -ne $package.hash) { throw "Wrong file hash: " + $package.url } 9 | New-Item -ItemType Directory -Force -Path $path | Out-Null 10 | Copy-Item $temp -Force -Destination ($root + $package.path) 11 | } -------------------------------------------------------------------------------- /manifest.ps1: -------------------------------------------------------------------------------- 1 | Param ( 2 | [string]$project = $env:APPVEYOR_PROJECT_NAME, 3 | [string]$version = $env:APPVEYOR_BUILD_VERSION 4 | ) 5 | 6 | $postfix = '_' + $version -replace '\.','-' 7 | $v1,$v2,$v3,$v4 = $version.split('.') 8 | Set-Content 'version.h' "#define VER_FILENAME $project" 9 | Add-Content 'version.h' "#define VERSION_FULL $version" 10 | Add-Content 'version.h' "#define VERSION_MAJOR $v1" 11 | Add-Content 'version.h' "#define VERSION_MINOR $v2" 12 | Add-Content 'version.h' "#define VERSION_REVISION $v3" 13 | Add-Content 'version.h' "#define VERSION_BUILD $v4" 14 | 15 | $encoding = [System.Text.Encoding]::UTF8 16 | $writer = New-Object System.XMl.XmlTextWriter('./manifest.xml', $encoding) 17 | $writer.Formatting = 'Indented' 18 | $writer.Indentation = 1 19 | $writer.IndentChar = "`t" 20 | $writer.WriteStartDocument() 21 | $writer.WriteStartElement('bundle') 22 | $writer.WriteAttributeString('xmlns', 'http://v8.1c.ru/8.2/addin/bundle') 23 | 24 | $writer.WriteStartElement('component') 25 | $writer.WriteAttributeString('type', 'native') 26 | $writer.WriteAttributeString('os', 'Windows') 27 | $writer.WriteAttributeString('arch', 'i386') 28 | $writer.WriteAttributeString('path', "${project}Win32${postfix}.dll") 29 | $writer.WriteEndElement(); 30 | 31 | $writer.WriteStartElement('component') 32 | $writer.WriteAttributeString('type', 'native') 33 | $writer.WriteAttributeString('os', 'Windows') 34 | $writer.WriteAttributeString('arch', 'x86_64') 35 | $writer.WriteAttributeString('path', "${project}Win64${postfix}.dll") 36 | $writer.WriteEndElement(); 37 | 38 | $writer.WriteStartElement('component') 39 | $writer.WriteAttributeString('type', 'native') 40 | $writer.WriteAttributeString('os', 'Linux') 41 | $writer.WriteAttributeString('arch', 'i386') 42 | $writer.WriteAttributeString('path', "${project}Lin32${postfix}.so") 43 | $writer.WriteEndElement(); 44 | 45 | $writer.WriteStartElement('component') 46 | $writer.WriteAttributeString('type', 'native') 47 | $writer.WriteAttributeString('os', 'Linux') 48 | $writer.WriteAttributeString('arch', 'x86_64') 49 | $writer.WriteAttributeString('path', "${project}Lin64${postfix}.so") 50 | $writer.WriteEndElement(); 51 | 52 | $writer.WriteEndElement(); 53 | $writer.WriteEndDocument() 54 | $writer.Flush() 55 | $writer.Close() 56 | -------------------------------------------------------------------------------- /src/AddInNative.cpp: -------------------------------------------------------------------------------- 1 | #include "stdafx.h" 2 | 3 | #include "../version.h" 4 | #define STRINGIZE2(s) #s 5 | #define STRINGIZE(s) STRINGIZE2(s) 6 | 7 | #ifdef _WINDOWS 8 | #pragma warning (disable : 4267) 9 | #pragma warning (disable : 4302) 10 | #pragma warning (disable : 4311) 11 | #else 12 | #include 13 | #include 14 | #include 15 | #endif 16 | 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | #include 25 | 26 | #include "AddInNative.h" 27 | 28 | #ifdef _WINDOWS 29 | 30 | HMODULE hModule = NULL; 31 | 32 | BOOL APIENTRY DllMain(HMODULE module, DWORD ul_reason_for_call, LPVOID lpReserved) 33 | { 34 | switch (ul_reason_for_call) 35 | { 36 | case DLL_PROCESS_ATTACH: 37 | ::DisableThreadLibraryCalls(module); 38 | ::hModule = module; 39 | break; 40 | case DLL_THREAD_ATTACH: 41 | case DLL_THREAD_DETACH: 42 | case DLL_PROCESS_DETACH: 43 | break; 44 | } 45 | return TRUE; 46 | } 47 | #endif 48 | 49 | const WCHAR_T* GetClassNames() 50 | { 51 | static const std::u16string names(AddInNative::getComponentNames()); 52 | return (const WCHAR_T*)names.c_str(); 53 | } 54 | 55 | long GetClassObject(const WCHAR_T* wsName, IComponentBase** pInterface) 56 | { 57 | if (*pInterface) return 0; 58 | auto cls_name = std::u16string(reinterpret_cast(wsName)); 59 | return long(*pInterface = AddInNative::CreateObject(cls_name)); 60 | } 61 | 62 | long DestroyObject(IComponentBase** pInterface) 63 | { 64 | if (!*pInterface) return -1; 65 | delete* pInterface; 66 | *pInterface = nullptr; 67 | return 0; 68 | } 69 | 70 | std::string WC2MB(const std::wstring& wstr) 71 | { 72 | std::wstring_convert> converter; 73 | return converter.to_bytes(wstr); 74 | } 75 | 76 | std::wstring MB2WC(const std::string& str) 77 | { 78 | std::wstring_convert> converter; 79 | return converter.from_bytes(str); 80 | } 81 | 82 | std::map AddInNative::components; 83 | 84 | AddInNative::AddInNative(void) : result(nullptr, this) { 85 | AddProperty(u"Version", u"Версия", [&](VH var) { var = this->version(); }); 86 | } 87 | 88 | std::string AddInNative::version() 89 | { 90 | return STRINGIZE(VERSION_FULL); 91 | } 92 | 93 | bool AddInNative::Init(void* pConnection) 94 | { 95 | m_iConnect = static_cast(pConnection); 96 | if (m_iConnect) m_iConnect->SetEventBufferDepth(100); 97 | return m_iConnect != nullptr; 98 | } 99 | 100 | bool AddInNative::setMemManager(void* memory) 101 | { 102 | return m_iMemory = static_cast(memory); 103 | } 104 | 105 | long AddInNative::GetInfo() 106 | { 107 | return 2000; 108 | } 109 | 110 | void AddInNative::Done() 111 | { 112 | } 113 | 114 | bool AddInNative::RegisterExtensionAs(WCHAR_T** wsLanguageExt) 115 | { 116 | return *wsLanguageExt = W(name.c_str()); 117 | } 118 | 119 | long AddInNative::GetNProps() 120 | { 121 | return properties.size(); 122 | } 123 | 124 | long AddInNative::FindProp(const WCHAR_T* wsPropName) 125 | { 126 | std::u16string name((char16_t*)wsPropName); 127 | for (auto it = properties.begin(); it != properties.end(); ++it) { 128 | for (auto n = it->names.begin(); n != it->names.end(); ++n) { 129 | if (n->compare(name) == 0) return long(it - properties.begin()); 130 | } 131 | } 132 | name = upper(name); 133 | for (auto it = properties.begin(); it != properties.end(); ++it) { 134 | for (auto n = it->names.begin(); n != it->names.end(); ++n) { 135 | if (upper(*n).compare(name) == 0) return long(it - properties.begin()); 136 | } 137 | } 138 | return -1; 139 | } 140 | 141 | const WCHAR_T* AddInNative::GetPropName(long lPropNum, long lPropAlias) 142 | { 143 | try { 144 | auto it = std::next(properties.begin(), lPropNum); 145 | if (it == properties.end()) return nullptr; 146 | auto nm = std::next(it->names.begin(), lPropAlias); 147 | if (nm == it->names.end()) return nullptr; 148 | return W(nm->c_str()); 149 | } 150 | catch (...) { 151 | return nullptr; 152 | } 153 | } 154 | 155 | bool AddInNative::GetPropVal(const long lPropNum, tVariant* pvarPropVal) 156 | { 157 | auto it = std::next(properties.begin(), lPropNum); 158 | if (it == properties.end()) return false; 159 | if (!it->getter) return false; 160 | try { 161 | it->getter(VA(pvarPropVal, &(*it))); 162 | return true; 163 | } 164 | catch (const std::u16string& msg) { 165 | AddError(msg); 166 | return false; 167 | } 168 | catch (...) { 169 | return false; 170 | } 171 | } 172 | 173 | bool AddInNative::SetPropVal(const long lPropNum, tVariant* pvarPropVal) 174 | { 175 | auto it = std::next(properties.begin(), lPropNum); 176 | if (it == properties.end()) return false; 177 | if (!it->setter) return false; 178 | try { 179 | it->setter(VA(pvarPropVal, &(*it))); 180 | return true; 181 | } 182 | catch (const std::u16string& msg) { 183 | AddError(msg); 184 | return false; 185 | } 186 | catch (...) { 187 | return false; 188 | } 189 | } 190 | 191 | bool AddInNative::IsPropReadable(const long lPropNum) 192 | { 193 | auto it = std::next(properties.begin(), lPropNum); 194 | if (it == properties.end()) return false; 195 | return (bool)it->getter; 196 | } 197 | 198 | bool AddInNative::IsPropWritable(const long lPropNum) 199 | { 200 | auto it = std::next(properties.begin(), lPropNum); 201 | if (it == properties.end()) return false; 202 | return (bool)it->setter; 203 | } 204 | 205 | long AddInNative::GetNMethods() 206 | { 207 | return methods.size(); 208 | } 209 | 210 | long AddInNative::FindMethod(const WCHAR_T* wsMethodName) 211 | { 212 | std::u16string name((char16_t*)wsMethodName); 213 | for (auto it = methods.begin(); it != methods.end(); ++it) { 214 | for (auto n = it->names.begin(); n != it->names.end(); ++n) { 215 | if (n->compare(name) == 0) return long(it - methods.begin()); 216 | } 217 | } 218 | name = upper(name); 219 | for (auto it = methods.begin(); it != methods.end(); ++it) { 220 | for (auto n = it->names.begin(); n != it->names.end(); ++n) { 221 | if (upper(*n).compare(name) == 0) return long(it - methods.begin()); 222 | } 223 | } 224 | return -1; 225 | } 226 | 227 | const WCHAR_T* AddInNative::GetMethodName(const long lMethodNum, const long lMethodAlias) 228 | { 229 | try { 230 | auto it = std::next(methods.begin(), lMethodNum); 231 | if (it == methods.end()) return nullptr; 232 | auto nm = std::next(it->names.begin(), lMethodAlias); 233 | if (nm == it->names.end()) return nullptr; 234 | return W(nm->c_str()); 235 | } 236 | catch (...) { 237 | return nullptr; 238 | } 239 | } 240 | 241 | long AddInNative::GetNParams(const long lMethodNum) 242 | { 243 | auto it = std::next(methods.begin(), lMethodNum); 244 | if (it == methods.end()) return 0; 245 | if (std::get_if(&it->handler)) return 0; 246 | if (std::get_if(&it->handler)) return 1; 247 | if (std::get_if(&it->handler)) return 2; 248 | if (std::get_if(&it->handler)) return 3; 249 | if (std::get_if(&it->handler)) return 4; 250 | if (std::get_if(&it->handler)) return 5; 251 | if (std::get_if(&it->handler)) return 6; 252 | if (std::get_if(&it->handler)) return 7; 253 | return 0; 254 | } 255 | 256 | bool AddInNative::GetParamDefValue(const long lMethodNum, const long lParamNum, tVariant* pvarParamDefValue) 257 | { 258 | try { 259 | VA(pvarParamDefValue).clear(); 260 | auto it = std::next(methods.begin(), lMethodNum); 261 | if (it == methods.end()) return true; 262 | auto p = it->defs.find(lParamNum); 263 | if (p == it->defs.end()) return true; 264 | auto var = &p->second.variant; 265 | if (auto value = std::get_if(var)) { 266 | VA(pvarParamDefValue) = *value; 267 | return true; 268 | } 269 | if (auto value = std::get_if(var)) { 270 | VA(pvarParamDefValue) = *value; 271 | return true; 272 | } 273 | if (auto value = std::get_if(var)) { 274 | VA(pvarParamDefValue) = *value; 275 | return true; 276 | } 277 | if (auto value = std::get_if(var)) { 278 | VA(pvarParamDefValue) = *value; 279 | return true; 280 | } 281 | return true; 282 | } 283 | catch (const std::u16string& msg) { 284 | AddError(msg); 285 | return false; 286 | } 287 | catch (...) { 288 | return false; 289 | } 290 | } 291 | 292 | bool AddInNative::HasRetVal(const long lMethodNum) 293 | { 294 | try { 295 | auto it = std::next(methods.begin(), lMethodNum); 296 | if (it == methods.end()) return false; 297 | return it->hasRetVal; 298 | } 299 | catch (...) { 300 | return false; 301 | } 302 | } 303 | 304 | bool AddInNative::CallMethod(MethFunction* func, tVariant* p, Meth* m, const long lSizeArray) 305 | { 306 | if (auto handler = std::get_if(func)) { 307 | (*handler)(); 308 | return true; 309 | } 310 | if (auto handler = std::get_if(func)) { 311 | if (lSizeArray < 1) throw std::bad_function_call(); 312 | (*handler)(VA(p, m, 0)); 313 | return true; 314 | } 315 | if (auto handler = std::get_if(func)) { 316 | if (lSizeArray < 2) throw std::bad_function_call(); 317 | (*handler)(VA(p, m, 0), VA(p, m, 1)); 318 | return true; 319 | } 320 | if (auto handler = std::get_if(func)) { 321 | if (lSizeArray < 3) throw std::bad_function_call(); 322 | (*handler)(VA(p, m, 0), VA(p, m, 1), VA(p, m, 2)); 323 | return true; 324 | } 325 | if (auto handler = std::get_if(func)) { 326 | if (lSizeArray < 4) throw std::bad_function_call(); 327 | (*handler)(VA(p, m, 0), VA(p, m, 1), VA(p, m, 2), VA(p, m, 3)); 328 | return true; 329 | } 330 | if (auto handler = std::get_if(func)) { 331 | if (lSizeArray < 5) throw std::bad_function_call(); 332 | (*handler)(VA(p, m, 0), VA(p, m, 1), VA(p, m, 2), VA(p, m, 3), VA(p, m, 4)); 333 | return true; 334 | } 335 | if (auto handler = std::get_if(func)) { 336 | if (lSizeArray < 6) throw std::bad_function_call(); 337 | (*handler)(VA(p, m, 0), VA(p, m, 1), VA(p, m, 2), VA(p, m, 3), VA(p, m, 4), VA(p, m, 5)); 338 | return true; 339 | } 340 | if (auto handler = std::get_if(func)) { 341 | if (lSizeArray < 7) throw std::bad_function_call(); 342 | (*handler)(VA(p, m, 0), VA(p, m, 1), VA(p, m, 2), VA(p, m, 3), VA(p, m, 4), VA(p, m, 5), VA(p, m, 6)); 343 | return true; 344 | } 345 | return false; 346 | } 347 | 348 | bool AddInNative::CallAsProc(const long lMethodNum, tVariant* paParams, const long lSizeArray) 349 | { 350 | auto it = std::next(methods.begin(), lMethodNum); 351 | if (it == methods.end()) return false; 352 | try { 353 | result << VA(nullptr); 354 | return CallMethod(&it->handler, paParams, &(*it), lSizeArray); 355 | } 356 | catch (const std::u16string& msg) { 357 | AddError(msg); 358 | return false; 359 | } 360 | catch (...) { 361 | return false; 362 | } 363 | } 364 | 365 | bool AddInNative::CallAsFunc(const long lMethodNum, tVariant* pvarRetValue, tVariant* paParams, const long lSizeArray) 366 | { 367 | auto it = std::next(methods.begin(), lMethodNum); 368 | if (it == methods.end()) return false; 369 | try { 370 | result << VA(pvarRetValue); 371 | bool ok = CallMethod(&it->handler, paParams, &(*it), lSizeArray); 372 | result << VA(nullptr); 373 | return ok; 374 | } 375 | catch (const std::u16string& msg) { 376 | AddError(msg); 377 | return false; 378 | } 379 | catch (...) { 380 | result << VA(nullptr); 381 | return false; 382 | } 383 | } 384 | 385 | void AddInNative::SetLocale(const WCHAR_T* locale) 386 | { 387 | std::string loc = WCHAR2MB(locale); 388 | this->alias = loc.substr(0, 3) == "rus"; 389 | } 390 | 391 | std::u16string AddInNative::getComponentNames() { 392 | const char16_t* const delim = u"|"; 393 | std::vector names; 394 | for (auto it = components.begin(); it != components.end(); ++it) names.push_back(it->first); 395 | std::basic_ostringstream, std::allocator> imploded; 396 | std::copy(names.begin(), names.end(), std::ostream_iterator>(imploded, delim)); 397 | std::u16string result = imploded.str(); 398 | result.pop_back(); 399 | return result; 400 | } 401 | 402 | std::u16string AddInNative::AddComponent(const std::u16string& name, CompFunction creator) 403 | { 404 | components.insert({ name, creator }); 405 | return name; 406 | } 407 | 408 | AddInNative* AddInNative::CreateObject(const std::u16string& name) { 409 | auto it = components.find(name); 410 | if (it == components.end()) return nullptr; 411 | AddInNative* object = it->second(); 412 | object->name = name; 413 | return object; 414 | } 415 | 416 | void AddInNative::AddProperty(const std::u16string& nameEn, const std::u16string& nameRu, const PropFunction& getter, const PropFunction& setter) 417 | { 418 | properties.push_back({ { nameEn, nameRu }, getter, setter }); 419 | } 420 | 421 | void AddInNative::AddProcedure(const std::u16string& nameEn, const std::u16string& nameRu, const MethFunction& handler, const MethDefaults& defs) 422 | { 423 | methods.push_back({ { nameEn, nameRu }, handler, defs, false }); 424 | } 425 | 426 | void AddInNative::AddFunction(const std::u16string& nameEn, const std::u16string& nameRu, const MethFunction& handler, const MethDefaults& defs) 427 | { 428 | methods.push_back({ { nameEn, nameRu }, handler, defs, true }); 429 | } 430 | 431 | bool ADDIN_API AddInNative::AllocMemory(void** pMemory, unsigned long ulCountByte) const 432 | { 433 | return m_iMemory ? m_iMemory->AllocMemory(pMemory, ulCountByte) : false; 434 | } 435 | 436 | void ADDIN_API AddInNative::FreeMemory(void** pMemory) const 437 | { 438 | if (m_iMemory) m_iMemory->FreeMemory(pMemory); 439 | } 440 | 441 | std::string AddInNative::WCHAR2MB(std::basic_string_view src) 442 | { 443 | #ifdef _WINDOWS 444 | static std::wstring_convert> cvt_utf8_utf16; 445 | return cvt_utf8_utf16.to_bytes(src.data(), src.data() + src.size()); 446 | #else 447 | static std::wstring_convert, char16_t> cvt_utf8_utf16; 448 | return cvt_utf8_utf16.to_bytes(reinterpret_cast(src.data()), 449 | reinterpret_cast(src.data() + src.size())); 450 | #endif//_WINDOWS 451 | } 452 | 453 | std::wstring AddInNative::WCHAR2WC(std::basic_string_view src) { 454 | #ifdef _WINDOWS 455 | return std::wstring(src); 456 | #else 457 | std::wstring_convert> conv; 458 | return conv.from_bytes(reinterpret_cast(src.data()), 459 | reinterpret_cast(src.data() + src.size())); 460 | #endif//_WINDOWS 461 | } 462 | 463 | std::u16string AddInNative::MB2WCHAR(std::string_view src) { 464 | #ifdef _WINDOWS 465 | static std::wstring_convert> cvt_utf8_utf16; 466 | std::wstring tmp = cvt_utf8_utf16.from_bytes(src.data(), src.data() + src.size()); 467 | return std::u16string(reinterpret_cast(tmp.data()), tmp.size()); 468 | #else 469 | static std::wstring_convert, char16_t> cvt_utf8_utf16; 470 | return cvt_utf8_utf16.from_bytes(src.data(), src.data() + src.size()); 471 | #endif//_WINDOWS 472 | } 473 | 474 | std::locale locale_ru = std::locale("ru_RU.UTF-8"); 475 | 476 | std::u16string AddInNative::upper(std::u16string& str) 477 | { 478 | std::transform(str.begin(), str.end(), str.begin(), [](wchar_t ch) { return std::toupper(ch, locale_ru); }); 479 | return str; 480 | } 481 | 482 | std::wstring AddInNative::upper(std::wstring& str) 483 | { 484 | std::transform(str.begin(), str.end(), str.begin(), [](wchar_t ch) { return std::toupper(ch, locale_ru); }); 485 | return str; 486 | } 487 | 488 | TYPEVAR AddInNative::VarinantHelper::type() 489 | { 490 | if (pvar == nullptr) throw std::bad_variant_access(); 491 | return pvar->vt; 492 | } 493 | 494 | uint32_t AddInNative::VarinantHelper::size() 495 | { 496 | if (pvar == nullptr) throw std::bad_variant_access(); 497 | if (pvar->vt != VTYPE_BLOB) throw error(VTYPE_BLOB); 498 | return pvar->strLen; 499 | } 500 | 501 | char* AddInNative::VarinantHelper::data() 502 | { 503 | if (pvar == nullptr) throw std::bad_variant_access(); 504 | if (pvar->vt != VTYPE_BLOB) throw error(VTYPE_BLOB); 505 | return pvar->pstrVal; 506 | } 507 | 508 | AddInNative::VarinantHelper& AddInNative::VarinantHelper::operator=(const std::string& str) 509 | { 510 | return operator=(AddInNative::MB2WCHAR(str)); 511 | } 512 | 513 | AddInNative::VarinantHelper& AddInNative::VarinantHelper::operator=(const std::wstring& str) 514 | { 515 | if (sizeof(wchar_t) == 2) { 516 | return operator=(std::u16string(reinterpret_cast(str.data()), str.size())); 517 | } 518 | else { 519 | return operator=(WC2MB(str)); 520 | } 521 | } 522 | 523 | void AddInNative::VarinantHelper::clear() 524 | { 525 | if (pvar == nullptr) throw std::bad_variant_access(); 526 | switch (TV_VT(pvar)) { 527 | case VTYPE_BLOB: 528 | case VTYPE_PWSTR: 529 | addin->FreeMemory(reinterpret_cast(&TV_WSTR(pvar))); 530 | break; 531 | } 532 | tVarInit(pvar); 533 | } 534 | 535 | AddInNative::VarinantHelper& AddInNative::VarinantHelper::operator=(int64_t value) 536 | { 537 | clear(); 538 | if (INT32_MIN <= value && value <= INT32_MAX) { 539 | TV_VT(pvar) = VTYPE_I4; 540 | TV_I4(pvar) = (int32_t)value; 541 | } 542 | else { 543 | TV_VT(pvar) = VTYPE_R8; 544 | TV_R8(pvar) = (double)value; 545 | } 546 | return *this; 547 | } 548 | 549 | AddInNative::VarinantHelper& AddInNative::VarinantHelper::operator=(double value) 550 | { 551 | clear(); 552 | TV_VT(pvar) = VTYPE_R8; 553 | TV_R8(pvar) = value; 554 | return *this; 555 | } 556 | 557 | AddInNative::VarinantHelper& AddInNative::VarinantHelper::operator=(bool value) 558 | { 559 | clear(); 560 | TV_VT(pvar) = VTYPE_BOOL; 561 | TV_BOOL(pvar) = value; 562 | return *this; 563 | } 564 | 565 | AddInNative::VarinantHelper& AddInNative::VarinantHelper::operator=(const std::u16string& str) 566 | { 567 | clear(); 568 | TV_VT(pvar) = VTYPE_PWSTR; 569 | pvar->pwstrVal = nullptr; 570 | size_t size = (str.size() + 1) * sizeof(char16_t); 571 | if (!addin->AllocMemory(reinterpret_cast(&pvar->pwstrVal), size)) throw std::bad_alloc(); 572 | memcpy(pvar->pwstrVal, str.c_str(), size); 573 | pvar->wstrLen = str.size(); 574 | while (pvar->wstrLen && pvar->pwstrVal[pvar->wstrLen - 1] == 0) pvar->wstrLen--; 575 | return *this; 576 | } 577 | 578 | bool AddInNative::AddError(const std::u16string& descr, long scode) 579 | { 580 | std::u16string info = u"AddIn." + name; 581 | return m_iConnect && m_iConnect->AddError(ADDIN_E_IMPORTANT, (WCHAR_T*)info.c_str(), (WCHAR_T*)descr.c_str(), scode); 582 | } 583 | 584 | static std::u16string typeinfo(TYPEVAR vt, bool alias) 585 | { 586 | switch (vt) { 587 | case VTYPE_EMPTY: 588 | return alias ? u"Неопределено" : u"Undefined"; 589 | case VTYPE_I2: 590 | case VTYPE_I4: 591 | case VTYPE_ERROR: 592 | case VTYPE_UI1: 593 | return alias ? u"Целое число" : u"Integer"; 594 | case VTYPE_BOOL: 595 | return alias ? u"Булево" : u"Boolean"; 596 | case VTYPE_R4: 597 | case VTYPE_R8: 598 | return alias ? u"Число" : u"Float"; 599 | case VTYPE_DATE: 600 | case VTYPE_TM: 601 | return alias ? u"Дата" : u"Date"; 602 | case VTYPE_PSTR: 603 | case VTYPE_PWSTR: 604 | return alias ? u"Строка" : u"String"; 605 | case VTYPE_BLOB: 606 | return alias ? u"Двоичные данные" : u"Binary"; 607 | default: 608 | return alias ? u"Неопределено" : u"Undefined"; 609 | } 610 | } 611 | 612 | std::exception AddInNative::VarinantHelper::error(TYPEVAR vt) const 613 | { 614 | std::basic_stringstream, std::allocator> ss; 615 | if (addin && addin->alias) { 616 | ss << u"Ошибка получения значения"; 617 | if (prop) ss << u" при обращении к свойству <" << prop->names[1] << ">"; 618 | if (meth) ss << u" при вызове метода <" << meth->names[1] << ">"; 619 | if (number >= 0) ss << u" параметр <" << number + 1 << ">"; 620 | ss << u" ожидается <" + typeinfo(vt, true) << u">"; 621 | if (pvar) ss << u" фактически <" + typeinfo(pvar->vt, true) << u">"; 622 | } 623 | else { 624 | ss << u"Error getting value"; 625 | if (prop) ss << u" of property <" << prop->names[0] << ">"; 626 | if (meth) ss << u" when calling method <" << meth->names[0] << ">"; 627 | if (number >= 0) ss << u" parameter <" << number + 1 << ">"; 628 | ss << u" expected <" + typeinfo(vt, false) << u">"; 629 | if (pvar) ss << u" actual value <" + typeinfo(pvar->vt, false) << u">"; 630 | } 631 | if (addin) addin->AddError(ss.str()); 632 | return std::bad_typeid(); 633 | } 634 | 635 | AddInNative::VarinantHelper::operator std::string() const 636 | { 637 | std::u16string str(*this); 638 | return WCHAR2MB((WCHAR_T*)str.c_str()); 639 | } 640 | 641 | AddInNative::VarinantHelper::operator std::wstring() const 642 | { 643 | std::u16string str(*this); 644 | return WCHAR2WC((WCHAR_T*)str.c_str()); 645 | } 646 | 647 | AddInNative::VarinantHelper::operator std::u16string() const 648 | { 649 | if (pvar == nullptr) throw std::bad_variant_access(); 650 | if (pvar->vt != VTYPE_PWSTR) throw error(VTYPE_PWSTR); 651 | return reinterpret_cast(pvar->pwstrVal); 652 | } 653 | 654 | AddInNative::VarinantHelper::operator int64_t() const 655 | { 656 | if (pvar == nullptr) throw std::bad_variant_access(); 657 | switch (TV_VT(pvar)) { 658 | case VTYPE_I2: 659 | case VTYPE_I4: 660 | case VTYPE_UI1: 661 | case VTYPE_ERROR: 662 | return (int64_t)pvar->lVal; 663 | case VTYPE_R4: 664 | case VTYPE_R8: 665 | return (int64_t)pvar->dblVal; 666 | default: 667 | throw error(VTYPE_I4); 668 | } 669 | } 670 | 671 | AddInNative::VarinantHelper::operator int() const 672 | { 673 | if (pvar == nullptr) throw std::bad_variant_access(); 674 | switch (TV_VT(pvar)) { 675 | case VTYPE_I2: 676 | case VTYPE_I4: 677 | case VTYPE_UI1: 678 | case VTYPE_ERROR: 679 | return (int)pvar->lVal; 680 | case VTYPE_R4: 681 | case VTYPE_R8: 682 | return (int)pvar->dblVal; 683 | default: 684 | throw error(VTYPE_I4); 685 | } 686 | } 687 | 688 | AddInNative::VarinantHelper::operator double() const 689 | { 690 | if (pvar == nullptr) throw std::bad_variant_access(); 691 | switch (TV_VT(pvar)) { 692 | case VTYPE_I2: 693 | case VTYPE_I4: 694 | case VTYPE_UI1: 695 | case VTYPE_ERROR: 696 | return (double)pvar->lVal; 697 | case VTYPE_R4: 698 | case VTYPE_R8: 699 | return (double)pvar->dblVal; 700 | default: 701 | throw error(VTYPE_R4); 702 | } 703 | } 704 | 705 | AddInNative::VarinantHelper::operator bool() const 706 | { 707 | if (pvar == nullptr) throw std::bad_variant_access(); 708 | switch (TV_VT(pvar)) { 709 | case VTYPE_BOOL: 710 | return TV_BOOL(pvar); 711 | case VTYPE_I2: 712 | case VTYPE_I4: 713 | case VTYPE_UI1: 714 | case VTYPE_ERROR: 715 | return (bool)pvar->lVal; 716 | default: 717 | throw error(VTYPE_BOOL); 718 | } 719 | } 720 | 721 | void AddInNative::VarinantHelper::AllocMemory(unsigned long size) 722 | { 723 | clear(); 724 | if (!addin->AllocMemory((void**)&pvar->pstrVal, size)) throw std::bad_alloc(); 725 | TV_VT(pvar) = VTYPE_BLOB; 726 | pvar->strLen = size; 727 | } 728 | 729 | WCHAR_T* AddInNative::W(const char16_t* str) const 730 | { 731 | WCHAR_T* res = NULL; 732 | size_t length = std::char_traits::length(str) + 1; 733 | unsigned long size = length * sizeof(WCHAR_T); 734 | if (!AllocMemory((void**)&res, size)) throw std::bad_alloc(); 735 | memcpy(res, str, size); 736 | return res; 737 | } 738 | 739 | -------------------------------------------------------------------------------- /src/AddInNative.def: -------------------------------------------------------------------------------- 1 | EXPORTS 2 | GetClassObject 3 | DestroyObject 4 | GetClassNames 5 | -------------------------------------------------------------------------------- /src/AddInNative.h: -------------------------------------------------------------------------------- 1 | #ifndef __ADDINNATIVE_H__ 2 | #define __ADDINNATIVE_H__ 3 | 4 | #ifdef _WINDOWS 5 | #include 6 | #endif //_WINDOWS 7 | 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | 14 | #include "ComponentBase.h" 15 | #include "AddInDefBase.h" 16 | #include "IMemoryManager.h" 17 | 18 | class AddInNative; 19 | 20 | class DefaultHelper { 21 | private: 22 | class EmptyValue {}; 23 | public: 24 | std::variant< 25 | EmptyValue, 26 | std::u16string, 27 | int64_t, 28 | double, 29 | bool 30 | > variant; 31 | public: 32 | DefaultHelper() : variant(EmptyValue()) {} 33 | DefaultHelper(const std::u16string& s) : variant(s) {} 34 | DefaultHelper(int64_t value) : variant(value) {} 35 | DefaultHelper(double value) : variant(value) {} 36 | DefaultHelper(bool value) : variant(value) {} 37 | DefaultHelper(const char16_t* value) { 38 | if (value) variant = std::u16string(value); 39 | else variant = EmptyValue(); 40 | } 41 | }; 42 | 43 | using CompFunction = std::function; 44 | 45 | class AddInNative : public IComponentBase 46 | { 47 | private: 48 | struct Prop; 49 | struct Meth; 50 | protected: 51 | class VarinantHelper { 52 | private: 53 | tVariant* pvar = nullptr; 54 | AddInNative* addin = nullptr; 55 | Prop* prop = nullptr; 56 | Meth* meth = nullptr; 57 | long number = -1; 58 | private: 59 | std::exception error(TYPEVAR vt) const; 60 | public: 61 | void AllocMemory(unsigned long size); 62 | VarinantHelper(const VarinantHelper& va) :pvar(va.pvar), addin(va.addin), prop(va.prop), meth(va.meth), number(va.number) {} 63 | VarinantHelper(tVariant* pvar, AddInNative* addin) :pvar(pvar), addin(addin) {} 64 | VarinantHelper(tVariant* pvar, AddInNative* addin, Prop* prop) :pvar(pvar), addin(addin), prop(prop) {} 65 | VarinantHelper(tVariant* pvar, AddInNative* addin, Meth* meth, long number) :pvar(pvar), addin(addin), meth(meth), number(number) {} 66 | VarinantHelper& operator<<(const VarinantHelper& va) { pvar = va.pvar; addin = va.addin; prop = va.prop, meth = va.meth, number = va.number; return *this; } 67 | VarinantHelper& operator=(const VarinantHelper& va) = delete; 68 | VarinantHelper& operator=(const std::string& str); 69 | VarinantHelper& operator=(const std::wstring& str); 70 | VarinantHelper& operator=(const std::u16string& str); 71 | VarinantHelper& operator=(int64_t value); 72 | VarinantHelper& operator=(double value); 73 | VarinantHelper& operator=(bool value); 74 | operator std::string() const; 75 | operator std::wstring() const; 76 | operator std::u16string() const; 77 | operator int64_t() const; 78 | operator double() const; 79 | operator bool() const; 80 | operator int() const; 81 | uint32_t size(); 82 | TYPEVAR type(); 83 | char* data(); 84 | void clear(); 85 | }; 86 | 87 | using VH = VarinantHelper; 88 | using MethDefaults = std::map; 89 | using PropFunction = std::function; 90 | using MethFunction0 = std::function; 91 | using MethFunction1 = std::function; 92 | using MethFunction2 = std::function; 93 | using MethFunction3 = std::function; 94 | using MethFunction4 = std::function; 95 | using MethFunction5 = std::function; 96 | using MethFunction6 = std::function; 97 | using MethFunction7 = std::function; 98 | 99 | using MethFunction = std::variant< 100 | MethFunction0, 101 | MethFunction1, 102 | MethFunction2, 103 | MethFunction3, 104 | MethFunction4, 105 | MethFunction5, 106 | MethFunction6, 107 | MethFunction7 108 | >; 109 | 110 | void AddProperty(const std::u16string& nameEn, const std::u16string& nameRu, const PropFunction &getter, const PropFunction &setter = nullptr); 111 | void AddProcedure(const std::u16string& nameEn, const std::u16string& nameRu, const MethFunction &handler, const MethDefaults &defs = {}); 112 | void AddFunction(const std::u16string& nameEn, const std::u16string& nameRu, const MethFunction &handler, const MethDefaults &defs = {}); 113 | static std::u16string AddComponent(const std::u16string& name, CompFunction creator); 114 | VarinantHelper result; 115 | 116 | static std::u16string upper(std::u16string& str); 117 | static std::wstring upper(std::wstring& str); 118 | static std::string WCHAR2MB(std::basic_string_view src); 119 | static std::wstring WCHAR2WC(std::basic_string_view src); 120 | static std::u16string MB2WCHAR(std::string_view src); 121 | WCHAR_T* W(const char16_t* str) const; 122 | static std::string version(); 123 | 124 | private: 125 | struct Prop { 126 | std::vector names; 127 | PropFunction getter; 128 | PropFunction setter; 129 | }; 130 | 131 | struct Meth { 132 | std::vector names; 133 | MethFunction handler; 134 | MethDefaults defs; 135 | bool hasRetVal; 136 | }; 137 | 138 | bool CallMethod(MethFunction* function, tVariant* paParams, Meth* meth, const long lSizeArray); 139 | VarinantHelper VA(tVariant* pvar) { return VarinantHelper(pvar, this); } 140 | VarinantHelper VA(tVariant* pvar, Prop* prop) { return VarinantHelper(pvar, this, prop); } 141 | VarinantHelper VA(tVariant* pvar, Meth* meth, long number) { return VarinantHelper(pvar + number, this, meth, number); } 142 | bool ADDIN_API AllocMemory(void** pMemory, unsigned long ulCountByte) const; 143 | void ADDIN_API FreeMemory(void** pMemory) const; 144 | bool AddError(const std::u16string& descr, long scode = 0); 145 | 146 | friend const WCHAR_T* GetClassNames(); 147 | static std::u16string getComponentNames(); 148 | friend long GetClassObject(const WCHAR_T*, IComponentBase**); 149 | static AddInNative* CreateObject(const std::u16string& name); 150 | 151 | static std::map components; 152 | std::vector properties; 153 | std::vector methods; 154 | std::u16string name; 155 | bool alias = false; 156 | 157 | public: 158 | AddInNative(void) ; 159 | virtual ~AddInNative() {} 160 | // IInitDoneBase 161 | virtual bool ADDIN_API Init(void*) override final; 162 | virtual bool ADDIN_API setMemManager(void* mem) override final; 163 | virtual long ADDIN_API GetInfo() override final; 164 | virtual void ADDIN_API Done() override final; 165 | // ILanguageExtenderBase 166 | virtual bool ADDIN_API RegisterExtensionAs(WCHAR_T** wsLanguageExt) override final; 167 | virtual long ADDIN_API GetNProps() override final; 168 | virtual long ADDIN_API FindProp(const WCHAR_T* wsPropName) override final; 169 | virtual const WCHAR_T* ADDIN_API GetPropName(long lPropNum, long lPropAlias) override final; 170 | virtual bool ADDIN_API GetPropVal(const long lPropNum, tVariant* pvarPropVal) override final; 171 | virtual bool ADDIN_API SetPropVal(const long lPropNum, tVariant* pvarPropVal) override final; 172 | virtual bool ADDIN_API IsPropReadable(const long lPropNum) override final; 173 | virtual bool ADDIN_API IsPropWritable(const long lPropNum) override final; 174 | virtual long ADDIN_API GetNMethods() override final; 175 | virtual long ADDIN_API FindMethod(const WCHAR_T* wsMethodName) override final; 176 | virtual const WCHAR_T* ADDIN_API GetMethodName(const long lMethodNum, const long lMethodAlias) override final; 177 | virtual long ADDIN_API GetNParams(const long lMethodNum) override final; 178 | virtual bool ADDIN_API GetParamDefValue(const long lMethodNum, const long lParamNum, tVariant* pvarParamDefValue) override final; 179 | virtual bool ADDIN_API HasRetVal(const long lMethodNum) override final; 180 | virtual bool ADDIN_API CallAsProc(const long lMethodNum, tVariant* paParams, const long lSizeArray) override final; 181 | virtual bool ADDIN_API CallAsFunc(const long lMethodNum, tVariant* pvarRetValue, tVariant* paParams, const long lSizeArray) override final; 182 | operator IComponentBase* () { return (IComponentBase*)this; }; 183 | // LocaleBase 184 | virtual void ADDIN_API SetLocale(const WCHAR_T* loc) override final; 185 | private: 186 | IMemoryManager* m_iMemory = nullptr; 187 | IAddInDefBase* m_iConnect = nullptr; 188 | }; 189 | #endif //__ADDINNATIVE_H__ 190 | -------------------------------------------------------------------------------- /src/AddInNative.rc: -------------------------------------------------------------------------------- 1 | #include 2 | #include "../version.h" 3 | 4 | #define STRINGIZE2(s) #s 5 | #define STRINGIZE(s) STRINGIZE2(s) 6 | 7 | #define VER_FILE_VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_REVISION, VERSION_BUILD 8 | #define VER_FILE_VERSION_STR STRINGIZE(VERSION_MAJOR) \ 9 | "." STRINGIZE(VERSION_MINOR) \ 10 | "." STRINGIZE(VERSION_REVISION) \ 11 | "." STRINGIZE(VERSION_BUILD) 12 | 13 | #define VER_FILE_DESCRIPTION_STR "Native AddIn for 1C" 14 | #define VER_COPYRIGHT_STR "Kandrashin Denis, 2020" 15 | #define VER_FILE_EXT ".dll" 16 | #define VER_FILE_STR STRINGIZE(VER_FILENAME) 17 | 18 | ///////////////////////////////////////////////////////////////////////////// 19 | 20 | #define APSTUDIO_READONLY_SYMBOLS 21 | 22 | #define VER_PRODUCTNAME_STR VER_FILE_STR 23 | #define VER_PRODUCT_VERSION VER_FILE_VERSION 24 | #define VER_PRODUCT_VERSION_STR VER_FILE_VERSION_STR 25 | #define VER_ORIGINAL_FILENAME_STR VER_FILE_STR VER_FILE_EXT 26 | #define VER_INTERNAL_NAME_STR VER_ORIGINAL_FILENAME_STR 27 | 28 | #ifdef _DEBUG 29 | #define VER_VER_DEBUG VS_FF_DEBUG 30 | #else 31 | #define VER_VER_DEBUG 0 32 | #endif 33 | 34 | #define VER_FILEOS VOS_NT_WINDOWS32 35 | #define VER_FILEFLAGS VER_VER_DEBUG 36 | 37 | ///////////////////////////////////////////////////////////////////////////// 38 | // 39 | // Version 40 | // 41 | VS_VERSION_INFO VERSIONINFO 42 | FILEVERSION VER_FILE_VERSION 43 | PRODUCTVERSION VER_PRODUCT_VERSION 44 | FILEFLAGSMASK 0x3fL 45 | FILEFLAGS VER_FILEFLAGS 46 | FILEOS VER_FILEOS 47 | FILETYPE VFT_DLL 48 | FILESUBTYPE 0x0L 49 | BEGIN 50 | BLOCK "StringFileInfo" 51 | BEGIN 52 | BLOCK "041904B0" 53 | BEGIN 54 | VALUE "FileDescription", VER_FILE_DESCRIPTION_STR "\0" 55 | VALUE "FileVersion", VER_FILE_VERSION_STR "\0" 56 | VALUE "InternalName", VER_INTERNAL_NAME_STR "\0" 57 | VALUE "LegalCopyright", VER_COPYRIGHT_STR "\0" 58 | VALUE "OriginalFilename", VER_ORIGINAL_FILENAME_STR "\0" 59 | VALUE "ProductName", VER_PRODUCTNAME_STR 60 | VALUE "ProductVersion", VER_PRODUCT_VERSION_STR "\0" 61 | END 62 | END 63 | BLOCK "VarFileInfo" 64 | BEGIN 65 | VALUE "Translation", 0x0419, 0x04B0 66 | END 67 | END 68 | -------------------------------------------------------------------------------- /src/FileFinder.cpp: -------------------------------------------------------------------------------- 1 | #include "FileFinder.h" 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | static void lower(std::wstring& text) 11 | { 12 | std::use_facet >(std::locale()).tolower(&text[0], &text[0] + text.size()); 13 | } 14 | 15 | FileFinder::FileFinder(const std::wstring& text, bool ignoreCase) 16 | : m_text(text), m_ignoreCase(ignoreCase) 17 | { 18 | if (ignoreCase) lower(m_text); 19 | } 20 | 21 | #ifdef _WINDOWS 22 | 23 | bool FileFinder::search(const std::wstring& path) 24 | { 25 | std::wifstream wif(path); 26 | wif.imbue(std::locale(std::locale(), new std::codecvt_utf8)); 27 | const size_t text_len = m_text.length(); 28 | const size_t buf_size = 8192; 29 | wchar_t buf[buf_size]; 30 | size_t offset = 0; 31 | while (true) { 32 | wif.read(buf + offset, buf_size - offset); 33 | auto read = wif.gcount(); 34 | if (read == 0) return false; 35 | wchar_t* end = buf + offset + read; 36 | if (m_ignoreCase) std::use_facet >(std::locale()).tolower(buf + offset, end); 37 | auto it = std::search(buf, end, m_text.begin(), m_text.end()); 38 | if (it != end) return true; 39 | offset = text_len; 40 | std::memmove(buf, end - offset, offset * sizeof(wchar_t)); 41 | } 42 | } 43 | 44 | #include 45 | #include 46 | #include 47 | 48 | std::string time2str(FILETIME& time) { 49 | SYSTEMTIME st; 50 | FileTimeToSystemTime(&time, &st); 51 | char* format = "%d-%02d-%02dT%02d:%02d:%02d.%03dZ"; 52 | char buffer[255]; 53 | wsprintfA(buffer, 54 | format, 55 | st.wYear, 56 | st.wMonth, 57 | st.wDay, 58 | st.wHour, 59 | st.wMinute, 60 | st.wSecond, 61 | st.wMilliseconds); 62 | return buffer; 63 | } 64 | 65 | void FileFinder::files(const std::wstring& root, const std::wstring& mask) 66 | { 67 | std::wstring tmp = root + L"\\" + mask; 68 | WIN32_FIND_DATA file; 69 | HANDLE hFind = FindFirstFileEx(tmp.c_str(), FindExInfoStandard, &file, FindExSearchNameMatch, NULL, 0); 70 | if (hFind == INVALID_HANDLE_VALUE) return; 71 | do { 72 | if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue; 73 | std::wstring path = root + L"\\" + std::wstring(file.cFileName); 74 | if (m_text.empty() || search(path)) { 75 | nlohmann::json j; 76 | j["path"] = WC2MB(path); 77 | j["name"] = WC2MB(file.cFileName); 78 | j["size"] = (static_cast(file.nFileSizeHigh) << sizeof(file.nFileSizeLow) * 8) | file.nFileSizeLow; 79 | j["date"] = time2str(file.ftLastWriteTime); 80 | m_json.push_back(j); 81 | } 82 | } while (FindNextFileW(hFind, &file)); 83 | FindClose(hFind); 84 | } 85 | 86 | void FileFinder::dirs(const std::wstring& root, const std::wstring& mask) 87 | { 88 | files(root, mask); 89 | std::wstring tmp = root + L"\\*"; 90 | WIN32_FIND_DATA file; 91 | HANDLE hFind = FindFirstFileEx(tmp.c_str(), FindExInfoStandard, &file, FindExSearchNameMatch, NULL, 0); 92 | if (hFind == INVALID_HANDLE_VALUE) return; 93 | do { 94 | if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { 95 | if (lstrcmpW(file.cFileName, L".") == 0) continue; 96 | if (lstrcmpW(file.cFileName, L"..") == 0) continue; 97 | std::wstring path = root + L"\\" + std::wstring(file.cFileName); 98 | dirs(path, mask); 99 | } 100 | } while (FindNextFileW(hFind, &file)); 101 | FindClose(hFind); 102 | } 103 | 104 | std::wstring FileFinder::find(const std::wstring& path, const std::wstring& mask) 105 | { 106 | dirs(path, mask); 107 | return MB2WC(m_json.dump()); 108 | } 109 | 110 | #else //_WINDOWS 111 | 112 | #ifdef USE_BOOST 113 | 114 | #include 115 | #include 116 | #include 117 | 118 | static void EscapeRegex(std::wstring& regex) 119 | { 120 | // Escape all regex special chars 121 | boost::replace_all(regex, "\\", "\\\\"); 122 | boost::replace_all(regex, "^", "\\^"); 123 | boost::replace_all(regex, ".", "\\."); 124 | boost::replace_all(regex, "$", "\\$"); 125 | boost::replace_all(regex, "|", "\\|"); 126 | boost::replace_all(regex, "(", "\\("); 127 | boost::replace_all(regex, ")", "\\)"); 128 | boost::replace_all(regex, "{", "\\{"); 129 | boost::replace_all(regex, "{", "\\}"); 130 | boost::replace_all(regex, "[", "\\["); 131 | boost::replace_all(regex, "]", "\\]"); 132 | boost::replace_all(regex, "*", "\\*"); 133 | boost::replace_all(regex, "+", "\\+"); 134 | boost::replace_all(regex, "?", "\\?"); 135 | boost::replace_all(regex, "/", "\\/"); 136 | 137 | // Convert chars '*?' back to their regex equivalents 138 | boost::replace_all(regex, "\\?", "."); 139 | boost::replace_all(regex, "\\*", ".*"); 140 | } 141 | 142 | #include 143 | #include 144 | 145 | static std::string time2str(time_t t) 146 | { 147 | struct tm lt; 148 | localtime_r(&t, <); 149 | char buffer[80]; 150 | strftime(buffer, sizeof(buffer), "%FT%T", <); 151 | } 152 | 153 | void FileFinder::dirs(const std::wstring& root, const std::wstring& mask) 154 | { 155 | boost::wregex pattern(mask, m_ignoreCase ? boost::regex::icase : boost::regex::normal); 156 | boost::filesystem::recursive_directory_iterator end_itr; // Default ctor yields past-the-end 157 | for (boost::filesystem::recursive_directory_iterator i(root); i != end_itr; ++i) { 158 | if (boost::filesystem::is_regular_file(i->status())) { 159 | boost::wsmatch what; 160 | if (!boost::regex_match(i->path().filename().wstring(), what, pattern)) continue; 161 | if (m_text.empty() || search(i->path().wstring())) { 162 | nlohmann::json j; 163 | j["path"] = WC2MB(i->path().wstring()); 164 | j["name"] = WC2MB(i->path().filename().wstring()); 165 | j["size"] = boost::filesystem::file_size(i->path().wstring()); 166 | j["date"] = time2str(boost::filesystem::last_write_time(i->path().wstring())); 167 | m_json.push_back(j); 168 | } 169 | } 170 | } 171 | } 172 | 173 | std::wstring FileFinder::find(const std::wstring& path, const std::wstring& mask) 174 | { 175 | std::wstring regex = mask; 176 | EscapeRegex(regex); 177 | dirs(path, L"^" + regex + L"$"); 178 | return MB2WC(m_json.dump()); 179 | } 180 | 181 | #else //USE_BOOST 182 | 183 | std::wstring FileFinder::find(const std::wstring& path, const std::wstring& mask) { return {}; } 184 | void FileFinder::dirs(const std::wstring& root, const std::wstring& mask) {} 185 | void FileFinder::files(const std::wstring& root, const std::wstring& mask) {} 186 | bool FileFinder::search(const std::wstring& path) { return false; } 187 | 188 | #endif //USE_BOOST 189 | 190 | #endif //_WINDOWS 191 | -------------------------------------------------------------------------------- /src/FileFinder.h: -------------------------------------------------------------------------------- 1 | #ifndef __FILEFINDER_H__ 2 | #define __FILEFINDER_H__ 3 | 4 | #include "stdafx.h" 5 | #include "json.hpp" 6 | 7 | class FileFinder { 8 | private: 9 | std::wstring m_text; 10 | bool m_ignoreCase; 11 | nlohmann::json m_json; 12 | public: 13 | FileFinder(const std::wstring& text, bool ignoreCase); 14 | std::wstring find(const std::wstring& path, const std::wstring& mask); 15 | private: 16 | void dirs(const std::wstring& root, const std::wstring& mask); 17 | void files(const std::wstring& root, const std::wstring& mask); 18 | bool search(const std::wstring& path); 19 | }; 20 | 21 | #endif//__FILEFINDER_H__ 22 | -------------------------------------------------------------------------------- /src/GitManager.h: -------------------------------------------------------------------------------- 1 | #ifndef __CLIPMNGR_H__ 2 | #define __CLIPMNGR_H__ 3 | 4 | #ifdef USE_LIBGIT2 5 | 6 | #include "stdafx.h" 7 | #include "AddInNative.h" 8 | #include 9 | 10 | struct GitCredential { 11 | std::string username; 12 | std::string password; 13 | std::string privkey; 14 | std::string pubkey; 15 | }; 16 | 17 | class GitManager : public AddInNative { 18 | 19 | class Signature { 20 | public: 21 | Signature(const std::string& name, const std::string& email) 22 | : m_name(name), m_email(email) {} 23 | 24 | virtual ~Signature() {} 25 | 26 | int now(git_signature** out) { 27 | return git_signature_now(out, m_name.c_str(), m_email.c_str()); 28 | } 29 | private: 30 | std::string m_name = nullptr; 31 | std::string m_email = nullptr; 32 | }; 33 | 34 | private: 35 | GitCredential m_credential; 36 | git_repository* m_repo = nullptr; 37 | Signature* m_author = nullptr; 38 | Signature* m_committer = nullptr; 39 | bool error(VH var); 40 | 41 | private: 42 | static std::vector names; 43 | GitManager(); 44 | 45 | public: 46 | virtual ~GitManager(); 47 | 48 | private: 49 | void setAuthor(const std::string& name, const std::string& email); 50 | void setCommitter(const std::string& name, const std::string& email); 51 | bool isBinary(VH blob, VH encoding); 52 | void blob(VH id, VH encoding); 53 | int64_t getEncoding(VH blob); 54 | std::string init(const std::string& path); 55 | std::string clone(const std::string& url, const std::string& path); 56 | std::string info(const std::string& msg); 57 | std::string open(const std::string& path); 58 | std::string find(const std::string& path); 59 | std::string add(const std::string& append, const std::string& remove); 60 | std::string checkout(const std::string& name, bool create); 61 | std::string fetch(const std::string& name, const std::string& ref); 62 | std::string push(const std::string& name, const std::string& ref); 63 | std::string reset(const std::string& filelist); 64 | std::string remove(const std::string& filelist); 65 | std::string discard(const std::string& filelist); 66 | std::string commit(const std::string& msg); 67 | std::string history(const std::string& msg); 68 | std::string compare(const std::string& ref1, const std::string& ref2); 69 | std::string diff(VH& old_blob, VH& new_blob); 70 | std::string diff_dir(const std::u16string &s1, const std::u16string& s2); 71 | std::string file(const std::string& path, bool full); 72 | std::string tree(const std::string& id); 73 | std::string branchList(); 74 | std::string remoteList(); 75 | std::string signature(); 76 | std::string status(); 77 | std::string head(); 78 | std::string close(); 79 | }; 80 | 81 | #endif //USE_LIBGIT2 82 | 83 | #endif //__CLIPMNGR_H__ 84 | -------------------------------------------------------------------------------- /src/cpp.hint: -------------------------------------------------------------------------------- 1 | // Файлы указаний помогают среде IDE Visual Studio интерпретировать идентификаторы Visual C++ 2 | // (например, имена функций и макросов). 3 | // Дополнительные сведения: https://go.microsoft.com/fwlink/?linkid=865984 4 | #define AUTO_GIT(N, T, F) class N { private: T* h = NULL; public: N() {} N(T* h) { this->h = h; } ~N() { if (h) (F(h)); } operator T*() const { return h; } T** operator &() { return &h; } T* operator->() { return h; } } ; 5 | #define ASSERT(c, m) if (!(c)) { addError(m); return false; } 6 | #define ASSERT(t) {if (t < 0) return lastError();} 7 | #define S(wstr) WC2MB(wstr).c_str() 8 | -------------------------------------------------------------------------------- /src/stdafx.h: -------------------------------------------------------------------------------- 1 | // stdafx.h : include file for standard system include files, 2 | // or project specific include files that are used frequently, but 3 | // are changed infrequently 4 | // 5 | #ifndef __STDAFX_H__ 6 | #define __STDAFX_H__ 7 | 8 | #ifdef _WINDOWS 9 | #include 10 | #endif //_WINDOWS 11 | 12 | #include 13 | 14 | std::wstring MB2WC(const std::string& source); 15 | std::string WC2MB(const std::wstring& source); 16 | 17 | #endif //__STDAFX_H__ 18 | -------------------------------------------------------------------------------- /tools/Compile.os: -------------------------------------------------------------------------------- 1 | #Использовать v8runner 2 | #Использовать logos 3 | 4 | Перем Лог; 5 | Перем УправлениеКонфигуратором; 6 | 7 | Функция ДатуКСтроке(Дат) 8 | Возврат Формат(Дат,"ДФ=yyyy.MM.dd.HH.mm.ss"); 9 | КонецФункции 10 | 11 | // Перемещаят найденные по маскам файлы с сохранением пути. 12 | // 13 | // Параметры: 14 | // КаталогКуда - Строка - Путь к каталогу в который переносятся файлы; 15 | // КаталогиОткуда - Массив - Пути к каталогам в которых осуществляется поиск файлов; 16 | // МассивМасок - Массив - Маски, по которым осуществляется поиск файлов. 17 | // 18 | // Взято из https://infostart.ru/public/537028/ 19 | Процедура ПереместитьФайлыВКаталог(КаталогКуда, КаталогиОткуда, МассивМасок) 20 | 21 | Для Каждого КаталогПоиска Из КаталогиОткуда Цикл 22 | 23 | КаталогПоискаОбъект = Новый Файл(КаталогПоиска); 24 | 25 | Если НЕ КаталогПоискаОбъект.Существует() Тогда 26 | Лог.Ошибка(НСтр("ru = 'Каталог не найден.'")); 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 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось переместить файл: 55 | |%1'"), ОписаниеОшибки())); 56 | Продолжить; 57 | КонецПопытки; 58 | 59 | ФайлНаДиске = Новый Файл(ОбъединитьПути(НовыйПуть, НовоеИмя)); 60 | Если НЕ ФайлНаДиске.Существует() Тогда 61 | Лог.Ошибка(НСтр("ru = 'Не удалось корректно переместить файл.'")); 62 | Продолжить; 63 | КонецЕсли; 64 | КонецЦикла; 65 | 66 | КонецЦикла; 67 | 68 | КонецЦикла; 69 | 70 | КонецПроцедуры 71 | 72 | // Проверяет наличия каталога и в случае его отсутствия создает новый. 73 | // 74 | // Параметры: 75 | // Каталог - Строка - Путь к каталогу, существование которого нужно проверить. 76 | // 77 | // Возвращаемое значение: 78 | // Булево - признак существования каталога. 79 | // 80 | // Взято из https://infostart.ru/public/537028/ 81 | Функция ОбеспечитьКаталог(Знач Каталог) 82 | 83 | Файл = Новый Файл(Каталог); 84 | Если Не Файл.Существует() Тогда 85 | Попытка 86 | СоздатьКаталог(Каталог); 87 | Исключение 88 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось создать каталог %1. 89 | |%2'"), Каталог, ИнформацияОбОшибке())); 90 | Возврат Ложь; 91 | КонецПопытки; 92 | ИначеЕсли Не Файл.ЭтоКаталог() Тогда 93 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Каталог %1 не является каталогом.'"), Каталог)); 94 | Возврат Ложь; 95 | КонецЕсли; 96 | 97 | Возврат Истина; 98 | 99 | КонецФункции 100 | 101 | Функция ПроверитьЧтоВсеФайлыИсходниковСоответствуютИхВерсиям(МассивВерсий,Знач ИмяКаталога) 102 | ПромКаталог = СтрЗаменить(ИмяКаталога,"/","\"); 103 | Если Прав(ПромКаталог,1) <> "\" Тогда 104 | ИмяКаталога = ИмяКаталога + ПолучитьРазделительПути(); 105 | КонецЕсли; 106 | 107 | //Сообщить("ИмяКаталога="+ИмяКаталога); 108 | 109 | МассивФайлов = Новый Массив; 110 | МассивДляПоиска = Новый Массив; 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 | Версия = Лев(СтрокаВерсии,Поз-1); 144 | ЧастьПути = Сред(СтрокаВерсии,Поз+1); 145 | 146 | ЧастьПути = СтрЗаменить(ЧастьПути,"/","\"); 147 | 148 | ИдФайла = МассивДляПоиска.Найти(ЧастьПути); 149 | 150 | Если ИдФайла = Неопределено Тогда 151 | Лог.Информация("Не найден файл версии: " + ЧастьПути); 152 | Возврат Ложь; 153 | КонецЕсли; 154 | 155 | Файл = МассивФайлов[ИдФайла]; 156 | ТекущаяВерсияСтрокой = ДатуКСтроке(Файл.ПолучитьВремяИзменения()); 157 | Если ТекущаяВерсияСтрокой <> Версия Тогда 158 | Лог.Информация("Изменилась версия у файла: " + ЧастьПути); 159 | Возврат Ложь; 160 | КонецЕсли; 161 | КонецЦикла; 162 | 163 | Возврат Истина; 164 | КонецФункции 165 | 166 | Процедура ЗагрузитьОбработкуИлиОтчетИзXML(ИмяФайла_filename,ИмяОбработкиИлиОтчета) 167 | Файл_filename = Новый Файл(ИмяФайла_filename); 168 | 169 | 170 | КаталогГдеЛежит_filename = Файл_filename.Путь; 171 | ИмяФайлаВерсии = Файл_filename.Путь + "fileversion"; 172 | 173 | Файл_ИмяКаталога_filename = Новый Файл(Файл_filename.Путь); 174 | ИмяКаталога_filename = Файл_ИмяКаталога_filename.Имя; 175 | 176 | ФайлКаталогГдеЛежит_filename = Новый Файл(КаталогГдеЛежит_filename); 177 | ИмяФайлаXML = ФайлКаталогГдеЛежит_filename.Имя + ".xml"; 178 | 179 | ИмяФайлаКорневойXml = ФайлКаталогГдеЛежит_filename.Путь + ИмяФайлаXML; 180 | ФайлКорневойXML = Новый Файл(ИмяФайлаКорневойXml); 181 | Если Не ФайлКорневойXML.Существует() Тогда 182 | ВызватьИсключение "Файл " + ИмяФайлаКорневойXml + " не существует."; 183 | КонецЕсли; 184 | 185 | ИмяФайлаОбработкиИлиОтчета = ФайлКорневойXML.Путь + ИмяОбработкиИлиОтчета; 186 | 187 | Если Прав(НРег(ИмяФайлаОбработкиИлиОтчета),4) = ".epf" Тогда 188 | ИмяФайлаВременныйОбработкаИлиОтчет = ПолучитьИмяВременногоФайла("epf"); 189 | Иначе 190 | ИмяФайлаВременныйОбработкаИлиОтчет = ПолучитьИмяВременногоФайла("erf"); 191 | КонецЕсли; 192 | 193 | 194 | ФайлОбработкаИлиОтчет = Новый Файл(ИмяФайлаОбработкиИлиОтчета); 195 | Если ФайлОбработкаИлиОтчет.Существует() Тогда 196 | //Проверим версию. Если она совпадает, то собирать файл не надо. 197 | ФайлВерсии = Новый Файл(ИмяФайлаВерсии); 198 | Если ФайлВерсии.Существует() Тогда 199 | Массив = Новый Массив; 200 | 201 | Текст = Новый ЧтениеТекста; 202 | Текст.Открыть(ИмяФайлаВерсии,"UTF-8"); 203 | 204 | Пока Истина Цикл 205 | Стр = Текст.ПрочитатьСтроку(); 206 | Если Стр = Неопределено Тогда 207 | Прервать; 208 | КонецЕсли; 209 | 210 | Массив.Добавить(Стр); 211 | КонецЦикла; 212 | Текст.Закрыть(); 213 | 214 | Если Массив.Количество() < 1 Тогда 215 | ВызватьИсключение "Н смог прочитать файл версии: " + ИмяФайлаВерсии; 216 | КонецЕсли; 217 | 218 | ВерсияСтрокой = Массив[0]; 219 | Поз = Найти(ВерсияСтрокой,"|"); 220 | ВерсияСтрокой = Лев(ВерсияСтрокой,Поз-1); 221 | 222 | ТекущаяВерсияСтрокой = ДатуКСтроке(ФайлОбработкаИлиОтчет.ПолучитьВремяИзменения()); 223 | Если НРег(ВерсияСтрокой) = НРег(ТекущаяВерсияСтрокой) Тогда 224 | Массив.Удалить(0); 225 | Если ПроверитьЧтоВсеФайлыИсходниковСоответствуютИхВерсиям(Массив,ФайлОбработкаИлиОтчет.Путь + ИмяКаталога_filename) Тогда 226 | Лог.Информация("" + ИмяОбработкиИлиОтчета + " УЖЕ собран."); 227 | Возврат; 228 | КонецЕсли; 229 | 230 | КонецЕсли; 231 | 232 | Если ТекущаяВерсияСтрокой > ВерсияСтрокой Тогда 233 | Лог.Ошибка("Файл <" + ИмяФайлаОбработкиИлиОтчета + "> имеет версию новее чем в исходниках. Удалите " + ФайлОбработкаИлиОтчет.Имя + ", если хотите пересобрать его."); 234 | Лог.Ошибка("Версия в исходниках: " + ВерсияСтрокой); 235 | Лог.Ошибка("Версия файла: " + ТекущаяВерсияСтрокой); 236 | ВызватьИсключение "Обработка прервана."; 237 | КонецЕсли; 238 | 239 | КонецЕсли; 240 | КонецЕсли; 241 | 242 | 243 | ПараметрыЗапуска = УправлениеКонфигуратором.ПолучитьПараметрыЗапуска(); 244 | ПараметрыЗапуска.Добавить("/LoadExternalDataProcessorOrReportFromFiles """ + ИмяФайлаКорневойXml + """ """ + ИмяФайлаВременныйОбработкаИлиОтчет + """"); 245 | 246 | ИмяФайлаOut = ПолучитьИмяВременногоФайла("txt"); 247 | ПараметрыЗапуска.Добавить("/Out """ + ИмяФайлаOut + """"); 248 | 249 | 250 | 251 | Попытка 252 | УправлениеКонфигуратором.ВыполнитьКоманду(ПараметрыЗапуска); 253 | Исключение 254 | Лог.Ошибка(ОписаниеОшибки()); 255 | Лог.Ошибка(УправлениеКонфигуратором.ВыводКоманды()); 256 | ВызватьИсключение "Выгрузка обработок в xml прервана."; 257 | КонецПопытки; 258 | 259 | УдалитьФайлы(ИмяФайлаОбработкиИлиОтчета); 260 | ПереместитьФайл(ИмяФайлаВременныйОбработкаИлиОтчет,ИмяФайлаОбработкиИлиОтчета); 261 | 262 | ФайлОбработкаИлиОтчет = Новый Файл(ИмяФайлаОбработкиИлиОтчета); 263 | ВремяИзменения = ДатуКСтроке(ФайлОбработкаИлиОтчет.ПолучитьВремяИзменения()); 264 | 265 | 266 | //запишем версию файла 267 | ЗаписатьВерсиюОбработкиИлиОтчета(ФайлОбработкаИлиОтчет,ИмяКаталога_filename,ИмяОбработкиИлиОтчета); 268 | 269 | Лог.Информация("" + ИмяОбработкиИлиОтчета + " собран."); 270 | КонецПроцедуры 271 | 272 | Функция ЭтоСлужебныйФайл(ИмяФайла) 273 | Если Нрег(ИмяФайла) = "filename" Тогда 274 | Возврат Истина; 275 | ИначеЕсли Нрег(ИмяФайла) = "fileversion" Тогда 276 | Возврат Истина; 277 | КонецЕсли; 278 | 279 | Возврат Ложь; 280 | КонецФункции 281 | 282 | Функция ПолучитьВерсииФайловВКаталоге(Каталог) 283 | //Сообщить("КаталогПолучитьВерсииФайловВКаталоге="+Каталог); 284 | 285 | ТаблицаФайлов = Новый ТаблицаЗначений; 286 | ТаблицаФайлов.Колонки.Добавить("ПолноеИмя"); 287 | ТаблицаФайлов.Колонки.Добавить("ЧастьПути"); 288 | ТаблицаФайлов.Колонки.Добавить("ЭтоКаталог"); 289 | ТаблицаФайлов.Колонки.Добавить("ВремяИзменения"); 290 | 291 | Файлы = НайтиФайлы(Каталог,"*",Истина); 292 | Для Каждого Файл Из Файлы Цикл 293 | Если ЭтоСлужебныйФайл(Файл.Имя) Тогда 294 | Продолжить; 295 | КонецЕсли; 296 | 297 | 298 | СтрокаТаблицаФайлов = ТаблицаФайлов.Добавить(); 299 | СтрокаТаблицаФайлов.ПолноеИмя = Файл.ПолноеИмя; 300 | СтрокаТаблицаФайлов.ЭтоКаталог = Файл.ЭтоКаталог(); 301 | СтрокаТаблицаФайлов.ЧастьПути = Сред(Файл.ПолноеИмя,СтрДлина(Каталог)); 302 | 303 | //Сообщить("СтрокаТаблицаФайлов.ЧастьПути="+СтрокаТаблицаФайлов.ЧастьПути); 304 | 305 | Если СтрокаТаблицаФайлов.ЭтоКаталог Тогда 306 | Продолжить; 307 | КонецЕсли; 308 | 309 | СтрокаТаблицаФайлов.ВремяИзменения = ДатуКСтроке(Файл.ПолучитьВремяИзменения()); 310 | КонецЦикла; 311 | 312 | Возврат ТаблицаФайлов; 313 | КонецФункции 314 | 315 | Процедура ЗаписатьВерсиюОбработкиИлиОтчета(ФайлОбработкаИлиОтчет,ИмяКаталогаОбработки,ИмяОбработкиИлиОтчета) 316 | ИмяФайлаВерсии = ФайлОбработкаИлиОтчет.Путь + ПолучитьРазделительПути()+ ИмяКаталогаОбработки + ПолучитьРазделительПути() + "fileversion"; 317 | //Сообщить("ИмяФайлаВерсии="+ИмяФайлаВерсии); 318 | УдалитьФайлы(ИмяФайлаВерсии); 319 | ВремяИзменения = ДатуКСтроке(ФайлОбработкаИлиОтчет.ПолучитьВремяИзменения()); 320 | 321 | ВерсииФайлов = ПолучитьВерсииФайловВКаталоге(ФайлОбработкаИлиОтчет.Путь + ИмяКаталогаОбработки + ПолучитьРазделительПути()); 322 | 323 | ЗТ = Новый ЗаписьТекста(ИмяФайлаВерсии,"UTF-8",,Истина); 324 | ЗТ.ЗаписатьСтроку(ВремяИзменения + "|" + ИмяОбработкиИлиОтчета); 325 | 326 | Для Каждого СтрокаВерсииФайлов Из ВерсииФайлов Цикл 327 | Если СтрокаВерсииФайлов.ЭтоКаталог Тогда 328 | Продолжить; 329 | КонецЕсли; 330 | 331 | Стр = "" + СтрокаВерсииФайлов.ВремяИзменения + "|" + СтрокаВерсииФайлов.ЧастьПути; 332 | ЗТ.ЗаписатьСтроку(Стр); 333 | КонецЦикла; 334 | 335 | ЗТ.Закрыть(); 336 | КонецПроцедуры 337 | 338 | Процедура СобратьОбработкуИлиОтчетВКаталогеИПодКаталогах(Путь) 339 | Файл = Новый Файл(Путь); 340 | Если НЕ Файл.Существует() Тогда 341 | ВызватьИсключение "Каталог <" + Путь + "> не существует."; 342 | КонецЕсли; 343 | 344 | Файлы = НайтиФайлы(Путь,"filename.*",Истина); 345 | 346 | КоличествоФайлов = Файлы.Количество(); 347 | 348 | НомерФайла = 0; 349 | Для Каждого Файл Из Файлы Цикл 350 | НомерФайла = НомерФайла + 1; 351 | 352 | Текст = Новый ЧтениеТекста; 353 | Текст.Открыть(Файл.ПолноеИмя,"UTF-8"); 354 | ИмяОбработкиИлиОтчета = ""; 355 | 356 | Пока Истина Цикл 357 | Стр = Текст.ПрочитатьСтроку(); 358 | Если Стр = Неопределено Тогда 359 | Прервать; 360 | КонецЕсли; 361 | 362 | ИмяОбработкиИлиОтчета = Стр; 363 | КонецЦикла; 364 | Текст.Закрыть(); 365 | 366 | Если ИмяОбработкиИлиОтчета = "" Тогда 367 | ВызватьИсключение "В файле " + Файл.ПолноеИмя + " не найдено имя собираемого файла."; 368 | КонецЕсли; 369 | 370 | Лог.Информация("Файл " + НомерФайла + " из " + КоличествоФайлов + ": " + ИмяОбработкиИлиОтчета); 371 | 372 | ЗагрузитьОбработкуИлиОтчетИзXML(Файл.ПолноеИмя,ИмяОбработкиИлиОтчета); 373 | КонецЦикла; 374 | 375 | КонецПроцедуры 376 | 377 | Функция ПереместитьФайлыДляРазборки(КаталогКудаОбъект, КаталогОткудаОбъект, Маска, МассивУдаляемыхВременныхФайлов) 378 | 379 | МассивПеремещения = НайтиФайлы(КаталогОткудаОбъект.ПолноеИмя, Маска, Истина); 380 | 381 | Для каждого ЭлементМассиваПеремещения из МассивПеремещения Цикл 382 | 383 | ПолноеИмяФайлаОткуда = ЭлементМассиваПеремещения.ПолноеИмя; 384 | КороткоеИмяФайлаОткуда = ЭлементМассиваПеремещения.Имя; 385 | ОтносительноеИмя = СтрЗаменить(ПолноеИмяФайлаОткуда, КаталогОткудаОбъект.ПолноеИмя, ""); 386 | ИмяНовогоКаталога = СтрЗаменить(КаталогКудаОбъект.ПолноеИмя + ОтносительноеИмя, КороткоеИмяФайлаОткуда, ""); 387 | 388 | Если НЕ ОбеспечитьКаталог(ИмяНовогоКаталога) Тогда 389 | Продолжить; 390 | КонецЕсли; 391 | 392 | КопироватьФайл(ПолноеИмяФайлаОткуда, КаталогКудаОбъект.ПолноеИмя + ОтносительноеИмя); 393 | МассивУдаляемыхВременныхФайлов.Добавить(КаталогОткудаОбъект.ПолноеИмя + ОтносительноеИмя); 394 | //Лог.Информация("Копируем " + ПолноеИмяФайлаОткуда + " в " + КаталогКудаОбъект.ПолноеИмя + ОтносительноеИмя); 395 | КонецЦикла; 396 | 397 | Возврат МассивУдаляемыхВременныхФайлов; 398 | 399 | КонецФункции 400 | 401 | Лог = Логирование.ПолучитьЛог("vb.compile.log"); 402 | Лог.УстановитьУровень(УровниЛога.Отладка); 403 | 404 | Если АргументыКоманднойСтроки.Количество() = 0 Тогда 405 | Лог.Ошибка("Не переданы параметры!"); 406 | ИначеЕсли АргументыКоманднойСтроки.Количество() > 2 Тогда 407 | Лог.Ошибка("Скрипт принимает не больше двух параметров!"); 408 | 409 | Иначе 410 | УправлениеКонфигуратором = Новый УправлениеКонфигуратором(); 411 | КаталогБазы = ПолучитьИмяВременногоФайла(); 412 | УправлениеКонфигуратором.СоздатьФайловуюБазу(КаталогБазы); 413 | УправлениеКонфигуратором.УстановитьКонтекст("/F""" + КаталогБазы + """","",""); 414 | 415 | Если АргументыКоманднойСтроки.Количество() = 2 Тогда 416 | 417 | МассивУдаляемыхВременныхФайлов = Новый Массив; 418 | КаталогКудаОбъект = Новый Файл(АргументыКоманднойСтроки[1]); 419 | КаталогОткудаОбъект = Новый Файл(АргументыКоманднойСтроки[0]); 420 | СобратьОбработкуИлиОтчетВКаталогеИПодКаталогах(КаталогОткудаОбъект.ПолноеИмя); 421 | МассивУдаляемыхВременныхФайлов = ПереместитьФайлыДляРазборки(КаталогКудаОбъект,КаталогОткудаОбъект, "*.epf", МассивУдаляемыхВременныхФайлов); 422 | МассивУдаляемыхВременныхФайлов = ПереместитьФайлыДляРазборки(КаталогКудаОбъект,КаталогОткудаОбъект, "*.erf", МассивУдаляемыхВременныхФайлов); 423 | 424 | Для каждого ВременныйФайл из МассивУдаляемыхВременныхФайлов Цикл 425 | УдалитьФайлы(ВременныйФайл); 426 | КонецЦикла; 427 | 428 | Иначе 429 | СобратьОбработкуИлиОтчетВКаталогеИПодКаталогах(АргументыКоманднойСтроки[0]); 430 | КонецЕсли; 431 | 432 | КонецЕсли; 433 | 434 | Сообщить("Обработка завершена."); 435 | 436 | 437 | 438 | -------------------------------------------------------------------------------- /tools/Decompile.os: -------------------------------------------------------------------------------- 1 | #Использовать v8runner 2 | #Использовать logos 3 | 4 | Перем Лог; 5 | Перем УправлениеКонфигуратором; 6 | 7 | Функция ДатуКСтроке(Дат) 8 | Возврат Формат(Дат,"ДФ=yyyy.MM.dd.HH.mm.ss"); 9 | КонецФункции 10 | 11 | // Перемещаят найденные по маскам файлы с сохранением пути. 12 | // 13 | // Параметры: 14 | // КаталогКуда - Строка - Путь к каталогу в который переносятся файлы; 15 | // КаталогиОткуда - Массив - Пути к каталогам в которых осуществляется поиск файлов; 16 | // МассивМасок - Массив - Маски, по которым осуществляется поиск файлов. 17 | // УдалятьВременныеКаталоги - Булево - удалять служебные каталоги разборки файлов в исходном месте. 18 | // 19 | // Взято из https://infostart.ru/public/537028/ 20 | Процедура ПереместитьФайлыВКаталог(КаталогКуда, КаталогиОткуда, МассивМасок, УдалятьВременныеКаталоги = Ложь) 21 | 22 | Для Каждого КаталогПоиска Из КаталогиОткуда Цикл 23 | 24 | КаталогПоискаОбъект = Новый Файл(КаталогПоиска); 25 | 26 | Если НЕ КаталогПоискаОбъект.Существует() Тогда 27 | 28 | Лог.Ошибка(НСтр("ru = 'Каталог не найден.'")); 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 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось переместить файл: 58 | |%1'"), ОписаниеОшибки())); 59 | Продолжить; 60 | КонецПопытки; 61 | 62 | ФайлНаДиске = Новый Файл(ОбъединитьПути(НовыйПуть, НовоеИмя)); 63 | Если НЕ ФайлНаДиске.Существует() Тогда 64 | Лог.Ошибка(НСтр("ru = 'Не удалось корректно переместить файл.'")); 65 | Продолжить; 66 | КонецЕсли; 67 | 68 | КонецЦикла; 69 | 70 | КонецЦикла; 71 | 72 | КонецЦикла; 73 | 74 | КонецПроцедуры 75 | 76 | // Проверяет наличия каталога и в случае его отсутствия создает новый. 77 | // 78 | // Параметры: 79 | // Каталог - Строка - Путь к каталогу, существование которого нужно проверить. 80 | // 81 | // Возвращаемое значение: 82 | // Булево - признак существования каталога. 83 | // 84 | // Взято из https://infostart.ru/public/537028/ 85 | Функция ОбеспечитьКаталог(Знач Каталог) 86 | 87 | Файл = Новый Файл(Каталог); 88 | Если Не Файл.Существует() Тогда 89 | Попытка 90 | СоздатьКаталог(Каталог); 91 | Исключение 92 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Не удалось создать каталог %1. 93 | |%2'"), Каталог, ИнформацияОбОшибке())); 94 | Возврат Ложь; 95 | КонецПопытки; 96 | ИначеЕсли Не Файл.ЭтоКаталог() Тогда 97 | Лог.Ошибка(СтрШаблон(НСтр("ru = 'Каталог %1 не является каталогом.'"), Каталог)); 98 | Возврат Ложь; 99 | КонецЕсли; 100 | 101 | Возврат Истина; 102 | 103 | КонецФункции 104 | 105 | Процедура ВыгрузитьФайлВXML(ИмяФайла,ВерсииВсехФайлов) 106 | ФайлОбработкиИлиОтчета = Новый Файл(ИмяФайла); 107 | ВремяИзменения = ДатуКСтроке(ФайлОбработкиИлиОтчета.ПолучитьВремяИзменения()); 108 | 109 | Если ВремяИзменения = ВерсииВсехФайлов[НРег(ФайлОбработкиИлиОтчета.ПолноеИмя)] Тогда 110 | Лог.Информация("Файл уже распакован."); 111 | Возврат; 112 | КонецЕсли; 113 | 114 | 115 | ВременныйКаталог = ПолучитьИмяВременногоФайла(); 116 | СоздатьКаталог(ВременныйКаталог); 117 | 118 | ПараметрыЗапуска = УправлениеКонфигуратором.ПолучитьПараметрыЗапуска(); 119 | ПараметрыЗапуска.Добавить("/DumpExternalDataProcessorOrReportToFiles """ + ВременныйКаталог + """ """ + ИмяФайла + """"); 120 | 121 | ИмяФайлаOut = ПолучитьИмяВременногоФайла("txt"); 122 | ПараметрыЗапуска.Добавить("/Out """ + ИмяФайлаOut + """"); 123 | 124 | 125 | Попытка 126 | УправлениеКонфигуратором.ВыполнитьКоманду(ПараметрыЗапуска); 127 | Исключение 128 | Лог.Ошибка(ОписаниеОшибки()); 129 | Лог.Ошибка(УправлениеКонфигуратором.ВыводКоманды()); 130 | ВызватьИсключение "Выгрузка обработок в xml прервана."; 131 | КонецПопытки; 132 | 133 | 134 | ФайлXMLВКаталогеРаспаковки = НайтиФайлы(ВременныйКаталог,"*.xml",Ложь); 135 | Если ФайлXMLВКаталогеРаспаковки.Количество() <> 1 Тогда 136 | ВызватьИсключение "В каталоге распаковки найдено " + ФайлXMLВКаталогеРаспаковки.Количество() + " файлов xml, а должен быть только один."; 137 | КонецЕсли; 138 | 139 | ФайлXmlОбработки = ФайлXMLВКаталогеРаспаковки[0]; 140 | ИмяКаталогаОбработки = ФайлXmlОбработки.ИмяБезРасширения; 141 | 142 | КаталогиОткуда = Новый Массив; 143 | КаталогиОткуда.Добавить(ВременныйКаталог); 144 | МассивМасок = Новый Массив; 145 | МассивМасок.Добавить("*.*"); 146 | ПереместитьФайлыВКаталог(ФайлОбработкиИлиОтчета.Путь,КаталогиОткуда,МассивМасок); 147 | 148 | 149 | //запишем реальное имя файла 150 | ИмяОбработкиИлиОтчета = ФайлОбработкиИлиОтчета.Имя; 151 | 152 | 153 | КаталогГдеЛежатФайлыОбработкиИлиОтчета = ФайлОбработкиИлиОтчета.Путь + ПолучитьРазделительПути()+ ИмяКаталогаОбработки; 154 | ФайлКаталогГдеЛежатФайлыОбработкиИлиОтчета = Новый Файл(КаталогГдеЛежатФайлыОбработкиИлиОтчета); 155 | Если Не ФайлКаталогГдеЛежатФайлыОбработкиИлиОтчета.Существует() Тогда 156 | СоздатьКаталог(КаталогГдеЛежатФайлыОбработкиИлиОтчета); 157 | КонецЕсли; 158 | 159 | ИмяФайлаИмяОбработкиИлиОтчета = ФайлОбработкиИлиОтчета.Путь + ПолучитьРазделительПути()+ ИмяКаталогаОбработки + ПолучитьРазделительПути() + "filename"; 160 | ФайлИмяФайлаИмяОбработкиИлиОтчета = Новый Файл(ИмяФайлаИмяОбработкиИлиОтчета); 161 | Если ФайлИмяФайлаИмяОбработкиИлиОтчета.Существует() Тогда 162 | УдалитьФайлы(ИмяФайлаИмяОбработкиИлиОтчета); 163 | КонецЕсли; 164 | 165 | 166 | 167 | ЗТ = Новый ЗаписьТекста(ИмяФайлаИмяОбработкиИлиОтчета,"UTF-8",,Истина); 168 | ЗТ.Записать(ИмяОбработкиИлиОтчета); 169 | ЗТ.Закрыть(); 170 | 171 | //запишем версию файла 172 | ЗаписатьВерсиюОбработкиИлиОчета(ФайлОбработкиИлиОтчета,ИмяКаталогаОбработки,ИмяОбработкиИлиОтчета); 173 | 174 | 175 | Попытка 176 | УдалитьФайлы(ВременныйКаталог); 177 | Исключение 178 | КонецПопытки; 179 | 180 | КонецПроцедуры 181 | 182 | Функция ПолучитьВерсииФайловВКаталоге(Каталог) 183 | //Сообщить("Каталог="+Каталог); 184 | 185 | ТаблицаФайлов = Новый ТаблицаЗначений; 186 | ТаблицаФайлов.Колонки.Добавить("ПолноеИмя"); 187 | ТаблицаФайлов.Колонки.Добавить("ЧастьПути"); 188 | ТаблицаФайлов.Колонки.Добавить("ЭтоКаталог"); 189 | ТаблицаФайлов.Колонки.Добавить("ВремяИзменения"); 190 | 191 | Файлы = НайтиФайлы(Каталог,"*",Истина); 192 | Для Каждого Файл Из Файлы Цикл 193 | Если Нрег(Файл.Имя) = "filename" Тогда 194 | Продолжить; 195 | ИначеЕсли Нрег(Файл.Имя) = "fileversion" Тогда 196 | Продолжить; 197 | КонецЕсли; 198 | 199 | СтрокаТаблицаФайлов = ТаблицаФайлов.Добавить(); 200 | СтрокаТаблицаФайлов.ПолноеИмя = Файл.ПолноеИмя; 201 | СтрокаТаблицаФайлов.ЭтоКаталог = Файл.ЭтоКаталог(); 202 | СтрокаТаблицаФайлов.ЧастьПути = Сред(Файл.ПолноеИмя,СтрДлина(Каталог)); 203 | 204 | //Сообщить("СтрокаТаблицаФайлов.ЧастьПути="+СтрокаТаблицаФайлов.ЧастьПути); 205 | 206 | Если СтрокаТаблицаФайлов.ЭтоКаталог Тогда 207 | Продолжить; 208 | КонецЕсли; 209 | 210 | СтрокаТаблицаФайлов.ВремяИзменения = ДатуКСтроке(Файл.ПолучитьВремяИзменения()); 211 | КонецЦикла; 212 | 213 | Возврат ТаблицаФайлов; 214 | КонецФункции 215 | 216 | Процедура ЗаписатьВерсиюОбработкиИлиОчета(ФайлОбработкиИлиОтчета,ИмяКаталогаОбработки,ИмяОбработкиИлиОтчета) 217 | ИмяФайлаВерсии = ФайлОбработкиИлиОтчета.Путь + ИмяКаталогаОбработки + ПолучитьРазделительПути() + "fileversion"; 218 | УдалитьФайлы(ИмяФайлаВерсии); 219 | ВремяИзменения = ДатуКСтроке(ФайлОбработкиИлиОтчета.ПолучитьВремяИзменения()); 220 | 221 | ВерсииФайлов = ПолучитьВерсииФайловВКаталоге(ФайлОбработкиИлиОтчета.Путь + ИмяКаталогаОбработки + ПолучитьРазделительПути()); 222 | 223 | ЗТ = Новый ЗаписьТекста(ИмяФайлаВерсии,"UTF-8",,Истина); 224 | ЗТ.ЗаписатьСтроку(ВремяИзменения + "|" + ИмяОбработкиИлиОтчета); 225 | 226 | Для Каждого СтрокаВерсииФайлов Из ВерсииФайлов Цикл 227 | Если СтрокаВерсииФайлов.ЭтоКаталог Тогда 228 | Продолжить; 229 | КонецЕсли; 230 | 231 | Стр = "" + СтрокаВерсииФайлов.ВремяИзменения + "|" + СтрокаВерсииФайлов.ЧастьПути; 232 | ЗТ.ЗаписатьСтроку(Стр); 233 | КонецЦикла; 234 | 235 | ЗТ.Закрыть(); 236 | КонецПроцедуры 237 | 238 | Функция ВерсииВсехФайлов(Файлы) 239 | Версии = Новый Соответствие; 240 | 241 | Для Каждого Файл Из Файлы Цикл 242 | Текст = Новый ЧтениеТекста; 243 | Текст.Открыть(Файл.ПолноеИмя,"UTF-8"); 244 | 245 | 246 | Массив = Новый Массив; 247 | 248 | Пока Истина Цикл 249 | Стр = Текст.ПрочитатьСтроку(); 250 | Если Стр = Неопределено Тогда 251 | Прервать; 252 | КонецЕсли; 253 | 254 | Массив.Добавить(Стр); 255 | КонецЦикла; 256 | 257 | Текст.Закрыть(); 258 | 259 | Если Массив.Количество() < 1 Тогда 260 | ВызватьИсключение "Не смог прочитать файл версии: " + Файл.ПолноеИм; 261 | КонецЕсли; 262 | 263 | Поз = Найти(Массив[0],"|"); 264 | ВерсияСтрокой = Лев(Массив[0],Поз-1); 265 | ИмяИзСтроки = Сред(Массив[0],Поз+1); 266 | 267 | ПутьКОбработкеИлиОтчету = Новый Файл(Файл.Путь); 268 | 269 | ИмяОбработкиИлиОтчета = НРег(ПутьКОбработкеИлиОтчету.Путь + ИмяИзСтроки); 270 | 271 | Версии.Вставить(ИмяОбработкиИлиОтчета,ВерсияСтрокой); 272 | КонецЦикла; 273 | 274 | Возврат Версии; 275 | КонецФункции 276 | 277 | Процедура РаспаковатьФайлыПоМаске(Путь,Маска,ИскатьВПодкаталогах) 278 | Файлы = НайтиФайлы(Путь,Маска,ИскатьВПодкаталогах); 279 | Файлыfileversion = НайтиФайлы(Путь,"fileversion",ИскатьВПодкаталогах); 280 | ВерсииВсехФайлов = ВерсииВсехФайлов(Файлыfileversion); 281 | 282 | КоличествоФайлов = Файлы.Количество(); 283 | НомерФайла = 0; 284 | Для Каждого Файл Из Файлы Цикл 285 | НомерФайла = НомерФайла + 1; 286 | Лог.Информация("Файл " + НомерФайла + " из " + КоличествоФайлов + ": " + Файл.ПолноеИмя); 287 | 288 | ВыгрузитьФайлВXML(Файл.ПолноеИмя,ВерсииВсехФайлов); 289 | КонецЦикла; 290 | 291 | КонецПроцедуры 292 | 293 | Процедура РазобратьОбработкуИлиОтчетВКаталогеИПодКаталогах(Путь) 294 | Файл = Новый Файл(Путь); 295 | Если НЕ Файл.Существует() Тогда 296 | ВызватьИсключение "Каталог <" + Путь + "> не существует."; 297 | КонецЕсли; 298 | 299 | РаспаковатьФайлыПоМаске(Путь,"*.erf",Истина); 300 | РаспаковатьФайлыПоМаске(Путь,"*.epf",Истина); 301 | КонецПроцедуры 302 | 303 | Функция ПереместитьФайлыДляРазборки(КаталогКудаОбъект, КаталогОткудаОбъект, Маска, МассивУдаляемыхВременныхФайлов) 304 | 305 | МассивПеремещения = НайтиФайлы(КаталогОткудаОбъект.ПолноеИмя, Маска, Истина); 306 | 307 | Для каждого ЭлементМассиваПеремещения из МассивПеремещения Цикл 308 | 309 | ПолноеИмяФайлаОткуда = ЭлементМассиваПеремещения.ПолноеИмя; 310 | КороткоеИмяФайлаОткуда = ЭлементМассиваПеремещения.Имя; 311 | ОтносительноеИмя = СтрЗаменить(ПолноеИмяФайлаОткуда, КаталогОткудаОбъект.ПолноеИмя, ""); 312 | ИмяНовогоКаталога = СтрЗаменить(КаталогКудаОбъект.ПолноеИмя + ОтносительноеИмя, КороткоеИмяФайлаОткуда, ""); 313 | 314 | Если НЕ ОбеспечитьКаталог(ИмяНовогоКаталога) Тогда 315 | Продолжить; 316 | КонецЕсли; 317 | 318 | КопироватьФайл(ПолноеИмяФайлаОткуда, КаталогКудаОбъект.ПолноеИмя + ОтносительноеИмя); 319 | МассивУдаляемыхВременныхФайлов.Добавить(КаталогКудаОбъект.ПолноеИмя + ОтносительноеИмя); 320 | //Лог.Информация("Копируем " + ПолноеИмяФайлаОткуда + " в " + КаталогКудаОбъект.ПолноеИмя + ОтносительноеИмя); 321 | КонецЦикла; 322 | 323 | Возврат МассивУдаляемыхВременныхФайлов; 324 | 325 | КонецФункции 326 | 327 | Лог = Логирование.ПолучитьЛог("vb.decompile.log"); 328 | Лог.УстановитьУровень(УровниЛога.Отладка); 329 | 330 | Если АргументыКоманднойСтроки.Количество() = 0 Тогда 331 | Лог.Ошибка("Не переданы параметры!"); 332 | ИначеЕсли АргументыКоманднойСтроки.Количество() > 2 Тогда 333 | Лог.Ошибка("Скрипт принимает не больше двух параметров!"); 334 | Иначе 335 | УправлениеКонфигуратором = Новый УправлениеКонфигуратором(); 336 | 337 | ПутьКВерсииПлатформы8310 = УправлениеКонфигуратором.ПолучитьПутьКВерсииПлатформы("8.3.10"); 338 | УправлениеКонфигуратором.ПутьКПлатформе1С(ПутьКВерсииПлатформы8310); 339 | 340 | КаталогБазы = ПолучитьИмяВременногоФайла(); 341 | УправлениеКонфигуратором.СоздатьФайловуюБазу(КаталогБазы); 342 | УправлениеКонфигуратором.УстановитьКонтекст("/F""" + КаталогБазы + """","",""); 343 | 344 | Если АргументыКоманднойСтроки.Количество() = 2 Тогда 345 | 346 | МассивУдаляемыхВременныхФайлов = Новый Массив; 347 | КаталогКудаОбъект = Новый Файл(АргументыКоманднойСтроки[1]); 348 | КаталогОткудаОбъект = Новый Файл(АргументыКоманднойСтроки[0]); 349 | МассивУдаляемыхВременныхФайлов = ПереместитьФайлыДляРазборки(КаталогКудаОбъект,КаталогОткудаОбъект, "*.epf", МассивУдаляемыхВременныхФайлов); 350 | МассивУдаляемыхВременныхФайлов = ПереместитьФайлыДляРазборки(КаталогКудаОбъект,КаталогОткудаОбъект, "*.erf", МассивУдаляемыхВременныхФайлов); 351 | РазобратьОбработкуИлиОтчетВКаталогеИПодКаталогах(КаталогКудаОбъект.ПолноеИмя); 352 | 353 | Для каждого ВременныйФайл из МассивУдаляемыхВременныхФайлов Цикл 354 | УдалитьФайлы(ВременныйФайл); 355 | КонецЦикла; 356 | 357 | Иначе 358 | РазобратьОбработкуИлиОтчетВКаталогеИПодКаталогах(АргументыКоманднойСтроки[0]); 359 | КонецЕсли; 360 | 361 | КонецЕсли; 362 | 363 | Сообщить("Обработка завершена."); 364 | 365 | 366 | 367 | -------------------------------------------------------------------------------- /tools/LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2018, Pautov Leonid 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 | * Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | * 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 | * 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 | -------------------------------------------------------------------------------- /tools/MakePack.os: -------------------------------------------------------------------------------- 1 | Перем ЗаписьXML, ЗаписьZIP, КаталогСкрипта, КаталогПакета, СуффиксВерсии; 2 | 3 | Процедура ДобавитьЭлемент(Система, Архитектура, ИмяФайла) 4 | 5 | Файл = новый Файл(ИмяФайла); 6 | НовоеИмяФайла = Сред(Файл.ИмяБезРасширения, 4) + СуффиксВерсии + Файл.Расширение; 7 | 8 | ЗаписьXML.ЗаписатьНачалоЭлемента("component"); 9 | ЗаписьXML.ЗаписатьАтрибут("type", "native"); 10 | ЗаписьXML.ЗаписатьАтрибут("os", Система); 11 | ЗаписьXML.ЗаписатьАтрибут("arch", Архитектура); 12 | ЗаписьXML.ЗаписатьАтрибут("path", НовоеИмяФайла); 13 | ЗаписьXML.ЗаписатьКонецЭлемента(); 14 | 15 | КопироватьФайл(КаталогСкрипта + "/" + ИмяФайла, КаталогПакета + НовоеИмяФайла); 16 | ЗаписьZIP.Добавить(КаталогПакета + НовоеИмяФайла, РежимСохраненияПутейZIP.НеСохранятьПути); 17 | 18 | КонецПроцедуры 19 | 20 | Процедура MakePackage() 21 | 22 | КаталогСкрипта = ТекущийСценарий().Каталог + "/.."; 23 | КаталогПакета = КаталогСкрипта + "/bin/"; 24 | СоздатьКаталог(КаталогПакета); 25 | 26 | НомерВерсии = ""; 27 | СуффиксВерсии = ""; 28 | ТекстовыйДокумент = Новый ТекстовыйДокумент; 29 | ТекстовыйДокумент.Прочитать(КаталогСкрипта + "/version.h"); 30 | Для НомерСтроки = 2 по 5 Цикл 31 | Стр = ТекстовыйДокумент.ПолучитьСтроку(НомерСтроки); 32 | Если НомерСтроки > 1 Тогда НомерВерсии = НомерВерсии + "."; КонецЕсли; 33 | НаборСтрок = СтрРазделить(СтрЗаменить(Стр, Символы.Таб, " "), " ", Ложь); 34 | ЭлементВерсии = НаборСтрок.Получить(НаборСтрок.Количество() - 1); 35 | СуффиксВерсии = СуффиксВерсии + "_" + ЭлементВерсии; 36 | НомерВерсии = НомерВерсии + ЭлементВерсии; 37 | КонецЦикла; 38 | 39 | Сообщить("Номер версии: " + НомерВерсии); 40 | 41 | ИмяПакета = КаталогСкрипта + "/AddIn.zip"; 42 | ИмяФайла = КаталогПакета + "MANIFEST.XML"; 43 | 44 | УдалитьФайлы(ИмяПакета); 45 | ЗаписьZIP = Новый ЗаписьZipФайла(ИмяПакета); 46 | 47 | ЗаписьXML = Новый ЗаписьXML; 48 | ЗаписьXML.ОткрытьФайл(ИмяФайла, "UTF-8", Истина); 49 | ЗаписьXML.ЗаписатьБезОбработки(""); 50 | ЗаписьXML.ЗаписатьНачалоЭлемента("bundle"); 51 | ЗаписьXML.ЗаписатьАтрибут("xmlns", "http://v8.1c.ru/8.2/addin/bundle"); 52 | 53 | ДобавитьЭлемент("Windows" , "i386" , "bin32/Release/libGitFor1cWin32.dll"); 54 | ДобавитьЭлемент("Windows" , "x86_64" , "bin64/Release/libGitFor1cWin64.dll"); 55 | // ДобавитьЭлемент("Linux" , "i386" , "bin/libGitFor1cLin32.so"); 56 | // ДобавитьЭлемент("Linux" , "x86_64" , "bin/libGitFor1cLin64.so"); 57 | 58 | ЗаписьXML.ЗаписатьКонецЭлемента(); 59 | ЗаписьXML.Закрыть(); 60 | 61 | ЗаписьZIP.Добавить(ИмяФайла, РежимСохраненияПутейZIP.НеСохранятьПути); 62 | ЗаписьZIP.Записать(); 63 | 64 | КонецПроцедуры 65 | 66 | MakePackage(); -------------------------------------------------------------------------------- /tools/README.md: -------------------------------------------------------------------------------- 1 | # External modules converter for 1C 2 | 3 | Данный инструмент предназначен для быстрой у удобной конвертации внешних обработок (epf файлов) и внешних отчетов (erf файлов) в формат xml и обратно. 4 | 5 | Для работы инструмента вам понадобится установить [OneScript](http://oscript.io) версии 1.0.20 или выше. 6 | 7 | ## Пример использования 8 | 1. Допустим у вас есть каталог/каталоги внешних отчетов и обработок. 9 | 2. Чтобы сконвертировать все файлы из каталога и его подкаталогов в xml формат нужно выполнить команду 10 | ``` 11 | oscript Decompile.os МойКаталог 12 | ``` 13 | 14 | 3. Чтобы сконвертировать все файлы из каталога из xml формата обратно в бинарый надо выполнить команду 15 | ``` 16 | oscript Compile.os МойКаталог 17 | ``` 18 | 19 | ## Для работы скриптов необходимо 20 | 1. Установить [OneScript](http://oscript.io) версии 1.0.20 или выше. 21 | 2. Также, чтобы работала сборка epf/erf надо установить платформу [1С:Предприятие 8.3.10](https://releases.1c.ru). 22 | 23 | 24 | ## Особенности использования 25 | 1. При первой распаковке файла будет создан служебный файл "filename". Он нужен, т.к. имя xml файла и имя epf/erf файла в общем случае могут различаться. 26 | 2. Файл filename лучше не добавлять в .gitignore, если вы планируете хранить исходники в git. 27 | 3. Также будет создан служебный файл "fileversion". Он нужен для того, чтобы делать конвертацию в xml и обратно только тех файлов, которые реально изменились. 28 | 4. Файл fileversion надо добавить в .gitignore. 29 | 5. Также пример использования данного инструмента можно увидеть в проекте Vanessa-Automation версии [1.2.001](https://github.com/Pr-Mex/vanessa-automation) и выше. 30 | -------------------------------------------------------------------------------- /version.h: -------------------------------------------------------------------------------- 1 | #define VER_FILENAME GitFor1C 2 | #define VERSION_FULL 0.3.0.0 3 | #define VERSION_MAJOR 0 4 | #define VERSION_MINOR 3 5 | #define VERSION_REVISION 0 6 | #define VERSION_BUILD 0 7 | --------------------------------------------------------------------------------