├── .gitignore ├── LICENSE ├── README.md ├── doc └── images │ └── screenshot_1.png └── src ├── Catalogs ├── ОбнРасшGit_Расширения.xml └── ОбнРасшGit_Расширения │ └── Forms │ ├── ФормаСписка.xml │ ├── ФормаСписка │ └── Ext │ │ ├── Form.xml │ │ └── Form │ │ └── Module.bsl │ ├── ФормаЭлемента.xml │ └── ФормаЭлемента │ └── Ext │ ├── Form.xml │ └── Form │ └── Module.bsl ├── CommonModules ├── ОбнРасшGit_JSON.xml ├── ОбнРасшGit_JSON │ └── Ext │ │ └── Module.bsl ├── ОбнРасшGit_Версии.xml ├── ОбнРасшGit_Версии │ └── Ext │ │ └── Module.bsl ├── ОбнРасшGit_ОбщегоНазначения.xml ├── ОбнРасшGit_ОбщегоНазначения │ └── Ext │ │ └── Module.bsl ├── ОбнРасшGit_Расширения.xml ├── ОбнРасшGit_Расширения │ └── Ext │ │ └── Module.bsl ├── ОбнРасшGit_СтроковыеФункции.xml └── ОбнРасшGit_СтроковыеФункции │ └── Ext │ └── Module.bsl ├── ConfigDumpInfo.xml ├── Configuration.xml ├── Languages └── Русский.xml └── Roles ├── ОбнРасшGit_ОсновнаяРоль.xml └── ОбнРасшGit_ОсновнаяРоль └── Ext └── Rights.xml /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.rsuser 8 | *.suo 9 | *.user 10 | *.userosscache 11 | *.sln.docstates 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Mono auto generated files 17 | mono_crash.* 18 | 19 | # Build results 20 | [Dd]ebug/ 21 | [Dd]ebugPublic/ 22 | [Rr]elease/ 23 | [Rr]eleases/ 24 | x64/ 25 | x86/ 26 | [Aa][Rr][Mm]/ 27 | [Aa][Rr][Mm]64/ 28 | bld/ 29 | [Bb]in/ 30 | [Oo]bj/ 31 | [Ll]og/ 32 | [Ll]ogs/ 33 | 34 | # Visual Studio 2015/2017 cache/options directory 35 | .vs/ 36 | # Uncomment if you have tasks that create the project's static files in wwwroot 37 | #wwwroot/ 38 | 39 | # Visual Studio 2017 auto generated files 40 | Generated\ Files/ 41 | 42 | # MSTest test Results 43 | [Tt]est[Rr]esult*/ 44 | [Bb]uild[Ll]og.* 45 | 46 | # NUnit 47 | *.VisualState.xml 48 | TestResult.xml 49 | nunit-*.xml 50 | 51 | # Build Results of an ATL Project 52 | [Dd]ebugPS/ 53 | [Rr]eleasePS/ 54 | dlldata.c 55 | 56 | # Benchmark Results 57 | BenchmarkDotNet.Artifacts/ 58 | 59 | # .NET Core 60 | project.lock.json 61 | project.fragment.lock.json 62 | artifacts/ 63 | 64 | # StyleCop 65 | StyleCopReport.xml 66 | 67 | # Files built by Visual Studio 68 | *_i.c 69 | *_p.c 70 | *_h.h 71 | *.ilk 72 | *.meta 73 | *.obj 74 | *.iobj 75 | *.pch 76 | *.pdb 77 | *.ipdb 78 | *.pgc 79 | *.pgd 80 | *.rsp 81 | *.sbr 82 | *.tlb 83 | *.tli 84 | *.tlh 85 | *.tmp 86 | *.tmp_proj 87 | *_wpftmp.csproj 88 | *.log 89 | *.vspscc 90 | *.vssscc 91 | .builds 92 | *.pidb 93 | *.svclog 94 | *.scc 95 | 96 | # Chutzpah Test files 97 | _Chutzpah* 98 | 99 | # Visual C++ cache files 100 | ipch/ 101 | *.aps 102 | *.ncb 103 | *.opendb 104 | *.opensdf 105 | *.sdf 106 | *.cachefile 107 | *.VC.db 108 | *.VC.VC.opendb 109 | 110 | # Visual Studio profiler 111 | *.psess 112 | *.vsp 113 | *.vspx 114 | *.sap 115 | 116 | # Visual Studio Trace Files 117 | *.e2e 118 | 119 | # TFS 2012 Local Workspace 120 | $tf/ 121 | 122 | # Guidance Automation Toolkit 123 | *.gpState 124 | 125 | # ReSharper is a .NET coding add-in 126 | _ReSharper*/ 127 | *.[Rr]e[Ss]harper 128 | *.DotSettings.user 129 | 130 | # TeamCity is a build add-in 131 | _TeamCity* 132 | 133 | # DotCover is a Code Coverage Tool 134 | *.dotCover 135 | 136 | # AxoCover is a Code Coverage Tool 137 | .axoCover/* 138 | !.axoCover/settings.json 139 | 140 | # Visual Studio code coverage results 141 | *.coverage 142 | *.coveragexml 143 | 144 | # NCrunch 145 | _NCrunch_* 146 | .*crunch*.local.xml 147 | nCrunchTemp_* 148 | 149 | # MightyMoose 150 | *.mm.* 151 | AutoTest.Net/ 152 | 153 | # Web workbench (sass) 154 | .sass-cache/ 155 | 156 | # Installshield output folder 157 | [Ee]xpress/ 158 | 159 | # DocProject is a documentation generator add-in 160 | DocProject/buildhelp/ 161 | DocProject/Help/*.HxT 162 | DocProject/Help/*.HxC 163 | DocProject/Help/*.hhc 164 | DocProject/Help/*.hhk 165 | DocProject/Help/*.hhp 166 | DocProject/Help/Html2 167 | DocProject/Help/html 168 | 169 | # Click-Once directory 170 | publish/ 171 | 172 | # Publish Web Output 173 | *.[Pp]ublish.xml 174 | *.azurePubxml 175 | # Note: Comment the next line if you want to checkin your web deploy settings, 176 | # but database connection strings (with potential passwords) will be unencrypted 177 | *.pubxml 178 | *.publishproj 179 | 180 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 181 | # checkin your Azure Web App publish settings, but sensitive information contained 182 | # in these scripts will be unencrypted 183 | PublishScripts/ 184 | 185 | # NuGet Packages 186 | *.nupkg 187 | # NuGet Symbol Packages 188 | *.snupkg 189 | # The packages folder can be ignored because of Package Restore 190 | **/[Pp]ackages/* 191 | # except build/, which is used as an MSBuild target. 192 | !**/[Pp]ackages/build/ 193 | # Uncomment if necessary however generally it will be regenerated when needed 194 | #!**/[Pp]ackages/repositories.config 195 | # NuGet v3's project.json files produces more ignorable files 196 | *.nuget.props 197 | *.nuget.targets 198 | 199 | # Microsoft Azure Build Output 200 | csx/ 201 | *.build.csdef 202 | 203 | # Microsoft Azure Emulator 204 | ecf/ 205 | rcf/ 206 | 207 | # Windows Store app package directories and files 208 | AppPackages/ 209 | BundleArtifacts/ 210 | Package.StoreAssociation.xml 211 | _pkginfo.txt 212 | *.appx 213 | *.appxbundle 214 | *.appxupload 215 | 216 | # Visual Studio cache files 217 | # files ending in .cache can be ignored 218 | *.[Cc]ache 219 | # but keep track of directories ending in .cache 220 | !?*.[Cc]ache/ 221 | 222 | # Others 223 | ClientBin/ 224 | ~$* 225 | *~ 226 | *.dbmdl 227 | *.dbproj.schemaview 228 | *.jfm 229 | *.pfx 230 | *.publishsettings 231 | orleans.codegen.cs 232 | 233 | # Including strong name files can present a security risk 234 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 235 | #*.snk 236 | 237 | # Since there are multiple workflows, uncomment next line to ignore bower_components 238 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 239 | #bower_components/ 240 | 241 | # RIA/Silverlight projects 242 | Generated_Code/ 243 | 244 | # Backup & report files from converting an old project file 245 | # to a newer Visual Studio version. Backup files are not needed, 246 | # because we have git ;-) 247 | _UpgradeReport_Files/ 248 | Backup*/ 249 | UpgradeLog*.XML 250 | UpgradeLog*.htm 251 | ServiceFabricBackup/ 252 | *.rptproj.bak 253 | 254 | # SQL Server files 255 | *.mdf 256 | *.ldf 257 | *.ndf 258 | 259 | # Business Intelligence projects 260 | *.rdl.data 261 | *.bim.layout 262 | *.bim_*.settings 263 | *.rptproj.rsuser 264 | *- [Bb]ackup.rdl 265 | *- [Bb]ackup ([0-9]).rdl 266 | *- [Bb]ackup ([0-9][0-9]).rdl 267 | 268 | # Microsoft Fakes 269 | FakesAssemblies/ 270 | 271 | # GhostDoc plugin setting file 272 | *.GhostDoc.xml 273 | 274 | # Node.js Tools for Visual Studio 275 | .ntvs_analysis.dat 276 | node_modules/ 277 | 278 | # Visual Studio 6 build log 279 | *.plg 280 | 281 | # Visual Studio 6 workspace options file 282 | *.opt 283 | 284 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 285 | *.vbw 286 | 287 | # Visual Studio LightSwitch build output 288 | **/*.HTMLClient/GeneratedArtifacts 289 | **/*.DesktopClient/GeneratedArtifacts 290 | **/*.DesktopClient/ModelManifest.xml 291 | **/*.Server/GeneratedArtifacts 292 | **/*.Server/ModelManifest.xml 293 | _Pvt_Extensions 294 | 295 | # Paket dependency manager 296 | .paket/paket.exe 297 | paket-files/ 298 | 299 | # FAKE - F# Make 300 | .fake/ 301 | 302 | # CodeRush personal settings 303 | .cr/personal 304 | 305 | # Python Tools for Visual Studio (PTVS) 306 | __pycache__/ 307 | *.pyc 308 | 309 | # Cake - Uncomment if you are using it 310 | # tools/** 311 | # !tools/packages.config 312 | 313 | # Tabs Studio 314 | *.tss 315 | 316 | # Telerik's JustMock configuration file 317 | *.jmconfig 318 | 319 | # BizTalk build output 320 | *.btp.cs 321 | *.btm.cs 322 | *.odx.cs 323 | *.xsd.cs 324 | 325 | # OpenCover UI analysis results 326 | OpenCover/ 327 | 328 | # Azure Stream Analytics local run output 329 | ASALocalRun/ 330 | 331 | # MSBuild Binary and Structured Log 332 | *.binlog 333 | 334 | # NVidia Nsight GPU debugger configuration file 335 | *.nvuser 336 | 337 | # MFractors (Xamarin productivity tool) working folder 338 | .mfractor/ 339 | 340 | # Local History for Visual Studio 341 | .localhistory/ 342 | 343 | # BeatPulse healthcheck temp database 344 | healthchecksdb 345 | 346 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 347 | MigrationBackup/ 348 | 349 | # Ionide (cross platform F# VS Code tools) working folder 350 | .ionide/ 351 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Автоматизированное обновление расширений 1С из Git 2 | 3 | Предназначено для автоматизирования обновления расширений 1С. 4 | 5 | ## Порядок установки 6 | 7 | 1. Установить расширение в конфигурацию; 8 | 2. Заполнить справочник "Расширения" списком установленных в системе расширений. 9 | 3. Задать параметры обновляемых расширений; 10 | ![image](https://github.com/zerobig/Update1CExtensionsFromGit/blob/main/doc/images/screenshot_1.png) 11 | 12 | ## Как использовать 13 | 14 | В справочнике "Расширения" выбрать в списке необходимое расширение и нажать кнопку "Обновить из Git" 15 | 16 | ## Существующие ограничения 17 | 18 | * Версии расширений должны состоять из трех групп чисел разделённых точкой. Использование других символов не допускается 19 | * Файл расширения конфигурации (*.cfu) должен быть прикреплён к релизу в системе контроля версий 20 | 21 | ## Планы 22 | 23 | - [ ] Рефакторинг 24 | - [ ] Интеграция с БСП (обновление идентификаторов метаданных, обновление регламентным заданием) 25 | - [ ] Возможность определять способ обновления (при запуске конфигурации / регламентным заданием / вручную). 26 | - [ ] Тесты 27 | 28 | Тестировалось с API Github и Gitea. Если кто-то использует другие системы контроля версий, пишите - постараюсь включить в проект. -------------------------------------------------------------------------------- /doc/images/screenshot_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zerobig/Update1CExtensionsFromGit/089eefd98854d7d750451540fb9de52f05adb038/doc/images/screenshot_1.png -------------------------------------------------------------------------------- /src/Catalogs/ОбнРасшGit_Расширения.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 915f4289-de53-4b82-b54a-d7a946d2226a 7 | b3e3b26f-4ec8-4b6b-8066-307b3b3072ff 8 | 9 | 10 | b06466e3-ddaf-4cea-9512-b1bc3242633b 11 | 4493e39f-d815-4fda-83dd-4c5b31908c41 12 | 13 | 14 | 122b5f8d-d749-446c-bf38-a7db771f34c7 15 | e0304339-d87f-4ca2-ae40-5e24e015c4c0 16 | 17 | 18 | 015b9edd-24e4-4e07-b13a-26dd8b9d0af5 19 | af86cc4c-6f58-43ef-a5c6-9b05599a05cd 20 | 21 | 22 | 3aea40ab-b0c4-46a3-a894-4b26c4374a58 23 | c68ae7ea-0f17-4d94-98e4-91d50791a006 24 | 25 | 26 | 27 | ОбнРасшGit_Расширения 28 | 29 | 30 | ru 31 | Расширения 32 | 33 | 34 | 35 | false 36 | HierarchyFoldersAndItems 37 | false 38 | 2 39 | true 40 | true 41 | 42 | ToItems 43 | 0 44 | 150 45 | String 46 | Variable 47 | WholeCatalog 48 | false 49 | false 50 | AsDescription 51 | 52 | Auto 53 | InDialog 54 | false 55 | BothWays 56 | 57 | Catalog.ОбнРасшGit_Расширения.StandardAttribute.Description 58 | 59 | Begin 60 | DontUse 61 | Directly 62 | Catalog.ОбнРасшGit_Расширения.Form.ФормаЭлемента 63 | 64 | Catalog.ОбнРасшGit_Расширения.Form.ФормаСписка 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | false 73 | 74 | 75 | Managed 76 | Use 77 | 78 | 79 | 80 | 81 | 82 | Use 83 | Auto 84 | DontUse 85 | false 86 | false 87 | 88 | 89 | 90 | 91 | АдресРесурса 92 | 93 | 94 | ru 95 | Адрес ресурса 96 | 97 | 98 | 99 | 100 | xs:string 101 | 102 | 200 103 | Variable 104 | 105 | 106 | false 107 | 108 | 109 | 110 | false 111 | 112 | false 113 | false 114 | 115 | 116 | false 117 | 118 | DontCheck 119 | Items 120 | 121 | 122 | Auto 123 | Auto 124 | 125 | 126 | Auto 127 | ForItem 128 | DontIndex 129 | Use 130 | DontUse 131 | 132 | 133 | 134 | 135 | АдресСервера 136 | 137 | 138 | ru 139 | Адрес сервера 140 | 141 | 142 | 143 | 144 | xs:string 145 | 146 | 200 147 | Variable 148 | 149 | 150 | false 151 | 152 | 153 | 154 | false 155 | 156 | false 157 | false 158 | 159 | 160 | false 161 | 162 | DontCheck 163 | Items 164 | 165 | 166 | Auto 167 | Auto 168 | 169 | 170 | Auto 171 | ForItem 172 | DontIndex 173 | Use 174 | DontUse 175 | 176 | 177 | 178 | 179 | ИмяПользователя 180 | 181 | 182 | ru 183 | Имя пользователя 184 | 185 | 186 | 187 | 188 | xs:string 189 | 190 | 100 191 | Variable 192 | 193 | 194 | false 195 | 196 | 197 | 198 | false 199 | 200 | false 201 | false 202 | 203 | 204 | false 205 | 206 | DontCheck 207 | Items 208 | 209 | 210 | Auto 211 | Auto 212 | 213 | 214 | Auto 215 | ForItem 216 | DontIndex 217 | Use 218 | DontUse 219 | 220 | 221 | 222 | 223 | Обновлять 224 | 225 | 226 | ru 227 | Обновлять 228 | 229 | 230 | 231 | 232 | xs:boolean 233 | 234 | false 235 | 236 | 237 | 238 | false 239 | 240 | false 241 | false 242 | 243 | 244 | false 245 | 246 | DontCheck 247 | Items 248 | 249 | 250 | Auto 251 | Auto 252 | 253 | 254 | Auto 255 | ForItem 256 | DontIndex 257 | Use 258 | DontUse 259 | 260 | 261 | 262 | 263 | Пароль 264 | 265 | 266 | ru 267 | Пароль 268 | 269 | 270 | 271 | 272 | xs:string 273 | 274 | 100 275 | Variable 276 | 277 | 278 | false 279 | 280 | 281 | 282 | false 283 | 284 | false 285 | false 286 | 287 | 288 | false 289 | 290 | DontCheck 291 | Items 292 | 293 | 294 | Auto 295 | Auto 296 | 297 | 298 | Auto 299 | ForItem 300 | DontIndex 301 | Use 302 | DontUse 303 | 304 | 305 |
ФормаЭлемента
306 |
ФормаСписка
307 |
308 |
309 |
-------------------------------------------------------------------------------- /src/Catalogs/ОбнРасшGit_Расширения/Forms/ФормаСписка.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 |
4 | 5 | ФормаСписка 6 | 7 | 8 | ru 9 | Форма списка 10 | 11 | 12 | 13 | Managed 14 | false 15 | 16 | PlatformApplication 17 | MobilePlatformApplication 18 | 19 | 20 |
21 |
-------------------------------------------------------------------------------- /src/Catalogs/ОбнРасшGit_Расширения/Forms/ФормаСписка/Ext/Form.xml: -------------------------------------------------------------------------------- 1 |  2 |
3 | 4 | Copy 5 | Create 6 | SetDeletionMark 7 | 8 | 9 | 10 | 15 | 20 | 21 | 22 | 23 | ОбработкаОповещения 24 | 25 | 26 | 27 | 28 | <v8:item> 29 | <v8:lang>ru</v8:lang> 30 | <v8:content>Группа пользовательских настроек</v8:content> 31 | </v8:item> 32 | 33 | false 34 | Vertical 35 | false 36 | 37 | 38 | 39 | List 40 | None 41 | true 42 | true 43 | ExpandTopLevel 44 | true 45 | Список 46 | Список.DefaultPicture 47 | 48 | Copy 49 | Create 50 | SetDeletionMark 51 | 52 | false 53 | 60 54 | 55 | Custom 56 | 0001-01-01T00:00:00 57 | 0001-01-01T00:00:00 58 | 59 | Items 60 | false 61 | 62 | true 63 | false 64 | Auto 65 | СписокКомпоновщикНастроекПользовательскиеНастройки 66 | 67 | 68 | false 69 | 70 | 71 | 72 | 73 | Список 74 | SearchStringRepresentation 75 | 76 | 77 | 78 | 79 | 80 | 81 | Список 82 | ViewStatusRepresentation 83 | 84 | 85 | 86 | 87 | 88 | 89 | Список 90 | SearchControl 91 | 92 | 93 | 94 | 95 | 96 | СписокПриАктивизацииСтроки 97 | 98 | 99 | 100 | Список.Description 101 | true 102 | 103 | 104 | 105 | 106 | Список.Обновлять 107 | Auto 108 | 109 | 110 | 111 | 112 |
113 |
114 | 115 | 116 | 117 | cfg:DynamicList 118 | 119 | true 120 | 121 | Список.АдресРесурса 122 | Список.АдресСервера 123 | Список.ИмяПользователя 124 | Список.Пароль 125 | 126 | 127 | false 128 | true 129 | Catalog.ОбнРасшGit_Расширения 130 | 131 | 132 | Normal 133 | dfcece9d-5077-440b-b6b3-45a5cb4538eb 134 | 135 | 136 | Normal 137 | 88619765-ccb3-46c6-ac52-38e9c992ebd4 138 | 139 | 140 | Normal 141 | b75fecce-942b-4aed-abc9-e6a02e460fb3 142 | 143 | Normal 144 | 911b6018-f537-43e8-a417-da56b22f9aec 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | <v8:item> 153 | <v8:lang>ru</v8:lang> 154 | <v8:content>Заполнить установленными расширениями</v8:content> 155 | </v8:item> 156 | 157 | 158 | 159 | ru 160 | Заполнить установленными расширениями 161 | 162 | 163 | ЗаполнитьУстановленнымиРасширениями 164 | 165 | 166 | 167 | <v8:item> 168 | <v8:lang>ru</v8:lang> 169 | <v8:content>Обновить из Git</v8:content> 170 | </v8:item> 171 | 172 | 173 | 174 | ru 175 | Обновить из git 176 | 177 | 178 | 179 | StdPicture.Refresh 180 | true 181 | 182 | Обновить 183 | TextPicture 184 | 185 | 186 |
-------------------------------------------------------------------------------- /src/Catalogs/ОбнРасшGit_Расширения/Forms/ФормаСписка/Ext/Form/Module.bsl: -------------------------------------------------------------------------------- 1 | &НаКлиенте 2 | Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) 3 | 4 | Если ИмяСобытия = "ИзмененыНастройкиАвтоматическогоОбновленияРасширения" Тогда 5 | УстановитьДоступность(Параметр.АдресСервера, Параметр.АдресРесурса); 6 | КонецЕсли; 7 | 8 | КонецПроцедуры 9 | 10 | &НаКлиенте 11 | Процедура СписокПриАктивизацииСтроки(Элемент) 12 | 13 | Если Элемент.ТекущиеДанные <> Неопределено Тогда 14 | УстановитьДоступность(Элемент.ТекущиеДанные.АдресСервера, Элемент.ТекущиеДанные.АдресРесурса); 15 | Иначе 16 | УстановитьДоступность("", ""); 17 | КонецЕсли; 18 | 19 | КонецПроцедуры 20 | 21 | &НаКлиенте 22 | Процедура ЗаполнитьУстановленнымиРасширениями(Команда) 23 | ЗаполнитьУстановленнымиРасширениямиНаСервере(); 24 | Элементы.Список.Обновить(); 25 | КонецПроцедуры 26 | 27 | &НаКлиенте 28 | Процедура Обновить(Команда) 29 | 30 | Если Элементы.Список.ТекущиеДанные <> Неопределено Тогда 31 | 32 | Результат = ОбновитьРасширениеНаСервере(Элементы.Список.ТекущиеДанные.Наименование, 33 | Элементы.Список.ТекущиеДанные.АдресСервера, 34 | Элементы.Список.ТекущиеДанные.АдресРесурса, 35 | Элементы.Список.ТекущиеДанные.ИмяПользователя, 36 | Элементы.Список.ТекущиеДанные.Пароль); 37 | 38 | Если Результат Тогда 39 | Сообщить("Расширение успешно обновлено."); 40 | Иначе 41 | Сообщить("Во время обновления расширения возникли проблемы. Подробности смотреть в журнале регистрации."); 42 | КонецЕсли; 43 | 44 | КонецЕсли; 45 | 46 | КонецПроцедуры 47 | 48 | &НаСервере 49 | Функция ОбновитьРасширениеНаСервере(НаименованиеРасширения, АдресСервера, АдресРесурса, ИмяПользователя, Пароль) 50 | 51 | УстановитьПривилегированныйРежим(Истина); 52 | Расширения = РасширенияКонфигурации.Получить(Новый Структура("Имя", НаименованиеРасширения)); 53 | УстановитьПривилегированныйРежим(Ложь); 54 | 55 | Если Расширения.Количество() > 0 Тогда 56 | 57 | Возврат ОбнРасшGit_Расширения.ОбновитьРасширение(Расширения[0], АдресСервера, АдресРесурса, ИмяПользователя, Пароль); 58 | 59 | КонецЕсли; 60 | 61 | Возврат Ложь; 62 | 63 | КонецФункции 64 | 65 | &НаСервере 66 | Процедура ЗаполнитьУстановленнымиРасширениямиНаСервере() 67 | 68 | УстановитьПривилегированныйРежим(Истина); 69 | Расширения = РасширенияКонфигурации.Получить(); 70 | УстановитьПривилегированныйРежим(Ложь); 71 | 72 | Запрос = Новый Запрос; 73 | Запрос.Текст = "ВЫБРАТЬ 74 | | Расширения.Ссылка КАК Ссылка, 75 | | Расширения.Наименование КАК Наименование, 76 | | Расширения.ПометкаУдаления КАК ПометкаУдаления 77 | |ИЗ 78 | | Справочник.ОбнРасшGit_Расширения КАК Расширения"; 79 | 80 | ТаблицаРасширений = Запрос.Выполнить().Выгрузить(); 81 | 82 | ИдентификаторыРасширений = Новый Массив; 83 | Для каждого Расширение Из Расширения Цикл 84 | ИдентификаторыРасширений.Добавить(Расширение.Имя); 85 | 86 | РасширенияВСправочнике = ТаблицаРасширений.НайтиСтроки(Новый Структура("Наименование", Расширение.Имя)); 87 | Если РасширенияВСправочнике.Количество() = 0 Тогда 88 | РасширениеОбъект = Справочники.ОбнРасшGit_Расширения.СоздатьЭлемент(); 89 | РасширениеОбъект.Наименование = Расширение.Имя; 90 | РасширениеОбъект.Записать(); 91 | ИначеЕсли РасширенияВСправочнике[0].ПометкаУдаления Тогда 92 | РасширениеОбъект = РасширенияВСправочнике[0].Ссылка.ПолучитьОбъект(); 93 | РасширениеОбъект.УстановитьПометкуУдаления(Ложь); 94 | КонецЕсли; 95 | КонецЦикла; 96 | 97 | Для каждого Расширение Из ТаблицаРасширений Цикл 98 | Если ИдентификаторыРасширений.Найти(Расширение.Наименование) = Неопределено Тогда 99 | РасширениеОбъект = Расширение.Ссылка.ПолучитьОбъект(); 100 | РасширениеОбъект.УстановитьПометкуУдаления(Истина); 101 | КонецЕсли; 102 | КонецЦикла; 103 | 104 | КонецПроцедуры 105 | 106 | &НаКлиенте 107 | Процедура УстановитьДоступность(АдресСервера, АдресРесурса) 108 | 109 | Если ПустаяСтрока(АдресСервера) ИЛИ 110 | ПустаяСтрока(АдресРесурса) Тогда 111 | 112 | Элементы.ФормаОбновить.Доступность = Ложь; 113 | Иначе 114 | Элементы.ФормаОбновить.Доступность = Истина; 115 | КонецЕсли; 116 | 117 | КонецПроцедуры 118 | -------------------------------------------------------------------------------- /src/Catalogs/ОбнРасшGit_Расширения/Forms/ФормаЭлемента.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 |
4 | 5 | ФормаЭлемента 6 | 7 | 8 | ru 9 | Форма элемента 10 | 11 | 12 | 13 | Managed 14 | false 15 | 16 | PlatformApplication 17 | MobilePlatformApplication 18 | 19 | 20 |
21 |
-------------------------------------------------------------------------------- /src/Catalogs/ОбнРасшGit_Расширения/Forms/ФормаЭлемента/Ext/Form.xml: -------------------------------------------------------------------------------- 1 |  2 |
3 | LockOwnerWindow 4 | Items 5 | 6 | 7 | ПослеЗаписи 8 | 9 | 10 | 11 | Объект.Description 12 | true 13 | EnterOnInput 14 | 15 | 16 | 17 | 18 | Объект.Обновлять 19 | Auto 20 | 21 | 22 | 23 | 24 | Объект.АдресСервера 25 | EnterOnInput 26 | 27 | 28 | 29 | 30 | Объект.АдресРесурса 31 | 32 | <v8:item> 33 | <v8:lang>ru</v8:lang> 34 | <v8:content>Адрес репозитория</v8:content> 35 | </v8:item> 36 | 37 | EnterOnInput 38 | 39 | 40 | 41 | 42 | 43 | <v8:item> 44 | <v8:lang>ru</v8:lang> 45 | <v8:content>Параметры доступа</v8:content> 46 | </v8:item> 47 | 48 | 49 | 50 | ru 51 | Группа параметры доступа 52 | 53 | 54 | Vertical 55 | 56 | 57 | 58 | Объект.ИмяПользователя 59 | EnterOnInput 60 | 61 | 62 | 63 | 64 | Объект.Пароль 65 | EnterOnInput 66 | true 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | cfg:CatalogObject.ОбнРасшGit_Расширения 77 | 78 | true 79 | true 80 | 81 | 82 | -------------------------------------------------------------------------------- /src/Catalogs/ОбнРасшGit_Расширения/Forms/ФормаЭлемента/Ext/Form/Module.bsl: -------------------------------------------------------------------------------- 1 |  2 | &НаКлиенте 3 | Процедура ПослеЗаписи(ПараметрыЗаписи) 4 | 5 | Оповестить("ИзмененыНастройкиАвтоматическогоОбновленияРасширения", Объект); 6 | 7 | КонецПроцедуры 8 | -------------------------------------------------------------------------------- /src/CommonModules/ОбнРасшGit_JSON.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | ОбнРасшGit_JSON 6 | 7 | 8 | ru 9 | JSON 10 | 11 | 12 | 13 | false 14 | false 15 | true 16 | false 17 | false 18 | false 19 | false 20 | DontUse 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/CommonModules/ОбнРасшGit_JSON/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 | Функция ЗаполнитьСтруктуруИзОтветаJSON(Знач Чтение) Экспорт 2 | 3 | Результат = Новый Структура; 4 | 5 | ПоследнееИмяРеквизита = Неопределено; 6 | 7 | Пока Чтение.Прочитать() Цикл 8 | Тип = Чтение.ТипТекущегоЗначения; 9 | Если Тип = ТипЗначенияJSON.НачалоОбъекта И ПоследнееИмяРеквизита<>Неопределено Тогда 10 | Результат[ПоследнееИмяРеквизита] = ЗаполнитьСтруктуруИзОтветаJSON(Чтение); 11 | ИначеЕсли Тип = ТипЗначенияJSON.КонецОбъекта Тогда 12 | Возврат Результат; 13 | ПоследнееИмяРеквизита = Неопределено; 14 | ИначеЕсли Тип = ТипЗначенияJSON.ИмяСвойства И 15 | Лев(Чтение.ТекущееЗначение, 1) <> "+" И Лев(Чтение.ТекущееЗначение, 1) <> "-" Тогда 16 | 17 | Результат.Вставить(Чтение.ТекущееЗначение, Неопределено); 18 | ПоследнееИмяРеквизита = Чтение.ТекущееЗначение; 19 | ИначеЕсли (Тип = ТипЗначенияJSON.Булево или Тип = ТипЗначенияJSON.Строка 20 | или Тип = ТипЗначенияJSON.Число или Тип = ТипЗначенияJSON.Null) И 21 | Результат.Свойство(ПоследнееИмяРеквизита) Тогда 22 | 23 | Результат[ПоследнееИмяРеквизита] = Чтение.ТекущееЗначение; 24 | ИначеЕсли Тип = ТипЗначенияJSON.НачалоМассива Тогда 25 | Результат[ПоследнееИмяРеквизита] = ЗаполнитьМассивИзОтветаJSON(Чтение); 26 | КонецЕсли; 27 | КонецЦикла; 28 | 29 | Возврат Результат; 30 | 31 | КонецФункции 32 | 33 | Функция ЗаполнитьМассивИзОтветаJSON(Знач Чтение) Экспорт 34 | 35 | Результат = Новый Массив; 36 | 37 | Пока Чтение.Прочитать() Цикл 38 | Тип = Чтение.ТипТекущегоЗначения; 39 | Если Тип = ТипЗначенияJSON.НачалоОбъекта Тогда 40 | Результат.Добавить(ЗаполнитьСтруктуруИзОтветаJSON(Чтение)); 41 | ИначеЕсли Тип = ТипЗначенияJSON.КонецМассива Тогда 42 | Возврат Результат; 43 | КонецЕсли; 44 | КонецЦикла; 45 | 46 | Возврат Результат; 47 | 48 | КонецФункции 49 | -------------------------------------------------------------------------------- /src/CommonModules/ОбнРасшGit_Версии.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | ОбнРасшGit_Версии 6 | 7 | 8 | ru 9 | Версии 10 | 11 | 12 | 13 | false 14 | false 15 | true 16 | false 17 | false 18 | false 19 | false 20 | DontUse 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/CommonModules/ОбнРасшGit_Версии/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 | Функция РазобратьИзСтроки(Знач ВерсияСтрокой, Ошибка, СообщениеОбОшибке) Экспорт 2 | 3 | Ошибка = Ложь; 4 | СообщениеОбОшибке = ""; 5 | 6 | Если СтрДлина(ВерсияСтрокой) = 0 Тогда 7 | СообщениеОбОшибке = "Длина строки версии 0"; 8 | Ошибка = Истина; 9 | Возврат Неопределено; 10 | КонецЕсли; 11 | 12 | ВерсияСтрокой = ПодготовитьКЧтению(ВерсияСтрокой); 13 | 14 | МассивСтрокВерсии = СтрРазделить(ВерсияСтрокой, "."); 15 | 16 | Если МассивСтрокВерсии.Количество() < 3 Тогда 17 | СообщениеОбОшибке = "Не найдены все составляющие версии"; 18 | Ошибка = Истина; 19 | Возврат Неопределено; 20 | КонецЕсли; 21 | 22 | СтрокаОсновнаяВерсия = МассивСтрокВерсии[0]; 23 | 24 | Если Не ОбнРасшGit_СтроковыеФункции.ТолькоЦифрыВСтроке(СтрокаОсновнаяВерсия) Тогда 25 | СообщениеОбОшибке = СтрШаблон("Основная версия <%1> должна содержать только цифры",СтрокаОсновнаяВерсия); 26 | Ошибка = Истина; 27 | Возврат Неопределено; 28 | КонецЕсли; 29 | 30 | Основная = Число(СтрокаОсновнаяВерсия); 31 | 32 | СтрокаВторостепеннаяВерсия = МассивСтрокВерсии[1]; 33 | 34 | Если Не ОбнРасшGit_СтроковыеФункции.ТолькоЦифрыВСтроке(СтрокаВторостепеннаяВерсия) Тогда 35 | СообщениеОбОшибке = СтрШаблон("Второстепенная версия <%1> должна содержать только цифры",СтрокаОсновнаяВерсия); 36 | Ошибка = Истина; 37 | Возврат Неопределено; 38 | КонецЕсли; 39 | 40 | Второстепенная = Число(СтрокаВторостепеннаяВерсия); 41 | 42 | СтрокаПатчаВерсии = МассивСтрокВерсии[2]; 43 | 44 | Если Не ОбнРасшGit_СтроковыеФункции.ТолькоЦифрыВСтроке(СтрокаПатчаВерсии) Тогда 45 | СообщениеОбОшибке = СтрШаблон("Версия патча <%1> должна содержать только цифры",СтрокаОсновнаяВерсия); 46 | Ошибка = Истина; 47 | Возврат Неопределено; 48 | КонецЕсли; 49 | 50 | Патч = Число(СтрокаПатчаВерсии); 51 | 52 | Версия = Новый Массив; 53 | Версия.Добавить(Основная); 54 | Версия.Добавить(Второстепенная); 55 | Версия.Добавить(Патч); 56 | 57 | Возврат Версия; 58 | 59 | КонецФункции 60 | 61 | Функция Сравнить(Знач ОсновнаяВерсия, Знач ВерсияДляСравнения) Экспорт 62 | 63 | Если НЕ ОсновнаяВерсия[0] = ВерсияДляСравнения[0] Тогда 64 | Возврат ?(ОсновнаяВерсия[0] > ВерсияДляСравнения[0], 1, -1); 65 | КонецЕсли; 66 | 67 | Если НЕ ОсновнаяВерсия[1] = ВерсияДляСравнения[1] Тогда 68 | Возврат ?(ОсновнаяВерсия[1] > ВерсияДляСравнения[1], 1, -1); 69 | КонецЕсли; 70 | 71 | Если НЕ ОсновнаяВерсия[2] = ВерсияДляСравнения[2] Тогда 72 | Возврат ?(ОсновнаяВерсия[2] > ВерсияДляСравнения[2], 1, -1); 73 | КонецЕсли; 74 | 75 | Возврат 0; 76 | 77 | КонецФункции 78 | 79 | Функция ПодготовитьКЧтению(Знач СтрокаВерсии) 80 | 81 | Если СтрНачинаетсяС(СтрокаВерсии, "v") Тогда 82 | СтрокаВерсии = СтрЗаменить(СтрокаВерсии, "v", ""); 83 | КонецЕсли; 84 | 85 | МассивСтрокВерсии = СтрРазделить(СтрокаВерсии, "."); 86 | 87 | КоличествоДобавления = 3 - МассивСтрокВерсии.Количество(); 88 | 89 | Для ИИ = 1 ПО КоличествоДобавления Цикл 90 | МассивСтрокВерсии.Добавить(0); 91 | КонецЦикла; 92 | 93 | Возврат СтрСоединить(МассивСтрокВерсии, "."); 94 | 95 | КонецФункции 96 | -------------------------------------------------------------------------------- /src/CommonModules/ОбнРасшGit_ОбщегоНазначения.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | ОбнРасшGit_ОбщегоНазначения 6 | 7 | 8 | ru 9 | Общего назначения 10 | 11 | 12 | 13 | false 14 | false 15 | true 16 | false 17 | false 18 | false 19 | false 20 | DontUse 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/CommonModules/ОбнРасшGit_ОбщегоНазначения/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 |  2 | Функция ЭтоLinuxСервер() Экспорт 3 | 4 | СистемнаяИнформация = Новый СистемнаяИнформация; 5 | Возврат СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86 ИЛИ СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86_64; 6 | 7 | КонецФункции 8 | 9 | Функция РазделениеВключено() Экспорт 10 | 11 | Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда 12 | МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); 13 | Возврат МодульРаботаВМоделиСервиса.РазделениеВключено(); 14 | Иначе 15 | Возврат Ложь; 16 | КонецЕсли; 17 | 18 | КонецФункции 19 | 20 | Функция ОбщийМодуль(Имя) 21 | 22 | Если Метаданные.ОбщиеМодули.Найти(Имя) <> Неопределено Тогда 23 | Модуль = Вычислить(Имя); // ВычислитьВБезопасномРежиме не требуется, т.к. проверка надежная. 24 | ИначеЕсли СтрЧислоВхождений(Имя, ".") = 1 Тогда 25 | Возврат СерверныйМодульМенеджера(Имя); 26 | Иначе 27 | Модуль = Неопределено; 28 | КонецЕсли; 29 | 30 | Если ТипЗнч(Модуль) <> Тип("ОбщийМодуль") Тогда 31 | ВызватьИсключение ОбнРасшGit_СтроковыеФункции.ПодставитьПараметрыВСтроку(НСтр("ru = 'Общий модуль ""%1"" не найден.'"), Имя); 32 | КонецЕсли; 33 | 34 | Возврат Модуль; 35 | 36 | КонецФункции 37 | 38 | Функция ПодсистемаСуществует(ПолноеИмяПодсистемы) 39 | 40 | ИменаПодсистем = ИменаПодсистем(); 41 | Возврат ИменаПодсистем.Получить(ПолноеИмяПодсистемы) <> Неопределено; 42 | 43 | КонецФункции 44 | 45 | Функция ИменаПодсистем() Экспорт 46 | 47 | ОтключенныеПодсистемы = Новый Соответствие; 48 | 49 | Имена = Новый Соответствие; 50 | ВставитьИменаПодчиненныхПодсистем(Имена, Метаданные, ОтключенныеПодсистемы); 51 | 52 | Возврат Новый ФиксированноеСоответствие(Имена); 53 | 54 | КонецФункции 55 | 56 | Процедура ВставитьИменаПодчиненныхПодсистем(Имена, РодительскаяПодсистема, ОтключенныеПодсистемы, ИмяРодительскойПодсистемы = "") 57 | 58 | Для Каждого ТекущаяПодсистема Из РодительскаяПодсистема.Подсистемы Цикл 59 | 60 | Если ТекущаяПодсистема.ВключатьВКомандныйИнтерфейс Тогда 61 | Продолжить; 62 | КонецЕсли; 63 | 64 | ИмяТекущейПодсистемы = ИмяРодительскойПодсистемы + ТекущаяПодсистема.Имя; 65 | Если ОтключенныеПодсистемы.Получить(ИмяТекущейПодсистемы) = Истина Тогда 66 | Продолжить; 67 | Иначе 68 | Имена.Вставить(ИмяТекущейПодсистемы, Истина); 69 | КонецЕсли; 70 | 71 | Если ТекущаяПодсистема.Подсистемы.Количество() = 0 Тогда 72 | Продолжить; 73 | КонецЕсли; 74 | 75 | ВставитьИменаПодчиненныхПодсистем(Имена, ТекущаяПодсистема, ОтключенныеПодсистемы, ИмяТекущейПодсистемы + "."); 76 | КонецЦикла; 77 | 78 | КонецПроцедуры 79 | 80 | Функция СерверныйМодульМенеджера(Имя) 81 | 82 | ОбъектНайден = Ложь; 83 | 84 | ЧастиИмени = СтрРазделить(Имя, "."); 85 | Если ЧастиИмени.Количество() = 2 Тогда 86 | 87 | ИмяВида = ВРег(ЧастиИмени[0]); 88 | ИмяОбъекта = ЧастиИмени[1]; 89 | 90 | Если ИмяВида = ВРег("Константы") Тогда 91 | Если Метаданные.Константы.Найти(ИмяОбъекта) <> Неопределено Тогда 92 | ОбъектНайден = Истина; 93 | КонецЕсли; 94 | ИначеЕсли ИмяВида = ВРег("РегистрыСведений") Тогда 95 | Если Метаданные.РегистрыСведений.Найти(ИмяОбъекта) <> Неопределено Тогда 96 | ОбъектНайден = Истина; 97 | КонецЕсли; 98 | ИначеЕсли ИмяВида = ВРег("РегистрыНакопления") Тогда 99 | Если Метаданные.РегистрыНакопления.Найти(ИмяОбъекта) <> Неопределено Тогда 100 | ОбъектНайден = Истина; 101 | КонецЕсли; 102 | ИначеЕсли ИмяВида = ВРег("РегистрыБухгалтерии") Тогда 103 | Если Метаданные.РегистрыБухгалтерии.Найти(ИмяОбъекта) <> Неопределено Тогда 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 | Если Метаданные.ПланыОбмена.Найти(ИмяОбъекта) <> Неопределено Тогда 144 | ОбъектНайден = Истина; 145 | КонецЕсли; 146 | ИначеЕсли ИмяВида = ВРег("ПланыВидовХарактеристик") Тогда 147 | Если Метаданные.ПланыВидовХарактеристик.Найти(ИмяОбъекта) <> Неопределено Тогда 148 | ОбъектНайден = Истина; 149 | КонецЕсли; 150 | ИначеЕсли ИмяВида = ВРег("ПланыВидовРасчета") Тогда 151 | Если Метаданные.ПланыВидовРасчета.Найти(ИмяОбъекта) <> Неопределено Тогда 152 | ОбъектНайден = Истина; 153 | КонецЕсли; 154 | КонецЕсли; 155 | 156 | КонецЕсли; 157 | 158 | Если Не ОбъектНайден Тогда 159 | ВызватьИсключение ОбнРасшGit_СтроковыеФункции.ПодставитьПараметрыВСтроку( 160 | НСтр("ru = 'Объект метаданных ""%1"" не найден, 161 | |либо для него не поддерживается получение модуля менеджера.'"), Имя); 162 | КонецЕсли; 163 | 164 | Модуль = Вычислить(Имя); // ВычислитьВБезопасномРежиме не требуется, т.к. проверка надежная. 165 | 166 | Возврат Модуль; 167 | 168 | КонецФункции 169 | -------------------------------------------------------------------------------- /src/CommonModules/ОбнРасшGit_Расширения.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | ОбнРасшGit_Расширения 6 | 7 | 8 | ru 9 | Расширения 10 | 11 | 12 | 13 | false 14 | false 15 | true 16 | false 17 | false 18 | false 19 | false 20 | DontUse 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/CommonModules/ОбнРасшGit_Расширения/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 | Функция ОбновитьРасширение(Расширение, АдресСервера, АдресРесурса, ИмяПользователя, Пароль) Экспорт 2 | 3 | Попытка 4 | 5 | Соединение = СоединениеССервером(АдресСервера, 80); 6 | 7 | Заголовки = Новый Соответствие; 8 | Заголовки.Вставить("Content-Type", "application/json"); 9 | Заголовки.Вставить("Accept", "application/json"); 10 | Если НЕ ПустаяСтрока(ИмяПользователя) Тогда 11 | Заголовки.Вставить("Authorization", "Basic " + Base64Строка(ИмяПользователя + ":" + Пароль)); 12 | КонецЕсли; 13 | 14 | Запрос = Новый HTTPЗапрос(АдресРесурса, Заголовки); 15 | 16 | Результат = Соединение.Получить(Запрос); 17 | 18 | ЧтениеJSON = Новый ЧтениеJSON; 19 | ЧтениеJSON.УстановитьСтроку(Результат.ПолучитьТелоКакСтроку()); 20 | 21 | МассивРелизов = ОбнРасшGit_JSON.ЗаполнитьМассивИзОтветаJSON(ЧтениеJSON); 22 | МассивНомеровРелизов = Новый Массив; 23 | 24 | Для каждого Релиз Из МассивРелизов Цикл 25 | Если Релиз["assets"].Количество() = 0 Тогда 26 | Продолжить; 27 | КонецЕсли; 28 | Для каждого Загрузка Из Релиз["assets"] Цикл 29 | Если СтрЗаканчиваетсяНа(Загрузка["browser_download_url"], ".cfe") Тогда 30 | МассивНомеровРелизов.Добавить(Новый Структура("НомерРелиза, Url", 31 | Релиз["tag_name"], Загрузка["browser_download_url"])); 32 | Прервать; 33 | КонецЕсли; 34 | КонецЦикла; 35 | КонецЦикла; 36 | 37 | Ошибка = Ложь; 38 | СообщениеОбОшибке = ""; 39 | 40 | ВерсияРасширения = ОбнРасшGit_Версии.РазобратьИзСтроки(Расширение.Версия, Ошибка, СообщениеОбОшибке); 41 | Если Ошибка Тогда 42 | ВызватьИсключение СообщениеОбОшибке; 43 | КонецЕсли; 44 | 45 | СообщениеОбОшибке = "У данного репозитория отсутствуют версии релизов расширений!"; 46 | Если МассивНомеровРелизов.Количество() = 0 Тогда 47 | ВызватьИсключение СообщениеОбОшибке; 48 | КонецЕсли; 49 | 50 | Ошибка = Истина; 51 | Сч = 0; НоваяВерсияСтрокой = ""; Url = ""; 52 | Пока Ошибка И МассивНомеровРелизов.Количество() > Сч Цикл 53 | НоваяВерсияСтрокой = МассивНомеровРелизов[Сч]["НомерРелиза"]; 54 | Url = МассивНомеровРелизов[Сч]["Url"]; 55 | НоваяВерсия = ОбнРасшGit_Версии.РазобратьИзСтроки(НоваяВерсияСтрокой, Ошибка, СообщениеОбОшибке); 56 | Если Ошибка Тогда 57 | ЗаписьЖурналаРегистрации("Не удалось разобрать версию: " + МассивНомеровРелизов[Сч]["НомерРелиза"], 58 | УровеньЖурналаРегистрации.Примечание,,, СообщениеОбОшибке); 59 | КонецЕсли; 60 | 61 | Сч = Сч + 1; 62 | КонецЦикла; 63 | Если Ошибка Тогда 64 | ВызватьИсключение СообщениеОбОшибке; 65 | КонецЕсли; 66 | 67 | Если ОбнРасшGit_Версии.Сравнить(ВерсияРасширения, НоваяВерсия) = -1 Тогда 68 | 69 | // Обновляем 70 | ПараметрыПолучения = Новый Структура("ИмяФайлаОтвета", ПолучитьИмяВременногоФайла("cfe")); 71 | Результат = ЗагрузитьСодержимоеИзИнтернет(Url, ИмяПользователя, Пароль, ПараметрыПолучения); 72 | Если Не ПустаяСтрока(Результат.Содержимое) Тогда 73 | 74 | Файл = Новый Файл(Результат.Содержимое); 75 | Если Файл.Существует() Тогда 76 | 77 | ОбновитьДвоичныеДанныеРасширения(Расширение, Новый ДвоичныеДанные(Результат.Содержимое), НоваяВерсияСтрокой); 78 | 79 | УдалитьФайлы(Результат.Содержимое); 80 | 81 | КонецЕсли; 82 | 83 | КонецЕсли; 84 | 85 | Иначе 86 | ВызватьИсключение "В репозитории отсутствуют подходящие обновления для расширения."; 87 | КонецЕсли; 88 | 89 | Исключение 90 | СообщениеСОшибкой = ОписаниеОшибки(); 91 | ЗаписьЖурналаРегистрации("Исключение", УровеньЖурналаРегистрации.Ошибка,,, СообщениеСОшибкой); 92 | 93 | Возврат Ложь; 94 | КонецПопытки; 95 | 96 | Возврат Истина; 97 | 98 | КонецФункции 99 | 100 | Процедура ОбновитьДвоичныеДанныеРасширения(Расширение, ДвоичныеДанные, ВерсияРелиза) 101 | 102 | ОписаниеРасширения = Новый ОписаниеКонфигурации(ДвоичныеДанные); 103 | 104 | Если ОписаниеРасширения.Имя <> Расширение.Имя Тогда 105 | ТекстОшибки = ОбнРасшGit_СтроковыеФункции.ПодставитьПараметрыВСтроку( 106 | НСтр("ru = 'Нельзя заменить расширение ""%1"" на ""%2"".'"), 107 | Расширение.Имя, 108 | ОписаниеРасширения.Имя); 109 | КонецЕсли; 110 | Если ОписаниеРасширения.Версия <> ВерсияРелиза Тогда 111 | ТекстОшибки = ОбнРасшGit_СтроковыеФункции.ПодставитьПараметрыВСтроку( 112 | НСтр("ru = 'Версия релиза на Git ""%1"" не соответствует версии загруженного с Git расширения ""%2"".'"), 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 | ТекстОшибки = ОбнРасшGit_СтроковыеФункции.ПодставитьПараметрыВСтроку( 139 | НСтр("ru = 'Новое расширение не может быть применено по причине: 140 | |%1'"), 141 | ТекстОшибки); 142 | Иначе 143 | Расширение.Записать(ДвоичныеДанные); 144 | КонецЕсли; 145 | 146 | Если ЗначениеЗаполнено(ТекстОшибки) Тогда 147 | ВызватьИсключение ТекстОшибки; 148 | КонецЕсли; 149 | 150 | КонецПроцедуры 151 | 152 | Процедура ОбновитьВсеРасширения() Экспорт 153 | 154 | Запрос = Новый Запрос; 155 | Запрос.Текст = "ВЫБРАТЬ 156 | | Расширения.Ссылка КАК Ссылка, 157 | | Расширения.АдресСервера КАК АдресСервера, 158 | | Расширения.АдресРесурса КАК АдресРесурса, 159 | | Расширения.ИмяПользователя КАК ИмяПользователя, 160 | | Расширения.Пароль КАК Пароль 161 | |ИЗ 162 | | Справочник.ОбнРасшGit_Расширения КАК Расширения 163 | |ГДЕ 164 | | Расширения.Обновлять 165 | | И НЕ Расширения.ПометкаУдаления 166 | | И Расширения.АдресСервера <> """" 167 | | И Расширения.АдресРесурса <> """""; 168 | 169 | ВыборкаЗапроса = Запрос.Выполнить().Выбрать(); 170 | Пока ВыборкаЗапроса.Следующий() Цикл 171 | 172 | ОбновитьРасширение(ВыборкаЗапроса.Ссылка, ВыборкаЗапроса.АдресСервера, ВыборкаЗапроса.АдресРесурса, 173 | ВыборкаЗапроса.ИмяПользователя, ВыборкаЗапроса.Пароль); 174 | 175 | КонецЦикла; 176 | 177 | КонецПроцедуры 178 | 179 | Функция СоединениеССервером(АдресСервера, Таймаут) 180 | 181 | Перем ЗащищенноеСоединение; 182 | Адрес = ""; 183 | Протокол = ""; 184 | 185 | ОпределитьПараметрыСайта(АдресСервера, ЗащищенноеСоединение, Адрес, Протокол); 186 | // TODO: 187 | //Прокси = СформироватьПрокси(Протокол); 188 | // 189 | //Соединение = Новый HTTPСоединение(Адрес, , , ,Прокси, Таймаут, ЗащищенноеСоединение); 190 | Соединение = Новый HTTPСоединение(Адрес, , , , , Таймаут, ЗащищенноеСоединение); 191 | 192 | Возврат Соединение; 193 | 194 | КонецФункции 195 | 196 | Процедура ОпределитьПараметрыСайта(Знач АдресСайта, ЗащищенноеСоединение, Адрес, Протокол) 197 | 198 | АдресСайта = СокрЛП(АдресСайта); 199 | 200 | АдресСайта = СтрЗаменить(АдресСайта, "\", "/"); 201 | АдресСайта = СтрЗаменить(АдресСайта, " ", ""); 202 | 203 | Если НРег(Лев(АдресСайта, 7)) = "http://" Тогда 204 | Протокол = "http"; 205 | Адрес = Сред(АдресСайта,8); 206 | ЗащищенноеСоединение = Неопределено; 207 | ИначеЕсли НРег(Лев(АдресСайта, 8)) = "https://" Тогда 208 | Протокол = "https"; 209 | Адрес = Сред(АдресСайта,9); 210 | 211 | СертификатыУдостоверяющихЦентров = Неопределено; 212 | Если Не ОбнРасшGit_ОбщегоНазначения.ЭтоLinuxСервер() И Не ОбнРасшGit_ОбщегоНазначения.РазделениеВключено() Тогда 213 | // Ошибка фреша при работе с веб сервисами. Не работает проверка доверенных сертификатов при установке соединения. 214 | СертификатыУдостоверяющихЦентров = Новый СертификатыУдостоверяющихЦентровWindows; 215 | КонецЕсли; 216 | ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL( , СертификатыУдостоверяющихЦентров); 217 | КонецЕсли; 218 | 219 | КонецПроцедуры 220 | 221 | #Если Не ВебКлиент Тогда 222 | 223 | Функция НовыйЗащищенноеСоединение() 224 | 225 | Возврат Новый ЗащищенноеСоединениеOpenSSL(, Новый СертификатыУдостоверяющихЦентровОС); 226 | 227 | КонецФункции 228 | 229 | Процедура УстановитьОписаниеОшибки(Результат, КодОшибки, СообщениеОбОшибке, ИнформацияОбОшибке, Перенаправления) 230 | 231 | Результат.КодОшибки = КодОшибки; 232 | Результат.СообщениеОбОшибке = СообщениеОбОшибке; 233 | ДопСообщение = ""; 234 | Если КодОшибки = "ConnectError" Тогда 235 | ДопСообщение = НСтр("ru = 'Ошибка при подключении к серверу.'"); 236 | 237 | ИначеЕсли КодОшибки = "ServerError" Тогда 238 | ДопСообщение = НСтр("ru = 'На сервере возникла внутренняя ошибка при обработке запроса.'"); 239 | 240 | ИначеЕсли КодОшибки = "ClientError" Тогда 241 | ДопСообщение = НСтр("ru = 'Некорректный запрос.'"); 242 | 243 | ИначеЕсли КодОшибки = "InternalError" Тогда 244 | ДопСообщение = НСтр("ru = 'Внутренняя ошибка.'"); 245 | 246 | ИначеЕсли КодОшибки = "LoginError" Тогда 247 | ДопСообщение = НСтр("ru = 'Ошибка аутентификации на сервере.'"); 248 | 249 | КонецЕсли; 250 | 251 | Результат.СообщениеОбОшибке = 252 | ?(ПустаяСтрока(ДопСообщение), "", ДопСообщение + " ") 253 | + СообщениеОбОшибке; 254 | 255 | Результат.ИнформацияОбОшибке = ИнформацияОбОшибке; 256 | 257 | Если Перенаправления.Количество() > 0 Тогда 258 | Результат.ИнформацияОбОшибке = Результат.ИнформацияОбОшибке + Символы.ПС 259 | + НСтр("ru = 'Перенаправления:'") + Символы.ПС 260 | + СтрСоединить(Перенаправления, ", " + Символы.ПС); 261 | КонецЕсли; 262 | 263 | КонецПроцедуры 264 | 265 | Процедура ДобавитьСписокПеренаправленийКИнформацииОбОшибке(ИнформацияОбОшибке, Перенаправления) 266 | 267 | Если Перенаправления.Количество() = 0 Тогда 268 | Возврат; 269 | КонецЕсли; 270 | 271 | ИнформацияОбОшибке = ИнформацияОбОшибке + Символы.ПС 272 | + НСтр("ru = 'Перенаправления:'") + Символы.ПС 273 | + СтрСоединить(Перенаправления, ", " + Символы.ПС); 274 | 275 | КонецПроцедуры 276 | 277 | Функция ЗагрузитьСодержимоеИзИнтернет( 278 | Знач URL, 279 | Знач Логин = Неопределено, 280 | Знач Пароль = Неопределено, 281 | ДопПараметры = Неопределено) Экспорт 282 | 283 | Результат = Новый Структура; 284 | Результат.Вставить("КодОшибки" , ""); 285 | Результат.Вставить("СообщениеОбОшибке" , ""); 286 | Результат.Вставить("ИнформацияОбОшибке", ""); 287 | Результат.Вставить("Содержимое" , Неопределено); 288 | Результат.Вставить("КодСостояния" , 0); 289 | Результат.Вставить("ФорматОтвета" , 0); 290 | 291 | // Формат ответа: 0 - имя файла ответа, 1 - как строка, 2 - как двоичные данные. 292 | // Метод: "GET", "POST" или "PUT". 293 | // ДанныеДляОбработки: данные, передаваемые методом POST. 294 | // ФорматДанныхДляОбработки: 0 - имя файла, 1 как строка, 2 - как двоичные данные. 295 | // Заголовки - заголовки запроса. 296 | ПараметрыПолучения = Новый Структура; 297 | ПараметрыПолучения.Вставить("ФорматОтвета" , 0); 298 | ПараметрыПолучения.Вставить("Метод" , "GET"); 299 | ПараметрыПолучения.Вставить("ДанныеДляОбработки" , Неопределено); 300 | ПараметрыПолучения.Вставить("ФорматДанныхДляОбработки", 0); 301 | ПараметрыПолучения.Вставить("Заголовки" , Неопределено); 302 | ПараметрыПолучения.Вставить("ИмяФайлаОтвета" , Неопределено); 303 | ПараметрыПолучения.Вставить("Таймаут" , -1); 304 | ПараметрыПолучения.Вставить("НастройкиПрокси" , Неопределено); 305 | 306 | Если ДопПараметры <> Неопределено Тогда 307 | ЗаполнитьЗначенияСвойств(ПараметрыПолучения, ДопПараметры); 308 | КонецЕсли; 309 | 310 | Если ПараметрыПолучения.Таймаут = -1 Тогда 311 | // Таймаут по умолчанию. 312 | ПараметрыПолучения.Таймаут = 30; 313 | КонецЕсли; 314 | 315 | Результат.ФорматОтвета = ПараметрыПолучения.ФорматОтвета; 316 | 317 | КоличествоПеренаправлений = 0; 318 | МаксКолвоПеренаправлений = 7; 319 | Перенаправления = Новый Массив; 320 | ВыполненныеПеренаправления = Новый Соответствие; 321 | ПроксиПоСхемам = Новый Соответствие; 322 | ЗащищенноеСоединениеКэш = Неопределено; 323 | 324 | URLДляПолучения = URL; 325 | HTTPЗапрос = Новый HTTPЗапрос; 326 | Если ПараметрыПолучения.Заголовки <> Неопределено Тогда 327 | HTTPЗапрос.Заголовки = ПараметрыПолучения.Заголовки; 328 | КонецЕсли; 329 | ТелоУстановлено = Ложь; 330 | Ответ = Неопределено; 331 | Пока КоличествоПеренаправлений < МаксКолвоПеренаправлений Цикл 332 | 333 | СтруктураURI = ОбщегоНазначенияКлиентСервер.СтруктураURI(URLДляПолучения); 334 | Если СтруктураURI.Схема <> "https" Тогда 335 | ЗащищенноеСоединение = Неопределено; 336 | Иначе 337 | Если ЗащищенноеСоединениеКэш = Неопределено Тогда 338 | ЗащищенноеСоединениеКэш = НовыйЗащищенноеСоединение(); 339 | КонецЕсли; 340 | ЗащищенноеСоединение = ЗащищенноеСоединениеКэш; 341 | КонецЕсли; 342 | 343 | Если НЕ ПустаяСтрока(СтруктураURI.Логин) Тогда 344 | ЛогинДляПолучения = СтруктураURI.Логин; 345 | ПарольДляПолучения = СтруктураURI.Пароль; 346 | Иначе 347 | ЛогинДляПолучения = Логин; 348 | ПарольДляПолучения = Пароль; 349 | КонецЕсли; 350 | 351 | Если СтруктураURI.Порт = Неопределено ИЛИ ПустаяСтрока(СтруктураURI.Порт) Тогда 352 | Порт = ?(ЗащищенноеСоединение = Неопределено, 80, 443); 353 | Иначе 354 | Порт = Число(СтруктураURI.Порт); 355 | КонецЕсли; 356 | 357 | // TODO: 358 | //Прокси = ПроксиПоСхемам.Получить(СтруктураURI.Схема); 359 | //Если Прокси = Неопределено Тогда 360 | // Если ПараметрыПолучения.НастройкиПрокси = Неопределено Тогда 361 | // Прокси = ПолучениеФайловИзИнтернетаКлиентСервер.ПолучитьПрокси(СтруктураURI.Схема); 362 | // Иначе 363 | // Прокси = СформироватьИнтернетПрокси(ПараметрыПолучения.НастройкиПрокси, СтруктураURI.Схема); 364 | // КонецЕсли; 365 | // ПроксиПоСхемам.Вставить(СтруктураURI.Схема, Прокси); 366 | //КонецЕсли; 367 | 368 | Соединение = Новый HTTPСоединение( 369 | СтруктураURI.Хост, 370 | Порт, 371 | ЛогинДляПолучения, 372 | ПарольДляПолучения, 373 | // TODO: 374 | //Прокси, 375 | , 376 | ПараметрыПолучения.Таймаут, 377 | ЗащищенноеСоединение); 378 | 379 | Попытка 380 | 381 | HTTPЗапрос.АдресРесурса = СтруктураURI.ПутьНаСервере; 382 | 383 | Если ПараметрыПолучения.Метод = "GET" Тогда 384 | Ответ = Соединение.Получить(HTTPЗапрос, ПараметрыПолучения.ИмяФайлаОтвета); 385 | ИначеЕсли ПараметрыПолучения.Метод = "HEAD" Тогда 386 | Ответ = Соединение.ПолучитьЗаголовки(HTTPЗапрос); 387 | Иначе 388 | 389 | Если НЕ ТелоУстановлено Тогда 390 | 391 | Если ПараметрыПолучения.ДанныеДляОбработки <> Неопределено Тогда 392 | 393 | Если ПараметрыПолучения.ФорматДанныхДляОбработки = 0 Тогда 394 | 395 | HTTPЗапрос.УстановитьИмяФайлаТела(ПараметрыПолучения.ДанныеДляОбработки); 396 | 397 | ИначеЕсли ПараметрыПолучения.ФорматДанныхДляОбработки = 1 Тогда 398 | 399 | HTTPЗапрос.УстановитьТелоИзСтроки(ПараметрыПолучения.ДанныеДляОбработки); 400 | 401 | Иначе 402 | 403 | HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ПараметрыПолучения.ДанныеДляОбработки); 404 | 405 | КонецЕсли; 406 | 407 | КонецЕсли; 408 | 409 | ТелоУстановлено = Истина; 410 | 411 | КонецЕсли; 412 | 413 | Если ПараметрыПолучения.Метод = "PUT" Тогда 414 | Ответ = Соединение.Записать(HTTPЗапрос); 415 | Иначе 416 | // POST 417 | Ответ = Соединение.ОтправитьДляОбработки(HTTPЗапрос, ПараметрыПолучения.ИмяФайлаОтвета); 418 | КонецЕсли; 419 | 420 | КонецЕсли; 421 | 422 | Исключение 423 | УстановитьОписаниеОшибки( 424 | Результат, 425 | "ConnectError", 426 | КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), 427 | СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( 428 | НСтр("ru = 'Не удалось загрузить содержимое (%1). %2'"), 429 | URL, 430 | ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())), 431 | Перенаправления); 432 | Возврат Результат; 433 | КонецПопытки; 434 | 435 | Результат.КодСостояния = Ответ.КодСостояния; 436 | 437 | Если Ответ.КодСостояния = 301 // 301 Moved Permanently 438 | ИЛИ Ответ.КодСостояния = 302 // 302 Found, 302 Moved Temporarily 439 | ИЛИ Ответ.КодСостояния = 303 // 303 See Other by GET 440 | ИЛИ Ответ.КодСостояния = 307 Тогда // 307 Temporary Redirect 441 | 442 | КоличествоПеренаправлений = КоличествоПеренаправлений + 1; 443 | 444 | Если КоличествоПеренаправлений > МаксКолвоПеренаправлений Тогда 445 | УстановитьОписаниеОшибки( 446 | Результат, 447 | "ServerError", 448 | НСтр("ru = 'Превышено количество перенаправлений.'"), 449 | СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( 450 | НСтр("ru = 'Ошибка сервера при получении файла (%1). Превышено количество перенаправлений (%2).'"), 451 | URL, 452 | МаксКолвоПеренаправлений), 453 | Перенаправления); 454 | Возврат Результат; 455 | Иначе 456 | Location = Ответ.Заголовки.Получить("Location"); 457 | Если Location = Неопределено Тогда 458 | УстановитьОписаниеОшибки( 459 | Результат, 460 | "ServerError", 461 | НСтр("ru = 'Некорректное перенаправление.'"), 462 | СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( 463 | НСтр("ru = 'Ошибка сервера (%1) при получении файла (%2). Некорректное перенаправление, отсутствует HTTP-заголовок ответа ""Location"".'"), 464 | Ответ.КодСостояния, 465 | URL), 466 | Перенаправления); 467 | Возврат Результат; 468 | Иначе 469 | Location = СокрЛП(Location); 470 | Если ПустаяСтрока(Location) Тогда 471 | УстановитьОписаниеОшибки( 472 | Результат, 473 | "ServerError", 474 | НСтр("ru = 'Некорректное перенаправление.'"), 475 | СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( 476 | НСтр("ru = 'Ошибка сервера (%1) при получении файла (%2). Некорректное перенаправление, пустой HTTP-заголовок ответа ""Location"".'"), 477 | Ответ.КодСостояния, 478 | URL), 479 | Перенаправления); 480 | Возврат Результат; 481 | КонецЕсли; 482 | 483 | Если ВыполненныеПеренаправления.Получить(Location) <> Неопределено Тогда 484 | УстановитьОписаниеОшибки( 485 | Результат, 486 | "ServerError", 487 | НСтр("ru = 'Циклическое перенаправление.'"), 488 | СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( 489 | НСтр("ru = 'Ошибка сервера (%1) при получении файла (%2). Циклическое перенаправление (%3).'"), 490 | Ответ.КодСостояния, 491 | URL, 492 | Location), 493 | Перенаправления); 494 | Возврат Результат; 495 | КонецЕсли; 496 | 497 | ВыполненныеПеренаправления.Вставить(Location, Истина); 498 | URLДляПолучения = Location; 499 | 500 | Перенаправления.Добавить(Строка(Ответ.КодСостояния) + ": " + Location); 501 | 502 | КонецЕсли; 503 | КонецЕсли; 504 | 505 | Иначе 506 | 507 | Прервать; 508 | 509 | КонецЕсли; 510 | 511 | КонецЦикла; 512 | 513 | Если ПараметрыПолучения.ФорматОтвета = 0 Тогда 514 | Результат.Содержимое = Ответ.ПолучитьИмяФайлаТела(); 515 | ИначеЕсли ПараметрыПолучения.ФорматОтвета = 1 Тогда 516 | Результат.Содержимое = Ответ.ПолучитьТелоКакСтроку(); 517 | ИначеЕсли ПараметрыПолучения.ФорматОтвета = 2 Тогда 518 | Результат.Содержимое = Ответ.ПолучитьТелоКакДвоичныеДанные(); 519 | Иначе 520 | Результат.Содержимое = Ответ; 521 | КонецЕсли; 522 | 523 | // Обработка ответа 524 | Если Ответ.КодСостояния < 200 Или Ответ.КодСостояния >= 300 Тогда 525 | 526 | // Анализ ошибки 527 | Если Ответ.КодСостояния = 407 Тогда 528 | 529 | // Ошибка подключения - не пройдена аутентификация на прокси-сервере. 530 | УстановитьОписаниеОшибки( 531 | Результат, 532 | "ConnectError", 533 | НСтр("ru = 'Ошибка аутентификации на прокси-сервере.'"), 534 | СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( 535 | НСтр("ru = 'Ошибка клиента (%1) при выполнении запроса к ресурсу (%2). 536 | |Тело ответа: %3'"), 537 | Ответ.КодСостояния, 538 | URL, 539 | Лев(Ответ.ПолучитьТелоКакСтроку(), 5120)), 540 | Перенаправления); 541 | 542 | ИначеЕсли Ответ.КодСостояния < 200 543 | ИЛИ Ответ.КодСостояния >= 300 544 | И Ответ.КодСостояния < 400 Тогда 545 | 546 | // Формат ответа сервера не поддерживается. 547 | УстановитьОписаниеОшибки( 548 | Результат, 549 | "ServerError", 550 | СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( 551 | НСтр("ru = 'Некорректный ответ сервера (%1).'"), 552 | Ответ.КодСостояния), 553 | СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( 554 | НСтр("ru = 'Ошибка сервера при получении файла (%1). Некорректный (неподдерживаемый) ответ (%2). 555 | |Тело ответа: %3'"), 556 | URL, 557 | Ответ.КодСостояния, 558 | Лев(Ответ.ПолучитьТелоКакСтроку(), 5120)), 559 | Перенаправления); 560 | 561 | ИначеЕсли Ответ.КодСостояния >= 400 И Ответ.КодСостояния < 500 Тогда 562 | 563 | // Ошибка клиентской части - некорректный запрос. 564 | УстановитьОписаниеОшибки( 565 | Результат, 566 | "ClientError", 567 | СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( 568 | НСтр("ru = 'Ошибка (%1) при выполнении запроса к ресурсу.'"), 569 | Строка(Ответ.КодСостояния)), 570 | СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( 571 | НСтр("ru = 'Ошибка клиента (%1) при выполнении запроса к ресурсу (%2). 572 | |Тело ответа: %3'"), 573 | Ответ.КодСостояния, 574 | URL, 575 | Лев(Ответ.ПолучитьТелоКакСтроку(), 5120)), 576 | Перенаправления); 577 | 578 | Иначе 579 | 580 | // Ошибка сервера - 5хх 581 | УстановитьОписаниеОшибки( 582 | Результат, 583 | "ServerError", 584 | СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( 585 | НСтр("ru = 'Код ошибки: %1.'"), 586 | Строка(Ответ.КодСостояния)), 587 | СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( 588 | НСтр("ru = 'Ошибка сервера (%1) при обработке запроса к ресурсу (%2). 589 | |Тело ответа: %3'"), 590 | Ответ.КодСостояния, 591 | URL, 592 | Лев(Ответ.ПолучитьТелоКакСтроку(), 5120)), 593 | Перенаправления); 594 | 595 | КонецЕсли; 596 | 597 | ДобавитьСписокПеренаправленийКИнформацииОбОшибке( 598 | Результат.ИнформацияОбОшибке, 599 | Перенаправления); 600 | 601 | КонецЕсли; 602 | 603 | Возврат Результат; 604 | 605 | КонецФункции 606 | 607 | #КонецЕсли -------------------------------------------------------------------------------- /src/CommonModules/ОбнРасшGit_СтроковыеФункции.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | ОбнРасшGit_СтроковыеФункции 6 | 7 | 8 | ru 9 | Строковые функции 10 | 11 | 12 | 13 | false 14 | false 15 | true 16 | false 17 | false 18 | false 19 | false 20 | DontUse 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/CommonModules/ОбнРасшGit_СтроковыеФункции/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 | Функция ПодставитьПараметрыВСтроку(Знач ШаблонСтроки, 2 | Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, 3 | Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, 4 | Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) Экспорт 5 | 6 | ЕстьПараметрыСПроцентом = СтрНайти(Параметр1, "%") 7 | Или СтрНайти(Параметр2, "%") 8 | Или СтрНайти(Параметр3, "%") 9 | Или СтрНайти(Параметр4, "%") 10 | Или СтрНайти(Параметр5, "%") 11 | Или СтрНайти(Параметр6, "%") 12 | Или СтрНайти(Параметр7, "%") 13 | Или СтрНайти(Параметр8, "%") 14 | Или СтрНайти(Параметр9, "%"); 15 | 16 | Если ЕстьПараметрыСПроцентом Тогда 17 | Возврат ПодставитьПараметрыСПроцентом(ШаблонСтроки, Параметр1, 18 | Параметр2, Параметр3, Параметр4, Параметр5, Параметр6, Параметр7, Параметр8, Параметр9); 19 | КонецЕсли; 20 | 21 | ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%1", Параметр1); 22 | ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%2", Параметр2); 23 | ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%3", Параметр3); 24 | ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%4", Параметр4); 25 | ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%5", Параметр5); 26 | ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%6", Параметр6); 27 | ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%7", Параметр7); 28 | ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%8", Параметр8); 29 | ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%9", Параметр9); 30 | Возврат ШаблонСтроки; 31 | 32 | КонецФункции 33 | 34 | Функция ПодставитьПараметрыСПроцентом(Знач СтрокаПодстановки, 35 | Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, 36 | Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, 37 | Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) 38 | 39 | Результат = ""; 40 | Позиция = СтрНайти(СтрокаПодстановки, "%"); 41 | Пока Позиция > 0 Цикл 42 | Результат = Результат + Лев(СтрокаПодстановки, Позиция - 1); 43 | СимволПослеПроцента = Сред(СтрокаПодстановки, Позиция + 1, 1); 44 | ПодставляемыйПараметр = Неопределено; 45 | Если СимволПослеПроцента = "1" Тогда 46 | ПодставляемыйПараметр = Параметр1; 47 | ИначеЕсли СимволПослеПроцента = "2" Тогда 48 | ПодставляемыйПараметр = Параметр2; 49 | ИначеЕсли СимволПослеПроцента = "3" Тогда 50 | ПодставляемыйПараметр = Параметр3; 51 | ИначеЕсли СимволПослеПроцента = "4" Тогда 52 | ПодставляемыйПараметр = Параметр4; 53 | ИначеЕсли СимволПослеПроцента = "5" Тогда 54 | ПодставляемыйПараметр = Параметр5; 55 | ИначеЕсли СимволПослеПроцента = "6" Тогда 56 | ПодставляемыйПараметр = Параметр6; 57 | ИначеЕсли СимволПослеПроцента = "7" Тогда 58 | ПодставляемыйПараметр = Параметр7 59 | ИначеЕсли СимволПослеПроцента = "8" Тогда 60 | ПодставляемыйПараметр = Параметр8; 61 | ИначеЕсли СимволПослеПроцента = "9" Тогда 62 | ПодставляемыйПараметр = Параметр9; 63 | КонецЕсли; 64 | Если ПодставляемыйПараметр = Неопределено Тогда 65 | Результат = Результат + "%"; 66 | СтрокаПодстановки = Сред(СтрокаПодстановки, Позиция + 1); 67 | Иначе 68 | Результат = Результат + ПодставляемыйПараметр; 69 | СтрокаПодстановки = Сред(СтрокаПодстановки, Позиция + 2); 70 | КонецЕсли; 71 | Позиция = СтрНайти(СтрокаПодстановки, "%"); 72 | КонецЦикла; 73 | Результат = Результат + СтрокаПодстановки; 74 | 75 | Возврат Результат; 76 | 77 | КонецФункции 78 | 79 | Функция ТолькоЦифрыВСтроке(Знач СтрокаПроверки, Знач УчитыватьЛидирующиеНули = Истина, Знач УчитыватьПробелы = Истина) Экспорт 80 | 81 | Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда 82 | Возврат Ложь; 83 | КонецЕсли; 84 | 85 | Если Не УчитыватьПробелы Тогда 86 | СтрокаПроверки = СтрЗаменить(СтрокаПроверки, " ", ""); 87 | КонецЕсли; 88 | 89 | Если ПустаяСтрока(СтрокаПроверки) Тогда 90 | Возврат Истина; 91 | КонецЕсли; 92 | 93 | Если Не УчитыватьЛидирующиеНули Тогда 94 | Позиция = 1; 95 | // Взятие символа за границей строки возвращает пустую строку. 96 | Пока Сред(СтрокаПроверки, Позиция, 1) = "0" Цикл 97 | Позиция = Позиция + 1; 98 | КонецЦикла; 99 | СтрокаПроверки = Сред(СтрокаПроверки, Позиция); 100 | КонецЕсли; 101 | 102 | // Если содержит только цифры, то в результате замен должна быть получена пустая строка. 103 | // Проверять при помощи ПустаяСтрока нельзя, так как в исходной строке могут быть пробельные символы. 104 | Возврат СтрДлина( 105 | СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( 106 | СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( 107 | СтрокаПроверки, "0", ""), "1", ""), "2", ""), "3", ""), "4", ""), "5", ""), "6", ""), "7", ""), "8", ""), "9", "") 108 | ) = 0; 109 | 110 | КонецФункции 111 | -------------------------------------------------------------------------------- /src/ConfigDumpInfo.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/Configuration.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 9cd510cd-abfc-11d4-9434-004095e12fc7 7 | aaca7fde-cf4c-4e6d-9879-ee0440dc9d8d 8 | 9 | 10 | 9fcd25a0-4822-11d4-9414-008048da11f9 11 | 50aecc21-263c-461d-8403-2797c2f6224c 12 | 13 | 14 | e3687481-0a87-462c-a166-9f34594f9bba 15 | bfe96b25-7b2b-4ecd-993d-c47a3ac830fc 16 | 17 | 18 | 9de14907-ec23-4a07-96f0-85521cb6b53b 19 | f16747b7-f4e5-4ee6-b2f7-9955a33ebf22 20 | 21 | 22 | 51f2d5d8-ea4d-4064-8892-82951750031e 23 | 00c9375b-415b-4fe4-be3f-0c0332e4c924 24 | 25 | 26 | e68182ea-4237-4383-967f-90c1e3370bc7 27 | 43786119-6e3e-45cb-8a64-be9f7b939036 28 | 29 | 30 | fb282519-d103-4dd3-bc12-cb271d631dfc 31 | 1c210b72-6f15-4e85-a90f-aabc9ee83e72 32 | 33 | 34 | 35 | ОбновлениеРасширенийСGit 36 | 37 | 38 | ru 39 | Обновление расширений с git 40 | 41 | 42 | 43 | AddOn 44 | Adopted 45 | true 46 | ОбнРасшGit_ 47 | Version8_3_11 48 | Russian 49 | MoveMyData.ru 50 | 1.0.0 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | Русский 59 | ОбнРасшGit_ОсновнаяРоль 60 | ОбнРасшGit_JSON 61 | ОбнРасшGit_Версии 62 | ОбнРасшGit_ОбщегоНазначения 63 | ОбнРасшGit_Расширения 64 | ОбнРасшGit_СтроковыеФункции 65 | ОбнРасшGit_Расширения 66 | 67 | 68 | -------------------------------------------------------------------------------- /src/Languages/Русский.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | Русский 7 | 8 | Adopted 9 | 42f28809-cd18-4f4f-a1f9-4612ce2f7fec 10 | ru 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/Roles/ОбнРасшGit_ОсновнаяРоль.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | ОбнРасшGit_ОсновнаяРоль 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/Roles/ОбнРасшGit_ОсновнаяРоль/Ext/Rights.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | true 4 | true 5 | false 6 | 7 | Catalog.ОбнРасшGit_Расширения 8 | 9 | Delete 10 | false 11 | 12 | 13 | InteractiveDelete 14 | false 15 | 16 | 17 | InteractiveDeleteMarked 18 | false 19 | 20 | 21 | InteractiveDeletePredefinedData 22 | false 23 | 24 | 25 | InteractiveDeleteMarkedPredefinedData 26 | false 27 | 28 | 29 | 30 | Configuration.ОбновлениеРасширенийСGit 31 | 32 | MainWindowModeNormal 33 | true 34 | 35 | 36 | MainWindowModeWorkplace 37 | true 38 | 39 | 40 | MainWindowModeEmbeddedWorkplace 41 | true 42 | 43 | 44 | MainWindowModeFullscreenWorkplace 45 | true 46 | 47 | 48 | MainWindowModeKiosk 49 | true 50 | 51 | 52 | AnalyticsSystemClient 53 | true 54 | 55 | 56 | --------------------------------------------------------------------------------