From b917fa1ece6da6c92dbfaaf3f5eb2037672b0101 Mon Sep 17 00:00:00 2001 From: Vladimir Ochakovskiy Date: Tue, 25 Apr 2023 19:35:11 +0700 Subject: [PATCH] =?UTF-8?q?=D0=90=D0=BA=D1=82=D1=83=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 90 - compileEpf.cmd | 2 - decompileEpf.cmd | 3 +- ...1\202\320\276\321\200\320\276\320\262.txt" | 4 +- {src/tests => plugins}/.gitkeep | 0 ...1\200\320\276\320\271\320\272\320\270.epf" | Bin 13523 -> 0 bytes ...1\202\321\200\320\276\320\272\320\270.epf" | Bin 7655 -> 0 bytes ...0\270\320\265\320\275\321\202\321\213.epf" | Bin 13048 -> 0 bytes replaceVA.cmd | 6 - ...1\200\320\260\321\206\320\270\320\270.xml" | 420 ----- .../Ext/ObjectModule.bsl" | 1629 ----------------- ...0\265\320\244\320\276\321\200\320\274.xml" | 22 - .../Ext/Form.bin" | Bin 2843 -> 0 bytes ...0\244\320\276\321\200\320\274\320\260.xml" | 22 - .../Ext/Form.xml" | 39 - .../Ext/Form/Module.bsl" | 1332 -------------- ...0\265\320\273\321\217\320\230\320\221.xml" | 16 - .../Ext/Template.xml" | 351 ---- ...1\200\321\204\320\265\320\271\321\201.xml" | 96 - ...0\244\320\276\321\200\320\274\320\260.xml" | 22 - .../Ext/Form.xml" | 133 -- .../Ext/Form/Module.bsl" | 679 ------- ...0\265\320\275\321\202\320\276\320\262.xml" | 62 - .../Ext/ObjectModule.bsl" | 309 ---- ...0\244\320\276\321\200\320\274\320\260.xml" | 22 - .../Ext/Form.xml" | 12 - .../Ext/Form/Module.bsl" | 176 -- ...0\276\320\262\320\241\320\232\320\224.xml" | 62 - .../Ext/ObjectModule.bsl" | 441 ----- ...0\244\320\276\321\200\320\274\320\260.xml" | 22 - .../Ext/Form.xml" | 12 - .../Ext/Form/Module.bsl" | 231 --- ...1\205\320\244\320\276\321\200\320\274.xml" | 61 - .../Ext/ObjectModule.bsl" | 448 ----- src/tools/.gitkeep | 0 ...1\201\321\202\320\260\320\274\320\270.xml" | 82 - ...0\244\320\276\321\200\320\274\320\260.xml" | 22 - .../Ext/Form.xml" | 1200 ------------ .../Ext/Form/Module.bsl" | 1581 ---------------- xddTestRunner.epf | Bin 106079 -> 0 bytes 40 files changed, 2 insertions(+), 9607 deletions(-) rename {src/tests => plugins}/.gitkeep (100%) delete mode 100644 "plugins/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.epf" delete mode 100644 "plugins/\320\237\320\260\321\200\321\201\320\265\321\200\320\232\320\276\320\274\320\260\320\275\320\264\320\275\320\276\320\271\320\241\321\202\321\200\320\276\320\272\320\270.epf" delete mode 100644 "plugins/\320\242\320\265\321\201\321\202\320\232\320\273\320\270\320\265\320\275\321\202\321\213.epf" delete mode 100644 replaceVA.cmd delete mode 100644 "src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.xml" delete mode 100644 "src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Ext/ObjectModule.bsl" delete mode 100644 "src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Forms/\320\237\320\276\320\273\321\203\321\207\320\265\320\275\320\270\320\265\320\244\320\276\321\200\320\274.xml" delete mode 100644 "src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Forms/\320\237\320\276\320\273\321\203\321\207\320\265\320\275\320\270\320\265\320\244\320\276\321\200\320\274/Ext/Form.bin" delete mode 100644 "src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Forms/\320\243\320\277\321\200\320\260\320\262\320\273\321\217\320\265\320\274\320\260\321\217\320\244\320\276\321\200\320\274\320\260.xml" delete mode 100644 "src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Forms/\320\243\320\277\321\200\320\260\320\262\320\273\321\217\320\265\320\274\320\260\321\217\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml" delete mode 100644 "src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Forms/\320\243\320\277\321\200\320\260\320\262\320\273\321\217\320\265\320\274\320\260\321\217\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" delete mode 100644 "src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Templates/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265\320\236\320\264\320\275\320\276\320\263\320\276\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\230\320\221.xml" delete mode 100644 "src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Templates/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265\320\236\320\264\320\275\320\276\320\263\320\276\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\230\320\221/Ext/Template.xml" delete mode 100644 "src/tests/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201.xml" delete mode 100644 "src/tests/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/Forms/\320\244\320\276\321\200\320\274\320\260.xml" delete mode 100644 "src/tests/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml" delete mode 100644 "src/tests/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" delete mode 100644 "src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262.xml" delete mode 100644 "src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/Ext/ObjectModule.bsl" delete mode 100644 "src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/Forms/\320\244\320\276\321\200\320\274\320\260.xml" delete mode 100644 "src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml" delete mode 100644 "src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" delete mode 100644 "src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224.xml" delete mode 100644 "src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/Ext/ObjectModule.bsl" delete mode 100644 "src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/Forms/\320\244\320\276\321\200\320\274\320\260.xml" delete mode 100644 "src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml" delete mode 100644 "src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" delete mode 100644 "src/tests/\321\202\320\265\321\201\321\202\321\213_\320\244\320\276\321\200\320\274\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\237\320\265\321\207\320\260\321\202\320\275\321\213\321\205\320\244\320\276\321\200\320\274/\321\202\320\265\321\201\321\202\321\213_\320\244\320\276\321\200\320\274\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\237\320\265\321\207\320\260\321\202\320\275\321\213\321\205\320\244\320\276\321\200\320\274.xml" delete mode 100644 "src/tests/\321\202\320\265\321\201\321\202\321\213_\320\244\320\276\321\200\320\274\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\237\320\265\321\207\320\260\321\202\320\275\321\213\321\205\320\244\320\276\321\200\320\274/\321\202\320\265\321\201\321\202\321\213_\320\244\320\276\321\200\320\274\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\237\320\265\321\207\320\260\321\202\320\275\321\213\321\205\320\244\320\276\321\200\320\274/Ext/ObjectModule.bsl" delete mode 100644 src/tools/.gitkeep delete mode 100644 "src/tools/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270.xml" delete mode 100644 "src/tools/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/Forms/\320\244\320\276\321\200\320\274\320\260.xml" delete mode 100644 "src/tools/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml" delete mode 100644 "src/tools/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" delete mode 100644 xddTestRunner.epf diff --git a/README.md b/README.md index ca5705b..6996b11 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,15 @@ # Дымовые тесты для 1С и вывод результата в отчет Allure -Сборка создана для инструмента Vanessa-ADD. - -Доработан инструмент по управлению дымовыми тестами, изменен ряд тестов. - Видео примеры: - VanessaADD. Дымовые тесты для 1С и вывод результата в отчет Allure. Проверяем доработки в расширение - VanessaRunner. Проверяем доработки после обновления с помощью внешней обработки [![telegram](https://img.shields.io/badge/telegram-chat-green.svg)](http://t.me/ovmst) -- [Цель](#цель) -- [Проблема](#проблема) - [Задача](#задача) - [Установка](#установка) - [Создание проекта](#создание-проекта) -- [Управление дымовыми тестами](#управление-дымовыми-тестами) - [Дымовые тесты](#дымовые-тесты) - - [Открытие/закрытие форм объектов метаданных](#открытие-форм) - - [Командный интерфейс](#командный-интерфейс) - - [Проведение документов](#проведение-документов) - - [Проверка макетов СКД](#проверка-макетов-скд) - - [Формирование печатных форм](#формирование-печатных-форм) - [Информация о поддержке метаданных](#информация-о-поддержке-метаданных) - [Групповая проверка доработок](#групповая-проверка-доработок) - [Синтаксическая проверка](#синтаксическая-проверка) @@ -29,24 +17,6 @@ - [Проверка кода](#проверка-кода) - [Дополнительные материалы](#доп-материалы) - - -## Цель - -Точечная настройка дымовых тестов. Возможность отобрать объекты для проверки, которые доработаны в расширениях. Сократить время тестирования доработок за счет точечной настройки дымовых тестов. - - - -## Проблема - -В Vanessa-ADD нет возможности автоматический отобрать объекты, доработанные в расширении для тестирования. Нужно руками помечать ненужные объекты в исключения. - -Представим. Есть среднестатистический 1С франчайзи с проектным отделом. В котором есть 4 консультанта и 4 программиста. Есть небольшие проекты и ряд небольших клиентов на постоянной поддержке. - -На таких проектах как правило делают небольшие доработки в расширение плюс внешние обработки и печатные формы. - -Как правило это происходит в самом начале, когда заходит клиент, и далее с ними работает консультант. В такой схеме консультант обновляет базы клиента. После обновления ему нужно протестировать доработки вручную и в случае проблемы с расширением привлекать программиста. - ## Задача @@ -77,21 +47,6 @@ При создании проекта сразу будут собраны обработки. -## Управление дымовыми тестами - - - -Добавлена команда `Исключить объекты, не используемые в расширение`. - -Доступны 4 вкладки: - -- `Открытие форм` - без изменений -- `Проведение и печатные формы` - добавленная. Задается количество документов для проведения, количество документов для проверки печатных форм. Добавляются в исключения нужные документы, отдельно для проведения и печатных форм -- `Макеты СКД` - добавленная. Можно добавить в исключения общий макет или объект, макеты которого не будут проверяться -- `Доп. настройки` - добавленная - - `Закрывать модальные окна` - официальное описание. В файл добавляется настройка из примера в описание - - `Тестирование командного интерфейса` - включить использование тестов командного интерфейса. В исключения по объектам попадают объекты, указанные на вкладке `Открытие форм` в группах `Существующие` - ## Дымовые тесты @@ -121,50 +76,6 @@ } } ``` - -### Открытие/закрытие форм объектов метаданных - - - -- официальное описание - -### Командный интерфейс - - - -- официальное описание - -### Проведение документов - - - -- официальное описание - -Доработано: - -- Объекты, которые находятся в исключениях, не выводятся в дерево тестов -- Адаптирован под новый формат тестов - -### Проверка макетов СКД - - - -- официальное описание - -Доработано: - -- Объекты, которые находятся в исключениях, не выводятся в дерево тестов -- Идентификация ошибок - -### Формирование печатных форм - - - -- официальное описание - -Доработано: - -- Объекты, которые находятся в исключениях, не выводятся в дерево тестов ## Информация о поддержке метаданных С помощью vanessa-support можно получить готовый json-файл для всех метаданных, которые могут быть изменены и не находятся в режиме чтения. Полученный файл можно использовать для групповой проверки доработок. @@ -285,7 +196,6 @@ ## Описание команд - `installVA.cmd` - обновление пакетов onescript, установка vanessa-runner, vanessa-add, vanessa-support -- `replaceVA.cmd` - собирает обработки из исходников и делает замену обработок xddTestRunner.epf (из ветки develop), УправлениеДымовымиТестами и плагинов (из ветки develop) в корне библиотеки vanessa-add - `runSyntax.cmd` - запуск синтаксической проверки - `runSmoke.cmd` - запуск дымовых тестов - `runAllure.cmd` - формирование отчета Allure. Предусмотрено сохранение истории diff --git a/compileEpf.cmd b/compileEpf.cmd index d455908..cf4f209 100644 --- a/compileEpf.cmd +++ b/compileEpf.cmd @@ -1,3 +1 @@ -call vrunner compileepf src/tools tools/epf/utils -call vrunner compileepf src/tests tests/smoke call vrunner compileepf src/epf tools/epf \ No newline at end of file diff --git a/decompileEpf.cmd b/decompileEpf.cmd index f7abc7c..b2124f1 100644 --- a/decompileEpf.cmd +++ b/decompileEpf.cmd @@ -1,4 +1,3 @@ @chcp 65001 -call vrunner decompileepf tools/epf/utils src/tools -call vrunner decompileepf tests/smoke src/tests + call vrunner decompileepf tools/epf src/epf diff --git "a/doc/\320\230\320\275\321\201\321\202\321\200\321\203\320\272\321\206\320\270\321\217 \320\277\320\276 \321\203\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\265 \320\264\320\273\321\217 \320\260\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\260\321\202\320\276\321\200\320\276\320\262.txt" "b/doc/\320\230\320\275\321\201\321\202\321\200\321\203\320\272\321\206\320\270\321\217 \320\277\320\276 \321\203\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\265 \320\264\320\273\321\217 \320\260\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\260\321\202\320\276\321\200\320\276\320\262.txt" index 0a6267f..b6484ae 100644 --- "a/doc/\320\230\320\275\321\201\321\202\321\200\321\203\320\272\321\206\320\270\321\217 \320\277\320\276 \321\203\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\265 \320\264\320\273\321\217 \320\260\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\260\321\202\320\276\321\200\320\276\320\262.txt" +++ "b/doc/\320\230\320\275\321\201\321\202\321\200\321\203\320\272\321\206\320\270\321\217 \320\277\320\276 \321\203\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\265 \320\264\320\273\321\217 \320\260\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\260\321\202\320\276\321\200\320\276\320\262.txt" @@ -33,7 +33,5 @@ Для проверки в командой строке: vrunner - opm install add -6) Выполнить команду replaceVA.cmd (проверьте пути в команде). Если через команду не хватит прав, выполните замену руками. - -7) Для пользователя под которым идет запуск тестов отключить защиту от опасных действий +6) Для пользователя под которым идет запуск тестов отключить защиту от опасных действий - Расположение обработки: C:\Program Files\OneScript\lib\add\xddTestRunner.epf (ваш путь может отличаться) diff --git a/src/tests/.gitkeep b/plugins/.gitkeep similarity index 100% rename from src/tests/.gitkeep rename to plugins/.gitkeep diff --git "a/plugins/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.epf" "b/plugins/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.epf" deleted file mode 100644 index 80f5fc7e470bee1e9282557e923ce676eb0e784a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13523 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 Ar2qf` diff --git "a/plugins/\320\237\320\260\321\200\321\201\320\265\321\200\320\232\320\276\320\274\320\260\320\275\320\264\320\275\320\276\320\271\320\241\321\202\321\200\320\276\320\272\320\270.epf" "b/plugins/\320\237\320\260\321\200\321\201\320\265\321\200\320\232\320\276\320\274\320\260\320\275\320\264\320\275\320\276\320\271\320\241\321\202\321\200\320\276\320\272\320\270.epf" deleted file mode 100644 index 67de8942e1ff12a67d94c47e4dab6217068d20fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7655 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 diff --git a/replaceVA.cmd b/replaceVA.cmd deleted file mode 100644 index bfdc655..0000000 --- a/replaceVA.cmd +++ /dev/null @@ -1,6 +0,0 @@ -@chcp 65001 -rem "Запускать под Администратором и изменить пути на свои" - -del tests\smoke\*.epf && del tools\epf\utils\*.epf -call compileEpf -xcopy /y /o /e "tools\epf\utils\*.*" "C:\Program Files\OneScript\lib\add\tools\epf\utils\*.*" && xcopy /y /o /e "xddTestRunner.epf" "C:\Program Files\OneScript\lib\add\" && xcopy /y /o /e "plugins\*.*" "C:\Program Files\OneScript\lib\add\plugins\*.*" \ No newline at end of file diff --git "a/src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.xml" "b/src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.xml" deleted file mode 100644 index 931e986..0000000 --- "a/src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.xml" +++ /dev/null @@ -1,420 +0,0 @@ - - - - - - c3831ec8-d8d5-4f93-8a22-f9bfae07327f - fb67d2f3-3c30-404c-ba27-8b210eae7978 - - - 370db9ea-cddc-4907-a50c-fc61e32c1cc7 - 8bb01ced-a2ee-426b-aef2-9a594e430f12 - - - - Тесты_ОткрытиеФормКонфигурации - - - ru - Тесты "Открытие форм конфигурации" - - - - ExternalDataProcessor.Тесты_ОткрытиеФормКонфигурации.Form.УправляемаяФорма - - - - - - мИменаОсновныхФорм - - - ru - Имена основных форм - - - - - false - - - - false - - false - false - - - DontCheck - Items - - - Auto - Auto - - - Auto - - - - - мИменаОсновныхФорм_Списки - - - ru - М имена основных форм списки - - - - - false - - - - false - - false - false - - - DontCheck - Items - - - Auto - Auto - - - Auto - - - - - мИменаОсновныхФорм_Объекты - - - ru - М имена основных форм объекты - - - - - false - - - - false - - false - false - - - DontCheck - Items - - - Auto - Auto - - - Auto - - - - - мПолучениеФорм - - - ru - М получение форм - - - - - false - - - - false - - false - false - - - DontCheck - Items - - - Auto - Auto - - - Auto - - - - - ВыводитьСообщенияВЖурналРегистрации - - - ru - Выводить сообщения в журнал регистрации - - - - - xs:boolean - - false - - - - false - - false - false - - - DontCheck - Items - - - Auto - Auto - - - Auto - - - - - Настройки - - - ru - Настройки - - - - - false - - - - false - - false - false - - - DontCheck - Items - - - Auto - Auto - - - Auto - - - - - ВидыМетаданных - - - ru - Виды метаданных - - - - - false - - - - false - - false - false - - - DontCheck - Items - - - Auto - Auto - - - Auto - - - - - ВидыПроверок - - - ru - Виды проверок - - - - - false - - - - false - - false - false - - - DontCheck - Items - - - Auto - Auto - - - Auto - - - - - ФормыОтключенныеЧерезФункциональныеОпции - - - ru - Формы, отключенные через функциональные опции - - - - - false - - - - false - - false - false - - - DontCheck - Items - - - Auto - Auto - - - Auto - - - - - СпособыГруппировки - - - ru - Способы группировки - - - - - false - - - - false - - false - false - - - DontCheck - Items - - - Auto - Auto - - - Auto - - - - - СписокПропускаемыхФорм - - - ru - Список пропускаемых форм - - - - - false - - - - false - - false - false - - - DontCheck - Items - - - Auto - Auto - - - Auto - - - - - ОткрываемФормыНаКлиентеТестирования - - - ru - Открываем формы на клиенте тестирования - - - - - xs:boolean - - false - - - - false - - false - false - - - DontCheck - Items - - - Auto - Auto - - - Auto - - -
ПолучениеФорм
-
УправляемаяФорма
- -
-
-
\ No newline at end of file diff --git "a/src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Ext/ObjectModule.bsl" "b/src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Ext/ObjectModule.bsl" deleted file mode 100644 index 2a84d4d..0000000 --- "a/src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Ext/ObjectModule.bsl" +++ /dev/null @@ -1,1629 +0,0 @@ -Перем КонтекстЯдра; -Перем Ожидаем; -Перем Утверждения; - -Перем ТестируемаяФорма; -Перем НужноИсключениеЕслиНеНайденоДокументов; - -#Область ИнтерфейсТестирования - -// директива препроцессора нужна для исключения ошибки загрузки в толстом клиенте управляемого приложения -#Если ТолстыйКлиентОбычноеПриложение Тогда - - Процедура Инициализация(КонтекстЯдраПараметр) Экспорт - - КонтекстЯдра = КонтекстЯдраПараметр; - Ожидаем = КонтекстЯдра.Плагин("УтвержденияBDD"); - Утверждения = КонтекстЯдра.Плагин("БазовыеУтверждения"); - - ЗагрузитьНастройки(); - - КонецПроцедуры - - Процедура ЗаполнитьНаборТестов(НаборТестов, КонтекстЯдраПараметр) Экспорт - - КонтекстЯдра = КонтекстЯдраПараметр; - - ВидыМетаданных = ВидыМетаданных(); - ВидыПроверок = ВидыПроверок(); - СпособыГруппировки = СпособыГруппировки(); - - ЗагрузитьНастройки(); - - НастройкаГруппировки = ПолучитьНастройкуГруппировки(Настройки); - - НужноИсключениеЕслиНеНайденоДокументов = Ложь; - - Если НЕ СоздатьФорму_ПолучениеФорм() Тогда - Возврат; - КонецЕсли; - - СоздатьИменаОсновныхФорм(); - - Если ВключенСтрогийПорядокВыполнения() Тогда - НаборТестов.СтрогийПорядокВыполнения(); - НаборТестов.ПродолжитьВыполнениеПослеПаденияТеста(); - КонецЕсли; - - Если НЕ ВидМетаданныхИсключенИзТестирования("Справочники") Тогда - ДобавитьТестыФормСправочников(НаборТестов, НастройкаГруппировки); - КонецЕсли; - - Если НЕ ВидМетаданныхИсключенИзТестирования("Документы") Тогда - ДобавитьТестыФормДокументов(НаборТестов, НастройкаГруппировки); - КонецЕсли; - - Если НЕ ВидМетаданныхИсключенИзТестирования("Обработки") Тогда - ДобавитьТестыФормОбработок(НаборТестов, НастройкаГруппировки); - КонецЕсли; - - Если НЕ ВидМетаданныхИсключенИзТестирования("Отчеты") Тогда - ДобавитьТестыФормОтчетов(НаборТестов, НастройкаГруппировки); - КонецЕсли; - - КонецПроцедуры - -#КонецЕсли - -#КонецОбласти - -#Область Тесты - -Процедура ПередЗапускомТеста() Экспорт - - НужноИсключениеЕслиНеНайденоДокументов = Ложь; - - СоздатьФорму_ПолучениеФорм(); - - НачатьТранзакцию(); - -КонецПроцедуры - -Процедура ПослеЗапускаТеста() Экспорт - - ЗакрытьФорму(); - - Если ТранзакцияАктивна() Тогда - ОтменитьТранзакцию(); - КонецЕсли; - -КонецПроцедуры - -Процедура ТестДолжен_ПропуститьТестФормы(Знач ПричинаПропускаТеста) Экспорт - КонтекстЯдра.ПропуститьТест(ПричинаПропускаТеста); -КонецПроцедуры - -Процедура Тест_ОткрытьФормуСуществующегоДокумента(МетаИмя,МетаФорма_ПолноеИмя,МетаФорма, ЕстьТранзакция) Экспорт - ИД = МетаИмя; - Док = ПолучитьСуществующийДокументОбъект(ИД, НужноИсключениеЕслиНеНайденоДокументов, "Тест_ОткрытьФормуСуществующегоДокумента"); - - Если Док <> Неопределено Тогда - ОткрытьФорму_ПоМетаФорме(МетаФорма_ПолноеИмя, МетаФорма.Имя, Док.Ссылка); - КонецЕсли; -КонецПроцедуры - -Процедура Тест_ПеренестиДокументНаТекущийДень_и_ОткрытьЕгоФорму(МетаИмя,МетаФорма_ПолноеИмя,МетаФорма, ЕстьТранзакция) Экспорт - ИД = МетаИмя; - Док = ПолучитьСуществующийДокументОбъект(ИД, Ложь, "Тест_ПеренестиДокументНаТекущийДень_и_ОткрытьЕгоФорму"); - Если Док = Неопределено Тогда - Возврат; - КонецЕсли; - - Док.Дата = ТекущаяДата(); - Док.ОбменДанными.Загрузка = Истина; - Док.Записать(); - - ОткрытьФорму_ПоМетаФорме(МетаФорма_ПолноеИмя, МетаФорма.Имя, Док.Ссылка); -КонецПроцедуры - -Процедура Тест_ОткрытьФормуНовогоДокумента(МетаИмя,МетаФорма_ПолноеИмя,МетаФорма, ЕстьТранзакция) Экспорт - - ИД = МетаИмя; - Док = Документы[ИД].СоздатьДокумент(); - Мета = Док.Метаданные(); - - Если НЕ ПравоДоступа("ИнтерактивноеДобавление", Мета) Тогда - Возврат; - КонецЕсли; - - Если Мета.ДлинаНомера <> 0 Тогда - Попытка - Док.УстановитьНовыйНомер(); - Исключение - КонецПопытки; - КонецЕсли; - - Если ЕстьНастройка("Документы.ЗначенияРеквизитовНовых." + Мета.Имя) Тогда - Для каждого Реквизит из Настройки.Документы.ЗначенияРеквизитовНовых[Мета.Имя] Цикл - Попытка - Док[Реквизит.Ключ] = ЗначениеРеквизита(Мета, Реквизит.Ключ, Реквизит.Значение); - Исключение - ВывестиСообщение(ОписаниеОшибки()); - КонецПопытки; - КонецЦикла; - КонецЕсли; - - ОткрытьФорму_ПоМетаФорме(МетаФорма_ПолноеИмя, МетаФорма.Имя, Док, Ложь); - -КонецПроцедуры - -Процедура Тест_ОткрытьФормуСуществующегоЭлементаСправочника(МетаИмя,МетаФорма_ПолноеИмя,МетаФорма, ЕстьТранзакция) Экспорт - ИД = МетаИмя; - - Элем = СоздатьЭлемент(ИД, "существующий"); - ОткрытьФорму_ПоМетаФорме(МетаФорма_ПолноеИмя, МетаФорма.Имя, Элем.Ссылка); -КонецПроцедуры - -Процедура Тест_ОткрытьФормуНовогоЭлементаСправочника(МетаИмя,МетаФорма_ПолноеИмя,МетаФорма, ЕстьТранзакция) Экспорт - - ИД = МетаИмя; - Элем = Справочники[ИД].СоздатьЭлемент(); - Мета = Элем.Метаданные(); - - Если НЕ ПравоДоступа("ИнтерактивноеДобавление", Мета) Тогда - Возврат; - КонецЕсли; - - Если Мета.ДлинаНаименования <> 0 Тогда - Попытка - Элем.Наименование = "новый"; - Исключение - КонецПопытки; - КонецЕсли; - - Если Мета.Владельцы.Количество() Тогда - Элем.Владелец = ПолучитьСсылкуНаВладельца(Мета, "Владелец для нового"); - КонецЕсли; - - ОткрытьФорму_ПоМетаФорме(МетаФорма_ПолноеИмя, МетаФорма.Имя, Элем, Ложь); - -КонецПроцедуры - -Процедура Тест_ОткрытьФормуНовогоЭлементаСправочникаСоздаваемогоКопированием(МетаИмя,МетаФорма_ПолноеИмя,МетаФорма, ЕстьТранзакция) Экспорт - ИД = МетаИмя; - Элем = СоздатьЭлемент(ИД, "копирование", "ИнтерактивноеДобавление"); - Если Элем = Неопределено Тогда - Возврат; - КонецЕсли; - - ОткрытьФорму_ПоМетаФорме(МетаФорма_ПолноеИмя, МетаФорма.Имя, Элем.Ссылка, Истина); -КонецПроцедуры - -#КонецОбласти - -#Область ПереопределениеИсключений - -// Переопределение исключений, чтобы не открывать формы. - -// Возвращаемое значение: -// СписокЗначений, Ложь - Ложь возвращается, если полностью исключается вид проверки -// -Функция ПолучитьСписокИсключений_Справочники_Списки() Экспорт - - Результат = ПолучитьИсключения(ВидыМетаданных.Справочники, ВидыПроверок.Списки); - Если ЗначениеЗаполнено(Результат) Или Результат = Ложь Тогда - Возврат Результат; - КонецЕсли; - - Результат = Новый СписокЗначений; - - // Пример Результат.Добавить("ирАлгоритмы"); - - Возврат Результат; -КонецФункции - -// Возвращаемое значение: -// СписокЗначений, Ложь - Ложь возвращается, если полностью исключается вид проверки -// -Функция ПолучитьСписокИсключений_Справочники_Существующие() Экспорт - - Результат = ПолучитьИсключения(ВидыМетаданных.Справочники, ВидыПроверок.Существующие); - Если ЗначениеЗаполнено(Результат) Или Результат = Ложь Тогда - Возврат Результат; - КонецЕсли; - - Результат = Новый СписокЗначений; - - // Пример Результат.Добавить("ирАлгоритмы"); - - Возврат Результат; -КонецФункции - -// Возвращаемое значение: -// СписокЗначений, Ложь - Ложь возвращается, если полностью исключается вид проверки -// -Функция ПолучитьСписокИсключений_Справочники_Новые() Экспорт - - Результат = ПолучитьИсключения(ВидыМетаданных.Справочники, ВидыПроверок.Новые); - Если ЗначениеЗаполнено(Результат) Или Результат = Ложь Тогда - Возврат Результат; - КонецЕсли; - - Результат = Новый СписокЗначений; - - // Пример Результат.Добавить("ирАлгоритмы"); - - Возврат Результат; -КонецФункции - -// Возвращаемое значение: -// СписокЗначений, Ложь - Ложь возвращается, если полностью исключается вид проверки -// -Функция ПолучитьСписокИсключений_Документы_Списки() Экспорт - - Результат = ПолучитьИсключения(ВидыМетаданных.Документы, ВидыПроверок.Списки); - Если ЗначениеЗаполнено(Результат) Или Результат = Ложь Тогда - Возврат Результат; - КонецЕсли; - - Результат = Новый СписокЗначений; - - // Пример Результат.Добавить("Штрафы"); - - Возврат Результат; -КонецФункции - -// Возвращаемое значение: -// СписокЗначений, Ложь - Ложь возвращается, если полностью исключается вид проверки -// -Функция ПолучитьСписокИсключений_Документы_Существующие() Экспорт - - Результат = ПолучитьИсключения(ВидыМетаданных.Документы, ВидыПроверок.Существующие); - Если ЗначениеЗаполнено(Результат) Или Результат = Ложь Тогда - Возврат Результат; - КонецЕсли; - - Результат = Новый СписокЗначений; - - // Пример Результат.Добавить("Штрафы"); - - Возврат Результат; -КонецФункции - -// Возвращаемое значение: -// СписокЗначений, Ложь - Ложь возвращается, если полностью исключается вид проверки -// -Функция ПолучитьСписокИсключений_Документы_ПеренестиДату() Экспорт - - Результат = ПолучитьИсключения(ВидыМетаданных.Документы, ВидыПроверок.ПеренестиДату); - Если ЗначениеЗаполнено(Результат) Или Результат = Ложь Тогда - Возврат Результат; - КонецЕсли; - - Результат = Новый СписокЗначений; - - // Пример Результат.Добавить("Штрафы"); - - Возврат Результат; -КонецФункции - -// Возвращаемое значение: -// СписокЗначений, Ложь - Ложь возвращается, если полностью исключается вид проверки -// -Функция ПолучитьСписокИсключений_Документы_Новые() Экспорт - - Результат = ПолучитьИсключения(ВидыМетаданных.Документы, ВидыПроверок.Новые); - Если ЗначениеЗаполнено(Результат) Или Результат = Ложь Тогда - Возврат Результат; - КонецЕсли; - - Результат = Новый СписокЗначений; - - // Пример Результат.Добавить("Штрафы"); - - Возврат Результат; -КонецФункции - -// Возвращаемое значение: -// СписокЗначений, Ложь - Ложь возвращается, если полностью исключается вид проверки -// -Функция ПолучитьСписокИсключений_Отчеты() Экспорт - - Результат = ПолучитьИсключения(ВидыМетаданных.Отчеты, ""); - Если ЗначениеЗаполнено(Результат) Или Результат = Ложь Тогда - Возврат Результат; - КонецЕсли; - - Результат = Новый СписокЗначений; - - // Пример Результат.Добавить("Цены"); - - Возврат Результат; -КонецФункции - -// Возвращаемое значение: -// СписокЗначений, Ложь - Ложь возвращается, если полностью исключается вид проверки -// -Функция ПолучитьСписокИсключений_Обработки() Экспорт - - Результат = ПолучитьИсключения(ВидыМетаданных.Обработки, ""); - Если ЗначениеЗаполнено(Результат) Или Результат = Ложь Тогда - Возврат Результат; - КонецЕсли; - - Результат = Новый СписокЗначений; - - //Результат.Добавить("ТестОбработка_Форма_ИсключениеПриОткрытии"); - - Возврат Результат; -КонецФункции - -// Получить список значений для исключения форм списков бизнес-процессов -// -// Возвращаемое значение: -// СписокЗначений, Ложь - ключ - это имя метаданного, Ложь возвращается, если полностью исключается вид проверки -// -Функция ПолучитьСписокИсключений_БизнесПроцессы_Списки() Экспорт - - Возврат ПолучитьИсключения(ВидыМетаданных.БизнесПроцессы, ВидыПроверок.Списки); - -КонецФункции - -// Получить список значений для исключения существующих бизнес-процессов -// -// Возвращаемое значение: -// СписокЗначений, Ложь - ключ - это имя метаданного, Ложь возвращается, если полностью исключается вид проверки -// -Функция ПолучитьСписокИсключений_БизнесПроцессы_Существующие() Экспорт - - Возврат ПолучитьИсключения(ВидыМетаданных.БизнесПроцессы, ВидыПроверок.Существующие); - -КонецФункции - -// Получить список значений для исключения новых бизнес-процессов -// -// Возвращаемое значение: -// СписокЗначений, Ложь - ключ - это имя метаданного, Ложь возвращается, если полностью исключается вид проверки -// -Функция ПолучитьСписокИсключений_БизнесПроцессы_Новые() Экспорт - - Возврат ПолучитьИсключения(ВидыМетаданных.БизнесПроцессы, ВидыПроверок.Новые); - -КонецФункции -#КонецОбласти - -#Область ФормированиеСпискаТестовыхСлучаев - -Процедура ДобавитьТестыФормСправочников(НаборТестов, НастройкаГруппировки) - - СтрогийПорядокВыполнения = ВключенСтрогийПорядокВыполнения(); - - Если НастройкаГруппировки.ГруппироватьПоВидуМетаданных Тогда - НаборТестов.НачатьГруппу("Справочники", СтрогийПорядокВыполнения); - КонецЕсли; - - СписокИсключений_Существующие = ПолучитьСписокИсключений_Справочники_Существующие(); - СписокИсключений_Новые = ПолучитьСписокИсключений_Справочники_Новые(); - СписокИсключений_Списки = ПолучитьСписокИсключений_Справочники_Списки(); - - Счетчик = 0; - - Для Каждого МетаОбъект Из Метаданные.Справочники Цикл - - Если НастройкаГруппировки.ГруппироватьПоКоличеству Тогда - Если Счетчик % НастройкаГруппировки.КоличествоВГруппе = 0 Тогда - ИмяГруппы = "Справочники (" + Строка(Счетчик + 1) + "..." + Строка(Счетчик + НастройкаГруппировки.КоличествоВГруппе) + ")"; - НаборТестов.НачатьГруппу(ИмяГруппы, СтрогийПорядокВыполнения); - КонецЕсли; - КонецЕсли; - - Если НастройкаГруппировки.ГруппироватьПоВидуОбъекта Тогда - НаборТестов.НачатьГруппу("Справочник." + МетаОбъект.Имя, СтрогийПорядокВыполнения); - КонецЕсли; - - Счетчик = Счетчик + 1; - - Если ПравоДоступа("Редактирование", МетаОбъект) Тогда - ДобавитьТестДляОдногоМетаданного_Объекты( - НаборТестов, - МетаОбъект, - "Тест_ОткрытьФормуСуществующегоЭлементаСправочника", - СписокИсключений_Существующие, - мИменаОсновныхФорм_Объекты, "Существующие элементы" - ); - КонецЕсли; - - Если ПравоДоступа("ИнтерактивноеДобавление", МетаОбъект) Тогда - ДобавитьТестДляОдногоМетаданного_Объекты( - НаборТестов, - МетаОбъект, - "Тест_ОткрытьФормуНовогоЭлементаСправочника", - СписокИсключений_Новые, - мИменаОсновныхФорм_Объекты, - "Новые элементы" - ); - КонецЕсли; - - Если ПравоДоступа("Добавление", МетаОбъект) Тогда - ДобавитьТестДляОдногоМетаданного_Объекты( - НаборТестов, - МетаОбъект, - "Тест_ОткрытьФормуНовогоЭлементаСправочникаСоздаваемогоКопированием", - СписокИсключений_Новые, - мИменаОсновныхФорм_Объекты, - "Новые через копирование элементы" - ); - КонецЕсли; - - ДобавитьТестДляМетаданного_ОдинОбъект( - НаборТестов, - МетаОбъект, - "ТестДолжен_ОткрытьФорму_ПоМетаФорме", - СписокИсключений_Списки, - мИменаОсновныхФорм_Списки - ); - - КонецЦикла; - -КонецПроцедуры - -Процедура ДобавитьТестыФормДокументов(НаборТестов, НастройкаГруппировки) - - СтрогийПорядокВыполнения = ВключенСтрогийПорядокВыполнения(); - - Если НастройкаГруппировки.ГруппироватьПоВидуМетаданных Тогда - НаборТестов.НачатьГруппу("Документы", СтрогийПорядокВыполнения); - КонецЕсли; - - СписокИсключений_Существующие = ПолучитьСписокИсключений_Документы_Существующие(); - СписокИсключений_Новые = ПолучитьСписокИсключений_Документы_Новые(); - СписокИсключений_Списки = ПолучитьСписокИсключений_Документы_Списки(); - СписокИсключений_ПеренестиДату = ПолучитьСписокИсключений_Документы_ПеренестиДату(); - - Счетчик = 0; - - Для Каждого МетаОбъект Из Метаданные.Документы Цикл - - Если НастройкаГруппировки.ГруппироватьПоКоличеству Тогда - Если Счетчик % НастройкаГруппировки.КоличествоВГруппе = 0 Тогда - ИмяГруппы = "Документы (" + Строка(Счетчик + 1) + "..." + Строка(Счетчик + НастройкаГруппировки.КоличествоВГруппе) + ")"; - НаборТестов.НачатьГруппу(ИмяГруппы, СтрогийПорядокВыполнения); - КонецЕсли; - КонецЕсли; - - Если НастройкаГруппировки.ГруппироватьПоВидуОбъекта Тогда - НаборТестов.НачатьГруппу("Документ." + МетаОбъект.Имя, СтрогийПорядокВыполнения); - КонецЕсли; - - Счетчик = Счетчик + 1; - - Если ПравоДоступа("Редактирование", МетаОбъект) Тогда - ДобавитьТестДляОдногоМетаданного_Объекты( - НаборТестов, - МетаОбъект, - "Тест_ОткрытьФормуСуществующегоДокумента", - СписокИсключений_Существующие, - мИменаОсновныхФорм_Объекты, - "Существующие документы" - ); - ДобавитьТестДляОдногоМетаданного_Объекты( - НаборТестов, - МетаОбъект, - "Тест_ПеренестиДокументНаТекущийДень_и_ОткрытьЕгоФорму", - СписокИсключений_ПеренестиДату, - мИменаОсновныхФорм_Объекты, - "Перенос документа на текущий день" - ); - КонецЕсли; - - Если ПравоДоступа("ИнтерактивноеДобавление", МетаОбъект) Тогда - ДобавитьТестДляОдногоМетаданного_Объекты( - НаборТестов, - МетаОбъект, - "Тест_ОткрытьФормуНовогоДокумента", - СписокИсключений_Новые, - мИменаОсновныхФорм_Объекты, - "Новые документы" - ); - КонецЕсли; - - ДобавитьТестДляМетаданного_ОдинОбъект( - НаборТестов, - МетаОбъект, - "ТестДолжен_ОткрытьФорму_ПоМетаФорме", - СписокИсключений_Списки, - мИменаОсновныхФорм_Списки - ); - - КонецЦикла; - -КонецПроцедуры - -Процедура ДобавитьТестыФормОбработок(НаборТестов, НастройкаГруппировки) - - Если НастройкаГруппировки.ГруппироватьПоВидуМетаданных Тогда - НаборТестов.НачатьГруппу("Обработки", ВключенСтрогийПорядокВыполнения()); - КонецЕсли; - - ДобавитьТестПоМенеджеруМетаданных( - НаборТестов, - Метаданные.Обработки, - "ТестДолжен_ОткрытьФорму_ПоМетаФорме", - ПолучитьСписокИсключений_Обработки(), - мИменаОсновныхФорм - ); - -КонецПроцедуры - -Процедура ДобавитьТестыФормОтчетов(НаборТестов, НастройкаГруппировки) - - Если НастройкаГруппировки.ГруппироватьПоВидуМетаданных Тогда - НаборТестов.НачатьГруппу("Отчеты", ВключенСтрогийПорядокВыполнения()); - КонецЕсли; - - ДобавитьТестПоМенеджеруМетаданных( - НаборТестов, - Метаданные.Отчеты, - "ТестДолжен_ОткрытьФорму_ПоМетаФорме", - ПолучитьСписокИсключений_Отчеты(), - мИменаОсновныхФорм - ); - -КонецПроцедуры - -Процедура ДобавитьТестПоМенеджеруМетаданных(НаборТестов, менеджерМетаданного, имяТеста, СписокИсключений, ИменаОсновныхФорм) - - НастройкаГруппировки = ПолучитьНастройкуГруппировки(Настройки); - СтрогийПорядокВыполнения = ВключенСтрогийПорядокВыполнения(); - - ЭтоОтчеты = (менеджерМетаданного = Метаданные.Отчеты); - - Счетчик = 0; - - Для Каждого МетаОбъект Из менеджерМетаданного Цикл - - Если НастройкаГруппировки.ГруппироватьПоКоличеству Тогда - Если Счетчик % НастройкаГруппировки.КоличествоВГруппе = 0 Тогда - ИмяГруппы = ?(ЭтоОтчеты, "Отчеты", "Обработки") + " (" + Строка(Счетчик + 1) + "..." + - Строка(Счетчик + НастройкаГруппировки.КоличествоВГруппе) + ")"; - НаборТестов.НачатьГруппу(ИмяГруппы, СтрогийПорядокВыполнения); - КонецЕсли; - КонецЕсли; - - Если НастройкаГруппировки.ГруппироватьПоВидуОбъекта Тогда - НаборТестов.НачатьГруппу(?(ЭтоОтчеты, "Отчет", "Обработка") + "." + МетаОбъект.Имя, СтрогийПорядокВыполнения); - КонецЕсли; - - Счетчик = Счетчик + 1; - - ДобавитьТестДляМетаданного_ОдинОбъект(НаборТестов, МетаОбъект, имяТеста, СписокИсключений, ИменаОсновныхФорм); - - КонецЦикла; - -КонецПроцедуры - -Процедура ДобавитьТестДляМетаданного_ОдинОбъект(НаборТестов, Знач МетаОбъект, Знач имяТеста, - Знач СписокИсключений, Знач ИменаОсновныхФорм) - ПрефиксПропускаемых = ""; - ПропускатьТест = Ложь; - - Если СписокИсключений = Ложь Или СписокИсключений.НайтиПоЗначению(МетаОбъект.Имя) <> Неопределено Тогда - ПропускатьТест = Истина; - ПрефиксПропускаемых = "объект находится в исключениях"; - - ИначеЕсли ЭтоУстаревшийМетаОбъектДляУдаления(МетаОбъект) Тогда - ПропускатьТест = Истина; - ПрефиксПропускаемых = "объект устарел"; - - ИначеЕсли Не ПравоДоступа("Просмотр", МетаОбъект) Тогда - ПропускатьТест = Истина; - ПрефиксПропускаемых = "нет прав интерактивного доступа у пользователя"; - КонецЕсли; - - Если ПропускатьТест Тогда - ПараметрыПропускаемогоТеста = НаборТестов.ПараметрыТеста(ПрефиксПропускаемых); - КонецЕсли; - - МетаФормы = ПолучитьМетаФормыОбъектаДляПроверки(МетаОбъект, ИменаОсновныхФорм); - - Для каждого МетаФорма Из МетаФормы Цикл - - МетаФорма_ПолноеИмя = МетаФорма.ПолноеИмя(); - - Если Метаданные.ОсновнаяФормаОтчета = МетаФорма Тогда - МетаФорма_ПолноеИмя = МетаОбъект.ПолноеИмя() + ".Форма"; - ИначеЕсли Метаданные.ОсновнаяФормаНастроекОтчета = МетаФорма Тогда - МетаФорма_ПолноеИмя = МетаОбъект.ПолноеИмя() + ".ФормаНастроек"; - КонецЕсли; - //МетаОбъект.Имя <Отчет1>, МетаФорма_ПолноеИмя <Отчет.Отчет1.Форма.ФормаОтчета> - //МетаОбъект.Имя <Отчет2>, МетаФорма_ПолноеИмя <Отчет.Отчет2.Форма> // в УФ ОбщаяФорма.ФормаОтчета - - ПредставлениеТеста = МетаФорма_ПолноеИмя; - ЕстьТранзакция = Истина; - - ПропускатьТестФормы = Ложь; - Если Не ПропускатьТест Тогда - // Проверим, нет ли конкретно самой формы в исключениях. - ОтносительныйПутьФормы = МетаОбъект.Имя + ".Форма." + МетаФорма.Имя; - Если СписокИсключений.НайтиПоЗначению(ОтносительныйПутьФормы) <> Неопределено Тогда - ПропускатьТестФормы = Истина; - ПрефиксПропускаемых = "форма находится в исключениях"; - ПараметрыПропускаемогоТеста = НаборТестов.ПараметрыТеста(ПрефиксПропускаемых); - КонецЕсли; - КонецЕсли; - - Если ПропускатьТест Или ПропускатьТестФормы Тогда - ПредставлениеТеста = ПрефиксПропускаемых + " : " + ПредставлениеТеста; - ПараметрыТеста = ПараметрыПропускаемогоТеста; - ВремИмяТеста = ИмяМетодаПропускаТестов(); - Иначе - ВремИмяТеста = имяТеста; - ПараметрыТеста = НаборТестов.ПараметрыТеста(МетаФорма_ПолноеИмя, ЕстьТранзакция, МетаОбъект); - КонецЕсли; - - НаборТестов.Добавить(ВремИмяТеста, ПараметрыТеста, ПредставлениеТеста); - - КонецЦикла; - -КонецПроцедуры - -Процедура ДобавитьТестДляОдногоМетаданного_Объекты( НаборТестов, Знач МетаОбъект, Знач имяТеста, - Знач СписокИсключений, Знач ИменаОсновныхФорм, - Знач ПрефиксПредставленияТеста) - ПрефиксПропускаемых = ""; - ПропускатьТест = Ложь; - - Если СписокИсключений = Ложь Или СписокИсключений.НайтиПоЗначению(МетаОбъект.Имя) <> Неопределено Тогда - ПропускатьТест = Истина; - ПрефиксПропускаемых = "объект находится в исключениях"; - - ИначеЕсли ЭтоУстаревшийМетаОбъектДляУдаления(МетаОбъект) Тогда - ПропускатьТест = Истина; - ПрефиксПропускаемых = "объект устарел"; - - ИначеЕсли Не (ПравоДоступа("Просмотр", МетаОбъект) и ПравоДоступа("Добавление", МетаОбъект)) Тогда - ПропускатьТест = Истина; - ПрефиксПропускаемых = "нет прав интерактивного доступа у пользователя"; - КонецЕсли; - - Если ПропускатьТест Тогда - ПрефиксПредставленияТеста = ПрефиксПредставленияТеста + " : " + ПрефиксПропускаемых; - ПараметрыПропускаемогоТеста = НаборТестов.ПараметрыТеста(ПрефиксПропускаемых); - КонецЕсли; - - МетаФормы = ПолучитьМетаФормыОбъектаДляПроверки(МетаОбъект, ИменаОсновныхФорм); - Для каждого МетаФорма Из МетаФормы Цикл - - МетаФорма_ПолноеИмя = МетаФорма.ПолноеИмя(); - ПредставлениеТеста = ПрефиксПредставленияТеста + " : " + МетаФорма_ПолноеИмя; - ЕстьТранзакция = Истина; - - ПропускатьТестФормы = Ложь; - Если Не ПропускатьТест Тогда - // Проверим, нет ли конкретно самой формы в исключениях. - ОтносительныйПутьФормы = МетаОбъект.Имя + ".Форма." + МетаФорма.Имя; - Если СписокИсключений.НайтиПоЗначению(ОтносительныйПутьФормы) <> Неопределено Тогда - ПропускатьТестФормы = Истина; - ПараметрыПропускаемогоТеста = НаборТестов.ПараметрыТеста("форма находится в исключениях"); - КонецЕсли; - КонецЕсли; - - Если ПропускатьТест Или ПропускатьТестФормы Тогда - ПараметрыТеста = ПараметрыПропускаемогоТеста; - ВремИмяТеста = ИмяМетодаПропускаТестов(); - Иначе - ПараметрыТеста = НаборТестов.ПараметрыТеста(МетаОбъект.Имя, МетаФорма_ПолноеИмя, МетаФорма, ЕстьТранзакция); - ВремИмяТеста = имяТеста; - КонецЕсли; - - НаборТестов.Добавить(ВремИмяТеста, ПараметрыТеста, ПредставлениеТеста); - - КонецЦикла; - -КонецПроцедуры - -#КонецОбласти - -#Область РаботаСФормами - -Процедура ЗакрытьФорму() - Если ТипЗнч(ТестируемаяФорма) <> Тип("Форма") и ТипЗнч(ТестируемаяФорма) <> Тип("УправляемаяФорма") Тогда - Возврат; - КонецЕсли; - ТестируемаяФорма.Модифицированность = Ложь; - Если ТестируемаяФорма.Открыта() Тогда - ТестируемаяФорма.Модифицированность = Ложь; - Попытка - ТестируемаяФорма.Закрыть(); - Исключение - Ошибка = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - Если ТранзакцияАктивна() Тогда - ОтменитьТранзакцию(); - КонецЕсли; - - НачатьТранзакцию(); - ТестируемаяФорма.УстановитьДействие("ПередЗакрытием", Неопределено); - ТестируемаяФорма.УстановитьДействие("ПриЗакрытии", Неопределено); - ТестируемаяФорма.Закрыть(); - ВызватьИсключение Ошибка; - КонецПопытки; - Иначе - Попытка - ТестируемаяФорма.Закрыть(); - Исключение - КонецПопытки; - КонецЕсли; - ТестируемаяФорма = ""; - -КонецПроцедуры - -Функция ЭтоОбычнаяФорма(Форма) - Возврат ТипЗнч(Форма) = Тип("Форма"); -КонецФункции - -// Портировано из подсистемы "Инструменты разработчика" - -Процедура ТестДолжен_ОткрытьФорму_ПоМетаФорме(МетаФорма_ПолноеИмя, ЕстьТранзакция=Ложь, МетаданныеВладельцаФормы=Неопределено) Экспорт - - ОткрытьФорму_ПоМетаФорме(МетаФорма_ПолноеИмя, "", Неопределено, Ложь, МетаданныеВладельцаФормы); - -КонецПроцедуры - -Процедура ОткрытьФорму_ПоМетаФорме(МетаФорма_ПолноеИмя, МетаФорма_Имя = "", СсылкаОбъектаИлиСамОбъект = Неопределено, СоздаватьОбъект = Ложь, МетаданныеВладельцаФормы=Неопределено) Экспорт - - ВыводитьСообщения = Ложь; - ВнешнийОбъект = Неопределено; - КлючВременнойФормы = "908насмь9ыв"; - - ИмяОперации = МетаФорма_ПолноеИмя; - - ВывестиСообщение("Операция: " + ИмяОперации, УровеньЖурналаРегистрации.Информация, ВыводитьСообщения); - - Форма = ПолучитьНовуюФорму(МетаФорма_ПолноеИмя, ВнешнийОбъект, КлючВременнойФормы); - Если Форма = Неопределено Тогда - Возврат; - КонецЕсли; - ЭтоФормаСсылочногоОбъекта = Ложь; - Если СсылкаОбъектаИлиСамОбъект <> Неопределено Тогда - ЭтоФормаСсылочногоОбъекта = Истина; - Иначе - Если ЭтоОбычнаяФорма(Форма) Тогда - Попытка - Пустышка = Форма.ЭтотОбъект.ЭтоНовый(); - ЭтоФормаСсылочногоОбъекта = Истина; - Исключение - КонецПопытки; - Иначе - Если Форма.Параметры.Свойство("Ключ") Тогда - Попытка - Пустышка = Форма.Параметры.Ключ.Ссылка; - ЭтоФормаСсылочногоОбъекта = Истина; - Исключение - КонецПопытки; - КонецЕсли; - КонецЕсли; - Если ЭтоФормаСсылочногоОбъекта Тогда - Если ЭтоОбычнаяФорма(Форма) Тогда - СсылкаОбъектаИлиСамОбъект = Форма.Ссылка; - Иначе - СсылкаОбъектаИлиСамОбъект = Форма.Параметры.Ключ; - КонецЕсли; - КонецЕсли; - КонецЕсли; - - Если ЭтоФормаСсылочногоОбъекта Тогда - Если ЭтоОбычнаяФорма(Форма) Тогда - Если СоздаватьОбъект Тогда - Если СсылкаОбъектаИлиСамОбъект <> Неопределено Тогда - СсылочныйОбъект = СсылкаОбъектаИлиСамОбъект.Скопировать(); - //Иначе - // СсылочныйОбъект = СсылкаОбъектаИлиСамОбъект.Метаданные; - КонецЕсли; - Иначе - СсылочныйОбъект = СсылкаОбъектаИлиСамОбъект; - КонецЕсли; - Форма = СсылочныйОбъект.ПолучитьФорму(МетаФорма_Имя, , КлючВременнойФормы); - Иначе - ПараметрыФормы = Новый Структура; - ЭтоОбъект = Ложь; - Попытка - Пустышка = СсылкаОбъектаИлиСамОбъект.ЭтотОбъект; - ЭтоОбъект = Истина; - Исключение - КонецПопытки; - Если СоздаватьОбъект Тогда - Если Не ЭтоОбъект Тогда - ПараметрыФормы.Вставить("ЗначениеКопирования", СсылкаОбъектаИлиСамОбъект); - КонецЕсли; - ИначеЕсли Не ЭтоОбъект Тогда - ПараметрыФормы.Вставить("Ключ", СсылкаОбъектаИлиСамОбъект); - КонецЕсли; - Форма = ПолучитьФормуЛкс(МетаФорма_ПолноеИмя, ПараметрыФормы, , КлючВременнойФормы); - КонецЕсли; - КонецЕсли; - - Если МетаданныеВладельцаФормы <> Неопределено И Метаданные.Справочники.Содержит(МетаданныеВладельцаФормы) Тогда - Если МетаданныеВладельцаФормы.Владельцы.Количество() Тогда - ВладелецСсылка = ПолучитьСсылкуНаВладельца(МетаданныеВладельцаФормы); - Попытка - Форма.ПараметрОтборПоВладельцу = ВладелецСсылка; - Исключение - КонецПопытки; - Попытка - Форма.ПараметрВыборПоВладельцу = ВладелецСсылка; - Исключение - КонецПопытки; - КонецЕсли; - КонецЕсли; - - ТестироватьФорму(Форма, ИмяОперации); - -КонецПроцедуры - -Процедура СоздатьИменаОсновныхФорм() Экспорт - Если Не ЗначениеЗаполнено(мИменаОсновныхФорм) Тогда - мИменаОсновныхФорм = Новый Массив(); - КонецЕсли; - СоздатьИменаОсновныхФорм_Объекты(); - СоздатьИменаОсновныхФормСписка(); - Если мИменаОсновныхФорм.Количество() = 0 Тогда - Для каждого эл Из мИменаОсновныхФорм_Объекты Цикл - мИменаОсновныхФорм.Добавить(эл); - КонецЦикла; - Для каждого эл Из мИменаОсновныхФорм_Списки Цикл - мИменаОсновныхФорм.Добавить(эл); - КонецЦикла; - КонецЕсли; -КонецПроцедуры - -Процедура СоздатьИменаОсновныхФорм_Объекты() - Если Не ЗначениеЗаполнено(мИменаОсновныхФорм_Объекты) Тогда - мИменаОсновныхФорм_Объекты = Новый Массив(); - КонецЕсли; - Если мИменаОсновныхФорм_Объекты.Количество() = 0 Тогда - мИменаОсновныхФорм_Объекты.Добавить("ОсновнаяФорма"); - мИменаОсновныхФорм_Объекты.Добавить("ОсновнаяФормаОбъекта"); - мИменаОсновныхФорм_Объекты.Добавить("ОсновнаяФормаГруппы"); - мИменаОсновныхФорм_Объекты.Добавить("ОсновнаяФормаЗаписи"); - мИменаОсновныхФорм_Объекты.Добавить("ОсновнаяФормаНастроек"); - мИменаОсновныхФорм_Объекты.Добавить("ОсновнаяФормаСохранения"); - мИменаОсновныхФорм_Объекты.Добавить("ОсновнаяФормаЗагрузки"); - - мИменаОсновныхФорм_Объекты.Добавить("ДополнительнаяФорма"); - мИменаОсновныхФорм_Объекты.Добавить("ДополнительнаяФормаОбъекта"); - мИменаОсновныхФорм_Объекты.Добавить("ДополнительнаяФормаГруппы"); - мИменаОсновныхФорм_Объекты.Добавить("ДополнительнаяФормаЗаписи"); - мИменаОсновныхФорм_Объекты.Добавить("ДополнительнаяФормаНастроек"); - мИменаОсновныхФорм_Объекты.Добавить("ДополнительнаяФормаСохранения"); - мИменаОсновныхФорм_Объекты.Добавить("ДополнительнаяФормаЗагрузки"); - КонецЕсли; -КонецПроцедуры - -Процедура СоздатьИменаОсновныхФормСписка() - Если Не ЗначениеЗаполнено(мИменаОсновныхФорм_Списки) Тогда - мИменаОсновныхФорм_Списки = Новый Массив(); - КонецЕсли; - - Если мИменаОсновныхФорм_Списки.Количество() = 0 Тогда - мИменаОсновныхФорм_Списки.Добавить("ОсновнаяФормаСписка"); - мИменаОсновныхФорм_Списки.Добавить("ОсновнаяФормаДляВыбора"); - мИменаОсновныхФорм_Списки.Добавить("ОсновнаяФормаДляВыбораГруппы"); - мИменаОсновныхФорм_Списки.Добавить("ОсновнаяФормаКонстант"); - - мИменаОсновныхФорм_Списки.Добавить("ДополнительнаяФормаСписка"); - мИменаОсновныхФорм_Списки.Добавить("ДополнительнаяФормаДляВыбора"); - мИменаОсновныхФорм_Списки.Добавить("ДополнительнаяФормаДляВыбораГруппы"); - мИменаОсновныхФорм_Списки.Добавить("ДополнительнаяФормаКонстант"); - КонецЕсли; -КонецПроцедуры - -Функция СоздатьФорму_ПолучениеФорм() - Попытка - мПолучениеФорм = ПолучитьФорму("ПолучениеФорм"); // в управляемом режиме здесь будет ошибка выполнения - Возврат Истина; - Исключение - КонецПопытки; - Возврат Ложь; -КонецФункции - -// Функция - Получить мета формы объекта для проверки -// -// Параметры: -// МетаОбъект - - -// ИменаОсновныхФорм - - -// -// Возвращаемое значение: -// Массив структур - с полями "Имя,МетаФорма", где "Имя" - это ИмяОсновнойФормы, "МетаФорма" - сама мета-форма -// -Функция ПолучитьМетаФормыОбъектаДляПроверки(МетаОбъект, ИменаОсновныхФорм) Экспорт - - ИспользоватьУФ = Метаданные.ИспользоватьУправляемыеФормыВОбычномПриложении ИЛИ (ТекущийРежимЗапуска() <> РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение); - МетаФормы = Новый Массив(); - - Для Каждого ИмяОсновнойФормы Из ИменаОсновныхФорм Цикл - Попытка - МетаФорма = МетаОбъект[ИмяОсновнойФормы]; - Исключение - Продолжить; - КонецПопытки; - Если МетаФорма = Неопределено Тогда - Продолжить; - КонецЕсли; - Если МетаФормы.Найти(МетаФорма) <> Неопределено Тогда - Продолжить; - КонецЕсли; - Если НЕ ИспользоватьУФ И МетаФорма.ТипФормы = Метаданные.СвойстваОбъектов.ТипФормы.Управляемая Тогда - Продолжить; - КонецЕсли; - МетаФормы.Добавить(МетаФорма); - КонецЦикла; - - Возврат МетаФормы; - -КонецФункции - -Функция ПолучитьФормуЛкс(ИмяФормы, Параметры = Неопределено, Владелец = Неопределено, Уникальность = Неопределено, Окно = Неопределено) Экспорт - - Возврат мПолучениеФорм.ПолучитьФормуЛкс(ИмяФормы, Параметры, Владелец, Уникальность, Окно); - -КонецФункции - -Функция ПолучитьНовуюФорму(МетаФорма, ВнешнийОбъект = Неопределено, КлючВременнойФормы = Неопределено) - - Форма = ПолучитьФормуЛкс(МетаФорма, , , КлючВременнойФормы); //ирНеглобальный. - Возврат Форма; - -КонецФункции - -Процедура ТестироватьФорму(Форма, ИмяОперации = "") Экспорт - ТестируемаяФорма = Форма; - Форма.Открыть(); // К сожалению здесь исключения не ловятся http://partners.v8.1c.ru/forum/thread.jsp?id=1080350#1080350 - Утверждения.Проверить(ТестируемаяФорма.Открыта(), "ТестируемаяФорма """+ИмяОперации+""" не открылась, а должна была открыться"); - - // Артур - мой код для доп.проверки формы - Если ЭтоОбычнаяФорма(ТестируемаяФорма) Тогда - ТестируемаяФорма.Обновить(); - Иначе - ТестируемаяФорма.ОбновитьОтображениеДанных(); - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - -#Область РаботаСНастройками - -Процедура ЗагрузитьНастройки() - - ПутьНастройки = "smoke"; - ПлагинНастроек = КонтекстЯдра.Плагин("Настройки"); - Настройки = ПлагинНастроек.ПолучитьНастройку(ПутьНастройки); - Если Не ЗначениеЗаполнено(Настройки) Тогда - Настройки = Новый Структура; - КонецЕсли; - - Если ЕстьНастройка("ВыводитьСообщенияВЖурналРегистрации") Тогда - ВыводитьСообщенияВЖурналРегистрации = Настройки.ВыводитьСообщенияВЖурналРегистрации; - Иначе - ВыводитьСообщенияВЖурналРегистрации = Истина; - КонецЕсли; - - НаборНастроекПоУмолчанию = СоздатьНаборНастроекПоУмолчанию(); - - ЗаменитьНесуществующиеНастройкиЗначениямиПоУмолчанию(Настройки, НаборНастроекПоУмолчанию); - -КонецПроцедуры - -Функция СоздатьНаборНастроекПоУмолчанию() Экспорт - - Рез = Новый Структура; - - //Рез.Вставить("ДобавлятьИмяПользователяВПредставлениеТеста", Ложь); - - Возврат Новый ФиксированнаяСтруктура(Рез); - -КонецФункции // () - -Процедура ЗаменитьНесуществующиеНастройкиЗначениямиПоУмолчанию(Знач Настройки, Знач НаборНастроекПоУмолчанию) - - Для каждого КлючЗначение Из НаборНастроекПоУмолчанию Цикл - Если Не ЕстьНастройка(КлючЗначение.Ключ) Тогда - Настройки.Вставить(КлючЗначение.Ключ, КлючЗначение.Значение); - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -// Функция - Получить исключения -// -// Параметры: -// ВидМетаданного - - -// ВидПроверки - - -// -// Возвращаемое значение: -// СписокЗначений, Ложь - ключ - это имя метаданного, Ложь возвращается, если полностью исключается вид проверки -// -Функция ПолучитьИсключения(Знач ВидМетаданного, Знач ВидПроверки) - Если Не ЗначениеЗаполнено(Настройки) Тогда - Возврат Новый СписокЗначений; - КонецЕсли; - Результат = Неопределено; - - Настройка = Неопределено; - ЕстьНастройка = Настройки.Свойство(ВидМетаданного, Настройка); - Если ЕстьНастройка Тогда - Если ТипЗнч(Настройка) = Тип("Массив") ИЛИ ВидПроверки = "" Или ТипЗнч(Настройка) = Тип("Булево") Тогда - МассивИсключений = Настройка; - Иначе - МассивИсключений = Неопределено; - Настройка.Свойство(ВидПроверки, МассивИсключений); - КонецЕсли; - Если ТипЗнч(МассивИсключений) = Тип("Массив") И ЗначениеЗаполнено(МассивИсключений) Тогда - Результат = Новый СписокЗначений; - Результат.ЗагрузитьЗначения(МассивИсключений); - ИначеЕсли МассивИсключений = Ложь Тогда - Результат = Ложь; - КонецЕсли; - КонецЕсли; - - ДобавитьИсключенияПоОтключеннымФункциональнымОпциям(ВидМетаданного, Результат); - - Если Не ЗначениеЗаполнено(Результат) И Результат <> Ложь Тогда - Результат = Новый СписокЗначений; - КонецЕсли; - Возврат Результат; -КонецФункции - -Процедура ДобавитьИсключенияПоОтключеннымФункциональнымОпциям(ВидМетаданного, СписокЗначений) - ИсключитьФормыЗависящиеОтОтключенныхФункциональныхОпций = Ложь; - ЕстьНастройка = Настройки.Свойство("ИсключитьФормыЗависящиеОтОтключенныхФункциональныхОпций", ИсключитьФормыЗависящиеОтОтключенныхФункциональныхОпций); - Если (ЕстьНастройка И Не ИсключитьФормыЗависящиеОтОтключенныхФункциональныхОпций) - ИЛИ (ТипЗнч(СписокЗначений) = Тип("Булево") И Не СписокЗначений) Тогда - - Возврат; - - КонецЕсли; - - Если Не ЗначениеЗаполнено(СписокЗначений) - Или ТипЗнч(СписокЗначений) = Тип("Булево") Тогда - СписокЗначений = Новый СписокЗначений; - КонецЕсли; - - Если ФормыОтключенныеЧерезФункциональныеОпции = Неопределено Тогда - ФормыОтключенныеЧерезФункциональныеОпции = Новый Структура; - КонецЕсли; - - Если Не ФормыОтключенныеЧерезФункциональныеОпции.Свойство(ВидМетаданного) Тогда - СписокМетаданныхФО = Новый СписокЗначений; - ФормыОтключенныеЧерезФункциональныеОпции.Вставить(ВидМетаданного, СписокМетаданныхФО); - - Для каждого ФО Из Метаданные.ФункциональныеОпции Цикл - Попытка - Значение = ПолучитьФункциональнуюОпцию(ФО.Имя); - Исключение - Продолжить; - КонецПопытки; - Если ТипЗнч(Значение) = Тип("Булево") И Не Значение Тогда - Для каждого СтрОбъект Из ФО.Состав Цикл - - Если СтрОбъект.Объект = Неопределено Тогда - Продолжить; - КонецЕсли; - - Если Метаданные[ВидМетаданного].Содержит(СтрОбъект.Объект) Тогда - СписокМетаданныхФО.Добавить(СтрОбъект.Объект.Имя); - КонецЕсли; - КонецЦикла; - КонецЕсли; - КонецЦикла; - КонецЕсли; - - СписокМетаданного = Неопределено; - Если ФормыОтключенныеЧерезФункциональныеОпции.Свойство(ВидМетаданного, СписокМетаданного) Тогда - - Для Каждого Элемент Из СписокМетаданного Цикл - МДИмяОбъекта = Элемент.Значение; - Если СписокЗначений.НайтиПоЗначению(МДИмяОбъекта) = Неопределено Тогда - СписокЗначений.Добавить(МДИмяОбъекта); - КонецЕсли; - КонецЦикла; - - КонецЕсли; - -КонецПроцедуры - -Функция ВидыМетаданных() Экспорт - Если ВидыМетаданных = Неопределено Тогда - ВидыМетаданных = Новый Структура; - ВидыМетаданных.Вставить("Справочники", "Справочники"); - ВидыМетаданных.Вставить("Документы", "Документы"); - ВидыМетаданных.Вставить("Обработки", "Обработки"); - ВидыМетаданных.Вставить("Отчеты", "Отчеты"); - ВидыМетаданных.Вставить("БизнесПроцессы", "БизнесПроцессы"); - ВидыМетаданных = Новый ФиксированнаяСтруктура(ВидыМетаданных); - КонецЕсли; - Возврат ВидыМетаданных; -КонецФункции - -Функция ВидыПроверок() Экспорт - Если ВидыПроверок = Неопределено Тогда - ВидыПроверок = Новый Структура; - ВидыПроверок.Вставить("Списки", "Списки"); - ВидыПроверок.Вставить("Существующие", "Существующие"); - ВидыПроверок.Вставить("Новые", "Новые"); - ВидыПроверок.Вставить("ПеренестиДату", "ПеренестиДату"); - ВидыПроверок = Новый ФиксированнаяСтруктура(ВидыПроверок); - КонецЕсли; - Возврат ВидыПроверок; -КонецФункции - -Функция КлючДляПропускаПоТекстуИсключения() - - Возврат "ПропускаемыеИсключения"; - -КонецФункции - -Функция ПолучитьНастройкуГруппировки(СтруктураНастроек) Экспорт - - Перем СпособГруппировки; - - НастройкаГруппировки = Новый Структура; - НастройкаГруппировки.Вставить("КоличествоВГруппе", 20); - - Если ЗначениеЗаполнено(СтруктураНастроек) Тогда - - Если ТипЗнч(СтруктураНастроек) = Тип("Структура") Тогда - СтруктураНастроек.Свойство("СпособГруппировки", СпособГруппировки); - СтруктураНастроек.Свойство("КоличествоВГруппе", НастройкаГруппировки.КоличествоВГруппе); - КонецЕсли; - - Если ТипЗнч(СпособГруппировки) <> Тип("Массив") Тогда - МассивСпособов = Новый Массив; - МассивСпособов.Добавить(СпособГруппировки); - СпособГруппировки = МассивСпособов; - КонецЕсли; - - НастройкаГруппировки.Вставить("ГруппироватьПоВидуМетаданных", СпособГруппировки.Найти(СпособыГруппировки.ПоВидуМетаданных) <> Неопределено); - НастройкаГруппировки.Вставить("ГруппироватьПоВидуОбъекта" , СпособГруппировки.Найти(СпособыГруппировки.ПоВидуОбъекта) <> Неопределено); - НастройкаГруппировки.Вставить("ГруппироватьПоКоличеству" , СпособГруппировки.Найти(СпособыГруппировки.ПоКоличеству) <> Неопределено); - - Иначе - НастройкаГруппировки.Вставить("ГруппироватьПоВидуМетаданных", Истина); - НастройкаГруппировки.Вставить("ГруппироватьПоВидуОбъекта" , Ложь); - НастройкаГруппировки.Вставить("ГруппироватьПоКоличеству" , Ложь); - КонецЕсли; - - Возврат НастройкаГруппировки; - -КонецФункции - -Функция СпособыГруппировки() Экспорт - Если СпособыГруппировки = Неопределено Тогда - СпособыГруппировки = Новый Структура; - СпособыГруппировки.Вставить("НеГруппировать", "НеГруппировать"); - СпособыГруппировки.Вставить("ПоВидуМетаданных", "ПоВидуМетаданных"); - СпособыГруппировки.Вставить("ПоВидуОбъекта", "ПоВидуОбъекта"); - СпособыГруппировки.Вставить("ПоКоличеству", "ПоКоличеству"); - СпособыГруппировки = Новый ФиксированнаяСтруктура(СпособыГруппировки); - КонецЕсли; - Возврат СпособыГруппировки; -КонецФункции - -// Позволяет одним вызовом получить значение из вложенных друг в друга структур -// по строке ключей, объединенных точкой. -// Пример: -// Структура = Новый Структура("Ключ1", Новый Структура("Ключ2", Новый Структура("Ключ3", 42))); -// РезультатПроверки = ЕстьНастройка("Ключ1.Ключ2.Ключ3", ВремЗнач); -// В результате получим ВремЗнач == 42 -// -Функция ЕстьНастройка(ПутьНастроек, СтруктураНастроек = Неопределено) - - // TODO: Метод нужно перенести в плагин "Настройки". - - Если СтруктураНастроек = Неопределено Тогда - СтруктураНастроек = Настройки; - КонецЕсли; - - Если ТипЗнч(СтруктураНастроек) = Тип("Структура") Тогда - - ПозТочки = Найти(ПутьНастроек, "."); - - Если ПозТочки = 0 Тогда - Возврат СтруктураНастроек.Свойство(ПутьНастроек); - Иначе - ИмяТекущегоСвойства = Лев(ПутьНастроек, ПозТочки - 1); - ОстатокПути = Сред(ПутьНастроек, ПозТочки + 1); - Если СтруктураНастроек.Свойство(ИмяТекущегоСвойства) Тогда - Возврат ЕстьНастройка(ОстатокПути, СтруктураНастроек[ИмяТекущегоСвойства]); - КонецЕсли; - КонецЕсли; - - КонецЕсли; - - Возврат Ложь; - -КонецФункции - -Функция ВключенСтрогийПорядокВыполнения() - Если ЕстьНастройка("СтрогийПорядокВыполнения", Настройки) И Настройки.СтрогийПорядокВыполнения = Ложь Тогда - Возврат Ложь; - КонецЕсли; - Возврат Истина; -КонецФункции - -// Функция - Пропускаем ошибку по тексту исключения -// -// Параметры: -// ТекстИсключения - - -// -// Возвращаемое значение: -// - -// -Функция ПропускаемОшибкуПоТекстуИсключения(Знач ТекстИсключения) Экспорт - - МассивТекстовИсключенийПоУмолчанию = Новый Массив; - МассивТекстовИсключенийПоУмолчанию.Добавить("Обработка не предназначена для непосредственного использования"); - - Если Не ЗначениеЗаполнено(Настройки) Тогда - МассивТекстовИсключений = МассивТекстовИсключенийПоУмолчанию; - Иначе - - Настройка = Неопределено; - ЕстьНастройка = Настройки.Свойство(КлючДляПропускаПоТекстуИсключения(), Настройка); - Если ЕстьНастройка Тогда - МассивТекстовИсключений = Неопределено; - Если ТипЗнч(Настройка) = Тип("Массив") Тогда - МассивТекстовИсключений = Настройка; - КонецЕсли; - Если Не ЗначениеЗаполнено(МассивТекстовИсключений) Тогда - МассивТекстовИсключений = МассивТекстовИсключенийПоУмолчанию; - Иначе - Для Каждого ОжидаемыйТекстИсключения Из МассивТекстовИсключенийПоУмолчанию Цикл - МассивТекстовИсключений.Добавить(ОжидаемыйТекстИсключения); - КонецЦикла; - КонецЕсли; - - КонецЕсли; - - КонецЕсли; - - Если ЗначениеЗаполнено(МассивТекстовИсключений) Тогда - - Для Каждого ОжидаемыйТекстИсключения Из МассивТекстовИсключений Цикл - Если Найти(ТекстИсключения, ОжидаемыйТекстИсключения) > 0 Тогда - Возврат Истина; - КонецЕсли; - КонецЦикла; - - КонецЕсли; - - Возврат Ложь; -КонецФункции - -#КонецОбласти - -#Область ПоискИСозданиеОбъектов - -Функция ПолучитьСуществующийДокументОбъект(ИД, НужноИсключениеЕслиНеНайденоДокументов, ДопОписаниеДляИсключения) - выборка = Документы[ИД].Выбрать(,,, "Дата Убыв"); - Успешно = выборка.Следующий(); - Если Не Успешно Тогда - Если НужноИсключениеЕслиНеНайденоДокументов Тогда - ВызватьИсключение - СтрШаблон_("%1: выборка.Следующий() - не найдено существующих документов %2! ", - ДопОписаниеДляИсключения, Ид); - Иначе - Возврат Неопределено; - КонецЕсли; - КонецЕсли; - Док = выборка.ПолучитьОбъект(); - Возврат Док; -КонецФункции - -Функция ПолучитьСуществующийДокументОбъектИВернутьСсылку(ИД, НужноИсключениеЕслиНеНайденоДокументов, ДопОписаниеДляИсключения) Экспорт - Док = ПолучитьСуществующийДокументОбъект(ИД, НужноИсключениеЕслиНеНайденоДокументов, ДопОписаниеДляИсключения); - Возврат ?(Док = Неопределено, Неопределено, Док.Ссылка); -КонецФункции - -Функция ПолучитьОбъектСуществующегоЭлементаСправочника(ИД, НужноИсключениеЕслиНеНайденоСправочников, - ДопОписаниеДляИсключения, Знач Отбор = Неопределено) - - Если Отбор = Неопределено Тогда - Отбор = Новый Структура; - КонецЕсли; - - выборка = ПолучитьРезультатЗапросаСуществующийЭлементСправочника(ИД, Отбор); - Успешно = выборка.Следующий(); - Если Не Успешно Тогда - Если НужноИсключениеЕслиНеНайденоСправочников Тогда - ВызватьИсключение - СтрШаблон_("%1: выборка.Следующий() - не найдено существующих элементов справочника %2! ", - ДопОписаниеДляИсключения, Ид); - Иначе - Возврат Неопределено; - КонецЕсли; - КонецЕсли; - Элем = выборка.Ссылка.ПолучитьОбъект(); - Возврат Элем; -КонецФункции - -Функция ПолучитьРезультатЗапросаСуществующийЭлементСправочника(ИД, Отбор) - - Запрос = Новый Запрос; - - ТекстЗапроса = - "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 - | ОбъектЗапроса.Ссылка - |ИЗ - | Справочник.%1 КАК ОбъектЗапроса"; - - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "%1", ИД); - - Если Отбор.Количество() <> 0 Тогда - ТекстЗапроса = ТекстЗапроса + Символы.ПС + " ГДЕ"; - Для каждого ЭлементОтбора Из Отбор Цикл - ТекстЗапроса = ТекстЗапроса + Символы.ПС + "ОбъектЗапроса." + ЭлементОтбора.Ключ + " = " + ЭлементОтбора.Значение; - КонецЦикла; - КонецЕсли; - - - - Запрос.Текст = ТекстЗапроса; - - РезультатЗапроса = Запрос.Выполнить().Выбрать(); - - Возврат РезультатЗапроса; - -КонецФункции - -Функция ПолучитьОбъектСуществующегоЭлементаСправочникаИВернутьСсылку(ИД, НужноИсключениеЕслиНеНайденоСправочников, - ДопОписаниеДляИсключения, Знач Отбор = Неопределено) Экспорт - - Элем = ПолучитьОбъектСуществующегоЭлементаСправочника(ИД, НужноИсключениеЕслиНеНайденоСправочников, - ДопОписаниеДляИсключения, Отбор); - Возврат ?(Элем = Неопределено, Неопределено, Элем.Ссылка); -КонецФункции - -Функция СоздатьЭлемент(ИД, Наименование, ПроверяемоеПравоДоступа = Неопределено) - - УстановитьПривилегированныйРежим(Истина); - - Если Метаданные.Справочники.Найти(ИД) <> Неопределено Тогда - Элем = Справочники[ИД].СоздатьЭлемент(); - ИначеЕсли Метаданные.ПланыВидовХарактеристик.Найти(ИД) <> Неопределено Тогда - Элем = ПланыВидовХарактеристик[ИД].СоздатьЭлемент(); - ИначеЕсли Метаданные.ПланыОбмена.Найти(ИД) <> Неопределено Тогда - Элем = ПланыОбмена[ИД].СоздатьУзел(); - Иначе - ВызватьИсключение СтрШаблон_(НСтр("ru = 'Не удалось найти объект метаданных по имени ""%1"".'"), ИД); - КонецЕсли; - Мета = Элем.Метаданные(); - - Если ПроверяемоеПравоДоступа <> Неопределено И НЕ ПравоДоступа(ПроверяемоеПравоДоступа, Мета) Тогда - Возврат Неопределено; - КонецЕсли; - - Если Мета.ДлинаНаименования <> 0 Тогда - Попытка - Элем.Наименование = Наименование; - Исключение - КонецПопытки; - КонецЕсли; - - Если Мета.ДлинаКода <> 0 Тогда - Элем.УстановитьНовыйКод(); - КонецЕсли; - - Если Метаданные.Справочники.Найти(Мета.Имя) <> Неопределено И Мета.Владельцы.Количество() Тогда - Элем.Владелец = ПолучитьСсылкуНаВладельца(Мета, "Владелец для: " + Наименование); - КонецЕсли; - - Если ЕстьНастройка("Справочники.ЗначенияРеквизитовНовых." + Мета.Имя) Тогда - Для каждого Реквизит из Настройки.Справочники.ЗначенияРеквизитовНовых[Мета.Имя] Цикл - Попытка - Элем[Реквизит.Ключ] = ЗначениеРеквизита(Мета, Реквизит.Ключ, Реквизит.Значение); - Исключение - ВывестиСообщение(ОписаниеОшибки(), УровеньЖурналаРегистрации.Предупреждение); - КонецПопытки; - КонецЦикла; - КонецЕсли; - - Элем.ОбменДанными.Загрузка = Истина; - Элем.Записать(); - - Возврат Элем; - -КонецФункции - -Функция СоздатьЭлементИВернутьСсылку(ИД, Наименование, ПроверяемоеПравоДоступа = Неопределено) Экспорт - Элем = СоздатьЭлемент(ИД, Наименование, ПроверяемоеПравоДоступа); - Возврат ?(Элем = Неопределено, Неопределено, Элем.Ссылка); -КонецФункции - -Функция ПолучитьМетаданныеВладельца(КоллекцияМетаданныхВладельцев, Индекс=0) - Счетчик = 0; - Для каждого Элемент из КоллекцияМетаданныхВладельцев Цикл - Если Счетчик = Индекс Тогда - Возврат Элемент; - КонецЕсли; - Счетчик = Счетчик + 1; - КонецЦикла; - ВызватьИсключение "Индекс за границей диапазона"; -КонецФункции - -Функция ПолучитьСсылкуНаВладельца(МетаданныеПодчиненного, НаименованиеПодчиненного="Элемент-владелец") - - МетаИмяВладельца = Неопределено; - - Если ЕстьНастройка("Справочники.Подчиненные") Тогда - Настройки.Справочники.Подчиненные.Свойство(МетаданныеПодчиненного.Имя, МетаИмяВладельца); - КонецЕсли; - - Если МетаИмяВладельца = Неопределено Тогда - МетаИмяВладельца = ПолучитьМетаданныеВладельца(МетаданныеПодчиненного.Владельцы).Имя; - КонецЕсли; - - Возврат СоздатьЭлементИВернутьСсылку(МетаИмяВладельца, НаименованиеПодчиненного); - -КонецФункции - -// Получить объект существующего бизнес-процесса и вернуть ссылку на объект -// -// Параметры: -// ИД - Строка - Имя бизнес-процесса -// НужноИсключениеЕслиНеНайденоБизнесПроцессов - Булево - Флаг выброса исключений -// ДопОписаниеДляИсключения - Строка - доп.текст исключения -// Отбор - Структура - Структура, в которой ключ - это имя реквизита бП, а значение - это значение реквизита отбора -// -// Возвращаемое значение: -// БизнесПроцессы.Ссылка, Неопределено - Найденный БП или Неопределено -// -Функция ПолучитьОбъектСуществующегоБизнесПроцессаИВернутьСсылку(ИД, НужноИсключениеЕслиНеНайденоБизнесПроцессов, - ДопОписаниеДляИсключения, Знач Отбор = Неопределено) Экспорт - - Элем = ПолучитьОбъектСуществующегоБизнесПроцесса(ИД, НужноИсключениеЕслиНеНайденоБизнесПроцессов, - ДопОписаниеДляИсключения, Отбор); - Возврат ?(Элем = Неопределено, Неопределено, Элем.Ссылка); -КонецФункции - -Функция ПолучитьОбъектСуществующегоБизнесПроцесса(ИД, НужноИсключениеЕслиНеНайденоБизнесПроцессов, - ДопОписаниеДляИсключения, Знач Отбор = Неопределено) - - Если Отбор = Неопределено Тогда - Отбор = Новый Структура; - КонецЕсли; - - Выборка = БизнесПроцессы[ИД].Выбрать(,, Отбор); - Успешно = Выборка.Следующий(); - Если Не Успешно Тогда - Если НужноИсключениеЕслиНеНайденоБизнесПроцессов Тогда - ВызватьИсключение - СтрШаблон_("%1: выборка.Следующий() - не найдено существующих бизнес процессов %2! ", - ДопОписаниеДляИсключения, Ид); - Иначе - Возврат Неопределено; - КонецЕсли; - КонецЕсли; - Элем = Выборка.ПолучитьОбъект(); - Возврат Элем; -КонецФункции - -Функция СоздатьБизнесПроцесс(ИД, ПроверяемоеПравоДоступа = Неопределено) - - Элем = БизнесПроцессы[ИД].СоздатьБизнесПроцесс(); - Мета = Элем.Метаданные(); - - Если ПроверяемоеПравоДоступа <> Неопределено И НЕ ПравоДоступа(ПроверяемоеПравоДоступа, Мета) Тогда - Возврат Неопределено; - КонецЕсли; - - Если Мета.ДлинаНомера <> 0 Тогда - Элем.УстановитьНовыйНомер(); - КонецЕсли; - - Элем.Дата = ТекущаяДата(); - - Если ЕстьНастройка("БизнесПроцессы.ЗначенияРеквизитовНовых." + Мета.Имя) Тогда - Для каждого Реквизит Из Настройки.БизнесПроцессы.ЗначенияРеквизитовНовых[Мета.Имя] Цикл - Попытка - Элем[Реквизит.Ключ] = ЗначениеРеквизита(Мета, Реквизит.Ключ, Реквизит.Значение); - Исключение - ВывестиСообщение(ОписаниеОшибки(), УровеньЖурналаРегистрации.Предупреждение); - КонецПопытки; - КонецЦикла; - КонецЕсли; - - Элем.ОбменДанными.Загрузка = Истина; - Элем.Записать(); - - Возврат Элем; - -КонецФункции - -// Создать новый БП и вернуть ссылку на него -// -// Параметры: -// ИД - Строка - Вид БП -// ПроверяемоеПравоДоступа - Строка - имя права доступа -// -// Возвращаемое значение: -// БизнесПроцесс.Ссылка, Неопределено - полученная ссылка или Неопределено -// -Функция СоздатьБизнесПроцессИВернутьСсылку(ИД, ПроверяемоеПравоДоступа = Неопределено) Экспорт - Элем = СоздатьБизнесПроцесс(ИД, ПроверяемоеПравоДоступа); - Возврат ?(Элем = Неопределено, Неопределено, Элем.Ссылка); -КонецФункции -#КонецОбласти - -#Область ВспомогательныеМетоды - -Функция ИмяМетодаПропускаТестов() - Возврат "ТестДолжен_ПропуститьТестФормы"; -КонецФункции - -Функция ЭтоУстаревшийМетаОбъектДляУдаления(МетаОбъект) Экспорт - Возврат Найти(НРег(МетаОбъект.Имя), НРег("Удалить")) = 1; -КонецФункции - -Функция ВидМетаданныхИсключенИзТестирования(ВидМетаданных) - Если ЕстьНастройка(ВидМетаданных) Тогда - Возврат (ТипЗнч(Настройки[ВидМетаданных]) = Тип("Булево") И НЕ Настройки[ВидМетаданных]); - КонецЕсли; - Возврат Ложь; -КонецФункции - -Функция ЗначениеРеквизита(МетаданныеОбъекта, ИмяРеквизита, ЗначениеРеквизитаИзФайла) - - ТипРеквизита = МетаданныеОбъекта.Реквизиты[ИмяРеквизита].Тип.Типы()[0]; - - Если ЭтоПримитивныйТипДанных(ТипРеквизита) Тогда - Возврат МетаданныеОбъекта.Реквизиты[ИмяРеквизита].Тип.ПривестиЗначение(ЗначениеРеквизитаИзФайла); - КонецЕсли; - - // Значит, это ссылочный тип данных. - Попытка - МетаданныеЗначения = Метаданные.НайтиПоТипу(ТипРеквизита); - Если Метаданные.Справочники.Содержит(МетаданныеЗначения) Тогда - Возврат СоздатьЭлементИВернутьСсылку(МетаданныеЗначения.Имя, ЗначениеРеквизитаИзФайла); - ИначеЕсли Метаданные.Перечисления.Содержит(МетаданныеЗначения) Тогда - Возврат Перечисления[МетаданныеЗначения.Имя][ЗначениеРеквизитаИзФайла]; - КонецЕсли; - // TODO: поддержку документов и других ссылочных типов данных (добавим по необходимости) - Исключение - КонецПопытки; - - Возврат Неопределено; - -КонецФункции - -Функция ЭтоПримитивныйТипДанных(Тип) - Возврат Тип = Тип("Строка") Или Тип = Тип("Число") - Или Тип = Тип("Дата") Или Тип = Тип("Булево"); -КонецФункции - -Процедура ВывестиСообщение(ТекстСообщения, Знач УровеньЖР=Неопределено, Сообщать=Ложь) - - Если Сообщать Тогда - Сообщить(ТекстСообщения, ?(УровеньЖР = УровеньЖурналаРегистрации.Ошибка, СтатусСообщения.ОченьВажное, СтатусСообщения.Обычное)); - КонецЕсли; - - Если ВыводитьСообщенияВЖурналРегистрации Тогда - Если УровеньЖР = Неопределено Тогда - УровеньЖР = УровеньЖурналаРегистрации.Информация; - КонецЕсли; - ЗаписьЖурналаРегистрации(Метаданные().Синоним, УровеньЖР, , , ТекстСообщения); - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - -Функция СтрШаблон_(Знач СтрокаШаблон, Знач Парам1 = Неопределено, Знач Парам2 = Неопределено, Знач Парам3 = Неопределено, Знач Парам4 = Неопределено, Знач Парам5 = Неопределено) Экспорт - - МассивПараметров = Новый Массив; - МассивПараметров.Добавить(Парам1); - МассивПараметров.Добавить(Парам2); - МассивПараметров.Добавить(Парам3); - МассивПараметров.Добавить(Парам4); - МассивПараметров.Добавить(Парам5); - - Для Сч = 1 По МассивПараметров.Количество() Цикл - ТекЗначение = МассивПараметров[Сч-1]; - СтрокаШаблон = СтрЗаменить(СтрокаШаблон, "%"+Сч, Строка(ТекЗначение)); - КонецЦикла; - - Возврат СтрокаШаблон; - -КонецФункции - -СписокПропускаемыхФорм = Новый СписокЗначений; diff --git "a/src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Forms/\320\237\320\276\320\273\321\203\321\207\320\265\320\275\320\270\320\265\320\244\320\276\321\200\320\274.xml" "b/src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Forms/\320\237\320\276\320\273\321\203\321\207\320\265\320\275\320\270\320\265\320\244\320\276\321\200\320\274.xml" deleted file mode 100644 index 4dd6a79..0000000 --- "a/src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Forms/\320\237\320\276\320\273\321\203\321\207\320\265\320\275\320\270\320\265\320\244\320\276\321\200\320\274.xml" +++ /dev/null @@ -1,22 +0,0 @@ - - -
- - ПолучениеФорм - - - ru - Получение форм - - - - Ordinary - false - - PlatformApplication - MobilePlatformApplication - - - -
-
\ No newline at end of file diff --git "a/src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Forms/\320\237\320\276\320\273\321\203\321\207\320\265\320\275\320\270\320\265\320\244\320\276\321\200\320\274/Ext/Form.bin" "b/src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Forms/\320\237\320\276\320\273\321\203\321\207\320\265\320\275\320\270\320\265\320\244\320\276\321\200\320\274/Ext/Form.bin" deleted file mode 100644 index b248d2417a9e682f5409ed34c8224a2278c99913..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2843 zcmeHJ&1xGl5MBa3#Nc;Wd`e(NC9U?4(o-LzXM1g*nic{%1=GYS>A`_OPobqrOLHx3 zN=;0DoL7*JeTw!C+;60{V>{R>fnG{&$2*edoB3wu+jT~x(Q9wTqmO-6E8Mf5X2 z+)vu>H+!%PU!Ukc z3~cCQ)72Md$MkR=VCQPhZRtXv2fqG{?LuF}v4B$-R$&hHu|A_X`V4Ua*Ts6ZvU-d2 zpZfa9?AnL`JOPLIdI)SEEauplUbTYrQ?rNj3!D$kA@LjPOOSnwW!D_&QzY8aS8)0O zr`TKoDE>uWuP`#abL%CdWAf4TD)fCf}2 zNF7iBD$X1%2OR?d*CkHtzWz$(=o>1}bkRiW<0p_hN2$m~-8Wqdv9Ke5)Qh_XV`o8C zI4P;GV{)tL)KH)6Z`52+xyz26W+pr}OFf|JmO_u}ky9xdvnt(|Nl>k9i3qUH8r5(u#bDPW{G zEugVGRPNUUgh$$QZL`(MfO_jTY|CvcX_qu(Q@XU^Cj%KdZ&DN|pVC{{kqIbqvJVAJ z^c_S&ToyN@EOL$#!q_-`tR-j27zz&+Xb=^JcLFVESs*$1DrGUC#ROFZV?K)ePlz+R z&V7|fc5@Bjb+ diff --git "a/src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Forms/\320\243\320\277\321\200\320\260\320\262\320\273\321\217\320\265\320\274\320\260\321\217\320\244\320\276\321\200\320\274\320\260.xml" "b/src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Forms/\320\243\320\277\321\200\320\260\320\262\320\273\321\217\320\265\320\274\320\260\321\217\320\244\320\276\321\200\320\274\320\260.xml" deleted file mode 100644 index 74a7ea8..0000000 --- "a/src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Forms/\320\243\320\277\321\200\320\260\320\262\320\273\321\217\320\265\320\274\320\260\321\217\320\244\320\276\321\200\320\274\320\260.xml" +++ /dev/null @@ -1,22 +0,0 @@ - - -
- - УправляемаяФорма - - - ru - Управляемая форма - - - - Managed - false - - PlatformApplication - MobilePlatformApplication - - - -
-
\ No newline at end of file diff --git "a/src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Forms/\320\243\320\277\321\200\320\260\320\262\320\273\321\217\320\265\320\274\320\260\321\217\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml" "b/src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Forms/\320\243\320\277\321\200\320\260\320\262\320\273\321\217\320\265\320\274\320\260\321\217\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml" deleted file mode 100644 index d38433a..0000000 --- "a/src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Forms/\320\243\320\277\321\200\320\260\320\262\320\273\321\217\320\265\320\274\320\260\321\217\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml" +++ /dev/null @@ -1,39 +0,0 @@ - -
- useIfNecessary - - - - - cfg:ExternalDataProcessorObject.Тесты_ОткрытиеФормКонфигурации - - true - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Создаваемый элемент</v8:content> - </v8:item> - - - cfg:AnyRef - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Нужно исключение если не найдено документов</v8:content> - </v8:item> - - - xs:string - - 0 - Variable - - - - - \ No newline at end of file diff --git "a/src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Forms/\320\243\320\277\321\200\320\260\320\262\320\273\321\217\320\265\320\274\320\260\321\217\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" "b/src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Forms/\320\243\320\277\321\200\320\260\320\262\320\273\321\217\320\265\320\274\320\260\321\217\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" deleted file mode 100644 index 638e45d..0000000 --- "a/src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Forms/\320\243\320\277\321\200\320\260\320\262\320\273\321\217\320\265\320\274\320\260\321\217\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" +++ /dev/null @@ -1,1332 +0,0 @@ -&НаКлиенте -Перем КонтекстЯдра; -&НаКлиенте -Перем Ожидаем; -&НаКлиенте -Перем Утверждения; - -&НаКлиенте -Перем ПлагинТестКлиенты; - -&НаКлиенте -Перем ТестируемаяФорма; - -// { интерфейс тестирования - -&НаКлиенте -Процедура Инициализация(КонтекстЯдраПараметр) Экспорт - КонтекстЯдра = КонтекстЯдраПараметр; - Утверждения = КонтекстЯдра.Плагин("БазовыеУтверждения"); - Ожидаем = КонтекстЯдра.Плагин("УтвержденияBDD"); - ПлагинТестКлиенты = КонтекстЯдра.Плагин("ТестКлиенты"); - - Объект.ОткрываемФормыНаКлиентеТестирования = Истина; - - ЗагрузитьНастройки(); -КонецПроцедуры - -&НаКлиенте -Процедура ЗаполнитьНаборТестов(НаборТестов, КонтекстЯдраПараметр) Экспорт - - Инициализация(КонтекстЯдраПараметр); - - Если Не НужноВыполнятьТест() Тогда - Возврат; - КонецЕсли; - - Если Объект.ОткрываемФормыНаКлиентеТестирования Тогда - ПлагинТестКлиенты = КонтекстЯдра.Плагин("ТестКлиенты"); - ТестКлиент = ПлагинТестКлиенты.ТестКлиентПоУмолчанию(); - ПлагинТестКлиенты.ЗакрытьВсеОткрытыеОкна(ТестКлиент); - - ОсновноеОкно = ОсновноеОкно(ТестКлиент); - КонецЕсли; - - ОписанияТестов = Новый Массив; - - НужноИсключениеЕслиНеНайденоДокументов = Ложь; - - ВключенСтрогийПорядокВыполнения= ВключенСтрогийПорядокВыполнения(); - - Если ВключенСтрогийПорядокВыполнения Тогда - НаборТестов.СтрогийПорядокВыполнения(); - НаборТестов.ПродолжитьВыполнениеПослеПаденияТеста(); - КонецЕсли; - - СоздатьИменаОсновныхФорм(); - - НастройкаГруппировки = ПолучитьНастройкуГруппировки(); - - ТолькоУправляемыеФормы = Истина; - #Если ТолстыйКлиентОбычноеПриложение или ТолстыйКлиентУправляемоеПриложение Тогда - ТолькоУправляемыеФормы = Ложь; - #КонецЕсли - - Если Не ИспользоватьОбычныеФормыВТолстомКлиентеВУправляемомРежимеСервер() Тогда - ТолькоУправляемыеФормы = Истина; - КонецЕсли; - - ИменаОсновныхФорм_Объекты_Сервер = ИменаОсновныхФорм_Объекты_Сервер(); - мИменаОсновныхФорм_Списки_Сервер = мИменаОсновныхФорм_Списки_Сервер(); - - Если НЕ ВидМетаданныхИсключенИзТестирования("Справочники") Тогда - - ОписанияТестов = Новый Массив; - - ДобавитьТестыДляСправочниковСервер( - ОписанияТестов, ТолькоУправляемыеФормы, - ИменаОсновныхФорм_Объекты_Сервер, мИменаОсновныхФорм_Списки_Сервер, НастройкаГруппировки); - - Если ЗначениеЗаполнено(ОписанияТестов) Тогда - - Если НастройкаГруппировки.ГруппироватьПоВидуМетаданных Тогда - НаборТестов.НачатьГруппу("Справочники", ВключенСтрогийПорядокВыполнения); - КонецЕсли; - - ДобавитьОписанияТестовВНаборТестов(НаборТестов, ОписанияТестов, ВключенСтрогийПорядокВыполнения); - - КонецЕсли; - КонецЕсли; - - Если НЕ ВидМетаданныхИсключенИзТестирования("Документы") Тогда - - ОписанияТестов = Новый Массив; - - ДобавитьТестыДляДокументовСервер( - ОписанияТестов, ТолькоУправляемыеФормы, - ИменаОсновныхФорм_Объекты_Сервер, мИменаОсновныхФорм_Списки_Сервер, НастройкаГруппировки); - - Если ЗначениеЗаполнено(ОписанияТестов) Тогда - - Если НастройкаГруппировки.ГруппироватьПоВидуМетаданных Тогда - НаборТестов.НачатьГруппу("Документы", ВключенСтрогийПорядокВыполнения); - КонецЕсли; - - ДобавитьОписанияТестовВНаборТестов(НаборТестов, ОписанияТестов, ВключенСтрогийПорядокВыполнения); - - КонецЕсли; - КонецЕсли; - - Если НЕ ВидМетаданныхИсключенИзТестирования("Обработки") Тогда - - ОписанияТестов = Новый Массив; - - ДобавлятьОбработки = Истина; - ДобавитьТестыДляОтчетовОбработокСервер(ОписанияТестов, ТолькоУправляемыеФормы, ДобавлятьОбработки, - НастройкаГруппировки); - - Если ЗначениеЗаполнено(ОписанияТестов) Тогда - - Если НастройкаГруппировки.ГруппироватьПоВидуМетаданных Тогда - НаборТестов.НачатьГруппу("Обработки", ВключенСтрогийПорядокВыполнения); - КонецЕсли; - - ДобавитьОписанияТестовВНаборТестов(НаборТестов, ОписанияТестов, ВключенСтрогийПорядокВыполнения); - - КонецЕсли; - КонецЕсли; - - Если НЕ ВидМетаданныхИсключенИзТестирования("Отчеты") Тогда - - ОписанияТестов = Новый Массив; - - ДобавлятьОбработки = Ложь; - ДобавитьТестыДляОтчетовОбработокСервер(ОписанияТестов, ТолькоУправляемыеФормы, ДобавлятьОбработки, - НастройкаГруппировки); - - Если ЗначениеЗаполнено(ОписанияТестов) Тогда - - Если НастройкаГруппировки.ГруппироватьПоВидуМетаданных Тогда - НаборТестов.НачатьГруппу("Отчеты", ВключенСтрогийПорядокВыполнения); - КонецЕсли; - - ДобавитьОписанияТестовВНаборТестов(НаборТестов, ОписанияТестов, ВключенСтрогийПорядокВыполнения); - - КонецЕсли; - - КонецЕсли; - - Если НЕ ВидМетаданныхИсключенИзТестирования("БизнесПроцессы") Тогда - - ОписанияТестов = Новый Массив; - - ДобавлятьОбработки = Ложь; - ДобавитьТестыДляБизнесПроцессовСервер( - ОписанияТестов, ТолькоУправляемыеФормы, - ИменаОсновныхФорм_Объекты_Сервер, мИменаОсновныхФорм_Списки_Сервер, НастройкаГруппировки); - - Если ЗначениеЗаполнено(ОписанияТестов) Тогда - - Если НастройкаГруппировки.ГруппироватьПоВидуМетаданных Тогда - НаборТестов.НачатьГруппу("БизнесПроцессы", ВключенСтрогийПорядокВыполнения); - КонецЕсли; - - ДобавитьОписанияТестовВНаборТестов(НаборТестов, ОписанияТестов, ВключенСтрогийПорядокВыполнения); - - КонецЕсли; - - КонецЕсли; - - Если НастройкаГруппировки.ГруппироватьПоВидуМетаданных Или НастройкаГруппировки.ГруппироватьПоКоличеству - Или НастройкаГруппировки.ГруппироватьПоВидуОбъекта Тогда - - НаборТестов.НачатьГруппу("Прочее", ВключенСтрогийПорядокВыполнения); - - КонецЕсли; - - ИмяТеста = "ТестДолжен_ПроверитьБагПлатформыПриОткрытииУправляемойФормыПриОткрытииКоторойЕстьИсключение"; - НаборТестов.Добавить(ИмяТеста, , ИмяТеста); - -КонецПроцедуры - -// } интерфейс тестирования - -//{ ФормированиеСпискаТестовыхСлучаев - -&НаКлиенте -Процедура ДобавитьОписанияТестовВНаборТестов(НаборТестов, ОписанияТестов, СтрогийПорядокВыполнения) - Для Каждого Описание Из ОписанияТестов Цикл - Если ТипЗнч(Описание) = Тип("Строка") Тогда - - ПредставлениеТеста = Описание; - НаборТестов.Добавить(Описание, , ПредставлениеТеста); - - ИначеЕсли ТипЗнч(Описание) = Тип("Структура") И Описание.Свойство("Набор") Тогда - НаборТестов.НачатьГруппу(Описание.Имя, СтрогийПорядокВыполнения); - ДобавитьОписанияТестовВНаборТестов(НаборТестов, Описание.Набор, СтрогийПорядокВыполнения); - - Иначе - - НаборТестов.Добавить(Описание.ИмяТеста, НаборТестов.ПараметрыТеста(Описание.Параметр), - Описание.ПредставлениеТеста); - КонецЕсли; - КонецЦикла; -КонецПроцедуры - -&НаСервере -Функция ПодробноеПредставлениеПрефикса(ПрефиксТеста) - - Результат = ""; - - Если ПрефиксТеста = "Новые" Тогда - - Результат = "открытие формы объекта при создании"; - - ИначеЕсли ПрефиксТеста = "Существующие" Тогда - - Результат = "открытие формы записанного объекта"; - - ИначеЕсли ПрефиксТеста = "Списки" Тогда - - Результат = "открытие формы списка"; - - КонецЕсли; - - Возврат Результат; - -КонецФункции - -&НаСервере -Процедура ДобавитьТестыДляСправочниковСервер(ОписанияТестов, ТолькоУправляемыеФормы, - ИменаОсновныхФорм_Объекты_Сервер, мИменаОсновныхФорм_Списки_Сервер, НастройкаГруппировки) - - ОсновнойОбъект = Объект(); - СписокИсключений_Существующие = ОсновнойОбъект.ПолучитьСписокИсключений_Справочники_Существующие(); - СписокИсключений_Новые = ОсновнойОбъект.ПолучитьСписокИсключений_Справочники_Новые(); - СписокИсключений_Списки = ОсновнойОбъект.ПолучитьСписокИсключений_Справочники_Списки(); - - Счетчик = 0; - - МенеджерМетаданного = Метаданные.Справочники; - Для Каждого МетаОбъект Из МенеджерМетаданного Цикл - - КоличествоЭлементовДо = ОписанияТестов.Количество(); - - НаборОписанийТестов = ДобавитьГруппировкуЕслиНужно("Справочники", "Справочник." + МетаОбъект.Имя, - ОписанияТестов, НастройкаГруппировки, Счетчик); - - Если ПравоДоступа("ИнтерактивноеДобавление", МетаОбъект) Тогда - - ДобавитьТестыПереданныхВидовФормПоОдномОбъектуМетаданных( - НаборОписанийТестов, - ОсновнойОбъект, МетаОбъект, - ТолькоУправляемыеФормы, - СписокИсключений_Новые, ИменаОсновныхФорм_Объекты_Сервер, - "ТестДолжен_ОткрытьФормуНовогоЭлементаСправочника", "Новые"); - - КонецЕсли; - - ДобавитьТестыПереданныхВидовФормПоОдномОбъектуМетаданных( - НаборОписанийТестов, - ОсновнойОбъект, МетаОбъект, - ТолькоУправляемыеФормы, - СписокИсключений_Существующие, ИменаОсновныхФорм_Объекты_Сервер, - "ТестДолжен_ОткрытьФормуСуществующегоЭлементаСправочника", "Существующие"); - - ДобавитьТестыПереданныхВидовФормПоОдномОбъектуМетаданных( - НаборОписанийТестов, - ОсновнойОбъект, МетаОбъект, - ТолькоУправляемыеФормы, - СписокИсключений_Списки, мИменаОсновныхФорм_Списки_Сервер, - "ТестДолжен_ОткрытьФормуПоПолномуИмениФормы", "Списки"); - - Если Не ЗначениеЗаполнено(НаборОписанийТестов) И ЗначениеЗаполнено(ОписанияТестов) Тогда - Для Счетчик = КоличествоЭлементовДо По ОписанияТестов.Количество() - 1 Цикл - ОписанияТестов.Удалить(ОписанияТестов.ВГраница()); - КонецЦикла; - КонецЕсли; - КонецЦикла; -КонецПроцедуры - -Функция ДобавитьГруппировкуЕслиНужно(Знач ИмяВидаМетаданного, Знач ИмяМетаданного, - Знач ОписанияТестов, Знач НастройкаГруппировки, Счетчик) - - НаборОписанийТестов = ОписанияТестов; - Если НастройкаГруппировки.ГруппироватьПоКоличеству Тогда - Если Счетчик % НастройкаГруппировки.КоличествоВГруппе = 0 Тогда - ИмяГруппы = ИмяВидаМетаданного + " (" + Строка(Счетчик + 1) + "..." - + Строка(Счетчик + НастройкаГруппировки.КоличествоВГруппе) + ")"; - ОписаниеГруппы = Новый Структура("Имя, Набор", ИмяГруппы, Новый Массив); - НаборОписанийТестов.Добавить(ОписаниеГруппы); - НаборОписанийТестов = ОписаниеГруппы.Набор; - КонецЕсли; - ИначеЕсли НастройкаГруппировки.ГруппироватьПоВидуОбъекта Тогда - ИмяГруппы = ИмяМетаданного; - ОписаниеГруппы = Новый Структура("Имя, Набор", ИмяГруппы, Новый Массив); - НаборОписанийТестов.Добавить(ОписаниеГруппы); - НаборОписанийТестов = ОписаниеГруппы.Набор; - КонецЕсли; - - Счетчик = Счетчик + 1; - - Возврат НаборОписанийТестов; -КонецФункции - -&НаСервере -Процедура ДобавитьТестыДляДокументовСервер(ОписанияТестов, ТолькоУправляемыеФормы, - ИменаОсновныхФорм_Объекты_Сервер, мИменаОсновныхФорм_Списки_Сервер, НастройкаГруппировки) - - ОсновнойОбъект = Объект(); - СписокИсключений_Существующие = ОсновнойОбъект.ПолучитьСписокИсключений_Документы_Существующие(); - СписокИсключений_Новые = ОсновнойОбъект.ПолучитьСписокИсключений_Документы_Новые(); - СписокИсключений_Списки = ОсновнойОбъект.ПолучитьСписокИсключений_Документы_Списки(); - - Счетчик = 0; - - МенеджерМетаданного = Метаданные.Документы; - Для Каждого МетаОбъект Из МенеджерМетаданного Цикл - - КоличествоЭлементовДо = ОписанияТестов.Количество(); - - НаборОписанийТестов = ДобавитьГруппировкуЕслиНужно("Документы", "Документ." + МетаОбъект.Имя, - ОписанияТестов, НастройкаГруппировки, Счетчик); - - Если ПравоДоступа("ИнтерактивноеДобавление", МетаОбъект) Тогда - имяТеста = "ТестДолжен_ОткрытьФормуНовогоДокумента"; - ПрефиксПредставленияТеста = "Новые"; - СписокИсключений = СписокИсключений_Новые; - ИменаОсновныхФорм = ИменаОсновныхФорм_Объекты_Сервер; - ПроверяемоеПравоДоступа = "ИнтерактивноеДобавление"; - ДобавитьТестыПереданныхВидовФормПоОдномОбъектуМетаданных(НаборОписанийТестов, ОсновнойОбъект, МетаОбъект, - ТолькоУправляемыеФормы, СписокИсключений, ИменаОсновныхФорм, имяТеста, ПрефиксПредставленияТеста); - КонецЕсли; - - имяТеста = "ТестДолжен_ОткрытьФормуСуществующегоЭлементаДокумента"; - ПрефиксПредставленияТеста = "Существующие"; - СписокИсключений = СписокИсключений_Существующие; - ИменаОсновныхФорм = ИменаОсновныхФорм_Объекты_Сервер; - - ДобавитьТестыПереданныхВидовФормПоОдномОбъектуМетаданных(НаборОписанийТестов, ОсновнойОбъект, МетаОбъект, - ТолькоУправляемыеФормы, СписокИсключений, ИменаОсновныхФорм, имяТеста, ПрефиксПредставленияТеста); - - имяТеста = "ТестДолжен_ОткрытьФормуПоПолномуИмениФормы"; - ПрефиксПредставленияТеста = "Списки"; - СписокИсключений = СписокИсключений_Списки; - ИменаОсновныхФорм = мИменаОсновныхФорм_Списки_Сервер; - - ДобавитьТестыПереданныхВидовФормПоОдномОбъектуМетаданных(НаборОписанийТестов, ОсновнойОбъект, МетаОбъект, - ТолькоУправляемыеФормы, СписокИсключений, ИменаОсновныхФорм, имяТеста, ПрефиксПредставленияТеста); - - Если Не ЗначениеЗаполнено(НаборОписанийТестов) И ЗначениеЗаполнено(ОписанияТестов) Тогда - Для Счетчик = КоличествоЭлементовДо По ОписанияТестов.Количество() - 1 Цикл - ОписанияТестов.Удалить(ОписанияТестов.ВГраница()); - КонецЦикла; - КонецЕсли; - КонецЦикла; -КонецПроцедуры - -&НаСервере -Процедура ДобавитьТестыДляОтчетовОбработокСервер(ОписанияТестов, ТолькоУправляемыеФормы, Знач ДобавлятьОбработки, - Знач НастройкаГруппировки) - ОсновнойОбъект = Объект(); - - ОписаниеВидаМетаданного = Новый Структура; - - ИменаОсновныхФорм = мИменаОсновныхФорм_Сервер(); - Если ДобавлятьОбработки Тогда - - ОписаниеВидаМетаданного.Вставить("Менеджер", Метаданные.Обработки); - ОписаниеВидаМетаданного.Вставить("ИмяВидаМнЧисло", "Обработки"); - ОписаниеВидаМетаданного.Вставить("ИмяВидаЕдЧисло", "Обработка"); - - ДобавитьТестыПереданныхВидовФормДляКаждогоОбъектаМенеджераМетаданных( - ОписанияТестов, ОсновнойОбъект, ОписаниеВидаМетаданного, - ТолькоУправляемыеФормы, - ОсновнойОбъект.ПолучитьСписокИсключений_Обработки(), - ИменаОсновныхФорм, - "ТестДолжен_ОткрытьФормуПоПолномуИмениФормы", "", - НастройкаГруппировки); - - Иначе - - ОписаниеВидаМетаданного.Вставить("Менеджер", Метаданные.Отчеты); - ОписаниеВидаМетаданного.Вставить("ИмяВидаМнЧисло", "Отчеты"); - ОписаниеВидаМетаданного.Вставить("ИмяВидаЕдЧисло", "Отчет"); - - ДобавитьТестыПереданныхВидовФормДляКаждогоОбъектаМенеджераМетаданных( - ОписанияТестов, ОсновнойОбъект, ОписаниеВидаМетаданного, - ТолькоУправляемыеФормы, - ОсновнойОбъект.ПолучитьСписокИсключений_Отчеты(), - ИменаОсновныхФорм, - "ТестДолжен_ОткрытьФормуПоПолномуИмениФормы", "", - НастройкаГруппировки); - - КонецЕсли; - -КонецПроцедуры - -&НаСервере -Процедура ДобавитьТестыДляБизнесПроцессовСервер(ОписанияТестов, ТолькоУправляемыеФормы, - ИменаОсновныхФорм_Объекты_Сервер, ИменаОсновныхФорм_Списки_Сервер, НастройкаГруппировки) - - ОсновнойОбъект = Объект(); - СписокИсключений_Существующие = ОсновнойОбъект.ПолучитьСписокИсключений_БизнесПроцессы_Существующие(); - СписокИсключений_Новые = ОсновнойОбъект.ПолучитьСписокИсключений_БизнесПроцессы_Новые(); - СписокИсключений_Списки = ОсновнойОбъект.ПолучитьСписокИсключений_БизнесПроцессы_Списки(); - - Счетчик = 0; - - МенеджерМетаданного = Метаданные.БизнесПроцессы; - Для Каждого МетаОбъект Из МенеджерМетаданного Цикл - - КоличествоЭлементовДо = ОписанияТестов.Количество(); - - НаборОписанийТестов = ДобавитьГруппировкуЕслиНужно("БизнесПроцессы", "БизнесПроцесс." + МетаОбъект.Имя, - ОписанияТестов, НастройкаГруппировки, Счетчик); - - Если ПравоДоступа("ИнтерактивноеДобавление", МетаОбъект) Тогда - - ДобавитьТестыПереданныхВидовФормПоОдномОбъектуМетаданных( - НаборОписанийТестов, - ОсновнойОбъект, МетаОбъект, - ТолькоУправляемыеФормы, - СписокИсключений_Новые, ИменаОсновныхФорм_Объекты_Сервер, - "ТестДолжен_ОткрытьФормуНовогоБизнесПроцесса", "Новые"); - - КонецЕсли; - - ДобавитьТестыПереданныхВидовФормПоОдномОбъектуМетаданных( - НаборОписанийТестов, - ОсновнойОбъект, МетаОбъект, - ТолькоУправляемыеФормы, - СписокИсключений_Существующие, ИменаОсновныхФорм_Объекты_Сервер, - "ТестДолжен_ОткрытьФормуСуществующегоБизнесПроцесса", "Существующие"); - - ДобавитьТестыПереданныхВидовФормПоОдномОбъектуМетаданных( - НаборОписанийТестов, - ОсновнойОбъект, МетаОбъект, - ТолькоУправляемыеФормы, - СписокИсключений_Списки, ИменаОсновныхФорм_Списки_Сервер, - "ТестДолжен_ОткрытьФормуПоПолномуИмениФормы", "Списки"); - - Если Не ЗначениеЗаполнено(НаборОписанийТестов) И ЗначениеЗаполнено(ОписанияТестов) Тогда - Для Счетчик = КоличествоЭлементовДо По ОписанияТестов.Количество() - 1 Цикл - ОписанияТестов.Удалить(ОписанияТестов.ВГраница()); - КонецЦикла; - КонецЕсли; - КонецЦикла; -КонецПроцедуры - -&НаСервере -Процедура ДобавитьТестыПереданныхВидовФормДляКаждогоОбъектаМенеджераМетаданных( - ОписанияТестов, ОсновнойОбъект, ОписаниеВидаМетаданного, - ТолькоУправляемыеФормы, СписокИсключений, ИменаОсновныхФорм, имяТеста, ПрефиксПредставленияТеста, - НастройкаГруппировки) - - Счетчик = 0; - - Для Каждого МетаОбъект Из ОписаниеВидаМетаданного.Менеджер Цикл - Если ОсновнойОбъект.ЭтоУстаревшийМетаОбъектДляУдаления(МетаОбъект) Тогда - Продолжить; - КонецЕсли; - Если Лев(МетаОбъект.Имя, СтрДлина("xddTestRunner")) = "xddTestRunner" Тогда - Продолжить; - КонецЕсли; - - КоличествоЭлементовДо = ОписанияТестов.Количество(); - - НаборОписанийТестов = ДобавитьГруппировкуЕслиНужно( - ОписаниеВидаМетаданного.ИмяВидаМнЧисло, - ОписаниеВидаМетаданного.ИмяВидаЕдЧисло + "." + МетаОбъект.Имя, - ОписанияТестов, НастройкаГруппировки, Счетчик); - - Добавили = ДобавитьТестыПереданныхВидовФормПоОдномОбъектуМетаданных(ОписанияТестов, ОсновнойОбъект, - МетаОбъект, ТолькоУправляемыеФормы, СписокИсключений, ИменаОсновныхФорм, имяТеста, - ПрефиксПредставленияТеста); - - Если Не Добавили Тогда - - Для Счетчик = КоличествоЭлементовДо По ОписанияТестов.Количество() - 1 Цикл - ОписанияТестов.Удалить(ОписанияТестов.ВГраница()); - КонецЦикла; - - КонецЕсли; - КонецЦикла; -КонецПроцедуры - -&НаСервере -Функция ДобавитьТестыПереданныхВидовФормПоОдномОбъектуМетаданных(ОписанияТестов, ОсновнойОбъект, МетаОбъект, - ТолькоУправляемыеФормы, СписокИсключений, ИменаОсновныхФорм, имяТеста, ПрефиксПредставленияТеста) - - Если ОсновнойОбъект.ЭтоУстаревшийМетаОбъектДляУдаления(МетаОбъект) Тогда - Возврат Ложь; - КонецЕсли; - - СписокИменМетаФорм = Новый СписокЗначений; - Успешно = ДобавитьИменаМетаФормДляОдногоОбъектаМетаданного(СписокИменМетаФорм, ОсновнойОбъект, МетаОбъект, - ТолькоУправляемыеФормы, СписокИсключений, ИменаОсновныхФорм); - ДобавитьТестПоПереданнымМетаФормамСсылочногоОбъектаСервер(ОписанияТестов, СписокИменМетаФорм, имяТеста, - ПрефиксПредставленияТеста); - - Возврат Успешно; -КонецФункции - -&НаСервере -Процедура ДобавитьТестПоПереданнымМетаФормамСсылочногоОбъектаСервер(ОписанияТестов, СписокИменМетаФорм, имяТеста, - ПрефиксПредставленияТеста) - Для каждого Элемент Из СписокИменМетаФорм Цикл - МетаФорма_ПолноеИмя = Элемент.Значение; - ПредставлениеТеста = МетаФорма_ПолноеИмя; - Если НЕ ПустаяСтрока(ПрефиксПредставленияТеста) Тогда - ПредставлениеТеста = МетаФорма_ПолноеИмя + " : " + ПодробноеПредставлениеПрефикса(ПрефиксПредставленияТеста); - КонецЕсли; - - лПараметры = Новый Структура("ПредставлениеТеста,ИмяТеста,Транзакция,Параметр", ПредставлениеТеста, имяТеста, - Истина, МетаФорма_ПолноеИмя); - ОписанияТестов.Добавить(лПараметры); - КонецЦикла; -КонецПроцедуры - -&НаСервереБезКонтекста -Функция ДобавитьИменаМетаФормДляОдногоОбъектаМетаданного(СписокИменМетаФорм, ОсновнойОбъект, МетаОбъект, - ТолькоУправляемыеФормы, СписокИсключений, ИменаОсновныхФорм) - - Если СписокИсключений = Ложь Или СписокИсключений.НайтиПоЗначению(МетаОбъект.Имя) <> Неопределено Тогда - Возврат Ложь; - КонецЕсли; - - Если Не ПравоДоступа("Просмотр", МетаОбъект) Тогда - Возврат Ложь; - КонецЕсли; - - Мета_ПолноеИмя = МетаОбъект.ПолноеИмя(); - - Результат = Ложь; - - МетаФормы = ОсновнойОбъект.ПолучитьМетаФормыОбъектаДляПроверки(МетаОбъект, ИменаОсновныхФорм); - - ФормыДобавлены = Ложь; - - Для каждого МетаФорма Из МетаФормы Цикл - - МетаФорма_ПолноеИмя = МетаФорма.ПолноеИмя(); - - // В режиме клиента тестирования не нужно добавлять .Форма, - // а необходимо указывать имя отчета, для формирования навигационной ссылки. - Если Не ОсновнойОбъект.ОткрываемФормыНаКлиентеТестирования Тогда - Если Метаданные.ОсновнаяФормаОтчета = МетаФорма Тогда - МетаФорма_ПолноеИмя = МетаОбъект.ПолноеИмя() + ".Форма"; - - // Форма настроек отчета из комплекта БСП не открывается без передачи параметра. - //ИначеЕсли Метаданные.ОсновнаяФормаНастроекОтчета = МетаФорма Тогда - // МетаФорма_ПолноеИмя = МетаОбъект.ПолноеИмя() + ".ФормаНастроек"; - - КонецЕсли; - КонецЕсли; - - //МетаОбъект.Имя <Отчет1>, МетаФорма_ПолноеИмя <Отчет.Отчет1.Форма.УправляемаяФормаОтчета> - //МетаОбъект.Имя <Отчет2>, МетаФорма_ПолноеИмя <ОбщаяФорма.ФормаОтчета> // в ОФ Отчет.Отчет2.Форма - - Если ТолькоУправляемыеФормы Тогда - Если Не ЭтоУправляемаяФорма(МетаФорма) Тогда - Продолжить; - КонецЕсли; - КонецЕсли; - - // исторически в списке исключений имя формы без имени коллекции объектов метаданных - // "Справочник1.Форма.ФормаЭлемента", а не "Справочник.Справочник1.Форма.ФормаЭлемента" - Если СписокИсключений.НайтиПоЗначению(Сред(МетаФорма_ПолноеИмя, Найти(МетаФорма_ПолноеИмя, ".") + 1)) - <> Неопределено Тогда - Продолжить; - КонецЕсли; - - // TODO Бессмысленно открывать для отчетов основную форму отчета, настроек, варианта из конфигурации - Если Лев(НРег(МетаФорма_ПолноеИмя), СтрДлина(Мета_ПолноеИмя)) <> НРег(Мета_ПолноеИмя) Тогда - Продолжить; - КонецЕсли; - - ФормыДобавлены = Истина; - - СписокИменМетаФорм.Добавить(МетаФорма_ПолноеИмя); - Результат = Истина; - - КонецЦикла; - - //добавить общие формы к отчётам, если они не указаны - ДлинаСловаОтчет = 6; - Если Метаданные.Отчеты.Найти(МетаОбъект.Имя) <> Неопределено И Лев(Мета_ПолноеИмя, ДлинаСловаОтчет) = "Отчет." Тогда - ФормыДобавлены = ДобавитьОбщиеФормыДляОтчетов(СписокИменМетаФорм, МетаОбъект, ОсновнойОбъект.ОткрываемФормыНаКлиентеТестирования); - Если НЕ Результат Тогда - Результат = ФормыДобавлены; - КонецЕсли; - КонецЕсли; - - // Добавляем наименование отчета для режима клиента тестирования, без указания формы. - // TODO Бессмысленно открывать для отчетов основную форму отчета, настроек, варианта из конфигурации. - // Также нужно добавить стандартные формы для всяких объектов - справочники, документы - Если Не ФормыДобавлены - И ОсновнойОбъект.ОткрываемФормыНаКлиентеТестирования Тогда - СписокИменМетаФорм.Добавить(Мета_ПолноеИмя); - Результат = Истина; - КонецЕсли; - - Возврат Результат; - -КонецФункции - -//} - -//{ РаботаСФормами - -&НаСервереБезКонтекста -Функция ДобавитьОбщиеФормыДляОтчетов(СписокИменМетаФорм, МетаОбъект, ОткрываемФормыНаКлиентеТестирования) - - Результат = Ложь; - - // В режиме клиента тестирования не нужно добавлять .Форма, - // а необходимо указывать имя отчета, для формирования навигационной ссылки. - Если ОткрываемФормыНаКлиентеТестирования Тогда - СписокИменМетаФорм.Добавить(МетаОбъект.ПолноеИмя()); - Результат = Истина; - Возврат Результат; - КонецЕсли; - - Если ПолучитьФормуОбъекта(МетаОбъект, "ОсновнаяФорма") = Неопределено - И ПолучитьФормуОбъекта(Метаданные, "ОсновнаяФормаОтчета") <> Неопределено Тогда - - СписокИменМетаФорм.Добавить(МетаОбъект.ПолноеИмя() + ".Форма"); - Результат = Истина; - - КонецЕсли; - - // Форма настроек отчета из комплекта БСП не открывается без передачи параметра. - //Если ПолучитьФормуОбъекта(МетаОбъект, "ОсновнаяФормаНастроек") = Неопределено - // И ПолучитьФормуОбъекта(Метаданные, "ОсновнаяФормаНастроекОтчета") <> Неопределено Тогда - // - // СписокИменМетаФорм.Добавить(МетаОбъект.ПолноеИмя() + ".ФормаНастроек"); - // Результат = Истина; - // - //КонецЕсли; - - ФормаВарианта = ПолучитьФормуОбъекта(МетаОбъект, "ОсновнаяФормаВарианта"); - Если ФормаВарианта = Неопределено Тогда - Если ПолучитьФормуОбъекта(Метаданные, "ОсновнаяФормаВариантаОтчета") <> Неопределено Тогда - - СписокИменМетаФорм.Добавить(МетаОбъект.ПолноеИмя() + ".ФормаВарианта"); - Результат = Истина; - - КонецЕсли; - Иначе - // Общая форма "ВариантыОтчета" не открываются самостоятельно. - //СписокИменМетаФорм.Добавить(ФормаВарианта.ПолноеИмя()); - СписокИменМетаФорм.Добавить(МетаОбъект.ПолноеИмя() + ".ФормаВарианта"); - Результат = Истина; - КонецЕсли; - - Возврат Результат; - -КонецФункции - -&НаСервереБезКонтекста -Функция ПолучитьФормуОбъекта(ОбъектФормы, ИмяФормы) - - Попытка - Результат = ОбъектФормы[ИмяФормы]; - Исключение - Результат = Неопределено; - КонецПопытки; - - Возврат Результат; -КонецФункции - -&НаСервереБезКонтекста -Функция ИспользоватьОбычныеФормыВТолстомКлиентеВУправляемомРежимеСервер() - Возврат Метаданные.ИспользоватьОбычныеФормыВУправляемомПриложении; -КонецФункции - -&НаКлиенте -Процедура ТестироватьФорму(ПолноеИмяФормы, ПараметрыФормы) Экспорт - Если Объект.ВыводитьСообщенияВЖурналРегистрации Тогда - ВыполнитьЗаписьВЖурналРегистрации(ПолноеИмяФормы); - КонецЕсли; - - Если Объект.ОткрываемФормыНаКлиентеТестирования Тогда - ТестироватьФормуНаКлиентеТестирования(ПолноеИмяФормы, ПараметрыФормы); - Иначе - ТестироватьФормуВТекущемКлиенте(ПолноеИмяФормы, ПараметрыФормы); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ТестироватьФормуВТекущемКлиенте(ПолноеИмяФормы, ПараметрыФормы) Экспорт - - ПредыдущиеОкна = ПолучитьОкна(); - - Попытка - - // К сожалению, здесь часто исключения не ловятся - //https://github.com/xDrivenDevelopment/xUnitFor1C/issues/154 - - ТестируемаяФорма = ОткрытьФорму(ПолноеИмяФормы, ПараметрыФормы,, Новый УникальныйИдентификатор); - - Исключение - ИнфоОшибки = ИнформацияОбОшибке(); - - Если Не ПропускаемОшибкуПоТекстуИсключенияСервер(ИнфоОшибки.Описание) Тогда - ВызватьИсключение; - КонецЕсли; - - Возврат; - КонецПопытки; - - Если ТестируемаяФорма = Неопределено Или Не ТестируемаяФорма.Открыта() Тогда - - НеПроверятьФорму = ТестируемаяФорма = Неопределено; - - НовыеОкна = ПолучитьОкна(); - - МассивНовыхОкон = Новый Массив; - Для Каждого НовоеОкно Из НовыеОкна Цикл - НашлиОкно = Ложь; - Для Каждого ОкноДо Из ПредыдущиеОкна Цикл - Если ОкноДо.Заголовок = НовоеОкно.Заголовок Тогда - НашлиОкно = Истина; - Продолжить; - КонецЕсли; - КонецЦикла; - - Если НашлиОкно Тогда - Продолжить; - КонецЕсли; - - МассивНовыхОкон.Добавить(НовоеОкно); - КонецЦикла; - - Если МассивНовыхОкон.Количество() = 0 И НеПроверятьФорму Тогда - Возврат; - КонецЕсли; - - Если МассивНовыхОкон.Количество() > 0 Тогда - МассивФорм = МассивНовыхОкон[0].Содержимое; - Если МассивНовыхОкон.Количество() = 0 И НеПроверятьФорму Тогда - Возврат; - КонецЕсли; - Если МассивНовыхОкон.Количество() > 0 Тогда - ТестируемаяФорма = МассивФорм[0]; - КонецЕсли; - КонецЕсли; - - КонецЕсли; - - Утверждения.Проверить(ТестируемаяФорма.Открыта(), "ТестируемаяФорма """+ПолноеИмяФормы - +""" не открылась, а должна была открыться"); - - Если ТипЗнч(ТестируемаяФорма) = Тип("УправляемаяФорма") Тогда - ТестируемаяФорма.ОбновитьОтображениеДанных(); - Иначе - ТестируемаяФорма.Обновить(); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ТестироватьФормуСсылочногоОбъекта(Мета_ПолноеИмя, СсылочныйОбъект) - ПараметрыФормы = Новый Структура("Ключ", СсылочныйОбъект); - ТестироватьФорму(Мета_ПолноеИмя, ПараметрыФормы); -КонецПроцедуры - -&НаКлиенте -Процедура ЗакрытьФорму() - Если ТипЗнч(ТестируемаяФорма) <> Тип("УправляемаяФорма") Тогда - Возврат; - КонецЕсли; - ТестируемаяФорма.Модифицированность = Ложь; - Если ТестируемаяФорма.Открыта() Тогда - ТестируемаяФорма.Модифицированность = Ложь; - //Попытка - ТестируемаяФорма.Закрыть(); - //Исключение - // Ошибка = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - // ЗакрытьФормуБезусловноСОтменойТранзакции(ТестируемаяФорма); - // //Если ТранзакцияАктивна() Тогда - // // ОтменитьТранзакцию(); - // //КонецЕсли; - // // //ДобавитьСтрокуРезультата(ИмяОперации, ИнформацияОбОшибке()); - // //НачатьТранзакцию(); - // //ТестируемаяФорма.УстановитьДействие("ПередЗакрытием", Неопределено); - // //ТестируемаяФорма.УстановитьДействие("ПриЗакрытии", Неопределено); - // //ТестируемаяФорма.Закрыть(); - // ВызватьИсключение Ошибка; - //КонецПопытки; - Иначе - Попытка - ТестируемаяФорма.Закрыть(); - Исключение - КонецПопытки; - КонецЕсли; - ТестируемаяФорма = ""; - -КонецПроцедуры - -&НаСервере -Процедура СоздатьИменаОсновныхФорм() - ОсновнойОбъект = Объект(); - ОсновнойОбъект.СоздатьИменаОсновныхФорм(); - ОсновнойОбъект.ВидыМетаданных = ОсновнойОбъект.ВидыМетаданных(); - ОсновнойОбъект.ВидыПроверок = ОсновнойОбъект.ВидыПроверок(); - ОсновнойОбъект.СпособыГруппировки = ОсновнойОбъект.СпособыГруппировки(); - ЗначениеВРеквизитФормы(ОсновнойОбъект, "Объект"); -КонецПроцедуры - -&НаСервере -Функция ИменаОсновныхФорм_Объекты_Сервер() - Возврат Объект().мИменаОсновныхФорм_Объекты; -КонецФункции - -&НаСервере -Функция мИменаОсновныхФорм_Списки_Сервер() - Возврат Объект().мИменаОсновныхФорм_Списки; -КонецФункции - -&НаСервере -Функция мИменаОсновныхФорм_Сервер() - Возврат Объект().мИменаОсновныхФорм; -КонецФункции - -&НаСервереБезКонтекста -Функция ЭтоУправляемаяФорма(МетаФорма) - Возврат МетаФорма <> Неопределено И МетаФорма.ТипФормы = Метаданные.СвойстваОбъектов.ТипФормы.Управляемая; -КонецФункции - -//} - -//{ РаботаСНастройками - -&НаКлиенте -Функция КлючНастройки() Экспорт - Возврат "smoke"; -КонецФункции - -&НаКлиенте -Процедура ЗагрузитьНастройки() - - ПутьНастройки = КлючНастройки(); - - //Отладка(СтрШаблон("Дымовые ФлагОтладки %1", КонтекстЯдра.Объект.ФлагОтладки)); - - ПлагинНастроек = КонтекстЯдра.Плагин("Настройки"); - - ПлагинТестКлиенты = КонтекстЯдра.Плагин("ТестКлиенты"); - НастройкиМодальныхОкон = ПлагинНастроек.ПолучитьНастройку(ПлагинТестКлиенты.КлючНастройкиМодальныхОкон()); - - Объект.Настройки = ПлагинНастроек.ПолучитьНастройку(ПутьНастройки); - Если Не ЗначениеЗаполнено(Объект.Настройки) Тогда - Объект.Настройки = Новый Структура; - КонецЕсли; - - Если ЕстьНастройка("ВыводитьСообщенияВЖурналРегистрации", Объект.Настройки) Тогда - Объект.ВыводитьСообщенияВЖурналРегистрации = Объект.Настройки.ВыводитьСообщенияВЖурналРегистрации; - //Отладка(СтрШаблон("ВыводитьСообщенияВЖурналРегистрации %1", Объект.ВыводитьСообщенияВЖурналРегистрации)); - КонецЕсли; - - Если ЕстьНастройка("ОткрываемФормыНаКлиентеТестирования", Объект.Настройки) Тогда - Объект.ОткрываемФормыНаКлиентеТестирования = Объект.Настройки.ОткрываемФормыНаКлиентеТестирования; - КонецЕсли; - - НаборНастроекПоУмолчанию = СоздатьНаборНастроекПоУмолчанию(); - - ЗаменитьНесуществующиеНастройкиЗначениямиПоУмолчанию(Объект.Настройки, НаборНастроекПоУмолчанию); - - Если ЗначениеЗаполнено(НастройкиМодальныхОкон) Тогда - Объект.Настройки.Вставить(ПлагинТестКлиенты.КлючНастройкиМодальныхОкон(), НастройкиМодальныхОкон); - КонецЕсли; - -КонецПроцедуры - -&НаСервере -Функция СоздатьНаборНастроекПоУмолчанию() Экспорт - - Возврат Объект().СоздатьНаборНастроекПоУмолчанию(); - -КонецФункции // () - -&НаКлиенте -Процедура ЗаменитьНесуществующиеНастройкиЗначениямиПоУмолчанию(Знач Настройки, Знач НаборНастроекПоУмолчанию) - - Для каждого КлючЗначение Из НаборНастроекПоУмолчанию Цикл - Если Не ЕстьНастройка(КлючЗначение.Ключ) Тогда - Настройки.Вставить(КлючЗначение.Ключ, КлючЗначение.Значение); - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -// Позволяет одним вызовом получить значение из вложенных друг в друга структур -// по строке ключей, объединенных точкой. -// -// Параметры: -// ПутьНастроек - Строка - Путь или ключ настроек -// СтруктураНастроек - Произвольный, Неопределено - полученное значение -// ( необязательно ) -// -// Возвращаемое значение: -// Булево - Истина, если ключ/путь найден, иначе Ложь -// -// Пример: -// Структура = Новый Структура("Ключ1", Новый Структура("Ключ2", Новый Структура("Ключ3", 42))); -// РезультатПроверки = ЕстьНастройка("Ключ1.Ключ2.Ключ3", ВремЗнач); -// В результате получим ВремЗнач == 42 -// -&НаКлиенте -Функция ЕстьНастройка(Знач ПутьНастроек, СтруктураНастроек = Неопределено) Экспорт - - Если СтруктураНастроек = Неопределено Тогда - СтруктураНастроек = Объект.Настройки; - КонецЕсли; - - Возврат КонтекстЯдра.Плагин("Настройки").ЕстьНастройка(ПутьНастроек, СтруктураНастроек); - -КонецФункции - -&НаКлиенте -Функция НужноВыполнятьТест() - - ЗначениеПоУмолчанию = Истина; - - ЗагрузитьНастройки(); - - Настройки = ОБъект.Настройки; - - Если Не ЗначениеЗаполнено(Настройки) Тогда - Возврат ЗначениеПоУмолчанию; - КонецЕсли; - - КлючНастройки = КлючНастройки(); - - ВыполнятьТест = Неопределено; - Если ТипЗнч(Настройки) = Тип("Структура") - И Настройки.Свойство("Используется", ВыполнятьТест) Тогда - - Возврат ВыполнятьТест = Истина; - КонецЕсли; - - Возврат ЗначениеПоУмолчанию; - -КонецФункции - -&НаКлиенте -Функция ВключенСтрогийПорядокВыполнения() - Если ЕстьНастройка("СтрогийПорядокВыполнения", Объект.Настройки) - И Объект.Настройки.СтрогийПорядокВыполнения = Ложь Тогда - Возврат Ложь; - КонецЕсли; - Возврат Истина; -КонецФункции - -&НаСервере -Функция ПолучитьНастройкуГруппировки() - Возврат Объект().ПолучитьНастройкуГруппировки(Объект.Настройки); -КонецФункции - -&НаКлиенте -Функция ВидМетаданныхИсключенИзТестирования(ВидМетаданных) - Если ЕстьНастройка(ВидМетаданных) Тогда - Возврат (ТипЗнч(Объект.Настройки[ВидМетаданных]) = Тип("Булево") И НЕ Объект.Настройки[ВидМетаданных]); - КонецЕсли; - Возврат Ложь; -КонецФункции - -&НаСервере -Функция ПропускаемОшибкуПоТекстуИсключенияСервер(Знач ТекстИсключения) - Возврат Объект().ПропускаемОшибкуПоТекстуИсключения(ТекстИсключения); -КонецФункции - -//} - -//{ блок юнит-тестов - САМИ ТЕСТЫ - -&НаКлиенте -Процедура ПередЗапускомТеста() Экспорт - - СоздаваемыйЭлемент = Неопределено; - - ОбновитьПовторноИспользуемыеЗначения(); - - НужноИсключениеЕслиНеНайденоДокументов = Ложь; - - СоздатьИменаОсновныхФорм(); - - ПлагинТестКлиенты = КонтекстЯдра.Плагин("ТестКлиенты"); - Если ЕстьНастройка(ПлагинТестКлиенты.КлючНастройкиМодальныхОкон(), Объект.Настройки) Тогда - ПлагинТестКлиенты.УстановитьНастройкиМодальныхОкон(Объект.Настройки[ПлагинТестКлиенты.КлючНастройкиМодальныхОкон()]); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ПослеЗапускаТеста() Экспорт - - ЗакрытьФорму(); - Попытка - УдалитьСозданныеОбъекты(СоздаваемыйЭлемент); - Исключение - КонецПопытки; -КонецПроцедуры - -&НаКлиенте -Процедура ТестДолжен_ПропуститьТестФормы(Знач ПричинаПропускаТеста) Экспорт - КонтекстЯдра.ПропуститьТест(ПричинаПропускаТеста); -КонецПроцедуры - -&НаКлиенте -Процедура ТестДолжен_ОткрытьФормуПоПолномуИмениФормы(ПолноеИмяФормы) Экспорт - ТестироватьФорму(ПолноеИмяФормы, Неопределено); -КонецПроцедуры - -&НаКлиенте -Процедура ТестДолжен_ОткрытьФормуСуществующегоЭлементаСправочника(Мета_ПолноеИмя) Экспорт - СуществующийЭлемент = ПолучитьОбъектСуществующегоЭлементаСправочникаИВернутьСсылкуСервер(Мета_ПолноеИмя); - Если ЗначениеЗаполнено(СуществующийЭлемент) Тогда - ТестироватьФормуСсылочногоОбъекта(Мета_ПолноеИмя, СуществующийЭлемент); - Иначе - СоздаваемыйЭлемент = СоздатьЭлементИВернутьСсылкуСервер(Мета_ПолноеИмя); - Если ЗначениеЗаполнено(СоздаваемыйЭлемент) Тогда - ТестироватьФормуСсылочногоОбъекта(Мета_ПолноеИмя, СоздаваемыйЭлемент); - КонецЕсли; - КонецЕсли; -КонецПроцедуры - -&НаСервере -Функция СоздатьЭлементИВернутьСсылкуСервер(Мета_ПолноеИмя) - ИД = ПолучитьВидМетаданного(Мета_ПолноеИмя); - - ОсновнойОбъект = Объект(); - Возврат ОсновнойОбъект.СоздатьЭлементИВернутьСсылку(ИД, "существующий"); - -КонецФункции - -&НаКлиенте -Процедура ТестДолжен_ОткрытьФормуНовогоЭлементаСправочника(Мета_ПолноеИмя) Экспорт - ТестироватьФормуСсылочногоОбъекта(Мета_ПолноеИмя, Неопределено); -КонецПроцедуры - -&НаКлиенте -Процедура ТестДолжен_ОткрытьФормуНовогоДокумента(Мета_ПолноеИмя) Экспорт - ТестироватьФормуСсылочногоОбъекта(Мета_ПолноеИмя, Неопределено); -КонецПроцедуры - -&НаКлиенте -Процедура ТестДолжен_ОткрытьФормуСуществующегоЭлементаДокумента(Мета_ПолноеИмя) Экспорт - Док = ПолучитьСуществующийДокументОбъектИВернутьСсылкуСервер(Мета_ПолноеИмя); - Если Док <> Неопределено Тогда - ТестироватьФормуСсылочногоОбъекта(Мета_ПолноеИмя, Док); - КонецЕсли; -КонецПроцедуры - -&НаСервере -Функция ПолучитьСуществующийДокументОбъектИВернутьСсылкуСервер(Мета_ПолноеИмя) - ИД = ПолучитьВидМетаданного(Мета_ПолноеИмя); - - ОсновнойОбъект = Объект(); - Док = ОсновнойОбъект.ПолучитьСуществующийДокументОбъектИВернутьСсылку(ИД, НужноИсключениеЕслиНеНайденоДокументов, - "ТестДолжен_ОткрытьФормуСуществующегоДокумента"); - Возврат Док; -КонецФункции - -&НаСервере -Функция ПолучитьОбъектСуществующегоЭлементаСправочникаИВернутьСсылкуСервер(Мета_ПолноеИмя) - ИД = ПолучитьВидМетаданного(Мета_ПолноеИмя); - - ОсновнойОбъект = Объект(); - - Отбор = Новый Структура; - МетаданныеОбъекта = Метаданные.Справочники[ИД]; - Если МетаданныеОбъекта.Иерархический - И МетаданныеОбъекта.ВидИерархии = Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияГруппИЭлементов Тогда - Отбор.Вставить("ЭтоГруппа", "Ложь"); - Если МетаданныеОбъекта.ОсновнаяФормаГруппы <> Неопределено - И Найти(Мета_ПолноеИмя, МетаданныеОбъекта.ОсновнаяФормаГруппы.Имя) <> 0 Тогда - Отбор.Вставить("ЭтоГруппа", "Истина"); - КонецЕсли; - КонецЕсли; - - Элем = ОсновнойОбъект.ПолучитьОбъектСуществующегоЭлементаСправочникаИВернутьСсылку(ИД, Ложь, - "ТестДолжен_ОткрытьФормуСуществующегоЭлементСправочника", Отбор); - Возврат Элем; -КонецФункции - -&НаКлиенте -Процедура ТестДолжен_ОткрытьФормуНовогоБизнесПроцесса(Мета_ПолноеИмя) Экспорт - ТестироватьФормуСсылочногоОбъекта(Мета_ПолноеИмя, Неопределено); -КонецПроцедуры - -&НаКлиенте -Процедура ТестДолжен_ОткрытьФормуСуществующегоБизнесПроцесса(Мета_ПолноеИмя) Экспорт - СуществующийЭлемент = ПолучитьОбъектСуществующегоБизнесПроцессаИВернутьСсылкуСервер(Мета_ПолноеИмя); - Если ЗначениеЗаполнено(СуществующийЭлемент) Тогда - ТестироватьФормуСсылочногоОбъекта(Мета_ПолноеИмя, СуществующийЭлемент); - Иначе - СоздаваемыйЭлемент = СоздатьБизнесПроцессИВернутьСсылкуСервер(Мета_ПолноеИмя); - Если ЗначениеЗаполнено(СоздаваемыйЭлемент) Тогда - ТестироватьФормуСсылочногоОбъекта(Мета_ПолноеИмя, СоздаваемыйЭлемент); - КонецЕсли; - КонецЕсли; -КонецПроцедуры - -&НаСервере -Функция ПолучитьОбъектСуществующегоБизнесПроцессаИВернутьСсылкуСервер(Мета_ПолноеИмя) - ИД = ПолучитьВидМетаданного(Мета_ПолноеИмя); - - ОсновнойОбъект = Объект(); - Элем = ОсновнойОбъект.ПолучитьОбъектСуществующегоБизнесПроцессаИВернутьСсылку(ИД, Ложь, - "ТестДолжен_ОткрытьФормуСуществующегоБизнесПроцесса"); - Возврат Элем; -КонецФункции - -&НаСервере -Функция СоздатьБизнесПроцессИВернутьСсылкуСервер(Мета_ПолноеИмя) - ИД = ПолучитьВидМетаданного(Мета_ПолноеИмя); - - ОсновнойОбъект = Объект(); - Возврат ОсновнойОбъект.СоздатьБизнесПроцессИВернутьСсылку(ИД); -КонецФункции - -// проверка бага https://github.com/xDrivenDevelopment/xUnitFor1C/issues/154 -&НаКлиенте -Процедура ТестДолжен_ПроверитьБагПлатформыПриОткрытииУправляемойФормыПриОткрытииКоторойЕстьИсключение() Экспорт - Мета_ПолноеИмя = "Обработка.ТестОбработка_Форма_ИсключениеПриОткрытии.Форма.УправляемаяФорма"; - ошибка =""; - Попытка - ОткрытьФорму(Мета_ПолноеИмя); - Исключение - ошибка = ОписаниеОшибки(); - КонецПопытки; - Утверждения.ПроверитьЗаполненность(ошибка, "Ошибка"); -КонецПроцедуры - -//} - -//{ Переопределение исключений, чтобы не открывать формы. -//} - -//{ ВспомогательныеМетоды - -&НаСервереБезКонтекста -Процедура УдалитьСозданныеОбъекты(СоздаваемыйЭлемент) - - Если СоздаваемыйЭлемент = Неопределено Тогда - Возврат; - КонецЕсли; - - Попытка - - СозданныйОбъект = СоздаваемыйЭлемент.ПолучитьОбъект(); - - Если ЗначениеЗаполнено(СоздаваемыйЭлемент.Владелец) Тогда - - Если СоздаваемыйЭлемент.Метаданные().Владельцы.Количество() > 0 - И Не СоздаваемыйЭлемент.Владелец.Пустая() Тогда - УдалитьСозданныеОбъекты(СозданныйОбъект.Владелец); - Возврат; - КонецЕсли; - - КонецЕсли; - - СозданныйОбъект.Удалить(); - - Исключение - - ИнформацияОбОшибке = ИнформацияОбОшибке(); - ЗаписьЖурналаРегистрации( - НСтр("ru='Тесты_ОткрытиеФормКонфигурации'", "ru"), - УровеньЖурналаРегистрации.Ошибка, - СозданныйОбъект, - СоздаваемыйЭлемент, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); - ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке); - - КонецПопытки; - - СоздаваемыйЭлемент = Неопределено; - -КонецПроцедуры - -&НаСервере -Функция Объект() - Возврат РеквизитФормыВЗначение("Объект"); -КонецФункции - -&НаКлиентеНаСервереБезКонтекста -Функция ПолучитьВидМетаданного(Мета_ПолноеИмя) - //Если ВключенаАнглийскаяЛокализация() Тогда - // СтрокаФорма = ".Form."; - //Иначе - // СтрокаФорма = ".Форма."; - //КонецЕсли; - - Поз = Найти(Мета_ПолноеИмя, ".Форма."); - Если Поз = 0 Тогда - Поз = Найти(Мета_ПолноеИмя, ".Form."); - КонецЕсли; - Если Поз <> 0 Тогда - ИД = Лев(Мета_ПолноеИмя, Поз - 1); - //TODO локализация Английская - Мета_ПолноеИмя "Catalog.ПростойСправочник.Form.УпрФормаЭлемента" String; - ИД = Сред(ИД, Найти(ИД, ".") + 1); - Иначе - // Если нет формы и мы открываем по имени справочника, - // то в качестве его ИД просто берем 2ю часть наименования // - ИД = Прав(Мета_ПолноеИмя, СтрДлина(Мета_ПолноеИмя) - Найти(Мета_ПолноеИмя,".")); - КонецЕсли; - - Возврат ИД; -КонецФункции - -&НаСервереБезКонтекста -Функция ИмяМетодаПропускаТестов() - Возврат "ТестДолжен_ПропуститьТестФормы"; -КонецФункции - -&НаСервере -Процедура ВыполнитьЗаписьВЖурналРегистрации(ПолноеИмяФормы) - ЗаписьЖурналаРегистрации(Объект().Метаданные().Синоним, УровеньЖурналаРегистрации.Информация, , , - "Операция: " + ПолноеИмяФормы); -КонецПроцедуры - -&НаКлиенте -Процедура Отладка(Знач Сообщение) - КонтекстЯдра.Отладка(Сообщение); -КонецПроцедуры - -&НаСервереБезКонтекста -Функция ВключенаАнглийскаяЛокализация() - ВариантВстроенногоЯзыкаАнглийский = Ложь; - Если Metadata.ScriptVariant = Metadata.ObjectProperties.ScriptVariant.English Или - ТекущийЯзыкСистемы() = "en" Тогда - - ВариантВстроенногоЯзыкаАнглийский = Истина; - КонецЕсли; - - Возврат ВариантВстроенногоЯзыкаАнглийский; -КонецФункции - -//} - -//{ Тесты с помощью клиента тестирования - -&НаКлиенте -Процедура ТестироватьФормуНаКлиентеТестирования(ПолноеИмяФормы, ПараметрыФормы) Экспорт - - ПлагинТестКлиенты = КонтекстЯдра.Плагин("ТестКлиенты"); - ТестКлиент = ПлагинТестКлиенты.ТестКлиентПоУмолчанию(); - ОсновноеОкно = ОсновноеОкно(ТестКлиент); - - ОткрытыеОкнаДо = ПлагинТестКлиенты.ОткрытыеОкна(ТестКлиент); - - Попытка - // Если ссылка задана - открываем просто форму Элемента/Документа - СсылкаНаОбъект = Неопределено; - Если ТипЗнч(ПараметрыФормы) = Тип("Структура") И ПараметрыФормы.Свойство("Ключ",СсылкаНаОбъект) - И ЗначениеЗаполнено(СсылкаНаОбъект) Тогда - ПарамНавигационнаяСсылка = ПолучитьНавигационнуюСсылку(СсылкаНаОбъект); - Иначе - // Иначе открываем просто по контексту - для справочника или документа это будет новый объект // - ПарамНавигационнаяСсылка = "e1cib/app/" + ПолноеИмяФормы; - КонецЕсли; - ОсновноеОкно.ВыполнитьКоманду(ПарамНавигационнаяСсылка); - Исключение - ВызватьИсключение КонтекстЯдра.СтрШаблон_("Не удалось выполнить команду %1 на тест-клиенте. - |Возможно, сеанс тест-клиента заблокирован модальным окном", ПарамНавигационнаяСсылка); - КонецПопытки; - - ПлагинТестКлиенты.ИдентифицироватьОкноПредупреждение(ТестКлиент, ПереходПоКнопкеКомандногоИнтерфейса(), Ложь); - - ПлагинТестКлиенты.ЗакрытьВсеОткрытыеОкна(ТестКлиент); - - ПлагинТестКлиенты.ПроверитьНаНовыеМодальныеОкна(ТестКлиент, ОткрытыеОкнаДо); - -КонецПроцедуры - -// TODO исправить дублирование кода с тестами командного интерфейса и плагином ТестКлиент - -&НаКлиенте -Функция ОсновноеОкно(ТестКлиент) - - Для Каждого ТестируемоеОкно Из ТестКлиент.ПолучитьПодчиненныеОбъекты() Цикл - Если ТипЗнч(ТестируемоеОкно) = Тип("ТестируемоеОкноКлиентскогоПриложения") - И ТестируемоеОкно.Основное Тогда - Возврат ТестируемоеОкно; - КонецЕсли; - КонецЦикла; - - ВызватьИсключение "Не удалось найти основное окно"; - -КонецФункции - -&НаКлиенте -Функция ПереходПоКнопкеКомандногоИнтерфейса() - - Возврат "Переход по кнопке командного интерфейса"; - -КонецФункции - -&НаКлиенте -Функция ТекстИсключения(ОкноПредупреждение) - - ТекстыЗаголовков = Новый Массив; - Для Каждого ТекОбъект Из ОкноПредупреждение.НайтиОбъекты(Тип("ТестируемоеПолеФормы")) Цикл - ТекстыЗаголовков.Добавить(ТекОбъект.ТекстЗаголовка); - КонецЦикла; - - Возврат СтрСоединить_(ТекстыЗаголовков, " "); - -КонецФункции - -//} - -//&НаКлиентеНаСервереБезКонтекста -Функция СтрСоединить_(МассивЭлементов, Символ = "") Экспорт - СтрокаРезультат = ""; - Если МассивЭлементов.Количество() > 0 Тогда - СтрокаРезультат = МассивЭлементов.Получить(0) + Символ; - Для сч = 0 по МассивЭлементов.ВГраница() Цикл - Элемент = МассивЭлементов.Получить(сч); - Если ЗначениеЗаполнено(Элемент) Тогда - СтрокаРезультат = МассивЭлементов.Получить(сч) + Символ; - КонецЕсли; - КонецЦикла; - КонецЕсли; - - Возврат СтрокаРезультат; - -КонецФункции diff --git "a/src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Templates/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265\320\236\320\264\320\275\320\276\320\263\320\276\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\230\320\221.xml" "b/src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Templates/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265\320\236\320\264\320\275\320\276\320\263\320\276\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\230\320\221.xml" deleted file mode 100644 index 9e2cd62..0000000 --- "a/src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Templates/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265\320\236\320\264\320\275\320\276\320\263\320\276\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\230\320\221.xml" +++ /dev/null @@ -1,16 +0,0 @@ - - - - \ No newline at end of file diff --git "a/src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Templates/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265\320\236\320\264\320\275\320\276\320\263\320\276\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\230\320\221/Ext/Template.xml" "b/src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Templates/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265\320\236\320\264\320\275\320\276\320\263\320\276\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\230\320\221/Ext/Template.xml" deleted file mode 100644 index ca7803b..0000000 --- "a/src/tests/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\242\320\265\321\201\321\202\321\213_\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265\320\244\320\276\321\200\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Templates/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265\320\236\320\264\320\275\320\276\320\263\320\276\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\230\320\221/Ext/Template.xml" +++ /dev/null @@ -1,351 +0,0 @@ - - - - ru - ru - - ru - Русский - Русский - - - en - English - English - - - - 7 - - 0 - - 1 - - - - 1 - - 2 - - - - 2 - - 3 - - - - 3 - - 4 - - - - 4 - - 5 - - - - 5 - - 6 - - - - 6 - - 7 - - - - - 0 - - - - 0 - - - ru - Тип - - - - - - - 0 - - - ru - Вид - - - - - - - 0 - - - ru - ИмяПеременной - - - - - - - 0 - - - ru - ТЧ - - - - - - - 0 - - - ru - Реквизит - - - - - - - 0 - - - ru - Значение - - - - - - - 0 - - - ru - Режим - - - - - - - - 1 - - - - 0 - - - ru - ПользовательИБ - - - - - - - 0 - - - - - - 0 - - - ru - Пользователь1 - - - - - - - - 2 - - - 4 - - 0 - - - ru - Имя - - - - - - - 0 - - - ru - ТестИмя - - - - - - - - 3 - - - 4 - - 0 - - - ru - ОсновнойИнтерфейс - - - - - - - 0 - - - ru - СтаршийРегион - - - - - - - - 4 - - - 4 - - 0 - - - ru - Пароль - - - - - - - - 5 - - - 3 - - 0 - - - ru - Роли - - - - - - - - 6 - - - 4 - - 0 - - - ru - Роль - - - - - - - 0 - - - ru - тестДоступКВнешнимОбработкам - - - - - - - - 7 - - - 4 - - 0 - - - ru - Роль - - - - - - - 0 - - - ru - СтаршийРегион - - - - - - - true - 8 - 8 - 8 - - 80 - - - 104 - - - 129 - - - 24 - - - 97 - - - 155 - - - 90 - - - 72 - - \ No newline at end of file diff --git "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201.xml" "b/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201.xml" deleted file mode 100644 index ec7eb3c..0000000 --- "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201.xml" +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - c3831ec8-d8d5-4f93-8a22-f9bfae07327f - c2c16537-e4b3-4069-a62e-c997e4e3541a - - - be5c37cb-b325-4947-a4e6-a467493e6913 - ca433c07-6469-4b9c-b801-04a95f2ab91b - - - - тесты_КомандныйИнтерфейс - - - ru - Тесты командный интерфейс - - - - ExternalDataProcessor.тесты_КомандныйИнтерфейс.Form.Форма - - - - - - СтрогийПорядокВыполнения - - - ru - Строгий порядок выполнения - - - - - xs:boolean - - false - - - - false - - false - false - - - DontCheck - Items - - - Auto - Auto - - - Auto - - - - - Настройки - - - ru - Настройки - - - - - false - - - - false - - false - false - - - DontCheck - Items - - - Auto - Auto - - - Auto - - -
Форма
-
-
-
\ No newline at end of file diff --git "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/Forms/\320\244\320\276\321\200\320\274\320\260.xml" "b/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/Forms/\320\244\320\276\321\200\320\274\320\260.xml" deleted file mode 100644 index 3280e5a..0000000 --- "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/Forms/\320\244\320\276\321\200\320\274\320\260.xml" +++ /dev/null @@ -1,22 +0,0 @@ - - -
- - Форма - - - ru - Форма - - - - Managed - false - - PlatformApplication - MobilePlatformApplication - - - -
-
\ No newline at end of file diff --git "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml" "b/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml" deleted file mode 100644 index 6ed4709..0000000 --- "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml" +++ /dev/null @@ -1,133 +0,0 @@ - -
- - false - - - - List - None - true -
false
- true - true - true - AsFile - КнопкиКомандногоИнтерфейса - - - - - - - КнопкиКомандногоИнтерфейса - SearchStringRepresentation - - - - - - - КнопкиКомандногоИнтерфейса - ViewStatusRepresentation - - - - - - - КнопкиКомандногоИнтерфейса - SearchControl - - - - - - КнопкиКомандногоИнтерфейсаВыбор - - - - КнопкиКомандногоИнтерфейса.ПредставлениеТеста - EnterOnInput - - - - - КнопкиКомандногоИнтерфейса.НавигационнаяСсылка - EnterOnInput - - - - -
-
- - - - cfg:ExternalDataProcessorObject.тесты_КомандныйИнтерфейс - - true - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Кнопки командного интерфейса</v8:content> - </v8:item> - - - v8:ValueTable - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Представление теста</v8:content> - </v8:item> - - - xs:string - - 0 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Навигационная ссылка</v8:content> - </v8:item> - - - xs:string - - 0 - Variable - - - - - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Интерактивный тест</v8:content> - </v8:item> - - - - ru - Интерактивный тест - - - ИнтерактивныйТест - DontUse - - -
\ No newline at end of file diff --git "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" "b/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" deleted file mode 100644 index 7004b90..0000000 --- "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/\321\202\320\265\321\201\321\202\321\213_\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" +++ /dev/null @@ -1,679 +0,0 @@ - -&НаКлиенте -Перем КонтекстЯдра; - -&НаКлиенте -Перем Утверждения; - -&НаКлиенте -Перем ПлагинТестКлиенты; - -&НаКлиенте -Процедура Инициализация(КонтекстЯдраПараметр) Экспорт - КонтекстЯдра = КонтекстЯдраПараметр; - Утверждения = КонтекстЯдра.Плагин("БазовыеУтверждения"); - ПлагинТестКлиенты = КонтекстЯдра.Плагин("ТестКлиенты"); - - ЗагрузитьНастройки(); -КонецПроцедуры - -&НаКлиенте -Процедура ЗагрузитьНастройки() - - ПутьНастройки = КлючНастройки(); - - Если ЗначениеЗаполнено(Объект.Настройки) Тогда - Возврат; - КонецЕсли; - - ПлагинНастроек = КонтекстЯдра.Плагин("Настройки"); - - НастройкиМодальныхОкон = ПлагинНастроек.ПолучитьНастройку(ПлагинТестКлиенты.КлючНастройкиМодальныхОкон()); - - Объект.Настройки = ПлагинНастроек.ПолучитьНастройку(ПутьНастройки); - Если Не ЗначениеЗаполнено(Объект.Настройки) Тогда - Объект.Настройки = Новый Структура; - КонецЕсли; - - НаборНастроекПоУмолчанию = СоздатьНаборНастроекПоУмолчанию(); - - ЗаменитьНесуществующиеНастройкиЗначениямиПоУмолчанию(Объект.Настройки, НаборНастроекПоУмолчанию); - - Если ЕстьНастройка("СтрогийПорядокВыполнения", Объект.Настройки) Тогда - Объект.СтрогийПорядокВыполнения = Объект.Настройки.СтрогийПорядокВыполнения; - КонецЕсли; - - Если ЗначениеЗаполнено(НастройкиМодальныхОкон) Тогда - Объект.Настройки.Вставить(ПлагинТестКлиенты.КлючНастройкиМодальныхОкон(), НастройкиМодальныхОкон); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Функция ЕстьНастройка(Знач ПутьНастроек, СтруктураНастроек = Неопределено) Экспорт - - Если СтруктураНастроек = Неопределено Тогда - СтруктураНастроек = Объект.Настройки; - КонецЕсли; - - Возврат КонтекстЯдра.Плагин("Настройки").ЕстьНастройка(ПутьНастроек, СтруктураНастроек); - -КонецФункции - -&НаСервере -Функция СоздатьНаборНастроекПоУмолчанию() Экспорт - - Рез = Новый Структура; - - Рез.Вставить("СтрогийПорядокВыполнения", Истина); - - Возврат Новый ФиксированнаяСтруктура(Рез); - -КонецФункции - -&НаКлиенте -Процедура ЗаменитьНесуществующиеНастройкиЗначениямиПоУмолчанию(Знач Настройки, Знач НаборНастроекПоУмолчанию) - - Для каждого КлючЗначение Из НаборНастроекПоУмолчанию Цикл - Если Не ЕстьНастройка(КлючЗначение.Ключ) Тогда - Настройки.Вставить(КлючЗначение.Ключ, КлючЗначение.Значение); - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -&НаКлиенте -Функция НужноВыполнятьТест() - - ЗначениеПоУмолчанию = Истина; - - ЗагрузитьНастройки(); - - Настройки = ОБъект.Настройки; - - Если Не ЗначениеЗаполнено(Настройки) Тогда - Возврат ЗначениеПоУмолчанию; - КонецЕсли; - - КлючНастройки = КлючНастройки(); - - ВыполнятьТест = Неопределено; - Если ТипЗнч(Настройки) = Тип("Структура") - И Настройки.Свойство("Используется", ВыполнятьТест) Тогда - - Возврат ВыполнятьТест = Истина; - КонецЕсли; - - Возврат ЗначениеПоУмолчанию; - -КонецФункции - -&НаКлиенте -Функция КлючНастройки() Экспорт - Возврат "CommandInterface"; -КонецФункции - -&НаКлиенте -Процедура ЗаполнитьНаборТестов(НаборТестов, КонтекстЯдраПараметр) Экспорт - - Инициализация(КонтекстЯдраПараметр); - - Если Не НужноВыполнятьТест() Тогда - Возврат; - КонецЕсли; - - Если Объект.СтрогийПорядокВыполнения Тогда - НаборТестов.СтрогийПорядокВыполнения(); - НаборТестов.ПродолжитьВыполнениеПослеПаденияТеста(); - КонецЕсли; - - КонтекстЯдра = КонтекстЯдраПараметр; - - ПлагинТестКлиенты = КонтекстЯдра.Плагин("ТестКлиенты"); - - ТестКлиент = Неопределено; - - Попытка - ТестКлиент = ПлагинТестКлиенты.ТестКлиентПоУмолчанию(); - Исключение - ИнфоОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - Сообщить(ИнфоОшибки); - Возврат; - КонецПопытки; - - Если ТестКлиент = Неопределено Тогда - Возврат; - КонецЕсли; - - ОсновноеОкно = ПлагинТестКлиенты.ОсновноеОкно(ТестКлиент); - - ИсключаемыеОперации = Новый Массив; - ДобавитьИсключения(ИсключаемыеОперации, "ОбщиеКоманды", "ОбщаяКоманда."); - ДобавитьИсключения(ИсключаемыеОперации, "ОбщиеФормы", "ОбщаяФорма."); - ДобавитьИсключения(ИсключаемыеОперации, "Справочники", "Справочник."); - ДобавитьИсключения(ИсключаемыеОперации, "Документы", "Документ."); - ДобавитьИсключения(ИсключаемыеОперации, "Отчеты", "Отчет."); - ДобавитьИсключения(ИсключаемыеОперации, "Обработки", "Обработка."); - ДобавитьИсключения(ИсключаемыеОперации, "БизнесПроцессы", "БизнесПроцесс."); - ДобавитьИсключения(ИсключаемыеОперации, "ВнешниеИсточникиДанных", "ВнешнийИсточникДанных."); - - ОписаниеДобавляемыхТестов = ОписаниеДобавляемыхТестов(ТестКлиент, ОсновноеОкно); - Для Каждого ГруппаТестов Из ОписаниеДобавляемыхТестов Цикл - - СписокДляСортировки = Новый СписокЗначений; - Для Каждого КлючЗначение Из ГруппаТестов.Тесты Цикл - Если Не ИсключитьИзПроверки(КлючЗначение.Ключ, ИсключаемыеОперации) Тогда - СписокДляСортировки.Добавить(КлючЗначение, КлючЗначение.Значение.ПредставлениеТеста); - КонецЕсли; - КонецЦикла; - СписокДляСортировки.СортироватьПоПредставлению(); - - Если СписокДляСортировки.Количество() Тогда - НаборТестов.НачатьГруппу(КонтекстЯдра.СтрШаблон_(НСтр("ru = 'Раздел: %1'"),ГруппаТестов.ИмяГруппы)); - КонецЕсли; - - Для Каждого ЭлементСпискаЗначений Из СписокДляСортировки Цикл - - КлючЗначение = ЭлементСпискаЗначений.Значение; - Описание = КлючЗначение.Значение; - ОписаниеНавигационнаяСсылка = Описание.НавигационнаяСсылка; - - НаборТестов.Добавить( - Описание.ИмяТеста, - НаборТестов.ПараметрыТеста(ОписаниеНавигационнаяСсылка), - КонтекстЯдра.СтрШаблон_(НСтр("ru = '%1: проверка элемента командного интерфейса'"), Описание.ПредставлениеТеста)); - - КонецЦикла; - - КонецЦикла; - -КонецПроцедуры - -&НаКлиенте -Процедура ДобавитьИсключения(Знач ИсключаемыеОперации, ИмяНастройки, ПрефиксШаблона) - - Если ВидМетаданныхИсключенИзТестирования(ИмяНастройки) Тогда - - ИсключаемыеОперации.Добавить(ПрефиксШаблона); - - ИначеЕсли ЕстьНастройка(ИмяНастройки) Тогда - - Для Каждого ПараметрНастройки Из Объект.Настройки[ИмяНастройки] Цикл - ИсключаемыеОперации.Добавить(ПрефиксШаблона + ПараметрНастройки); - КонецЦикла; - - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Функция ИсключитьИзПроверки(ОписаниеНавигационнаяСсылка, ИсключаемыеОперации) - - Для Каждого ШаблонИсключения Из ИсключаемыеОперации Цикл - Если Найти(ОписаниеНавигационнаяСсылка, ШаблонИсключения) <> 0 Тогда - Возврат Истина; - КонецЕсли; - КонецЦикла; - - Возврат Ложь; -КонецФункции - -&НаКлиенте -Процедура ПередЗапускомТеста() Экспорт - - ПлагинТестКлиенты = КонтекстЯдра.Плагин("ТестКлиенты"); - Если ЕстьНастройка(ПлагинТестКлиенты.КлючНастройкиМодальныхОкон(), Объект.Настройки) Тогда - ПлагинТестКлиенты.УстановитьНастройкиМодальныхОкон(Объект.Настройки[ПлагинТестКлиенты.КлючНастройкиМодальныхОкон()]); - КонецЕсли; - - ТестКлиент = ПлагинТестКлиенты.ТестКлиентПоУмолчанию(); - ПлагинТестКлиенты.ЗакрытьВсеОткрытыеОкна(ТестКлиент); - -КонецПроцедуры - -&НаКлиенте -Процедура ПослеЗапускаТеста() Экспорт - - //ТестКлиент = КонтекстЯдра.Плагин("ТестКлиенты").ТестКлиентПоУмолчанию(); - //КонтекстЯдра.Плагин("ТестКлиенты").ЗакрытьВсеОткрытыеОкна(ТестКлиент); - -КонецПроцедуры - -&НаКлиенте -Функция ОписаниеДобавляемыхТестов(ТестКлиент, ОсновноеОкно) - - РезКоллекцияОписаний = Новый Массив; - ИсключаемыеРазделы = Новый Массив; - ДобавитьИсключения(ИсключаемыеРазделы, "Разделы", ""); - - Попытка - КомандныйИнтерфейс = ОсновноеОкно.ПолучитьКомандныйИнтерфейс(); - Исключение - ВызватьИсключение "Не удалось получить командный интерфейс. - |Возможно, сеанс тест-клиента заблокирован модальным окном"; - КонецПопытки; - ПанельРазделов = КомандныйИнтерфейс.НайтиОбъект(Тип("ТестируемаяГруппаКомандногоИнтерфейса"), НСтр("ru = 'Панель разделов'; en = 'Section panel'")); - Если ПанельРазделов = Неопределено Тогда - ПанельРазделов = КомандныйИнтерфейс.НайтиОбъект(Тип("ТестируемаяГруппаКомандногоИнтерфейса"), "Section panel"); - КонецЕсли; - - Если ТипЗнч(ПанельРазделов) = Тип("ТестируемаяГруппаКомандногоИнтерфейса") Тогда - КнопкиРазделов = ПанельРазделов.НайтиОбъекты(Тип("ТестируемаяКнопкаКомандногоИнтерфейса")); - Для Каждого ТекКнопкаРаздел Из КнопкиРазделов Цикл - Если ИсключитьИзПроверки(ТекКнопкаРаздел.ТекстЗаголовка, ИсключаемыеРазделы) Тогда - Продолжить; - КонецЕсли; - СтруктураГруппы = Новый Структура; - СтруктураГруппы.Вставить("ИмяГруппы", ТекКнопкаРаздел.ТекстЗаголовка); - СтруктураГруппы.Вставить("Тесты", Новый Соответствие); - РезКоллекцияОписаний.Добавить(СтруктураГруппы); - ТекКнопкаРаздел.Нажать(); - ДобавитьОписаниеТеста(СтруктураГруппы.Тесты, КомандныйИнтерфейс); - ТекКнопкаРаздел.Нажать(); - КонецЦикла; - - Если КнопкиРазделов.Количество() > 1 Тогда - КнопкиРазделов[0].Нажать(); - КнопкиРазделов[0].Нажать(); - КонецЕсли; - КонецЕсли; - - Возврат РезКоллекцияОписаний; - -КонецФункции - -&НаКлиенте -Процедура ДобавитьОписаниеТеста(КоллекцияОписанийТестов, КомандныйИнтерфейс) - - Разделы = Новый Массив; - Разделы.Добавить(КомандныйИнтерфейс); - Для Каждого Раздел Из КомандныйИнтерфейс.НайтиОбъекты(Тип("ТестируемаяГруппаКомандногоИнтерфейса")) Цикл - Если ЭтоСлужебныйРаздел(Раздел) Тогда - Продолжить; - КонецЕсли; - Разделы.Добавить(Раздел); - КонецЦикла; - - Для Каждого ТекРаздел Из Разделы Цикл - - Для Каждого ТекКнопка Из ТекРаздел.НайтиОбъекты(Тип("ТестируемаяКнопкаКомандногоИнтерфейса")) Цикл - - Если Найти(ТекКнопка.НавигационнаяСсылка, "e1cib/command/Подсистема.") > 0 - Или Не ЗначениеЗаполнено(ТекКнопка.НавигационнаяСсылка) - Или ЭтоСлужебныйРазделВерсия82(ТекКнопка) Тогда - Продолжить; - КонецЕсли; - - ПредставлениеТеста = КонтекстЯдра.СтрШаблон_("%1->%2", ТекРаздел.ТекстЗаголовка, ТекКнопка.ТекстЗаголовка); - - ДобавляемоеОписание = Новый Структура; - ДобавляемоеОписание.Вставить("ПредставлениеТеста", ПредставлениеТеста); - ДобавляемоеОписание.Вставить("НавигационнаяСсылка", ТекКнопка.НавигационнаяСсылка); - ДобавляемоеОписание.Вставить("ИмяТеста", ИмяТеста(ТекКнопка.НавигационнаяСсылка)); - КоллекцияОписанийТестов.Вставить(ТекКнопка.НавигационнаяСсылка, ДобавляемоеОписание); - - КонецЦикла; - - КонецЦикла; - -КонецПроцедуры - -&НаКлиенте -Функция ВидМетаданныхИсключенИзТестирования(ВидМетаданных) - Если ЕстьНастройка(ВидМетаданных) Тогда - Возврат (ТипЗнч(Объект.Настройки[ВидМетаданных]) = Тип("Булево") И НЕ Объект.Настройки[ВидМетаданных]); - КонецЕсли; - Возврат Ложь; -КонецФункции - -&НаКлиенте -Функция ИмяТеста(ПараметрНавигационнаяСсылка) - - ПропускаемыеНавигационныеСсылки = Новый Массив; - ПропускаемыеНавигационныеСсылки.Добавить("e1cib/command/ОбщаяКоманда.СтраницаМобильноеПриложениеНаAppStore"); - ПропускаемыеНавигационныеСсылки.Добавить("e1cib/command/ОбщаяКоманда.СтраницаМобильноеПриложениеНаGooglePlay"); - ПропускаемыеНавигационныеСсылки.Добавить("e1cib/command/ОбщаяКоманда.СтраницаПродуктаНаСайте1С"); - ПропускаемыеНавигационныеСсылки.Добавить("e1cib/command/ОбщаяКоманда.СтраницаЧтоНовогоВВерсииВидео"); - ПропускаемыеНавигационныеСсылки.Добавить("e1cib/command/Обработка.Ценообразование.Команда.Ценообразование"); - ПропускаемыеНавигационныеСсылки.Добавить("e1cib/command/ОбщаяКоманда.Налоги_РегламентированнаяОтчетность"); - - Если ПропускаемыеНавигационныеСсылки.Найти(ПараметрНавигационнаяСсылка) = Неопределено Тогда - Возврат "ТестДолжен_ПерейтиПоКнопкеКомандногоИнтерфейса"; - Иначе - Возврат "ТестДолжен_ПропуститьВыполнение"; - КонецЕсли; - -КонецФункции - -&НаКлиенте -Функция ЭтоСлужебныйРаздел(ГруппаКомандногоИнтерфейса) - - ЗаголовкиСлужебныхРазделов = Новый Соответствие; - - // Такси - ЗаголовкиСлужебныхРазделов.Вставить(НРег(НСтр("ru = 'Панель разделов'")) , Истина); - ЗаголовкиСлужебныхРазделов.Вставить(НРег(НСтр("ru = 'Панель инструментов'")) , Истина); - ЗаголовкиСлужебныхРазделов.Вставить(НРег(НСтр("ru = 'Панель открытых'")) , Истина); - ЗаголовкиСлужебныхРазделов.Вставить(НРег(НСтр("ru = 'Меню функций'")) , Истина); - - Возврат ЗаголовкиСлужебныхРазделов.Получить(НРег(ГруппаКомандногоИнтерфейса.ТекстЗаголовка)) = Истина; - -КонецФункции - -&НаКлиенте -Функция ЭтоСлужебныйРазделВерсия82(ГруппаКомандногоИнтерфейса) - - ЗаголовкиСлужебныхРазделов = Новый Соответствие; - - // Версия 8.2 - ЗаголовкиСлужебныхРазделов.Вставить(НРег(НСтр("ru = 'Отчеты'")) , Истина); - ЗаголовкиСлужебныхРазделов.Вставить(НРег(НСтр("ru = 'Сервис'")) , Истина); - ЗаголовкиСлужебныхРазделов.Вставить(НРег(НСтр("ru = 'Панель действий'")), Истина); - - Возврат ЗаголовкиСлужебныхРазделов.Получить(НРег(ГруппаКомандногоИнтерфейса.ТекстЗаголовка)) = Истина; - -КонецФункции - -&НаКлиенте -Процедура ТестДолжен_ПропуститьВыполнение(ПараметрНавигационнаяСсылка) Экспорт - - КонтекстЯдра.ПропуститьТест(); - -КонецПроцедуры - -&НаКлиенте -Процедура ТестДолжен_ПерейтиПоКнопкеКомандногоИнтерфейса(ПараметрНавигационнаяСсылка) Экспорт - - ТестКлиент = ПлагинТестКлиенты.ТестКлиентПоУмолчанию(); - ОсновноеОкно = ПлагинТестКлиенты.ОсновноеОкно(ТестКлиент); - - ОткрытыеОкнаДо = ПлагинТестКлиенты.ОткрытыеОкна(ТестКлиент); - - Попытка - ОсновноеОкно.ВыполнитьКоманду(ПараметрНавигационнаяСсылка); - Исключение - ВызватьИсключение КонтекстЯдра.СтрШаблон_("Не удалось выполнить команду %1 на тест-клиенте. - |Возможно, сеанс тест-клиента заблокирован модальным окном", ПараметрНавигационнаяСсылка); - КонецПопытки; - - ПлагинТестКлиенты.ИдентифицироватьОкноПредупреждение(ТестКлиент, ПереходПоКнопкеКомандногоИнтерфейса(), Ложь); - - ОписанияШаговСценария = Новый Массив; - ОписанияШаговСценария.Добавить(КликПоПервойСтрокеТаблицыФормы()); - ОписанияШаговСценария.Добавить(КликПоПоследнейСтрокеТаблицыФормы()); - - Для Каждого ШагСценария Из ОписанияШаговСценария Цикл - ОкноСТаблицейФормы = ТестКлиент.ПолучитьАктивноеОкно(); - Если ОкноСТаблицейФормы.НачальнаяСтраница Или ОкноСТаблицейФормы.Основное Тогда - Продолжить; - КонецЕсли; - Обработали = ВыполнитьШагПроверкиТаблицыФормы(ОкноСТаблицейФормы, ШагСценария, ТестКлиент); - Если Обработали Тогда - ПлагинТестКлиенты.ИдентифицироватьОкноПредупреждение(ТестКлиент, ШагСценария, Ложь); - КонецЕсли; - КонецЦикла; - - ПлагинТестКлиенты.ЗакрытьВсеОткрытыеОкна(ТестКлиент); - - ПлагинТестКлиенты.ПроверитьНаНовыеМодальныеОкна(ТестКлиент, ОткрытыеОкнаДо); - -КонецПроцедуры - -&НаКлиенте -Функция ВыполнитьШагПроверкиТаблицыФормы(ОкноСТаблицейФормы, ШагСценария, ТестКлиент) - - Результат = Ложь; - ТекстИсключенияДляГруппировки = НСтр("ru = 'Действие недоступно для строки группировки списка!'"); - - ТаблицыФормы = ОкноСТаблицейФормы.НайтиОбъекты(Тип("ТестируемаяТаблицаФормы")); - - Если ТаблицыФормы = Неопределено Тогда - Возврат Результат; - КонецЕсли; - - Для Каждого ТаблицаФормы Из ТаблицыФормы Цикл - - ТаблицаФормы.Активизировать(); - - Если Не ТаблицаФормыДоступна(ТаблицаФормы) Тогда - Продолжить; - КонецЕсли; - - ПерейтиКЗаданнойСтрокеТаблицыФормы(ШагСценария, ТаблицаФормы, ТестКлиент); - - Если Не ЗначениеЗаполнено(ТаблицаФормы.ПолучитьВыделенныеСтроки()) Тогда - Результат = Истина; - Иначе - - РазвернутьВетвьДерева(ТаблицаФормы); - - ТаблицаФормы.Выбрать(); - - КонецЕсли; - - Пока ПлагинТестКлиенты.ПоявилосьОкноПредупрежденияСТекстом(ТестКлиент, ТекстИсключенияДляГруппировки) Цикл - - ТекущееОкно = ТестКлиент.ПолучитьАктивноеОкно(); - ТекущееОкно.Закрыть(); - - Если ТаблицаФормы.ВозможноРазвернуть() Тогда - Если Не ТаблицаФормы.Развернут() Тогда - ТаблицаФормы.Развернуть(); - КонецЕсли; - ТаблицаФормы.ПерейтиНаУровеньВниз(); - КонецЕсли; - - ТаблицаФормы.Выбрать(); - - КонецЦикла; - - ПлагинТестКлиенты.ИдентифицироватьОкноПредупреждение(ТестКлиент, ШагСценария, Ложь); - - ТекущееОкно = ТестКлиент.ПолучитьАктивноеОкно(); - Если ПриКликеВТаблицеФормыНовоеОкноНеОткрылось(ТекущееОкно, ОкноСТаблицейФормы) Тогда - Если ТаблицаФормы.ТекущийРежимРедактирование() Тогда - ТаблицаФормы.ЗакончитьРедактированиеСтроки(); - КонецЕсли; - Результат = Истина; - Иначе - НажатьКнопкуЗаписать(ШагСценария, ТекущееОкно, ТестКлиент); - КонецЕсли; - - Если ШагСценария = КликПоПервойСтрокеТаблицыФормы() Тогда - ПроверитьКомандныйИнтерфейсОкна(ТекущееОкно, ТестКлиент); - КонецЕсли; - - Если ОкноСТаблицейФормы <> ТекущееОкно Тогда - ТекущееОкно.Закрыть(); - КонецЕсли; - - КонецЦикла; - - Возврат Результат; - -КонецФункции - -&НаКлиенте -Процедура ПерейтиКЗаданнойСтрокеТаблицыФормы(ШагСценария, ТаблицаФормы, ТестКлиент) - - Если ШагСценария = КликПоПервойСтрокеТаблицыФормы() Тогда - - ТаблицаФормы.ПерейтиКПервойСтроке(); - - ИначеЕсли ШагСценария = КликПоПоследнейСтрокеТаблицыФормы() Тогда - - ТаблицаФормы.ПерейтиКПоследнейСтроке(); - - Иначе - - ВызватьИсключение КонтекстЯдра.СтрШаблон_("Поведение для шага ""%1"" не определено", ШагСценария); - - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Функция ПриКликеВТаблицеФормыНовоеОкноНеОткрылось(ТекущееОкно, ОкноСТаблицейФормы) - - Возврат ТекущееОкно = ОкноСТаблицейФормы; - -КонецФункции - -&НаКлиенте -Процедура ПроверитьМодифицированность(ШагСценария, ТекущееОкно, ТестКлиент, МоментПроверки) - - ТестируемаяФорма = ТекущееОкно.НайтиОбъект(Тип("ТестируемаяФорма")); - ТекущаяМодифицированность = ТестируемаяФорма.ТекущаяМодифицированность(); - Если ТекущаяМодифицированность Тогда - ТекстИсключения = КонтекстЯдра.СтрШаблон_("%1 - %2 - %3 - %4: - |Ожидали, что форма не модифицирована сразу же после ее открытия или сразу же после записи, а это не так.", - ШагСценария, МоментПроверки, ТестируемаяФорма.ИмяФормы, ТестируемаяФорма.ТекстЗаголовка); - КонтекстЯдра.ВызватьОшибкуПроверки(ТекстИсключения); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура НажатьКнопкуЗаписать(ШагСценария, ТекущееОкно, ТестКлиент) - - КнопкаЗаписать = ТекущееОкно.НайтиОбъект(Тип("ТестируемаяКнопкаФормы"), "Записать"); - Если КнопкаЗаписать = Неопределено Тогда - Возврат; - КонецЕсли; - - Если Не КнопкаЗаписать.ТекущаяВидимость() Или Не КнопкаЗаписать.ТекущаяДоступность() Тогда - Возврат; - КонецЕсли; - - // Платформа не позволяет заранее определить доступность кнопки. - // Поэтому нажимаем в попытке, а затем ловим исключение, если нажать кнопку не удалось. - Попытка - КнопкаЗаписать.Нажать(); - Исключение - ТекстИсключения = ОписаниеОшибки(); - Если Найти(ТекстИсключения, "Неподходящий тип элемента управления для вызванного действия") = 0 - // У формы установлен признак ТолькоПросмотр - И Найти(ТекстИсключения, "Невидимый пользователю элемент управления не может выполнять интерактивные действия") = 0 Тогда - КонтекстЯдра.ВызватьОшибкуПроверки(ТекстИсключения); - КонецЕсли; - КонецПопытки; - - ПлагинТестКлиенты.ИдентифицироватьОкноПредупреждение( - ТестКлиент, - КонтекстЯдра.СтрШаблон_("%1: Кнопка ""Записать""", ШагСценария), - Ложь); - -КонецПроцедуры - -&НаКлиенте -Процедура ПроверитьКомандныйИнтерфейсОкна(ТекущееОкно, ТестКлиент) - - КомандныйИнтерфейс = ТекущееОкно.ПолучитьКомандныйИнтерфейс(); - Для Каждого ТекКнопка Из КомандныйИнтерфейс.НайтиОбъекты(Тип("ТестируемаяКнопкаКомандногоИнтерфейса")) Цикл - - ТекКнопка.Нажать(); - - ПлагинТестКлиенты.ИдентифицироватьОкноПредупреждение( - ТестКлиент, - КонтекстЯдра.СтрШаблон_("Командный интерфейс формы: ""%1""", ТекКнопка.ТекстЗаголовка), - Ложь); - - КонецЦикла; - -КонецПроцедуры - -&НаКлиенте -Функция ПереходПоКнопкеКомандногоИнтерфейса() - - Возврат "Переход по кнопке командного интерфейса"; - -КонецФункции - -&НаКлиенте -Функция КликПоПервойСтрокеТаблицыФормы() - - Возврат "Клик по первой строке таблицы формы"; - -КонецФункции - -&НаКлиенте -Функция КликПоПоследнейСтрокеТаблицыФормы() - - Возврат "Клик по последней строке таблицы формы"; - -КонецФункции - -&НаКлиенте -Функция ТаблицаФормыДоступна(ТаблицаФормы) - Возврат ТаблицаФормы.ТекущаяДоступность() И ТаблицаФормы.ТекущаяВидимость() И Не ТаблицаФормы.ТекущееТолькоПросмотр(); -КонецФункции - -&НаКлиенте -Функция РазвернутьВетвьДерева(ТаблицаФормы) - - ТекущаяСтрока = ТекущаяСтрокаТаблицы(ТаблицаФормы); - - Пока ТаблицаФормы.ВозможноРазвернуть() Цикл - - Если Не ТаблицаФормы.Развернут(ТекущаяСтрока) Тогда - ТаблицаФормы.Развернуть(ТекущаяСтрока); - Если Не ТаблицаФормы.Развернут(ТекущаяСтрока) Тогда - Прервать; - КонецЕсли; - КонецЕсли; - - ТаблицаФормы.ПерейтиКПоследнейСтроке(Истина); - Если ТаблицаФормы.ПолучитьВыделенныеСтроки().Количество() <= 1 Тогда - ТаблицаФормы.ПерейтиКСтроке(ТекущаяСтрока, НаправлениеПереходаКСтроке.Вверх); - Прервать; - КонецЕсли; - - Если ТаблицаФормы.ПерейтиКСтроке(ТекущаяСтрока, НаправлениеПереходаКСтроке.Вверх) Тогда - ТаблицаФормы.ПерейтиНаУровеньВниз(); - КонецЕсли; - - мТекущаяСтрока = ТекущаяСтрокаТаблицы(ТаблицаФормы); - Если СтрокиТаблицыРавны(ТекущаяСтрока, мТекущаяСтрока) Тогда - Прервать; - Иначе - ТекущаяСтрока = мТекущаяСтрока; - КонецЕсли; - - КонецЦикла; - -КонецФункции - -&НаКлиенте -Функция ТекущаяСтрокаТаблицы(ТаблицаФормы) - - ВыделенныеСтроки = ТаблицаФормы.ПолучитьВыделенныеСтроки(); - - Если ВыделенныеСтроки.Количество() Тогда - ТекущаяСтрокаТаблицы = ВыделенныеСтроки[0]; - Иначе - ТекущаяСтрокаТаблицы = Новый Соответствие; - КонецЕсли; - - Возврат ТекущаяСтрокаТаблицы; - -КонецФункции - -&НаКлиенте -Функция СтрокиТаблицыРавны(Строка1, Строка2) - - Если ТипЗнч(Строка1) <> Тип("Соответствие") Или ТипЗнч(Строка2) <> Тип("Соответствие") Тогда - Возврат Ложь; - КонецЕсли; - - Если Строка1.Количество() <> Строка2.Количество() Тогда - Возврат Ложь; - КонецЕсли; - - Для Каждого КлючЗначение Из Строка1 Цикл - Если КлючЗначение.Значение <> Строка2[КлючЗначение.Ключ] Тогда - Возврат Ложь; - КонецЕсли; - КонецЦикла; - - Возврат Истина; - -КонецФункции diff --git "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262.xml" "b/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262.xml" deleted file mode 100644 index fb5fb12..0000000 --- "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262.xml" +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - c3831ec8-d8d5-4f93-8a22-f9bfae07327f - 0a9e9dfd-26e5-428e-80bc-ebabf64dd88d - - - fa2f3866-7f26-4eb8-a28d-cd212547b8a7 - 11cc79be-4df6-4200-bcfc-e91ece82a82c - - - - тесты_ПроведениеДокументов - - - ru - Проведение и проверка движений до и после - - - - ExternalDataProcessor.тесты_ПроведениеДокументов.Form.Форма - - - - - - Настройки - - - ru - Настройки - - - - - false - - - - false - - false - false - - - DontCheck - Items - - - Auto - Auto - - - Auto - - -
Форма
-
-
-
\ No newline at end of file diff --git "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/Ext/ObjectModule.bsl" "b/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/Ext/ObjectModule.bsl" deleted file mode 100644 index 954ec86..0000000 --- "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/Ext/ObjectModule.bsl" +++ /dev/null @@ -1,309 +0,0 @@ -#Область ОписаниеПеременных - -Перем КонтекстЯдра; -Перем Утверждения; -Перем УтвержденияПроверкаТаблиц; - -#КонецОбласти - -#Область ПрограммныйИнтерфейс - -#Область ИнтерфейсТестирования - -Функция КлючНастройки() Экспорт - Возврат "ПроведениеДокументов"; -КонецФункции - -Процедура Инициализация(КонтекстЯдраПараметр) Экспорт - КонтекстЯдра = КонтекстЯдраПараметр; - Утверждения = КонтекстЯдра.Плагин("БазовыеУтверждения"); - УтвержденияПроверкаТаблиц = КонтекстЯдра.Плагин("УтвержденияПроверкаТаблиц"); - - ЗагрузитьНастройки(); -КонецПроцедуры - -Процедура ЗаполнитьНаборТестов(НаборТестов, КонтекстЯдраПараметр) Экспорт - - Если ТекущийРежимЗапуска() = РежимЗапускаКлиентскогоПриложения.УправляемоеПриложение Then - Возврат; - КонецЕсли; - - КонтекстЯдра = КонтекстЯдраПараметр; - - ЗагрузитьНастройки(); - - Если Не НужноВыполнятьТест() Тогда - Возврат; - КонецЕсли; - - Для Каждого МетаОбъект Из Метаданные.Документы Цикл - Если МетаОбъект.Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить - И ПравоДоступа("Проведение", МетаОбъект) Тогда - - ДобавитьТестыДляДокумента(НаборТестов, МетаОбъект); - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -#КонецОбласти - -#Область Тесты - -Процедура ПередЗапускомТеста() Экспорт - НачатьТранзакцию(); -КонецПроцедуры - -Процедура ПослеЗапускаТеста() Экспорт - Если ТранзакцияАктивна() Тогда - ОтменитьТранзакцию(); - КонецЕсли; -КонецПроцедуры - -Процедура Тест_ПровестиДокумент(ДокументСсылка) Экспорт - - ДокументОбъект = ДокументСсылка.ПолучитьОбъект(); - - ДвиженияДо = ПолучитьДвиженияДокумента(ДокументОбъект); - - ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение); - - ДвиженияПосле = ПолучитьДвиженияДокумента(ДокументОбъект); - - Для Каждого КлючИЗначение Из ДвиженияДо Цикл - ТипДвижения = КлючИЗначение.Ключ; - ТаблицаДвиженияДо = КлючИЗначение.Значение; - ТаблицаДвиженияПосле = ДвиженияПосле.Получить(ТипДвижения); - УтвержденияПроверкаТаблиц.ПроверитьРавенствоТаблиц(ТаблицаДвиженияДо, ТаблицаДвиженияПосле, - "Отличаются движения по регистру " + ТипДвижения); - КонецЦикла; - -КонецПроцедуры - -Процедура Тест_ПропуститьПроведениеДокумента(Знач Сообщение) Экспорт - КонтекстЯдра.ПропуститьТест(Сообщение); -КонецПроцедуры - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -#Область Настройки - -Процедура ЗагрузитьНастройки() - Если ЗначениеЗаполнено(Настройки) Тогда - Возврат; - КонецЕсли; - - ПлагинНастройки = КонтекстЯдра.Плагин("Настройки"); - ПлагинНастройки.Инициализация(КонтекстЯдра); - - Настройки = ПлагинНастройки.ПолучитьНастройку(КлючНастройки()); - - НастройкиПоУмолчанию = НастройкиПоУмолчанию(); - Если ТипЗнч(Настройки) <> Тип("Структура") Then - Настройки = НастройкиПоУмолчанию; - Иначе - ЗаполнитьЗначенияСвойств(НастройкиПоУмолчанию, Настройки); - Настройки = НастройкиПоУмолчанию; - КонецЕсли; -КонецПроцедуры - -Функция НастройкиПоУмолчанию() - - Результат = Новый Структура; - - Результат.Вставить("Используется", Истина); - Результат.Вставить("КоличествоДокументов", 10); - Результат.Вставить("Исключения", Новый Массив); - - Возврат Результат; -КонецФункции - -Функция НужноВыполнятьТест() - - ЗагрузитьНастройки(); - - Если Не ЗначениеЗаполнено(Настройки) Тогда - Возврат Истина; - КонецЕсли; - - КлючНастройки = КлючНастройки(); - - ВыполнятьТест = Истина; - Если ТипЗнч(Настройки) = Тип("Структура") - И Настройки.Свойство("Используется", ВыполнятьТест) Тогда - - Возврат ВыполнятьТест = Истина; - КонецЕсли; - - Возврат Истина; - -КонецФункции - -#КонецОбласти - -Процедура ДобавитьТестыДляДокумента(НаборТестов, МетаОбъект) Экспорт - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | Ссылка, - | Представление - |ИЗ - | Документ." + МетаОбъект.Имя + " - |ГДЕ - | Проведен - | - |УПОРЯДОЧИТЬ ПО - | МоментВремени Убыв"; - - Запрос.Текст = СтрЗаменить(Запрос.Текст, - "ВЫБРАТЬ ПЕРВЫЕ 1", - "ВЫБРАТЬ ПЕРВЫЕ " + Формат(Настройки.КоличествоДокументов, "ЧГ=") - ); - РезультатЗапроса = Запрос.Выполнить(); - Если РезультатЗапроса.Пустой() Тогда - Возврат; - КонецЕсли; - - //++ РС 11.08.2021 - Если КонтекстЯдра.ЕстьВИсключаемойКоллекции(МетаОбъект.Имя, Настройки.Исключения) Тогда - Возврат; - КонецЕсли; - //-- РС - - НаборТестов.НачатьГруппу(МетаОбъект.Синоним + " - Документ." + МетаОбъект.Имя); - - ПредставлениеТеста = "Проведение и проверка движений до и после - " + МетаОбъект.Имя; - //++ РС 11.08.2021 - //Сообщение = "Пропускаем из-за исключения по имени документа - " + ПредставлениеТеста; - //Если ДобавитьТестИсключениеЕслиЕстьВИсключаемойКоллекции(МетаОбъект.Имя, Настройки.Исключения, - // Сообщение, НаборТестов) Тогда - // Возврат; - //КонецЕсли; - //-- РС - - Выборка = РезультатЗапроса.Выбрать(); - Пока Выборка.Следующий() Цикл - ПараметрыТеста = НаборТестов.ПараметрыТеста(Выборка.Ссылка); - ПредставлениеТеста = "Проведение и проверка движений до и после - " + Выборка.Представление; - - НаборТестов.Добавить("Тест_ПровестиДокумент", ПараметрыТеста, ПредставлениеТеста); - КонецЦикла; - -КонецПроцедуры - -Функция ДобавитьТестИсключениеЕслиЕстьВИсключаемойКоллекции(Знач ЧтоИщем, Знач КоллекцияДляПоиска, Знач Сообщение, - Знач НаборТестов) - - Если КонтекстЯдра.ЕстьВИсключаемойКоллекции(ЧтоИщем, КоллекцияДляПоиска) Тогда - КонтекстЯдра.Отладка(Сообщение); - ПараметрыТеста = НаборТестов.ПараметрыТеста(Сообщение); - - НаборТестов.Добавить("Тест_ПропуститьПроведениеДокумента", ПараметрыТеста, Сообщение); - - Возврат Истина; - КонецЕсли; - - Возврат Ложь; -КонецФункции - -//++ РС 11.08.2021 -Функция ЕстьВИсключаемойКоллекции(Знач ЧтоИщем, Знач КоллекцияДляПоиска) - Возврат КоллекцияДляПоиска.Найти(ЧтоИщем) <> Неопределено; -КонецФункции //-- РС - -Функция ПолучитьДвиженияДокумента(ДокументОбъект) - - Результат = Новый Соответствие; - - Для Каждого Движение Из ДокументОбъект.Движения Цикл - ТипДвижения = ТипЗнч(Движение); - Движение.Прочитать(); - ТаблицаДвижения = Движение.Выгрузить(); - Результат.Вставить(ТипДвижения, ТаблицаДвижения); - КонецЦикла; - - Возврат Результат; - -КонецФункции - -Функция ИмяТеста() - Возврат Метаданные().Имя; -КонецФункции - -Функция ДокументыМета() Экспорт - - МассивДок = Новый Массив; - - Для Каждого МетаОбъект Из Метаданные.Документы Цикл - Если МетаОбъект.Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить - И ПравоДоступа("Проведение", МетаОбъект) Тогда - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | Ссылка, - | Представление - |ИЗ - | Документ." + МетаОбъект.Имя + " - |ГДЕ - | Проведен - | - |УПОРЯДОЧИТЬ ПО - | МоментВремени Убыв"; - - Запрос.Текст = СтрЗаменить(Запрос.Текст, - "ВЫБРАТЬ ПЕРВЫЕ 1", - "ВЫБРАТЬ ПЕРВЫЕ " + Формат(Настройки.КоличествоДокументов, "ЧГ=") - ); - РезультатЗапроса = Запрос.Выполнить(); - Если РезультатЗапроса.Пустой() Тогда - Продолжить; - КонецЕсли; - - //++ РС 11.08.2021 - Если ЕстьВИсключаемойКоллекции(МетаОбъект.Имя, Настройки.Исключения) Тогда - Продолжить; - КонецЕсли; - //-- РС - - Выборка = РезультатЗапроса.Выбрать(); - - Данные = Новый Массив; - Пока Выборка.Следующий() Цикл - - Данные.Добавить(Новый Структура("Ссылка, Представление", Выборка.Ссылка, Выборка.Представление)); - - КонецЦикла; - - МассивДок.Добавить(Новый Структура("Имя, Синоним, Данные", МетаОбъект.Имя, МетаОбъект.Синоним, Данные)); - - КонецЕсли; - КонецЦикла; - - Возврат МассивДок; - -КонецФункции - -#КонецОбласти - -#Область ДоработанныйФункционал - -Функция ЕстьВИсключаемойКоллекцииНастроек(Знач ЧтоИщем, КлючНастроек) - - Если Настройки.Свойство(КлючНастроек) - И ТипЗнч(Настройки[КлючНастроек]) = Тип("Массив") - И Настройки[КлючНастроек].Найти(ЧтоИщем) <> Неопределено - Тогда - Возврат Истина; - КонецЕсли; - - Возврат Ложь; - -КонецФункции - -#КонецОбласти diff --git "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/Forms/\320\244\320\276\321\200\320\274\320\260.xml" "b/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/Forms/\320\244\320\276\321\200\320\274\320\260.xml" deleted file mode 100644 index c03ddc5..0000000 --- "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/Forms/\320\244\320\276\321\200\320\274\320\260.xml" +++ /dev/null @@ -1,22 +0,0 @@ - - -
- - Форма - - - ru - Форма - - - - Managed - false - - PlatformApplication - MobilePlatformApplication - - - -
-
\ No newline at end of file diff --git "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml" "b/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml" deleted file mode 100644 index ad825e2..0000000 --- "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml" +++ /dev/null @@ -1,12 +0,0 @@ - -
- - - - - cfg:ExternalDataProcessorObject.тесты_ПроведениеДокументов - - true - - - \ No newline at end of file diff --git "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" "b/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" deleted file mode 100644 index 3715a1b..0000000 --- "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\320\264\320\265\320\275\320\270\320\265\320\224\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" +++ /dev/null @@ -1,176 +0,0 @@ -#Область ОписаниеПеременных - -&НаКлиенте -Перем КонтекстЯдра; -&НаКлиенте -Перем Утверждения; - -#КонецОбласти - -#Область ОсновныеПроцедурыТеста - -&НаСервере -Функция КлючНастройки() Экспорт - Возврат МодульОбъекта().КлючНастройки(); -КонецФункции - -&НаКлиенте -Процедура Инициализация(КонтекстЯдраПараметр) Экспорт - КонтекстЯдра = КонтекстЯдраПараметр; - Утверждения = КонтекстЯдра.Плагин("БазовыеУтверждения"); - - ЗагрузитьНастройки(); -КонецПроцедуры - -&НаКлиенте -Процедура ЗаполнитьНаборТестов(НаборТестов, КонтекстЯдраПараметр) Экспорт - - Если ТекущийРежимЗапуска() = РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение Then - Возврат; - КонецЕсли; - - КонтекстЯдра = КонтекстЯдраПараметр; - - ЗагрузитьНастройки(); - - Если Не НужноВыполнятьТест() Тогда - Возврат; - КонецЕсли; - - ДобавитьДокументы(НаборТестов); - -КонецПроцедуры - -&НаКлиенте -Процедура ДобавитьДокументы(НаборТестов) - - ДокументыМета = СписокДокументов(); - - Для Каждого СтрокаДок Из ДокументыМета Цикл - - НаборТестов.НачатьГруппу(СтрокаДок.Синоним + " - Документ." + СтрокаДок.Имя); - - ПредставлениеТеста = "Проведение и проверка движений до и после - " + СтрокаДок.Имя; - - Для Каждого СтрокаДанные Из СтрокаДок.Данные Цикл - - ПараметрыТеста = НаборТестов.ПараметрыТеста(СтрокаДанные.Ссылка); - ПредставлениеТеста = "Проведение и проверка движений до и после - " + СтрокаДанные.Представление; - - НаборТестов.Добавить("Тест_ПровестиДокумент", ПараметрыТеста, ПредставлениеТеста); - - КонецЦикла; - - КонецЦикла; - -КонецПроцедуры - -&НаКлиенте -Процедура Тест_ПровестиДокумент(ДокументСсылка) Экспорт - ПровестиДокумент(ДокументСсылка); -КонецПроцедуры - -&НаКлиенте -Процедура Тест_ПропуститьПроведениеДокумента(Знач Сообщение) Экспорт - Утверждения.ПропуститьТест(Сообщение); -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -#Область Настройки - -&НаКлиенте -Процедура ЗагрузитьНастройки() - Если ЗначениеЗаполнено(Объект.Настройки) Тогда - Возврат; - КонецЕсли; - - ПлагинНастройки = КонтекстЯдра.Плагин("Настройки"); - ПлагинНастройки.Инициализация(КонтекстЯдра); - - Объект.Настройки = ПлагинНастройки.ПолучитьНастройку(КлючНастройки()); - - НастройкиПоУмолчанию = НастройкиПоУмолчанию(); - Если ТипЗнч(Объект.Настройки) <> Тип("Структура") Then - Объект.Настройки = НастройкиПоУмолчанию; - Иначе - ЗаполнитьЗначенияСвойств(НастройкиПоУмолчанию, Объект.Настройки); - Объект.Настройки = НастройкиПоУмолчанию; - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Функция НастройкиПоУмолчанию() - - Результат = Новый Структура; - - Результат.Вставить("Используется", Истина); - Результат.Вставить("КоличествоДокументов", 10); - Результат.Вставить("Исключения", Новый Массив); - - Возврат Результат; -КонецФункции - -&НаКлиенте -Функция НужноВыполнятьТест() - - ЗагрузитьНастройки(); - - Если Не ЗначениеЗаполнено(Объект.Настройки) Тогда - Возврат Истина; - КонецЕсли; - - КлючНастройки = КлючНастройки(); - - ВыполнятьТест = Истина; - Если ТипЗнч(Объект.Настройки) = Тип("Структура") - И Объект.Настройки.Свойство("Используется", ВыполнятьТест) Тогда - - Возврат ВыполнятьТест = Истина; - КонецЕсли; - - Возврат Истина; - -КонецФункции - -#КонецОбласти - -&НаСервере -Функция СписокДокументов() - Возврат МодульОбъекта().ДокументыМета(); -КонецФункции - -&НаСервере -Процедура ПровестиДокумент(ДокументСсылка) - МодульОбъекта().Тест_ПровестиДокумент(ДокументСсылка); -КонецПроцедуры - -&НаСервере -Функция МодульОбъекта() - Возврат РеквизитФормыВЗначение("Объект"); -КонецФункции - -&НаКлиенте -Функция ДобавитьТестИсключениеЕслиЕстьВИсключаемойКоллекции(Знач ЧтоИщем, - Знач КоллекцияДляПоиска, - Знач Сообщение, - Знач НаборТестов) - - Если КонтекстЯдра.ЕстьВИсключаемойКоллекции(ЧтоИщем, КоллекцияДляПоиска) Тогда - - КонтекстЯдра.Отладка(Сообщение); - ПараметрыТеста = НаборТестов.ПараметрыТеста(Сообщение); - - //НаборТестов.Добавить("Тест_ПропуститьМакетСКД", ПараметрыТеста, Сообщение); - - Возврат Истина; - - КонецЕсли; - - Возврат Ложь; - -КонецФункции - -#КонецОбласти \ No newline at end of file diff --git "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224.xml" "b/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224.xml" deleted file mode 100644 index 55d79e4..0000000 --- "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224.xml" +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - c3831ec8-d8d5-4f93-8a22-f9bfae07327f - 09e7aba4-241c-4b5b-974b-dc1eb43d0507 - - - d525eb41-ce59-4622-9e11-7ede3a7d1132 - f3638dfb-f4e4-4319-b692-ae8bec295c30 - - - - тесты_ПроверкаМакетовСКД - - - ru - Тесты проверка макетов СКД - - - - ExternalDataProcessor.тесты_ПроверкаМакетовСКД.Form.Форма - - - - - - Настройки - - - ru - Настройки - - - - - false - - - - false - - false - false - - - DontCheck - Items - - - Auto - Auto - - - Auto - - -
Форма
-
-
-
\ No newline at end of file diff --git "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/Ext/ObjectModule.bsl" "b/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/Ext/ObjectModule.bsl" deleted file mode 100644 index 8b684af..0000000 --- "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/Ext/ObjectModule.bsl" +++ /dev/null @@ -1,441 +0,0 @@ -#Область ОписаниеПеременных - -Перем КонтекстЯдра; -Перем Утверждения; - -#КонецОбласти - -#Область ПрограммныйИнтерфейс - -#Область ИнтерфейсТестирования - -Функция КлючНастройки() Экспорт - Возврат "МакетыСКД"; -КонецФункции - -Процедура Инициализация(КонтекстЯдраПараметр) Экспорт - КонтекстЯдра = КонтекстЯдраПараметр; - Утверждения = КонтекстЯдра.Плагин("БазовыеУтверждения"); - - ЗагрузитьНастройки(); -КонецПроцедуры - -Процедура ЗаполнитьНаборТестов(НаборТестов, КонтекстЯдраПараметр) Экспорт - - Если ТекущийРежимЗапуска() = РежимЗапускаКлиентскогоПриложения.УправляемоеПриложение Then - Возврат; - КонецЕсли; - - КонтекстЯдра = КонтекстЯдраПараметр; - ЗагрузитьНастройки(); - - Если Не НужноВыполнятьТест() Тогда - Возврат; - КонецЕсли; - - ДобавитьОбщиеМакеты(НаборТестов); - ДобавитьМакетМетаданных(НаборТестов); - -КонецПроцедуры - -#КонецОбласти - -#Область Тесты - -Процедура ТестДолжен_ПроверитьМакетСКД(ИмяМенеджера, ИмяОбьекта, ИмяМакета) Экспорт - - Менеджер = МенеджерОбьектаПоИмени(ИмяМенеджера); - - СхемаКомпоновкиДанных = Менеджер[ИмяОбьекта].ПолучитьМакет(СокрЛП(ИмяМакета)); - - ПроверитьСхемуСКД(СхемаКомпоновкиДанных); - -КонецПроцедуры - -Процедура ТестДолжен_ПроверитьОбщийМакетСКД(ИмяМакета) Экспорт - - СхемаКомпоновкиДанных = ПолучитьОбщийМакет(ИмяМакета); - - ПроверитьСхемуСКД(СхемаКомпоновкиДанных); - -КонецПроцедуры - -Процедура ТестДолжен_ПроверитьВложенныйМакетСКД(ИмяМенеджера, ИмяОбьекта, ИменаМакетов) Экспорт - - ИменаМакетов = РазложитьСтрокуВМассивПодстрок(ИменаМакетов, "->"); - - Если ИмяОбьекта = ТекстОбщиеМакеты() Тогда - СхемаКомпоновкиДанных = ПолучитьОбщийМакет(ИменаМакетов[0]); - Иначе - Менеджер = МенеджерОбьектаПоИмени(ИмяМенеджера); - СхемаКомпоновкиДанных = Менеджер[ИмяОбьекта].ПолучитьМакет(ИменаМакетов[0]); - КонецЕсли; - - Для ВложенностьМакета = 1 По ИменаМакетов.Количество() - 1 Цикл - ВложенныеСхемыКомпоновкиДанных = СхемаКомпоновкиДанных.ВложенныеСхемыКомпоновкиДанных; - СхемаКомпоновкиДанных = ВложенныеСхемыКомпоновкиДанных.Найти(ИменаМакетов[ВложенностьМакета]).Схема; - КонецЦикла; - - ПроверитьСхемуСКД(СхемаКомпоновкиДанных); - -КонецПроцедуры - -Процедура ТестДолжен_ПропуститьМакетСКД(ТекстСообщения) Экспорт - Утверждения.ПропуститьТест(ТекстСообщения); -КонецПроцедуры - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -#Область Настройки - -Процедура ЗагрузитьНастройки() - Если ЗначениеЗаполнено(Настройки) Тогда - Возврат; - КонецЕсли; - - ПлагинНастройки = КонтекстЯдра.Плагин("Настройки"); - ПлагинНастройки.Инициализация(КонтекстЯдра); - - Настройки = ПлагинНастройки.ПолучитьНастройку(КлючНастройки()); - - НастройкиПоУмолчанию = НастройкиПоУмолчанию(); - Если ТипЗнч(Настройки) <> Тип("Структура") Then - Настройки = НастройкиПоУмолчанию; - Иначе - ЗаполнитьЗначенияСвойств(НастройкиПоУмолчанию, Настройки); - Настройки = НастройкиПоУмолчанию; - КонецЕсли; -КонецПроцедуры - -Функция НастройкиПоУмолчанию() - - Результат = Новый Структура; - - Результат.Вставить("Используется", Истина); - Результат.Вставить("ИсключенияОбщихМакетов", Новый Массив); - Результат.Вставить("ИсключенияПоИмениМетаданных", Новый Массив); - Результат.Вставить("ИсключенияПоИмениМакетов", Новый Массив); - - Возврат Результат; -КонецФункции - -Функция НужноВыполнятьТест() - - ЗагрузитьНастройки(); - - Если Не ЗначениеЗаполнено(Настройки) Тогда - Возврат Истина; - КонецЕсли; - - КлючНастройки = КлючНастройки(); - - ВыполнятьТест = Истина; - Если ТипЗнч(Настройки) = Тип("Структура") - И Настройки.Свойство("Используется", ВыполнятьТест) Тогда - - Возврат ВыполнятьТест = Истина; - КонецЕсли; - - Возврат Истина; - -КонецФункции - -#КонецОбласти - -Процедура ДобавитьОбщиеМакеты(НаборТестов) - - мОбщиеМакеты = ОбщиеМакеты(); - - Если мОбщиеМакеты.Количество() > 0 Тогда - - НаборТестов.НачатьГруппу(ТекстОбщиеМакеты(), Ложь); - - Для Каждого ОбщийМакет Из мОбщиеМакеты Цикл - - Сообщение = "Пропускаем из-за исключения по имени общего макета - " + - КонтекстЯдра.СтрШаблон_(ШаблонПредставления(), ТекстОбщиеМакеты(), ОбщийМакет.Представление); - Если ДобавитьТестИсключениеЕслиЕстьВИсключаемойКоллекции(ОбщийМакет.Представление, - Настройки.ИсключенияОбщихМакетов, Сообщение, НаборТестов) Тогда - Продолжить; - КонецЕсли; - - НаборТестов.Добавить(ОбщийМакет.ИмяПроцедуры, ОбщийМакет.Параметры, ОбщийМакет.Представление); - - КонецЦикла; - - КонецЕсли; - -КонецПроцедуры - -Процедура ДобавитьМакетМетаданных(НаборТестов) - - ГруппыМакетовМетаданных = ГруппыМакетовМетаданных(); - - Для Каждого ГруппаМакетовМетаданных Из ГруппыМакетовМетаданных Цикл - - Если ГруппаМакетовМетаданных.Значение.Количество() > 0 Тогда - - НаборТестов.НачатьГруппу(ГруппаМакетовМетаданных.Ключ, Ложь); - - Для Каждого МакетМетаданных Из ГруппаМакетовМетаданных.Значение Цикл - - НаборТестов.Добавить( - МакетМетаданных.ИмяПроцедуры, - МакетМетаданных.Параметры, - МакетМетаданных.Представление); - - КонецЦикла; - - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -Процедура ДобавитьВложенныеМакеты(МассивТестов, Родитель, ИмяРодителя, ИмяОбъекта = "", ИмяМенеджера = "") - - Если ТипЗнч(Родитель) = Тип("ВложеннаяСхемаКомпоновкиДанных") Тогда - Макет = Родитель.Схема; - ИначеЕсли ЗначениеЗаполнено(ИмяМенеджера) Тогда - Менеджер = МенеджерОбьектаПоИмени(ВРег(ИмяМенеджера)); - Макет = Менеджер[ИмяОбъекта].ПолучитьМакет(СокрЛП(Родитель.Имя)); - Иначе - Макет = ПолучитьОбщийМакет(Родитель.Имя); - КонецЕсли; - - Для Каждого ВложенныйМакет Из Макет.ВложенныеСхемыКомпоновкиДанных Цикл - - ИмяМакета = СтрШаблон_("%1->%2", ИмяРодителя, ВложенныйМакет.Имя); - Представление = СтрШаблон_(ШаблонПредставления(), ИмяОбъекта, ИмяМакета); - - ПараметрыТеста = Новый Массив; - ПараметрыТеста.Добавить(ИмяМенеджера); - ПараметрыТеста.Добавить(ИмяОбъекта); - ПараметрыТеста.Добавить(ИмяМакета); - - СтруктураТеста = Новый Структура; - СтруктураТеста.Вставить("ИмяПроцедуры", "ТестДолжен_ПроверитьВложенныйМакетСКД"); - СтруктураТеста.Вставить("Параметры", ПараметрыТеста); - СтруктураТеста.Вставить("Представление", Представление); - МассивТестов.Добавить(СтруктураТеста); - - ДобавитьВложенныеМакеты(МассивТестов, ВложенныйМакет, ИмяМакета, ИмяОбъекта, ИмяМенеджера); - - КонецЦикла; - -КонецПроцедуры - -Процедура ПроверитьСхемуСКД(СхемаКомпоновкиДанных) - - ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных; - - КомпоновщикНастроекКомпоновкиДанных = Новый КомпоновщикНастроекКомпоновкиДанных; - ИсточникДоступныхНастроекКомпоновкиДанных = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных); - - // Тут проходит синтаксический анализ запроса. - КомпоновщикНастроекКомпоновкиДанных.Инициализировать(ИсточникДоступныхНастроекКомпоновкиДанных); - -КонецПроцедуры - -Функция ПроверяемыеМетаданные() - - ПроверяемыеОбъекты = Новый Массив(); - ПроверяемыеОбъекты.Добавить("Справочники"); - ПроверяемыеОбъекты.Добавить("Документы"); - ПроверяемыеОбъекты.Добавить("Обработки"); - ПроверяемыеОбъекты.Добавить("Отчеты"); - ПроверяемыеОбъекты.Добавить("Перечисления"); - ПроверяемыеОбъекты.Добавить("ПланыВидовХарактеристик"); - ПроверяемыеОбъекты.Добавить("ПланыСчетов"); - ПроверяемыеОбъекты.Добавить("ПланыВидовРасчета"); - ПроверяемыеОбъекты.Добавить("РегистрыСведений"); - ПроверяемыеОбъекты.Добавить("РегистрыНакопления"); - ПроверяемыеОбъекты.Добавить("РегистрыБухгалтерии"); - ПроверяемыеОбъекты.Добавить("РегистрыРасчета"); - ПроверяемыеОбъекты.Добавить("БизнесПроцессы"); - ПроверяемыеОбъекты.Добавить("Задачи"); - - Возврат ПроверяемыеОбъекты; - -КонецФункции - -Функция МенеджерОбьектаПоИмени(Знач ИмяМенеджера) - - Попытка - Менеджер = Вычислить(ИмяМенеджера); - Исключение - Менеджер = Неопределено; - КонецПопытки; - - Возврат Менеджер; - -КонецФункции - -Функция ШаблонПредставления() - Возврат НСтр("ru = 'Валидация корректности запроса СКД в %1: %2'"); -КонецФункции - -Функция ТекстОбщиеМакеты() Экспорт - Возврат "ОбщиеМакеты"; -КонецФункции - -Функция ДобавитьТестИсключениеЕслиЕстьВИсключаемойКоллекции(Знач ЧтоИщем, - Знач КоллекцияДляПоиска, - Знач Сообщение, - Знач НаборТестов) - - Если КонтекстЯдра.ЕстьВИсключаемойКоллекции(ЧтоИщем, КоллекцияДляПоиска) Тогда - - КонтекстЯдра.Отладка(Сообщение); - ПараметрыТеста = НаборТестов.ПараметрыТеста(Сообщение); - - НаборТестов.Добавить("Тест_ПропуститьМакетСКД", ПараметрыТеста, Сообщение); - - Возврат Истина; - - КонецЕсли; - - Возврат Ложь; - -КонецФункции - -Функция ОбщиеМакеты() Экспорт - - мОбщиеМакеты = Новый Массив; - - Для Каждого ОбщийМакет Из Метаданные.ОбщиеМакеты Цикл - - Если ОбщийМакет.ТипМакета <> Метаданные.СвойстваОбъектов.ТипМакета.СхемаКомпоновкиДанных Тогда - Продолжить; - КонецЕсли; - - //++ РС 14.08.2021 - Если ЕстьВИсключаемойКоллекцииНастроек(ОбщийМакет.Имя, "ИсключенияОбщихМакетов") Тогда - Продолжить; - КонецЕсли; - //-- РС - - ПараметрыТеста = Новый Массив; - ПараметрыТеста.Добавить(ОбщийМакет.Имя); - - мОбщиеМакеты.Добавить( - Новый Структура("ИмяПроцедуры, Параметры, Представление", - "ТестДолжен_ПроверитьОбщийМакетСКД", - ПараметрыТеста, - СтрШаблон_(ШаблонПредставления(), ТекстОбщиеМакеты(), ОбщийМакет.Имя))); - - ДобавитьВложенныеМакеты(мОбщиеМакеты, ОбщийМакет, ОбщийМакет.Имя, ТекстОбщиеМакеты()); - - КонецЦикла; - - Возврат мОбщиеМакеты; - -КонецФункции - -Функция ГруппыМакетовМетаданных() Экспорт - - ГруппыМакетовМетаданных = Новый Соответствие; - - ПроверяемыеОбъекты = ПроверяемыеМетаданные(); - - Для Каждого ПроверяемыйОбъект Из ПроверяемыеОбъекты Цикл - - МакетыМетаданных = Новый Массив; - - Для Каждого ТекОбъект Из Метаданные[ПроверяемыйОбъект] Цикл - - ИмяМенеджера = ВРЕГ(ПроверяемыйОбъект); - - Для Каждого ТекДанныеМакета Из ТекОбъект.Макеты Цикл - - Если ТекДанныеМакета.ТипМакета <> Метаданные.СвойстваОбъектов.ТипМакета.СхемаКомпоновкиДанных Тогда - Продолжить; - КонецЕсли; - - //++ РС 14.08.2021 - Если ЕстьВИсключаемойКоллекцииНастроек(ТекОбъект.Имя, "ИсключенияПоИмениМетаданных") Тогда - Продолжить; - КонецЕсли; - //-- РС - - ПараметрыТеста = Новый Массив; - ПараметрыТеста.Добавить(ИмяМенеджера); - ПараметрыТеста.Добавить(ТекОбъект.Имя); - ПараметрыТеста.Добавить(ТекДанныеМакета.Имя); - - МакетыМетаданных.Добавить( - Новый Структура("ИмяПроцедуры, Параметры, Представление", - "ТестДолжен_ПроверитьМакетСКД", - ПараметрыТеста, - СтрШаблон_(ШаблонПредставления(), ТекОбъект.Имя, ТекДанныеМакета.Имя))); - - ДобавитьВложенныеМакеты( - МакетыМетаданных, - ТекДанныеМакета, - ТекДанныеМакета.Имя, - ТекОбъект.Имя, - ИмяМенеджера); - - КонецЦикла; - - КонецЦикла; - - Если МакетыМетаданных.Количество() Тогда - ГруппыМакетовМетаданных.Вставить(ПроверяемыйОбъект, МакетыМетаданных); - КонецЕсли; - - КонецЦикла; - - Возврат ГруппыМакетовМетаданных; - -КонецФункции - -Функция СтрШаблон_(СтрокаШаблон, - Парам1 = Неопределено, - Парам2 = Неопределено, - Парам3 = Неопределено, - Парам4 = Неопределено, - Парам5 = Неопределено) - - Если КонтекстЯдра = Неопределено Тогда - СтроковыеУтилиты = ВнешниеОбработки.Создать("СтроковыеУтилиты"); - Возврат СтроковыеУтилиты.ПодставитьПараметрыВСтроку(СтрокаШаблон, Парам1, Парам2, Парам3, Парам4, Парам5); - Иначе - Возврат КонтекстЯдра.СтрШаблон_(СтрокаШаблон, Парам1, Парам2, Парам3, Парам4, Парам5); - КонецЕсли; - -КонецФункции - -Функция РазложитьСтрокуВМассивПодстрок(Строка, Разделитель = ",", ПропускатьПустыеСтроки = Неопределено) - - Если КонтекстЯдра = Неопределено Тогда - СтроковыеУтилиты = ВнешниеОбработки.Создать("СтроковыеУтилиты"); - Возврат СтроковыеУтилиты.РазложитьСтрокуВМассивПодстрок(Строка, Разделитель, ПропускатьПустыеСтроки); - Иначе - Возврат КонтекстЯдра.РазложитьСтрокуВМассивПодстрок(Строка, Разделитель, ПропускатьПустыеСтроки); - КонецЕсли; - -КонецФункции - -#КонецОбласти - -#Область ДоработанныйФункционал - -Функция ЕстьВИсключаемойКоллекцииНастроек(Знач ЧтоИщем, КлючНастроек) - - Если Настройки.Свойство(КлючНастроек) - И ТипЗнч(Настройки[КлючНастроек]) = Тип("Массив") - И Настройки[КлючНастроек].Найти(ЧтоИщем) <> Неопределено - Тогда - Возврат Истина; - КонецЕсли; - - Возврат Ложь; - -КонецФункции - -#КонецОбласти \ No newline at end of file diff --git "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/Forms/\320\244\320\276\321\200\320\274\320\260.xml" "b/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/Forms/\320\244\320\276\321\200\320\274\320\260.xml" deleted file mode 100644 index 04d687d..0000000 --- "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/Forms/\320\244\320\276\321\200\320\274\320\260.xml" +++ /dev/null @@ -1,22 +0,0 @@ - - -
- - Форма - - - ru - Форма - - - - Managed - false - - PlatformApplication - MobilePlatformApplication - - - -
-
\ No newline at end of file diff --git "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml" "b/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml" deleted file mode 100644 index 1da5f7d..0000000 --- "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml" +++ /dev/null @@ -1,12 +0,0 @@ - -
- - - - - cfg:ExternalDataProcessorObject.тесты_ПроверкаМакетовСКД - - true - - - \ No newline at end of file diff --git "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" "b/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" deleted file mode 100644 index 66156e2..0000000 --- "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/\321\202\320\265\321\201\321\202\321\213_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\234\320\260\320\272\320\265\321\202\320\276\320\262\320\241\320\232\320\224/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" +++ /dev/null @@ -1,231 +0,0 @@ -#Область ОписаниеПеременных - -&НаКлиенте -Перем КонтекстЯдра; -&НаКлиенте -Перем Утверждения; - -#КонецОбласти - -#Область ОсновныеПроцедурыТеста - -&НаСервере -Функция КлючНастройки() Экспорт - Возврат МодульОбъекта().КлючНастройки(); -КонецФункции - -&НаКлиенте -Процедура Инициализация(КонтекстЯдраПараметр) Экспорт - КонтекстЯдра = КонтекстЯдраПараметр; - Утверждения = КонтекстЯдра.Плагин("БазовыеУтверждения"); - - ЗагрузитьНастройки(); -КонецПроцедуры - -&НаКлиенте -Процедура ЗаполнитьНаборТестов(НаборТестов, КонтекстЯдраПараметр) Экспорт - - Если ТекущийРежимЗапуска() = РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение Then - Возврат; - КонецЕсли; - - КонтекстЯдра = КонтекстЯдраПараметр; - ЗагрузитьНастройки(); - - Если Не НужноВыполнятьТест() Тогда - Возврат; - КонецЕсли; - - КонтекстЯдра = КонтекстЯдраПараметр; - - ДобавитьОбщиеМакеты(НаборТестов); - - ДобавитьМакетМетаданных(НаборТестов); - -КонецПроцедуры - -&НаКлиенте -Процедура ТестДолжен_ПроверитьМакетСКД(ИмяМенеджера, ИмяОбьекта, ИмяМакета) Экспорт - ПроверитьМакетСКД(ИмяМенеджера, ИмяОбьекта, ИмяМакета); -КонецПроцедуры - -&НаСервере -Процедура ПроверитьМакетСКД(ИмяМенеджера, ИмяОбьекта, ИмяМакета) - МодульОбъекта().ТестДолжен_ПроверитьМакетСКД(ИмяМенеджера, ИмяОбьекта, ИмяМакета); -КонецПроцедуры - -&НаКлиенте -Процедура ТестДолжен_ПроверитьОбщийМакетСКД(ИмяМакета) Экспорт - ПроверитьОбщийМакетСКД(ИмяМакета); -КонецПроцедуры - -&НаСервере -Процедура ПроверитьОбщийМакетСКД(ИмяМакета) - МодульОбъекта().ТестДолжен_ПроверитьОбщийМакетСКД(ИмяМакета); -КонецПроцедуры - -&НаКлиенте -Процедура ТестДолжен_ПроверитьВложенныйМакетСКД(ИмяМенеджера, ИмяОбьекта, ИменаМакетов) Экспорт - ПроверитьВложенныйМакетСКД(ИмяМенеджера, ИмяОбьекта, ИменаМакетов); -КонецПроцедуры - -&НаСервере -Процедура ПроверитьВложенныйМакетСКД(ИмяМенеджера, ИмяОбьекта, ИменаМакетов) - МодульОбъекта().ТестДолжен_ПроверитьВложенныйМакетСКД(ИмяМенеджера, ИмяОбьекта, ИменаМакетов); -КонецПроцедуры - -&НаКлиенте -Процедура ТестДолжен_ПропуститьМакетСКД(ТекстСообщения) Экспорт - Утверждения.ПропуститьТест(ТекстСообщения); -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -#Область Настройки - -&НаКлиенте -Процедура ЗагрузитьНастройки() - Если ЗначениеЗаполнено(Объект.Настройки) Тогда - Возврат; - КонецЕсли; - - ПлагинНастройки = КонтекстЯдра.Плагин("Настройки"); - ПлагинНастройки.Инициализация(КонтекстЯдра); - - Объект.Настройки = ПлагинНастройки.ПолучитьНастройку(КлючНастройки()); - - НастройкиПоУмолчанию = НастройкиПоУмолчанию(); - Если ТипЗнч(Объект.Настройки) <> Тип("Структура") Then - Объект.Настройки = НастройкиПоУмолчанию; - Иначе - ЗаполнитьЗначенияСвойств(НастройкиПоУмолчанию, Объект.Настройки); - Объект.Настройки = НастройкиПоУмолчанию; - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Функция НастройкиПоУмолчанию() - - Результат = Новый Структура; - - Результат.Вставить("Используется", Истина); - Результат.Вставить("ИсключенияОбщихМакетов", Новый Массив); - Результат.Вставить("ИсключенияПоИмениМетаданных", Новый Массив); - Результат.Вставить("ИсключенияПоИмениМакетов", Новый Массив); - - Возврат Результат; -КонецФункции - -&НаКлиенте -Функция НужноВыполнятьТест() - - ЗагрузитьНастройки(); - - Если Не ЗначениеЗаполнено(Объект.Настройки) Тогда - Возврат Истина; - КонецЕсли; - - КлючНастройки = КлючНастройки(); - - ВыполнятьТест = Истина; - Если ТипЗнч(Объект.Настройки) = Тип("Структура") - И Объект.Настройки.Свойство("Используется", ВыполнятьТест) Тогда - - Возврат ВыполнятьТест = Истина; - КонецЕсли; - - Возврат Истина; - -КонецФункции - -#КонецОбласти - -&НаКлиенте -Процедура ДобавитьОбщиеМакеты(НаборТестов) - - мОбщиеМакеты = ОбщиеМакеты(); - - Если мОбщиеМакеты.Количество() > 0 Тогда - - НаборТестов.НачатьГруппу(ТекстОбщиеМакеты(), Ложь); - - Для Каждого ОбщийМакет Из мОбщиеМакеты Цикл - - НаборТестов.Добавить(ОбщийМакет.ИмяПроцедуры, ОбщийМакет.Параметры, ОбщийМакет.Представление); - - КонецЦикла; - - КонецЕсли; - -КонецПроцедуры - -&НаСервере -Функция ОбщиеМакеты() - Возврат МодульОбъекта().ОбщиеМакеты(); -КонецФункции - -&НаКлиенте -Процедура ДобавитьМакетМетаданных(НаборТестов) - - ГруппыМакетовМетаданных = ГруппыМакетовМетаданных(); - - Для Каждого ГруппаМакетовМетаданных Из ГруппыМакетовМетаданных Цикл - - Если ГруппаМакетовМетаданных.Значение.Количество() > 0 Тогда - - НаборТестов.НачатьГруппу(ГруппаМакетовМетаданных.Ключ, Ложь); - - Для Каждого МакетМетаданных Из ГруппаМакетовМетаданных.Значение Цикл - - НаборТестов.Добавить( - МакетМетаданных.ИмяПроцедуры, - МакетМетаданных.Параметры, - МакетМетаданных.Представление); - - КонецЦикла; - - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -&НаСервере -Функция ГруппыМакетовМетаданных() - Возврат МодульОбъекта().ГруппыМакетовМетаданных(); -КонецФункции - -&НаСервере -Функция МодульОбъекта() - Возврат РеквизитФормыВЗначение("Объект"); -КонецФункции - -&НаКлиентеНаСервереБезКонтекста -Функция ТекстОбщиеМакеты() Экспорт - Возврат "ОбщиеМакеты"; -КонецФункции - -&НаКлиенте -Функция ДобавитьТестИсключениеЕслиЕстьВИсключаемойКоллекции(Знач ЧтоИщем, - Знач КоллекцияДляПоиска, - Знач Сообщение, - Знач НаборТестов) - - Если КонтекстЯдра.ЕстьВИсключаемойКоллекции(ЧтоИщем, КоллекцияДляПоиска) Тогда - - КонтекстЯдра.Отладка(Сообщение); - ПараметрыТеста = НаборТестов.ПараметрыТеста(Сообщение); - - НаборТестов.Добавить("Тест_ПропуститьМакетСКД", ПараметрыТеста, Сообщение); - - Возврат Истина; - - КонецЕсли; - - Возврат Ложь; - -КонецФункции - -#КонецОбласти \ No newline at end of file diff --git "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\244\320\276\321\200\320\274\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\237\320\265\321\207\320\260\321\202\320\275\321\213\321\205\320\244\320\276\321\200\320\274/\321\202\320\265\321\201\321\202\321\213_\320\244\320\276\321\200\320\274\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\237\320\265\321\207\320\260\321\202\320\275\321\213\321\205\320\244\320\276\321\200\320\274.xml" "b/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\244\320\276\321\200\320\274\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\237\320\265\321\207\320\260\321\202\320\275\321\213\321\205\320\244\320\276\321\200\320\274/\321\202\320\265\321\201\321\202\321\213_\320\244\320\276\321\200\320\274\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\237\320\265\321\207\320\260\321\202\320\275\321\213\321\205\320\244\320\276\321\200\320\274.xml" deleted file mode 100644 index 8e989b8..0000000 --- "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\244\320\276\321\200\320\274\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\237\320\265\321\207\320\260\321\202\320\275\321\213\321\205\320\244\320\276\321\200\320\274/\321\202\320\265\321\201\321\202\321\213_\320\244\320\276\321\200\320\274\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\237\320\265\321\207\320\260\321\202\320\275\321\213\321\205\320\244\320\276\321\200\320\274.xml" +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - c3831ec8-d8d5-4f93-8a22-f9bfae07327f - d9ce875b-8e44-47c3-bbb7-2d51a8b7193f - - - 76d40422-beaf-4957-9d39-69502dede67f - 768a107e-39db-412f-9056-6b7d54241618 - - - - тесты_ФормированиеПечатныхФорм - - - ru - Формирование печатных форм - - - - - - - - - - Настройки - - - ru - Настройки - - - - - false - - - - false - - false - false - - - DontCheck - Items - - - Auto - Auto - - - Auto - - - - - \ No newline at end of file diff --git "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\244\320\276\321\200\320\274\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\237\320\265\321\207\320\260\321\202\320\275\321\213\321\205\320\244\320\276\321\200\320\274/\321\202\320\265\321\201\321\202\321\213_\320\244\320\276\321\200\320\274\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\237\320\265\321\207\320\260\321\202\320\275\321\213\321\205\320\244\320\276\321\200\320\274/Ext/ObjectModule.bsl" "b/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\244\320\276\321\200\320\274\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\237\320\265\321\207\320\260\321\202\320\275\321\213\321\205\320\244\320\276\321\200\320\274/\321\202\320\265\321\201\321\202\321\213_\320\244\320\276\321\200\320\274\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\237\320\265\321\207\320\260\321\202\320\275\321\213\321\205\320\244\320\276\321\200\320\274/Ext/ObjectModule.bsl" deleted file mode 100644 index ffdee52..0000000 --- "a/src/tests/\321\202\320\265\321\201\321\202\321\213_\320\244\320\276\321\200\320\274\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\237\320\265\321\207\320\260\321\202\320\275\321\213\321\205\320\244\320\276\321\200\320\274/\321\202\320\265\321\201\321\202\321\213_\320\244\320\276\321\200\320\274\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\237\320\265\321\207\320\260\321\202\320\275\321\213\321\205\320\244\320\276\321\200\320\274/Ext/ObjectModule.bsl" +++ /dev/null @@ -1,448 +0,0 @@ -#Область ОписаниеПеременных - -Перем КонтекстЯдра; -Перем Утверждения; - -#КонецОбласти - -#Область ПрограммныйИнтерфейс - -#Область ИнтерфейсТестирования - -Функция КлючНастройки() Экспорт - Возврат "ФормированиеПечатныхФорм"; -КонецФункции - -Процедура Инициализация(КонтекстЯдраПараметр) Экспорт - КонтекстЯдра = КонтекстЯдраПараметр; - Утверждения = КонтекстЯдра.Плагин("БазовыеУтверждения"); - - ЗагрузитьНастройки(); -КонецПроцедуры - -Процедура ЗаполнитьНаборТестов(НаборТестов, КонтекстЯдраПараметр) Экспорт - КонтекстЯдра = КонтекстЯдраПараметр; - - ЗагрузитьНастройки(); - - Если Не НужноВыполнятьТест(КонтекстЯдра) Тогда - Возврат; - КонецЕсли; - - Для Каждого МетаОбъект Из Метаданные.Документы Цикл - Если ПравоДоступа("Просмотр", МетаОбъект) Тогда - ДобавитьТестыДляДокумента(НаборТестов, МетаОбъект); - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -#КонецОбласти - -#Область Тесты - -Процедура ПередЗапускомТеста() Экспорт - //НачатьТранзакцию(); -КонецПроцедуры - -Процедура ПослеЗапускаТеста() Экспорт - //Если ТранзакцияАктивна() Тогда - // ОтменитьТранзакцию(); - //КонецЕсли; -КонецПроцедуры - -Процедура Тест_ПолучитьПечатнуюФорму(МетаИмя, КомандаПечати) Экспорт - - ДокументыДляПечати = ПолучитьДокументыДляПечати(Метаданные.Документы[МетаИмя], КомандаПечати.УсловияВидимости); - Если ДокументыДляПечати.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - Для Каждого ДокСсылка Из ДокументыДляПечати Цикл - НачалоСообщенияОбОшибке = "Печать документа " + ДокСсылка + ": "; - КоллекцияПечатныхФорм = ПолучитьКоллекциюПечатныхФорм(КомандаПечати, ДокСсылка); - - Утверждения.Проверить(ТипЗнч(КоллекцияПечатныхФорм) = Тип("ТаблицаЗначений"), НачалоСообщенияОбОшибке + "Ожидалось, что КоллекцияПечатныхФорм будет иметь тип Таблица значений!"); - Утверждения.Проверить(КоллекцияПечатныхФорм.Количество() > 0, НачалоСообщенияОбОшибке + "Ожидалось, что количество элементов в КоллекцияПечатныхФорм будет больше 0!"); - - Для Каждого СтрокаТаблицы Из КоллекцияПечатныхФорм Цикл - ТабДок = СтрокаТаблицы.ТабличныйДокумент; - Утверждения.Проверить(ТабДок <> Неопределено, НачалоСообщенияОбОшибке + "Ожидалось, что будет получен табличный документ, а получено значение <Неопределено>!"); - //++ РС 19.08.2021 - //Утверждения.Проверить(ТабДок.ВысотаТаблицы > 0, НачалоСообщенияОбОшибке + "Ожидалось, что высота полученного табличного документа будет больше 0!"); - //-- РС - КонецЦикла; - - КонецЦикла; - -КонецПроцедуры - -Процедура Тест_ПропуститьПечатнуюФорму(Знач Сообщение) Экспорт - КонтекстЯдра.ПропуститьТест(Сообщение); -КонецПроцедуры - -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -#Область Настройки - -Процедура ЗагрузитьНастройки() - Если ЗначениеЗаполнено(Настройки) Тогда - Возврат; - КонецЕсли; - - ПлагинНастройки = КонтекстЯдра.Плагин("Настройки"); - ПлагинНастройки.Инициализация(КонтекстЯдра); - - НастройкиПоУмолчанию = НастройкиПоУмолчанию(); - Настройки = ПлагинНастройки.ПолучитьНастройку(КлючНастройки()); - Если ТипЗнч(Настройки) <> Тип("Структура") Then - Настройки = НастройкиПоУмолчанию; - Иначе - ЗаполнитьЗначенияСвойств(НастройкиПоУмолчанию, Настройки); - Настройки = НастройкиПоУмолчанию; - - КонецЕсли; - -КонецПроцедуры - -Функция НастройкиПоУмолчанию() - - Результат = Новый Структура; - Результат.Вставить("Используется", Истина); - Результат.Вставить("КоличествоДокументов", 1); - Результат.Вставить("ИсключенияПоИдентификатору", Новый Массив); - Результат.Вставить("ИсключенияПоИмени", Новый Массив); - Результат.Вставить("ИсключенияПоОбъекту", Новый Массив); - - Возврат Результат; -КонецФункции - -Функция НужноВыполнятьТест(КонтекстЯдра) - - ЗагрузитьНастройки(); - //Настройки(КонтекстЯдра, ПутьНастройки); - - Если Не ЗначениеЗаполнено(Настройки) Тогда - Возврат Истина; - КонецЕсли; - - //ИмяТеста = ИмяТеста(); - КлючНастройки = КлючНастройки(); - - ВыполнятьТест = Истина; - Если ТипЗнч(Настройки) = Тип("Структура") - И Настройки.Свойство("Используется", ВыполнятьТест) Тогда - //И Настройки.Свойство("Параметры") - //И Настройки.Параметры.Свойство(ИмяТеста) Тогда - - //ВыполнятьТест = Настройки.Параметры[ИмяТеста]; - Возврат ВыполнятьТест = Истина; - КонецЕсли; - - Возврат Истина; - -КонецФункции - -#КонецОбласти - -Процедура ДобавитьТестыДляДокумента(НаборТестов, МетаОбъект) - - // TODO реализовать возможность указания исключаемых объектов, а то у некоторых документов в менеджере нет процедуры ДобавитьКомандыПечати() - КомандыПечати = Неопределено; - Попытка - МодульУправлениеПечатью = Вычислить("УправлениеПечатью"); - КомандыПечати = МодульУправлениеПечатью.КомандыПечатиОбъекта(МетаОбъект); - Исключение - КонтекстЯдра.Отладка("Не удалось получить команды печати для документа " + МетаОбъект + ": " + ОписаниеОшибки()); - Возврат; - КонецПопытки; - - Если КомандыПечати.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - //++ РС 11.08.2021 - Если КонтекстЯдра.ЕстьВИсключаемойКоллекции(МетаОбъект.Имя, Настройки.ИсключенияПоОбъекту) Тогда - Возврат; - КонецЕсли; - //-- РС - - НаборТестов.НачатьГруппу("Печатные формы " + МетаОбъект.Синоним + " - Документ." + МетаОбъект.Имя); - - Для Каждого ТекущаяКомандаПечати Из КомандыПечати Цикл - - Идентификатор = ТекущаяКомандаПечати.Идентификатор; - ИдентификаторДляСравнения = НРег(Идентификатор); - - ДопИнфо = "Идентификатор = " + Идентификатор; - Если ТекущаяКомандаПечати.МенеджерПечати = "СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки" Тогда - ДопИнфо = "Ссылка = " + ТекущаяКомандаПечати.ДополнительныеПараметры.Ссылка + "; " + ДопИнфо; - КонецЕсли; - ПредставлениеТеста = "Печатная форма " + МетаОбъект.Имя + ": " + ТекущаяКомандаПечати.Представление + " : " + "{" + ДопИнфо + "}"; - - //++ РС 11.08.2021 - Если КонтекстЯдра.ЕстьВИсключаемойКоллекции(Идентификатор, Настройки.ИсключенияПоИдентификатору) - ИЛИ ТекущаяКомандаПечати.МенеджерПечати = "" - Тогда - Продолжить; - КонецЕсли; - - Если КонтекстЯдра.ЕстьВИсключаемойКоллекции(ТекущаяКомандаПечати.Представление, Настройки.ИсключенияПоИмени) Тогда - Продолжить; - КонецЕсли; - - Если КонтекстЯдра.ЕстьВИсключаемойКоллекции(МетаОбъект.Имя, Настройки.ИсключенияПоОбъекту) Тогда - Продолжить; - КонецЕсли; - - //Сообщение = "Пропускаем из-за исключения по идентификатору - " + ПредставлениеТеста; - //Если ДобавитьТестИсключениеЕслиЕстьВИсключаемойКоллекции(Идентификатор, Настройки.ИсключенияПоИдентификатору, - // Сообщение, НаборТестов) Тогда - // Продолжить; - //КонецЕсли; - // - //Сообщение = "Пропускаем из-за исключения по имени - " + ПредставлениеТеста; - //Если ДобавитьТестИсключениеЕслиЕстьВИсключаемойКоллекции(ТекущаяКомандаПечати.Представление, Настройки.ИсключенияПоИмени, - // Сообщение, НаборТестов) Тогда - // Продолжить; - //КонецЕсли; - // - //Сообщение = "Пропускаем из-за исключения по имени объекта - " + ПредставлениеТеста; - //Если ДобавитьТестИсключениеЕслиЕстьВИсключаемойКоллекции(МетаОбъект.Имя, Настройки.ИсключенияПоОбъекту, - // Сообщение, НаборТестов) Тогда - // Продолжить; - //КонецЕсли; - //-- РС - - СтруктураКоманды = Новый Структура; - Для Каждого Колонка Из КомандыПечати.Колонки Цикл - ИмяКолонки = Колонка.Имя; - СтруктураКоманды.Вставить(ИмяКолонки, ТекущаяКомандаПечати[ИмяКолонки]); - КонецЦикла; - ПараметрыТеста = НаборТестов.ПараметрыТеста(МетаОбъект.Имя, СтруктураКоманды); - - НаборТестов.Добавить("Тест_ПолучитьПечатнуюФорму", ПараметрыТеста, ПредставлениеТеста); - КонецЦикла; - -КонецПроцедуры - -Функция ДобавитьТестИсключениеЕслиЕстьВИсключаемойКоллекции(Знач ЧтоИщем, Знач КоллекцияДляПоиска, Знач Сообщение, - Знач НаборТестов) - - Если КонтекстЯдра.ЕстьВИсключаемойКоллекции(ЧтоИщем, КоллекцияДляПоиска) Тогда - КонтекстЯдра.Отладка(Сообщение); - ПараметрыТеста = НаборТестов.ПараметрыТеста(Сообщение); - - НаборТестов.Добавить("Тест_ПропуститьПечатнуюФорму", ПараметрыТеста, Сообщение); - - Возврат Истина; - КонецЕсли; - - Возврат Ложь; -КонецФункции - -//++ РС 11.08.2021 -Функция ЕстьВИсключаемойКоллекции(Знач ЧтоИщем, Знач КоллекцияДляПоиска) - Возврат КоллекцияДляПоиска.Найти(ЧтоИщем) <> Неопределено ; -КонецФункции //-- РС - -Функция ПолучитьДокументыДляПечати(МетаОбъект, УсловияВидимости = Неопределено) - - // здесь можно указать количество документов, для которых нужно проверить каждую форму - КолвоТестируемыхДокументов = Настройки.КоличествоДокументов; - - Результат = Новый Массив; - - ШаблонТекстаЗапроса = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | Док.Ссылка КАК Ссылка - |ИЗ - | Документ.СчетНаОплатуПокупателю КАК Док - |ГДЕ - | &ДопУсловия - | - |УПОРЯДОЧИТЬ ПО - | ВЫБОР - | КОГДА Док.Проведен - | ТОГДА 0 - | КОГДА Док.ПометкаУдаления - | ТОГДА 2 - | ИНАЧЕ 1 - | КОНЕЦ, - | Док.Дата УБЫВ"; - ШаблонТекстаЗапроса = СтрЗаменить(ШаблонТекстаЗапроса, "Документ.СчетНаОплатуПокупателю", "Документ." + МетаОбъект.Имя); - ШаблонТекстаЗапроса = СтрЗаменить(ШаблонТекстаЗапроса, "ВЫБРАТЬ ПЕРВЫЕ 1", "ВЫБРАТЬ ПЕРВЫЕ " + Формат(КолвоТестируемыхДокументов, "ЧГ=")); - - Запрос = Новый Запрос; - Запрос.Текст = ШаблонТекстаЗапроса; - - ОперацииУсловий = Новый Соответствие; - ОперацииУсловий.Вставить(ВидСравнения.Равно, "="); - ОперацииУсловий.Вставить(ВидСравненияКомпоновкиДанных.Равно, "="); - ОперацииУсловий.Вставить(ВидСравнения.Больше, ">"); - ОперацииУсловий.Вставить(ВидСравненияКомпоновкиДанных.Больше, ">"); - ОперацииУсловий.Вставить(ВидСравнения.БольшеИлиРавно, ">="); - ОперацииУсловий.Вставить(ВидСравненияКомпоновкиДанных.БольшеИлиРавно, ">="); - ОперацииУсловий.Вставить(ВидСравнения.Меньше, "<"); - ОперацииУсловий.Вставить(ВидСравненияКомпоновкиДанных.Меньше, "<"); - ОперацииУсловий.Вставить(ВидСравнения.МеньшеИлиРавно, "<="); - ОперацииУсловий.Вставить(ВидСравненияКомпоновкиДанных.МеньшеИлиРавно, "<="); - ОперацииУсловий.Вставить(ВидСравнения.НеРавно, "<>"); - ОперацииУсловий.Вставить(ВидСравненияКомпоновкиДанных.НеРавно, "<>"); - - ДопУсловия = ""; - Если ТипЗнч(УсловияВидимости) = Тип("Массив") Тогда - Для Каждого Условие Из УсловияВидимости Цикл - ТекТекстУсловия = ""; - ТекОперация = ОперацииУсловий.Получить(Условие.ВидСравнения); - Если ТекОперация <> Неопределено Тогда - ТекТекстУсловия = Условие.Реквизит + " " + ТекОперация + " &" + Условие.Реквизит; - ИначеЕсли Условие.ВидСравнения = ВидСравнения.ВСписке - Или Условие.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке Тогда - ТекТекстУсловия = Условие.Реквизит + " В(&" + Условие.Реквизит + ")"; - ИначеЕсли Условие.ВидСравнения = ВидСравнения.НеВСписке - Или Условие.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке Тогда - ТекТекстУсловия = "НЕ " + Условие.Реквизит + " В(&" + Условие.Реквизит + ")"; - ИначеЕсли Условие.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено Тогда - // TODO: обработать условие видимости "Заполнено" - ИначеЕсли Условие.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено Тогда - // TODO: обработать условие видимости "Не заполнено" - КонецЕсли; - Если НЕ ПустаяСтрока(ТекТекстУсловия) Тогда - ДопУсловия = ДопУсловия + ?(ПустаяСтрока(ДопУсловия), "", " И ") + ТекТекстУсловия; - Запрос.УстановитьПараметр(Условие.Реквизит, Условие.Значение); - КонецЕсли; - КонецЦикла; - КонецЕсли; - - Если НЕ ПустаяСтрока(ДопУсловия) Тогда - Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ДопУсловия", ДопУсловия); - Иначе - Запрос.УстановитьПараметр("ДопУсловия", Истина); - КонецЕсли; - - РезультатЗапроса = Запрос.Выполнить(); - - Если РезультатЗапроса.Пустой() Тогда - // нет документов для тестирования :( - Если НЕ ПустаяСтрока(ДопУсловия) Тогда - // возможно причина пустого результата в доп.условиях: - // попробуем без них - Запрос = Новый Запрос; - Запрос.Текст = ШаблонТекстаЗапроса; - Запрос.УстановитьПараметр("ДопУсловия", Истина); - РезультатЗапроса = Запрос.Выполнить(); - КонецЕсли; - КонецЕсли; - - Если НЕ РезультатЗапроса.Пустой() Тогда - Результат = РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Ссылка"); - КонецЕсли; - - Возврат Результат; - -КонецФункции - -Функция ПолучитьКоллекциюПечатныхФорм(КомандаПечати, ДокументДляПечати) - - Результат = Неопределено; - - ДокументыДляПечати = Новый Массив; - ДокументыДляПечати.Добавить(ДокументДляПечати); - - Если КомандаПечати.МенеджерПечати = "СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки" - И Вычислить("ОбщегоНазначения.ПодсистемаСуществует(""СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки"")") Тогда - // печать внешней печатной формы - ДополнительнаяОбработкаСсылка = КомандаПечати.ДополнительныеПараметры.Ссылка; - ПараметрыИсточника = Новый Структура; - ПараметрыИсточника.Вставить("ИдентификаторКоманды", КомандаПечати.Идентификатор); - ПараметрыИсточника.Вставить("ОбъектыНазначения", ДокументыДляПечати); - КоллекцияПечатныхФорм = Неопределено; - ОбъектыПечати = Новый СписокЗначений; - ПараметрыВывода = Неопределено; - - МодульУправлениеПечатью = Вычислить("УправлениеПечатью"); - //Попытка - МодульУправлениеПечатью.ПечатьПоВнешнемуИсточнику( - ДополнительнаяОбработкаСсылка, - ПараметрыИсточника, - КоллекцияПечатныхФорм, - ОбъектыПечати, - ПараметрыВывода - ); - - Результат = КоллекцияПечатныхФорм; - //Исключение - // Инфо = ИнформацияОбОшибке(); - // //TODO нужно не костылем исключить печатные формы, которые открываются не в 1С - word и т.п. - // Если (Найти(Инфо.Описание, "Метод объекта не обнаружен (Печать)") > 0 Или - // Найти(Инфо.Описание, "Object method not found (Печать)") > 0) - // //И - // //Найти(Инфо.ИсходнаяСтрока, "ОбъектПлагина.Инициализация(ЭтотОбъект);") > 0 - // //И - // //( Найти(Инфо.ИмяМодуля, "Форма.УправляемаяФорма.Форма") > 0 Или - // ////ExternalDataProcessor.xddTestRunner.Form.УправляемаяФорма.Form - // //Найти(Инфо.ИмяМодуля, "Form.УправляемаяФорма.Form") > 0 ) - // Тогда - // КонтекстЯдра.ПропуститьТест(НСтр("ru = 'Тест пропущен: '") + Инфо.Описание); - // Иначе - // ВызватьИсключение; - // КонецЕсли; - //КонецПопытки; - Иначе - // печать встроенной печатной формы - ИмяМенеджераПечати = КомандаПечати.МенеджерПечати; - ИменаМакетов = КомандаПечати.Идентификатор; - МассивОбъектов = ДокументыДляПечати; - //++ РС 18.08.2021 - //ПараметрыПечати = Новый Структура("ДополнительныеПараметры", КомандаПечати.ДополнительныеПараметры); - ПараметрыПечати = ?(КомандаПечати.Свойство("ДополнительныеПараметры"), КомандаПечати.ДополнительныеПараметры, - Новый Структура); - //-- РС - - ДопустимыеТипыОбъектовПечати = Неопределено; - - МодульУправлениеПечатью = Вычислить("УправлениеПечатью"); - //Попытка - ПечатныеФормы = МодульУправлениеПечатью.СформироватьПечатныеФормы( - ИмяМенеджераПечати, - ИменаМакетов, - МассивОбъектов, - ПараметрыПечати, - ДопустимыеТипыОбъектовПечати - ); - - Результат = ПечатныеФормы.КоллекцияПечатныхФорм; - //Исключение - // Инфо = ИнформацияОбОшибке(); - // //TODO нужно не костылем исключить печатные формы, которые открываются не в 1С - word и т.п. - // Если (Найти(Инфо.Описание, "Метод объекта не обнаружен (Печать)") > 0 Или - // Найти(Инфо.Описание, "Object method not found (Печать)") > 0) - // //И - // //Найти(Инфо.ИсходнаяСтрока, "ОбъектПлагина.Инициализация(ЭтотОбъект);") > 0 - // //И - // //( Найти(Инфо.ИмяМодуля, "Форма.УправляемаяФорма.Форма") > 0 Или - // ////ExternalDataProcessor.xddTestRunner.Form.УправляемаяФорма.Form - // //Найти(Инфо.ИмяМодуля, "Form.УправляемаяФорма.Form") > 0 ) - // Тогда - // КонтекстЯдра.ПропуститьТест(НСтр("ru = 'Тест пропущен: '") + Инфо.Описание); - // Иначе - // ВызватьИсключение; - // КонецЕсли; - //КонецПопытки; - - КонецЕсли; - - Возврат Результат; - -КонецФункции - -Функция ИмяТеста() - Возврат Метаданные().Имя; -КонецФункции - -#КонецОбласти diff --git a/src/tools/.gitkeep b/src/tools/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git "a/src/tools/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270.xml" "b/src/tools/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270.xml" deleted file mode 100644 index c57b7be..0000000 --- "a/src/tools/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270.xml" +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - c3831ec8-d8d5-4f93-8a22-f9bfae07327f - e30126c8-eb71-4599-b829-003b902f0fcb - - - ad2d63ee-86f7-4b9d-8554-51242235153f - a93ee18f-8524-430a-8c06-e4a15bedb47d - - - - УправлениеДымовымиТестами - - - ru - Управление дымовыми тестами - - - - ExternalDataProcessor.УправлениеДымовымиТестами.Form.Форма - - - - - - - efdf3a18-3377-4604-8aef-b03abb387690 - 9481f5c2-2514-448a-bfb7-ae81c40f9498 - - - b6ae8105-d103-4b08-b8e1-0d2a6e3fb212 - 2ddadae4-d3e9-4dc5-a40f-c29da57f0ec4 - - - - ЗначенияРеквизитовНовых - - - ru - Значения реквизитов новых - - - - - DontCheck - - - - DontCheck - false - false - Auto - - - false - - - Auto - Auto - - false - false - - - - Use - - - - - - - - - -
Форма
-
-
-
\ No newline at end of file diff --git "a/src/tools/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/Forms/\320\244\320\276\321\200\320\274\320\260.xml" "b/src/tools/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/Forms/\320\244\320\276\321\200\320\274\320\260.xml" deleted file mode 100644 index a566fc7..0000000 --- "a/src/tools/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/Forms/\320\244\320\276\321\200\320\274\320\260.xml" +++ /dev/null @@ -1,22 +0,0 @@ - - -
- - Форма - - - ru - Форма - - - - Managed - false - - PersonalComputer - MobileDevice - - - -
-
\ No newline at end of file diff --git "a/src/tools/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml" "b/src/tools/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml" deleted file mode 100644 index beed250..0000000 --- "a/src/tools/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml" +++ /dev/null @@ -1,1200 +0,0 @@ - -
- - - - - - - - - - ПриСозданииНаСервере - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Страницы тестов</v8:content> - </v8:item> - - - - ru - Страницы тестов - - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Открытие форм</v8:content> - </v8:item> - - - - ru - Страница открытие форм - - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Настройки открытие форм</v8:content> - </v8:item> - - - - ru - Настройки открытие форм - - - None - false - - - - ТестироватьОткрытиеФорм - Auto - - - - - ОткрываемФормыНаКлиентеТестирования - Auto - - - - - - - Tree - false - false - true - Use - true - true - ДеревоМетаданных - - Copy - Delete - Add - - CommandBar - None - - - - - - ДеревоМетаданных - SearchStringRepresentation - - - - - - - ДеревоМетаданных - ViewStatusRepresentation - - - - - - - ДеревоМетаданных - SearchControl - - - - - - ДеревоМетаданныхПриАктивизацииСтроки - - - - ДеревоМетаданных.Исключено - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Исключено из проверки</v8:content> - </v8:item> - - EnterOnInput - Auto - - - - ДеревоМетаданныхВыборПриИзменении - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Исключаемые из проверки формы</v8:content> - </v8:item> - - InCell - - - - ДеревоМетаданных.ВидМетаданных - true - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Исключаемые из проверки формы</v8:content> - </v8:item> - - EnterOnInput - - - - - ДеревоМетаданных.ВидПроверки - true - None - EnterOnInput - - - - - ДеревоМетаданных.ИмяМетаданного - true - None - EnterOnInput - - - - - - -
- - List - true - true - true - ЗначенияРеквизитовНовых - - - - - - - ЗначенияРеквизитовНовых - SearchStringRepresentation - - - - - - - ЗначенияРеквизитовНовых - ViewStatusRepresentation - - - - - - - ЗначенияРеквизитовНовых - SearchControl - - - - - - ЗначенияРеквизитовНовыхПередНачаломДобавления - ЗначенияРеквизитовНовыхПриНачалеРедактирования - - - - ЗначенияРеквизитовНовых.ВидМетаданных - EnterOnInput - - - - - ЗначенияРеквизитовНовых.ИмяМетаданного - EnterOnInput - - - - - ЗначенияРеквизитовНовых.Реквизит - EnterOnInput - true - - - - ЗначенияРеквизитовНовыхРеквизитПриИзменении - - - - ЗначенияРеквизитовНовых.ЗначениеРеквизита - EnterOnInput - - - - ЗначенияРеквизитовНовыхЗначениеРеквизитаПриИзменении - - - -
-
-
- - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Проведение печатные формы</v8:content> - </v8:item> - - - - ru - Страница проведение печатные формы - - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Настройки проверок</v8:content> - </v8:item> - - - - ru - Настройки проведение печатные формы - - - - - - ТестироватьПроведение - Auto - - - - - КоличествоДокументовПроведение - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Проводить документов</v8:content> - </v8:item> - - - - - - ТестироватьПечатныеФормы - Auto - - - - - КоличествоДокументовПечатныеФормы - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Открывать печатные формы документов</v8:content> - </v8:item> - - - - - - - - List - true - Use - true - true - ТаблицаДокументы - CommandBar - CommandBar - - - - false - - - - - ТаблицаДокументы - SearchStringRepresentation - - - - - - - ТаблицаДокументы - ViewStatusRepresentation - - - - - - - ТаблицаДокументы - SearchControl - - - - - - ТаблицаДокументыПриАктивизацииСтроки - - - - ТаблицаДокументы.ИмяМетаданного - true - EnterOnInput - - - - - ТаблицаДокументы.ИсключеноПроведение - EnterOnInput - Auto - - - - - ТаблицаДокументы.ИсключеноПечатныеФормы - EnterOnInput - Auto - - - - -
- - List - true - Use - true - true - ТаблицаПечатныеФормы - CommandBar - CommandBar - - - - false - - - - - ТаблицаПечатныеФормы - SearchStringRepresentation - - - - - - - ТаблицаПечатныеФормы - ViewStatusRepresentation - - - - - - - ТаблицаПечатныеФормы - SearchControl - - - - - - - ТаблицаПечатныеФормы.Исключено - EnterOnInput - Auto - - - - - ТаблицаПечатныеФормы.Идентификатор - true - EnterOnInput - - - - -
-
-
- - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Макеты СКД</v8:content> - </v8:item> - - - - ru - Страница макеты СКД - - - - - - ТестироватьМакетыСКД - Auto - - - - - List - true - Use - true - true - ТаблицаМакетыСКД - CommandBar - CommandBar - - - - false - - - - - ТаблицаМакетыСКД - SearchStringRepresentation - - - - - - - ТаблицаМакетыСКД - ViewStatusRepresentation - - - - - - - ТаблицаМакетыСКД - SearchControl - - - - - - - ТаблицаМакетыСКД.ИмяМетаданного - true - EnterOnInput - - - - - ТаблицаМакетыСКД.Объект - true - EnterOnInput - - - - - ТаблицаМакетыСКД.Исключено - EnterOnInput - Auto - - - - -
-
-
- - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Доп. настройки</v8:content> - </v8:item> - - - - ru - Страница доп настройки - - - - - - ЗакрыватьМодальныеОкна - - - ru - В файл добавляется настройка из примера официальной документации https://github.com/vanessa-opensource/add/blob/develop/tests/smoke/smoke.bsp.json - - - Button - Auto - - - - - ТестироватьКомандныйИнтерфейс - - - ru - Включить использование тестов командного интерфейса. В исключения по объектам попадают объекты, указанные на вкладке Открытие форм в группах Существующие - - - Button - Auto - - - - - -
-
-
- - - - cfg:ExternalDataProcessorObject.УправлениеДымовымиТестами - - true - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Дерево метаданных</v8:content> - </v8:item> - - - v8:ValueTree - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Исключено</v8:content> - </v8:item> - - - xs:boolean - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Вид метаданных</v8:content> - </v8:item> - - - xs:string - - 200 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Имя метаданного</v8:content> - </v8:item> - - - xs:string - - 200 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Вид проверки</v8:content> - </v8:item> - - - xs:string - - 200 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Вид метаданных для поиска</v8:content> - </v8:item> - - - xs:string - - 0 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Вид проверки для поиска</v8:content> - </v8:item> - - - xs:string - - 0 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Есть изменения расширениями</v8:content> - </v8:item> - - - xs:boolean - - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Значения реквизитов новых</v8:content> - </v8:item> - - - v8:ValueTable - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Имя метаданного</v8:content> - </v8:item> - - - xs:string - - 200 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Реквизит</v8:content> - </v8:item> - - - xs:string - - 200 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Значение реквизита</v8:content> - </v8:item> - - - xs:boolean - xs:string - xs:dateTime - xs:decimal - cfg:DocumentRef - cfg:EnumRef - cfg:TaskRef - cfg:ChartOfCharacteristicTypesRef - cfg:ChartOfAccountsRef - cfg:CatalogRef - - 10 - 0 - Any - - - 0 - Variable - - - Date - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Значение реквизита строкой</v8:content> - </v8:item> - - - xs:boolean - xs:string - xs:dateTime - xs:decimal - - 10 - 0 - Any - - - 0 - Variable - - - Date - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Вид метаданных</v8:content> - </v8:item> - - - xs:string - - 0 - Variable - - - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Строка JSON</v8:content> - </v8:item> - - - xs:string - - 0 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Тестировать открытие форм</v8:content> - </v8:item> - - - xs:boolean - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Открываем формы на клиенте тестирования</v8:content> - </v8:item> - - - xs:boolean - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Закрывать модальные окна</v8:content> - </v8:item> - - - xs:boolean - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Тестировать командный интерфейс</v8:content> - </v8:item> - - - xs:boolean - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Тестировать макеты СКД</v8:content> - </v8:item> - - - xs:boolean - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Таблица макеты скд</v8:content> - </v8:item> - - - v8:ValueTable - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Имя метаданного</v8:content> - </v8:item> - - - xs:string - - 200 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Есть изменения расширениями</v8:content> - </v8:item> - - - xs:boolean - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Исключено</v8:content> - </v8:item> - - - xs:boolean - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Объект</v8:content> - </v8:item> - - - xs:string - - 0 - Variable - - - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Количество документов печатные формы</v8:content> - </v8:item> - - - xs:decimal - - 10 - 0 - Nonnegative - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Количество документов проведение</v8:content> - </v8:item> - - - xs:decimal - - 10 - 0 - Nonnegative - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Тестировать проведение</v8:content> - </v8:item> - - - xs:boolean - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Тестировать печатные формы</v8:content> - </v8:item> - - - xs:boolean - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Таблица печатные формы</v8:content> - </v8:item> - - - v8:ValueTable - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Имя метаданного</v8:content> - </v8:item> - - - xs:string - - 200 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Исключено</v8:content> - </v8:item> - - - xs:boolean - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Идентификатор</v8:content> - </v8:item> - - - xs:string - - 200 - Variable - - - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Таблица документы</v8:content> - </v8:item> - - - v8:ValueTable - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Имя метаданного</v8:content> - </v8:item> - - - xs:string - - 200 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Есть изменения расширениями</v8:content> - </v8:item> - - - xs:boolean - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Исключено для проведения</v8:content> - </v8:item> - - - xs:boolean - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Исключено для проверки печатных форм</v8:content> - </v8:item> - - - xs:boolean - - - - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Обновить дерево метаданных</v8:content> - </v8:item> - - - - ru - Заполнить дерево метаданных - - - ЗаполнитьДеревоМетаданных - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Создать файл настроек</v8:content> - </v8:item> - - - - ru - Создать файл настроек - - - СоздатьФайлНастроек - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Загрузить файл настроек</v8:content> - </v8:item> - - - - ru - Загрузить файл настроек - - - ЗагрузитьФайлНастроек - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Исключить объекты, не используемые в расширениях</v8:content> - </v8:item> - - - - ru - Исключить объекты не расширение - - - ИсключитьОбъектыНеРасширение - - -
\ No newline at end of file diff --git "a/src/tools/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" "b/src/tools/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" deleted file mode 100644 index ce77a9b..0000000 --- "a/src/tools/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\224\321\213\320\274\320\276\320\262\321\213\320\274\320\270\320\242\320\265\321\201\321\202\320\260\320\274\320\270/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" +++ /dev/null @@ -1,1581 +0,0 @@ -#Область ОбработчикиСобытийФормы - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - ЗаполнитьДеревоМетаданныхНаСервере(); - НастройкиПоУмолчанию(); - -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиСобытийЭлементовШапкиФормы - -#КонецОбласти - -#Область ОбработчикиСобытийЭлементовТаблицыФормыДеревоМетаданных - -&НаКлиенте -Процедура ДеревоМетаданныхПриАктивизацииСтроки(Элемент) - - СтрокаДЗ = Элементы.ДеревоМетаданных.ТекущиеДанные; - - Если СтрокаДЗ<>Неопределено Тогда - Отбор = Новый ФиксированнаяСтруктура(Новый Структура("ВидМетаданных,ИмяМетаданного",СтрокаДЗ.ВидМетаданныхДляПоиска,СтрокаДЗ.ИмяМетаданного)); - Элементы.ЗначенияРеквизитовНовых.ОтборСтрок = Отбор; - Иначе - Отбор = Новый ФиксированнаяСтруктура(Новый Структура("ВидМетаданных,ИмяМетаданного","","")); - Элементы.ЗначенияРеквизитовНовых.ОтборСтрок = Отбор; - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ДеревоМетаданныхВыборПриИзменении(Элемент) - - ТекущаяСтрока = Элементы.ДеревоМетаданных.ТекущиеДанные; - ЗначениеФлажка = ТекущаяСтрока.Исключено; - ПодчиненныеСтроки = ТекущаяСтрока.ПолучитьЭлементы(); - УстановитьЗначениеВыбораВПодчиненных(ПодчиненныеСтроки,ЗначениеФлажка); - -КонецПроцедуры - -#КонецОбласти - -#Область ТаблицаДокументы - -&НаКлиенте -Процедура ТаблицаДокументыПриАктивизацииСтроки(Элемент) - - ТекущиеДанные = Элементы.ТаблицаДокументы.ТекущиеДанные; - - Если ТекущиеДанные <> Неопределено Тогда - Отбор = Новый ФиксированнаяСтруктура(Новый Структура("ИмяМетаданного", ТекущиеДанные.ИмяМетаданного)); - Иначе - Отбор = Новый ФиксированнаяСтруктура(Новый Структура("ИмяМетаданного", "")); - КонецЕсли; - - Элементы.ТаблицаПечатныеФормы.ОтборСтрок = Отбор; - -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиСобытийЭлементовТаблицыФормыЗначенияРеквизитовНовых - -&НаКлиенте -Процедура ЗначенияРеквизитовНовыхПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) - СтрокаДЗ = Элементы.ДеревоМетаданных.ТекущиеДанные; - Если Не ЗначениеЗаполнено(СтрокаДЗ.ИмяМетаданного) ТОгда - СообщитьПользователю("Выберите объект метаданных, для добавления значений реквизитов", Отказ); - ИначеЕсли СтрокаДЗ.ВидМетаданныхДляПоиска<>"Справочники" И СтрокаДЗ.ВидМетаданныхДляПоиска<>"Документы" Тогда - СообщитьПользователю("Данная настройка доступна только для справочников или документов", Отказ); - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Процедура ЗначенияРеквизитовНовыхРеквизитПриИзменении(Элемент) - - ТекущаяСтрока = Элементы.ЗначенияРеквизитовНовых.ТекущиеДанные; - - УстановитьТипПоляВСтроке(ТекущаяСтрока); - -КонецПроцедуры - -&НаКлиенте -Процедура ЗначенияРеквизитовНовыхПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) - - СтрокаДЗ = Элементы.ДеревоМетаданных.ТекущиеДанные; - ТекущаяСтрока = Элементы.ЗначенияРеквизитовНовых.ТекущиеДанные; - ТекущаяСтрока.ВидМетаданных = СтрокаДЗ.ВидМетаданныхДляПоиска; - ТекущаяСтрока.ИмяМетаданного = СтрокаДЗ.ИмяМетаданного; - - ЗаполнитьСписокРеквизитов(ТекущаяСтрока); -КонецПроцедуры - -&НаКлиенте -Процедура ЗначенияРеквизитовНовыхЗначениеРеквизитаПриИзменении(Элемент) - ЗначенияРеквизитовНовыхЗначениеРеквизитаПриИзмененииНаСервере(); -КонецПроцедуры - -#КонецОбласти - -#Область ОбработчикиКомандФормы - -&НаКлиенте -Процедура ЗаполнитьДеревоМетаданных(Команда) - ЗаполнитьДеревоМетаданныхНаСервере(); -КонецПроцедуры - -&НаКлиенте -Процедура ЗагрузитьФайлНастроек(Команда) - - ОбработчикОповещения = Новый ОписаниеОповещения("ЗагрузитьНастройкуПослеВыбораФайла",ЭтаФорма); - - ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); - - ВыборФайла.Показать(ОбработчикОповещения); - ВыборФайла.Фильтр = "Файлы JSON (*.json)|*.json"; - -КонецПроцедуры - -&НаКлиенте -Процедура СоздатьФайлНастроек(Команда) - - ОбработчикОповещения = Новый ОписаниеОповещения("ЗаписатьНастройкуПослеВыбораФайла",ЭтаФорма); - - ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); - - ВыборФайла.Показать(ОбработчикОповещения); - ВыборФайла.Фильтр = "Файлы JSON (*.json)|*.json"; - -КонецПроцедуры - -&НаКлиенте -Процедура ИсключитьОбъектыНеРасширение(Команда) - ИсключитьОбъектыНеРасширениеНаСервере(); -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -&НаСервере -Процедура НастройкиПоУмолчанию() - - ТестироватьОткрытиеФорм = Истина; - ОткрываемФормыНаКлиентеТестирования = Истина; - - ТестироватьПроведение = Истина; - КоличествоДокументовПроведение = 2; - - ТестироватьПечатныеФормы = Истина; - КоличествоДокументовПечатныеФормы = 2; - - ТестироватьМакетыСКД = Истина; - - ЗакрыватьМодальныеОкна = Истина; - ТестироватьКомандныйИнтерфейс = Ложь; - -КонецПроцедуры - -&НаСервере -Процедура ЗаполнитьДеревоМетаданныхНаСервере() - - ДЗ = РеквизитФормыВЗначение("ДеревоМетаданных"); - - ДЗ.Строки.Очистить(); - - ВидыПроверок = Новый Массив; - ВидыПроверок.Добавить("Списки"); - ВидыПроверок.Добавить("Новые"); - ВидыПроверок.Добавить("Существующие"); - - //добавляем справочники - ДобавитьМетаданныеВДерево(ВидыПроверок,ДЗ,"Справочники"); - - //добавляем документв - ДобавитьМетаданныеВДерево(ВидыПроверок,ДЗ,"Документы"); - - //добавляем отчеты - ДобавитьМетаданныеВДерево(Новый Массив,ДЗ,"Отчеты"); - - //добавляем обработки - ДобавитьМетаданныеВДерево(Новый Массив,ДЗ,"Обработки"); - - //добавляем бизнес процессы - ДобавитьМетаданныеВДерево(Новый Массив,ДЗ,"БизнесПроцессы"); - - ЗначениеВРеквизитФормы(ДЗ,"ДеревоМетаданных"); - - ДобавитьМетаданныеВТаблицуДокументов(); - ДобавитьМетаданныеВТаблицуМакетовСКД(); - -КонецПроцедуры - -&НаСервере -Процедура ДобавитьМетаданныеВДерево(ВидыПроверок,Дерево,ВидМетаданных) - - СтрокаМетаданных = Дерево.Строки.Добавить(); - СтрокаМетаданных.ВидМетаданных = ВидМетаданных; - СтрокаМетаданных.ВидМетаданныхДляПоиска = ВидМетаданных; - - Если ВидыПроверок.Количество() Тогда - Для каждого ВидПроверки из ВидыПроверок Цикл - - СтрокаПроверки = СтрокаМетаданных.Строки.Добавить(); - СтрокаПроверки.ВидМетаданныхДляПоиска = ВидМетаданных; - СтрокаПроверки.ВидПроверкиДляПоиска = ВидПроверки; - СтрокаПроверки.ВидПроверки = ВидПроверки; - - Для каждого Метаданное из Метаданные[ВидМетаданных] Цикл - - СтрокаОбъекта = СтрокаПроверки.Строки.Добавить(); - СтрокаОбъекта.ИмяМетаданного = Метаданное.Имя; - СтрокаОбъекта.ВидМетаданныхДляПоиска = ВидМетаданных; - СтрокаОбъекта.ВидПроверкиДляПоиска = ВидПроверки; - - УстановитьПризнакИзмененияРасширениями(СтрокаОбъекта, Метаданное); - - КонецЦикла; - КонецЦикла; - Иначе - Для каждого Метаданное из Метаданные[ВидМетаданных] Цикл - - СтрокаОбъекта = СтрокаМетаданных.Строки.Добавить(); - СтрокаОбъекта.ВидМетаданныхДляПоиска = ВидМетаданных; - СтрокаОбъекта.ИмяМетаданного = Метаданное.Имя; - - УстановитьПризнакИзмененияРасширениями(СтрокаОбъекта, Метаданное); - - КонецЦикла; - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ЗаписатьНастройкуПослеВыбораФайла(Результат,ДопПараметры) Экспорт - - Если Результат <> Неопределено Тогда - - ИмяФайла = Результат[0]; - - Файл = Новый Файл(ИмяФайла); - - ПараметрыЗаписи = Новый ПараметрыЗаписиJSON( , Символы.Таб); - ЗаписьJSON = Новый ЗаписьJSON; - - Если ЗначениеЗаполнено(СтрокаJSON) Тогда - ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписи); - Иначе - ЗаписьJSON.ОткрытьФайл(ИмяФайла); - КонецЕсли; - - ЗаписатьJSON(ЗаписьJSON, СоответствиеНастроек()); - - Если ЗначениеЗаполнено(СтрокаJSON) Тогда - ВремСтрокаJSON = ЗаписьJSON.Закрыть(); - - НастроенноеСоответствие = ПрочитатьСоответствиеИзСтрокиJSON(ВремСтрокаJSON); - - ЗаписьJSON = Новый ЗаписьJSON; - ЗаписьJSON.ОткрытьФайл(ИмяФайла, , , ПараметрыЗаписи); - ЗаписатьJSON(ЗаписьJSON, НастроенноеСоответствие); - ЗаписьJSON.Закрыть(); - КонецЕсли; - - КонецЕсли; - -КонецПроцедуры - -&НаСервере -Функция СоответствиеНастроек() - - НастройкиОткрытияФорм = Новый Соответствие; - - Для каждого СтрокаМетаданного из ДеревоМетаданных.ПолучитьЭлементы() Цикл - - ВидыПроверки = Новый Структура; - ДобавлятьМетаданное = Истина; - - Если СтрокаМетаданного.ВидМетаданных = "Справочники" Или СтрокаМетаданного.ВидМетаданных = "Документы" Тогда - //сначала добавляем данные о значениях реквизитов - Если СтрокаМетаданного.Исключено Тогда - ДобавлятьМетаданное = Ложь; - Иначе - НастройкаЗаполненияРеквизитов = ПолучитьНастройкуЗаполненияРеквизитов(СтрокаМетаданного.ВидМетаданных); - - Если НастройкаЗаполненияРеквизитов.Количество() Тогда - ВидыПроверки.Вставить("ЗначенияРеквизитовНовых",НастройкаЗаполненияРеквизитов); - КонецЕсли; - - //для справочников и документов есть еще подраздел виды проверки - Для каждого СтрокаВидаПроверки Из СтрокаМетаданного.ПолучитьЭлементы() Цикл - - ДобавлятьВидПроверки = Истина; - Если СтрокаВидаПроверки.Исключено Тогда - ДобавлятьВидПроверки = Ложь; - ВидыПроверки.Вставить(СтрокаВидаПроверки.ВидПроверки, Ложь); - Иначе - МетаданныеПроверки = Новый Массив; - - Для каждого СтрокаИмяМетаданного из СтрокаВидаПроверки.ПолучитьЭлементы() Цикл - - Если СтрокаИмяМетаданного.Исключено Тогда - МетаданныеПроверки.Добавить(СтрокаИмяМетаданного.ИмяМетаданного); - КонецЕсли; - - КонецЦикла; - - Если МетаданныеПроверки.Количество() Тогда - ВидыПроверки.Вставить(СтрокаВидаПроверки.ВидПроверки,МетаданныеПроверки); - КонецЕсли; - КонецЕсли; - - КонецЦикла; - КонецЕсли; - - Иначе - - МетаданныеПроверки = Новый Массив; - - Если СтрокаМетаданного.Исключено Тогда - ДобавлятьМетаданное = Ложь; - Иначе - Для каждого СтрокаИмяМетаданного из СтрокаМетаданного.ПолучитьЭлементы() Цикл - - Если СтрокаИмяМетаданного.Исключено Тогда - МетаданныеПроверки.Добавить(СтрокаИмяМетаданного.ИмяМетаданного); - КонецЕсли; - - КонецЦикла; - КонецЕсли; - - Если МетаданныеПроверки.Количество() Тогда - ВидыПроверки = МетаданныеПроверки; - КонецЕсли; - - КонецЕсли; - - Если ДобавлятьМетаданное Тогда - Если ВидыПроверки.Количество() Тогда - НастройкиОткрытияФорм.Вставить(СтрокаМетаданного.ВидМетаданных, ВидыПроверки); - КонецЕсли; - Иначе - НастройкиОткрытияФорм.Вставить(СтрокаМетаданного.ВидМетаданных, Ложь); - КонецЕсли; - - КонецЦикла; - - НастройкиОткрытияФорм.Вставить("Используется" , ТестироватьОткрытиеФорм); - НастройкиОткрытияФорм.Вставить("ОткрываемФормыНаКлиентеТестирования" , ОткрываемФормыНаКлиентеТестирования); - - Результат = Новый Соответствие; - Результат.Вставить(КлючНастройкиОткрытиеФорм(), НастройкиОткрытияФорм); - - ЗаписатьНастройкуПоКлючу(КлючНастройкиМодальныеОкна(), Результат); - ЗаписатьНастройкуПоКлючу(КлючНастройкиКомандныйИнтерфейс(), Результат); - ЗаписатьНастройкуПоКлючу(КлючНастройкиМакетыСКД(), Результат); - ЗаписатьНастройкуПоКлючу(КлючНастройкиПроведениеДокументов(), Результат); - ЗаписатьНастройкуПоКлючу(КлючНастройкиФормированиеПечатныхФорм(), Результат); - - Возврат Результат; - -КонецФункции - -&НаСервере -Функция ПолучитьНастройкуЗаполненияРеквизитов(ВидМетаданных) - - НастройкаЗаполненияРеквизитов = Новый Структура; - - Отбор = Новый Структура("ВидМетаданных", ВидМетаданных); - - ТЗ = ЗначенияРеквизитовНовых.Выгрузить(Отбор); - - ТЗИменМетаданных = ТЗ.Скопировать(); - ТЗИменМетаданных.Свернуть("ИмяМетаданного"); - - Для каждого СтрокаМетаданного из ТЗИменМетаданных Цикл - - ЗначенияРеквизитов = Новый Структура; - Отбор = Новый Структура("ИмяМетаданного",СтрокаМетаданного.ИмяМетаданного); - СтрокиРеквизитов = ТЗ.НайтиСтроки(Отбор); - - Для каждого СтрокаРеквзита из СтрокиРеквизитов Цикл - ЗначенияРеквизитов.Вставить(СтрокаРеквзита.Реквизит,СтрокаРеквзита.ЗначениеРеквизитаСтрокой); - КонецЦИкла; - - НастройкаЗаполненияРеквизитов.Вставить(СтрокаМетаданного.ИмяМетаданного,ЗначенияРеквизитов); - - КонецЦикла; - - Возврат НастройкаЗаполненияРеквизитов; - -КонецФункции - -&НаКлиенте -Процедура УстановитьЗначениеВыбораВПодчиненных(ПодчиненныеСтроки,ЗначениеФлажка) - - Для каждого Строка из ПодчиненныеСтроки Цикл - Строка.Исключено = ЗначениеФлажка; - УстановитьЗначениеВыбораВПодчиненных(Строка.ПолучитьЭлементы(),ЗначениеФлажка); - КонецЦикла; - -КонецПроцедуры - -&НаКлиенте -Процедура ЗаполнитьСписокРеквизитов(ТекущаяСтрока) - - МассивРеквизитов = ПолучитьМассивРеквизитовНаСервере(ТекущаяСтрока.ВидМетаданных,ТекущаяСтрока.ИмяМетаданного); - - Элементы.ЗначенияРеквизитовНовыхРеквизит.СписокВыбора.ЗагрузитьЗначения(МассивРеквизитов); - -КонецПроцедуры - -&НаСервере -Функция ПолучитьМассивРеквизитовНаСервере(ЗНАЧ ВидМетаданных,ЗНАЧ ИмяМетаданного) - ОбМетаданных = ПолучитьОбъектМетаданных(ВидМетаданных,ИмяМетаданного); - - МассивРеквизитов = Новый Массив; - - Для каждого Реквизит Из ОбМетаданных.Реквизиты Цикл - МассивРеквизитов.Добавить(Реквизит.Имя); - КонецЦикла; - - Для каждого Реквизит Из ОбМетаданных.СтандартныеРеквизиты Цикл - МассивРеквизитов.Добавить(Реквизит.Имя); - КонецЦикла; - - Возврат МассивРеквизитов; - -КонецФункции - -&НаКлиенте -Процедура ЗагрузитьНастройкуПослеВыбораФайла(Результат,ДопПараметры) Экспорт - - Если Результат<>Неопределено Тогда - - ИмяФайла = Результат[0]; - - КоллекцияИсключаемыхКлючей = Новый Соответствие; - КоллекцияИсключаемыхКлючей.Вставить("$schema", "$schema"); - - ЧтениеJSON = Новый ЧтениеJSON; - ЧтениеJSON.ОткрытьФайл(ИмяФайла); - - Соответствие = ПрочитатьJSON(ЧтениеJSON, Истина); - - СтрокаJSON = ""; - - ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(,Символы.Таб); - ЗаписьJSON = Новый ЗаписьJSON; - ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписи); - ЗаписатьJSON(ЗаписьJSON, Соответствие); - СтрокаJSON = ЗаписьJSON.Закрыть(); - - Результат = ПреобразоватьСоответствиеВСтруктуру(Соответствие, КоллекцияИсключаемыхКлючей); - - ЗагрузитьФайлНастроекНаСервере(Результат); - - ДеревоМетаданныхПриАктивизацииСтроки(Неопределено); - - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Функция ПреобразоватьСоответствиеВСтруктуру(Знач Соответствие, Знач КоллекцияИсключаемыхКлючей) - Результат = Новый Структура; - Для каждого КлючЗначение Из Соответствие Цикл - Если КоллекцияИсключаемыхКлючей.Получить(КлючЗначение.Ключ) = Неопределено Тогда - Значение = КлючЗначение.Значение; - Если ТипЗнч(Значение) = Тип("Соответствие") Тогда - Значение = ПреобразоватьСоответствиеВСтруктуру(Значение, КоллекцияИсключаемыхКлючей); - КонецЕсли; - Результат.Вставить(КлючЗначение.Ключ, Значение); - КонецЕсли; - КонецЦикла; - Возврат Результат; -КонецФункции - -&НаСервере -Процедура ЗагрузитьФайлНастроекНаСервере(Результат) - - ЗначенияРеквизитовНовых.Очистить(); - ЗаполнитьДеревоМетаданныхНаСервере(); - - ДЗ = РеквизитФормыВЗначение("ДеревоМетаданных"); - - Попытка - Настройки = Результат[КлючНастройкиОткрытиеФорм()]; - Для каждого Элемент из Настройки Цикл - ЗагрузитьНастройкиВДерево(ДЗ,Элемент); - КонецЦикла; - Исключение - СообщитьПользователю("Ошибка при загрузке настроек открытия форм из файла: "+ОписаниеОшибки()); - КонецПопытки; - - ЗначениеВРеквизитФормы(ДЗ,"ДеревоМетаданных"); - - ТестироватьОткрытиеФорм = НастройкаИспользуется(Результат, КлючНастройкиОткрытиеФорм()); - ОткрываемФормыНаКлиентеТестирования = НастройкаИспользуется(Результат, КлючНастройкиОткрытиеФорм(), - "ОткрываемФормыНаКлиентеТестирования"); - - ТестироватьПечатныеФормы = НастройкаИспользуется(Результат, КлючНастройкиФормированиеПечатныхФорм()); - ТестироватьПроведение = НастройкаИспользуется(Результат, КлючНастройкиПроведениеДокументов()); - - ТестироватьМакетыСКД = НастройкаИспользуется(Результат, КлючНастройкиМакетыСКД()); - - ЗакрыватьМодальныеОкна = Результат.Свойство(КлючНастройкиМодальныеОкна()); - ТестироватьКомандныйИнтерфейс = НастройкаИспользуется(Результат, КлючНастройкиКомандныйИнтерфейс()); - - ЗагрузитьНастройкиВТаблицу(Результат, КлючНастройкиПроведениеДокументов()); - ЗагрузитьНастройкиВТаблицу(Результат, КлючНастройкиФормированиеПечатныхФорм()); - ЗагрузитьНастройкиВТаблицу(Результат, КлючНастройкиМакетыСКД()); - -КонецПроцедуры - -&НаСервере -Процедура ЗагрузитьНастройкиВДерево(ДЗ,Элемент) - - //1. Исключаем из проверки формы указанные в файле настроек - Если Элемент.Ключ = "Документы" Или Элемент.Ключ = "Справочники" Тогда - - Если ТипЗнч(Элемент.Значение) = Тип("Булево") И Элемент.Значение = Ложь Тогда - Отбор = Новый Структура("ВидМетаданныхДляПоиска", Элемент.Ключ); - МассивСтрокМетаданного = ДЗ.Строки.НайтиСтроки(Отбор, Ложь); - Для каждого СтрокаМетаданного из МассивСтрокМетаданного Цикл - СтрокаМетаданного.Исключено = Истина; - КонецЦикла; - Иначе - Для каждого ПодчЭлемент из Элемент.Значение Цикл - Если ПодчЭлемент.Ключ <> "ЗначенияРеквизитовНовых" Тогда - Если ТипЗнч(ПодчЭлемент.Значение) = Тип("Булево") И ПодчЭлемент.Значение = Ложь Тогда - Отбор = Новый Структура("ВидМетаданныхДляПоиска,ВидПроверкиДляПоиска", Элемент.Ключ, ПодчЭлемент.Ключ); - МассивСтрокМетаданного = ДЗ.Строки.НайтиСтроки(Отбор,Истина); - Для каждого СтрокаМетаданного из МассивСтрокМетаданного Цикл - СтрокаМетаданного.Исключено = Истина; - КонецЦикла; - Иначе - Для каждого Метаданное из ПодчЭлемент.Значение Цикл - //ключ - вид проверки, значение массив метаданных - Отбор = Новый Структура("ВидМетаданныхДляПоиска,ВидПроверкиДляПоиска,ИмяМетаданного", Элемент.Ключ, ПодчЭлемент.Ключ, Метаданное); - МассивСтрокМетаданного = ДЗ.Строки.НайтиСтроки(Отбор,Истина); - Для каждого СтрокаМетаданного из МассивСтрокМетаданного Цикл - СтрокаМетаданного.Исключено = Истина; - КонецЦикла; - КонецЦикла; - КонецЕсли; - - Иначе - - ВидМетаданных = Элемент.Ключ; - //заполним таблицу со значениями реквизитов для запролнения - Для каждого Метаданное из ПодчЭлемент.Значение Цикл - - ОбМетаданных = ПолучитьОбъектМетаданных(ВидМетаданных,Метаданное.Ключ); - - Для каждого Реквизит из Метаданное.Значение Цикл - ЗначениеРеквизита = ЗначениеРеквизита(ОбМетаданных,Реквизит.Ключ,Реквизит.Значение); - СтрокаРеквизита = ЗначенияРеквизитовНовых.Добавить(); - СтрокаРеквизита.ИмяМетаданного = Метаданное.Ключ; - СтрокаРеквизита.Реквизит = Реквизит.Ключ; - СтрокаРеквизита.ЗначениеРеквизита = ЗначениеРеквизита; - СтрокаРеквизита.ЗначениеРеквизитаСтрокой = Реквизит.Значение; - СтрокаРеквизита.ВидМетаданных = ВидМетаданных; - - КонецЦикла; - КонецЦикла; - КонецЕсли; - КонецЦикла; - КонецЕсли; - - ИначеЕсли Элемент.Ключ = "Обработки" Или Элемент.Ключ = "Отчеты" Тогда - - Если ТипЗнч(Элемент.Значение) = Тип("Булево") И Элемент.Значение = Ложь Тогда - Отбор = Новый Структура("ВидМетаданныхДляПоиска", Элемент.Ключ); - МассивСтрокМетаданного = ДЗ.Строки.НайтиСтроки(Отбор, Ложь); - Для каждого СтрокаМетаданного из МассивСтрокМетаданного Цикл - СтрокаМетаданного.Исключено = Истина; - КонецЦикла; - Иначе - //находим строки по виду метаданного - Отбор = Новый Структура("ВидМетаданных",Элемент.Ключ); - МассивСтрокВидовМетаданных = ДЗ.Строки.НайтиСтроки(Отбор); - - Для каждого Метаданное из Элемент.Значение Цикл - - Отбор = Новый Структура("ВидМетаданныхДляПоиска,ИмяМетаданного",Элемент.Ключ,Метаданное); - МассивСтрокМетаданного = ДЗ.Строки.НайтиСтроки(Отбор,Истина); - - Для каждого СтрокаМетаданного из МассивСтрокМетаданного Цикл - СтрокаМетаданного.Исключено = Истина; - КонецЦикла; - - КонецЦикла; - КонецЕсли; - - КонецЕсли; - -КонецПроцедуры - -&НаСервере -Функция ПолучитьОбъектМетаданных(ВидМетаданных,ИмяМетаданного) - - ПолноеИмяМетаданного = Лев(ВидМетаданных,СтрДлина(ВидМетаданных)-1)+"."+ИмяМетаданного; - ОбМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмяМетаданного); - - Возврат ОбМетаданных; - -КонецФункции - -&НаСервере -Функция ЗначениеРеквизита(МетаданныеОбъекта, ИмяРеквизита, ЗначениеРеквизитаИзФайла) - - //Плевако Е. добавил попытку для возможности указания значений стандартных реквизитов - ЭтоСтандартныйРеквизит = Ложь; - Попытка - ТипРеквизита = МетаданныеОбъекта.Реквизиты[ИмяРеквизита].Тип.Типы()[0]; - Исключение - ТипРеквизита = МетаданныеОбъекта.СтандартныеРеквизиты[ИмяРеквизита].Тип.Типы()[0]; - ЭтоСтандартныйРеквизит = Истина; - КонецПопытки; - - Если ЭтоПримитивныйТипДанных(ТипРеквизита) Тогда - Если ЭтоСтандартныйРеквизит Тогда - Возврат МетаданныеОбъекта.СтандартныеРеквизиты[ИмяРеквизита].Тип.ПривестиЗначение(ЗначениеРеквизитаИзФайла); - Иначе - Возврат МетаданныеОбъекта.Реквизиты[ИмяРеквизита].Тип.ПривестиЗначение(ЗначениеРеквизитаИзФайла); - КонецЕсли; - КонецЕсли; - - // Значит, это ссылочный тип данных. - Попытка - МетаданныеЗначения = Метаданные.НайтиПоТипу(ТипРеквизита); - Если Метаданные.Справочники.Содержит(МетаданныеЗначения) Тогда - Возврат Справочники[МетаданныеЗначения.Имя].НайтиПоНаименованию(ЗначениеРеквизитаИзФайла,Истина); - ИначеЕсли Метаданные.Перечисления.Содержит(МетаданныеЗначения) Тогда - Возврат Перечисления[МетаданныеЗначения.Имя][ЗначениеРеквизитаИзФайла]; - КонецЕсли; - // TODO: поддержку документов и других ссылочных типов данных (добавим по необходимости) - Исключение - КонецПопытки; - - Возврат Неопределено; - -КонецФункции - -&НаСервере -Функция ЭтоПримитивныйТипДанных(Тип) - Возврат Тип = Тип("Строка") Или Тип = Тип("Число") - Или Тип = Тип("Дата") Или Тип = Тип("Булево"); -КонецФункции - -&НаКлиенте -Процедура УстановитьТипПоляВСтроке(ТекущаяСтрока) - - Элементы.ЗначенияРеквизитовНовыхЗначениеРеквизита.ОграничениеТипа = ПолучитьОписаниеТиповРеквизита(ТекущаяСтрока.ВидМетаданных,ТекущаяСтрока.ИмяМетаданного,ТекущаяСтрока.Реквизит); - -КонецПроцедуры - -&НаСервере -Функция ПолучитьОписаниеТиповРеквизита(ВидМетаданных,ИмяМетаданного,ИмяРеквизита) - - ОбМетаданных = ПолучитьОбъектМетаданных(ВидМетаданных,ИмяМетаданного); - - Попытка - ТипРеквизита = ОбМетаданных.Реквизиты[ИмяРеквизита].Тип; - Исключение - ТипРеквизита = ОбМетаданных.СтандартныеРеквизиты[ИмяРеквизита].Тип; - КонецПопытки; - - Возврат ТипРеквизита; - -КонецФункции - -&НаСервере -Процедура ЗначенияРеквизитовНовыхЗначениеРеквизитаПриИзмененииНаСервере() - - СтрокаТЗ = ЗначенияРеквизитовНовых.НайтиПоИдентификатору(Элементы.ЗначенияРеквизитовНовых.ТекущаяСтрока); - ЗначениеРеквизита = СтрокаТЗ.ЗначениеРеквизита; - - ТипРеквизита = ТипЗнч(ЗначениеРеквизита); - - Если ЭтоПримитивныйТипДанных(ТипРеквизита) Тогда - СтрокаТЗ.ЗначениеРеквизитаСтрокой = ЗначениеРеквизита; - Возврат; - КонецЕсли; - - МетаданныеЗначения = Метаданные.НайтиПоТипу(ТипРеквизита); - Если Метаданные.Справочники.Содержит(МетаданныеЗначения) Тогда - СтрокаТЗ.ЗначениеРеквизитаСтрокой = ЗначениеРеквизитаОбъекта(ЗначениеРеквизита,"Наименование"); - ИначеЕсли Метаданные.Перечисления.Содержит(МетаданныеЗначения) Тогда - Для каждого ЭлементПеречисления из МетаданныеЗначения.ЗначенияПеречисления Цикл - Если ЭлементПеречисления.Синоним = Строка(ЗначениеРеквизита) Тогда - СтрокаТЗ.ЗначениеРеквизитаСтрокой = ЭлементПеречисления.Имя; - КонецЕсли; - КонецЦикла; - КонецЕсли; - -КонецПроцедуры - -&НаКлиентеНаСервереБезКонтекста -Процедура СообщитьПользователю(Знач Сообщение, Отказ = Ложь) - Сообщить(Сообщение); - Отказ = Истина; -КонецПроцедуры - -#область ФункцииДляСовместимости - -// Возвращает структуру, содержащую значения реквизитов прочитанные из информационной базы -// по ссылке на объект. -// -// Если доступа к одному из реквизитов нет, то в случае "ВыбратьРазрешенные = Ложь" возникнет исключение прав доступа, -// а в случае "ВыбратьРазрешенные = Истина" вернется значение Неопределено для всех реквизитов. -// -// Если необходимо зачитать реквизит независимо от прав текущего пользователя, -// то следует использовать предварительный переход в привилегированный режим. -// -// Функция не предназначена для получения значений реквизитов пустых ссылок. -// -// Параметры: -// Ссылка - ЛюбаяСсылка - объект, значения реквизитов которого необходимо получить. -// -// Реквизиты - Строка - имена реквизитов, перечисленные через запятую, в формате -// требований к свойствам структуры. -// Например, "Код, Наименование, Родитель". -// - Структура, ФиксированнаяСтруктура - в качестве ключа передается -// псевдоним поля для возвращаемой структуры с результатом, а в качестве -// значения (опционально) фактическое имя поля в таблице. -// Если значение не определено, то имя поля берется из ключа. -// - Массив, ФиксированныйМассив - имена реквизитов в формате требований -// к свойствам структуры. -// -// ВыбратьРазрешенные - Булево - если Истина, то запрос к объекту выполняется с учетом прав пользователя, и в случае, -// если выборка будет пустая, то все реквизиты вернутся со значением Неопределено; -// если Ложь, то возникнет исключение при отсутствии прав на любой из реквизитов. -// -// Возвращаемое значение: -// Структура - содержит имена (ключи) и значения затребованных реквизитов. -// Если строка затребованных реквизитов пуста, то возвращается пустая структура. -// Если в качестве объекта передана пустая ссылка, то все реквизиты вернутся со значением Неопределено. -// -&НаСервере -Функция ЗначенияРеквизитовОбъекта(Ссылка, Знач Реквизиты, ВыбратьРазрешенные = Ложь) Экспорт - - Если ТипЗнч(Реквизиты) = Тип("Строка") Тогда - Если ПустаяСтрока(Реквизиты) Тогда - Возврат Новый Структура; - КонецЕсли; - Реквизиты = РазложитьСтрокуВМассивПодстрок(Реквизиты, ",", Ложь); - КонецЕсли; - - СтруктураРеквизитов = Новый Структура; - Если ТипЗнч(Реквизиты) = Тип("Структура") Или ТипЗнч(Реквизиты) = Тип("ФиксированнаяСтруктура") Тогда - СтруктураРеквизитов = Реквизиты; - ИначеЕсли ТипЗнч(Реквизиты) = Тип("Массив") Или ТипЗнч(Реквизиты) = Тип("ФиксированныйМассив") Тогда - Для Каждого Реквизит Из Реквизиты Цикл - СтруктураРеквизитов.Вставить(СтрЗаменить(Реквизит, ".", ""), Реквизит); - КонецЦикла; - Иначе - ВызватьИсключение ПодставитьПараметрыВСтроку(НСтр("ru = 'Неверный тип второго параметра Реквизиты: %1'"), Строка(ТипЗнч(Реквизиты))); - КонецЕсли; - - ТекстПолей = ""; - Для Каждого КлючИЗначение Из СтруктураРеквизитов Цикл - ИмяПоля = ?(ЗначениеЗаполнено(КлючИЗначение.Значение), - СокрЛП(КлючИЗначение.Значение), - СокрЛП(КлючИЗначение.Ключ)); - - Псевдоним = СокрЛП(КлючИЗначение.Ключ); - - ТекстПолей = ТекстПолей + ?(ПустаяСтрока(ТекстПолей), "", ",") + " - | " + ИмяПоля + " КАК " + Псевдоним; - КонецЦикла; - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("Ссылка", Ссылка); - Запрос.Текст = - "ВЫБРАТЬ " + ?(ВыбратьРазрешенные, "РАЗРЕШЕННЫЕ", "") + " - |" + ТекстПолей + " - |ИЗ - | " + Ссылка.Метаданные().ПолноеИмя() + " КАК ПсевдонимЗаданнойТаблицы - |ГДЕ - | ПсевдонимЗаданнойТаблицы.Ссылка = &Ссылка - |"; - Выборка = Запрос.Выполнить().Выбрать(); - - Результат = Новый Структура; - Для Каждого КлючИЗначение Из СтруктураРеквизитов Цикл - Результат.Вставить(КлючИЗначение.Ключ); - КонецЦикла; - - Если Выборка.Следующий() Тогда - ЗаполнитьЗначенияСвойств(Результат, Выборка); - КонецЕсли; - - Возврат Результат; - -КонецФункции - -// Возвращает значение реквизита, прочитанного из информационной базы по ссылке на объект. -// -// Если доступа к реквизиту нет, то в случае "ВыбратьРазрешенные = Ложь" возникнет исключение прав доступа, -// а в случае "ВыбратьРазрешенные = Истина" вернется значение Неопределено. -// -// Если необходимо зачитать реквизит независимо от прав текущего пользователя, -// то следует использовать предварительный переход в привилегированный режим. -// -// Функция не предназначена для получения значений реквизитов пустых ссылок. -// -// Параметры: -// Ссылка - ЛюбаяСсылка - объект, значения реквизитов которого необходимо получить. -// ИмяРеквизита - Строка - имя получаемого реквизита. -// ВыбратьРазрешенные - Булево - если Истина, то запрос к объекту выполняется с учетом прав пользователя, и в случае, -// если выборка будет пустая, то вернется значение Неопределено. -// -// Возвращаемое значение: -// Произвольный - зависит от типа значения прочитанного реквизита. -// -&НаСервере -Функция ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные = Ложь) Экспорт - - Результат = ЗначенияРеквизитовОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные); - Возврат Результат[СтрЗаменить(ИмяРеквизита, ".", "")]; - -КонецФункции - -// Возвращает значения реквизитов, прочитанные из информационной базы -// для нескольких объектов. -// -// Если доступа к одному из реквизитов какого-либо объекта нет, то в случае "ВыбратьРазрешенные = Ложь" возникнет -// исключение прав доступа, а в случае "ВыбратьРазрешенные = Истина" вернется значение Неопределено для всех -// реквизитов этого объекта. -// -// Если необходимо зачитать реквизит независимо от прав текущего пользователя, -// то следует использовать предварительный переход в привилегированный режим. -// -// Функция не предназначена для получения значений реквизитов пустых ссылок. -// -// Параметры: -// МассивСсылок - Массив - массив ссылок на объекты одного типа. -// ВАЖНО! Значения массива должны быть ссылками на объекты ОДНОГО типа! -// ИменаРеквизитов - Строка - имена реквизитов перечисленные через запятую, в формате требований к свойствам структуры. -// Например, "Код, Наименование, Родитель". -// -// ВыбратьРазрешенные - Булево - если Истина, то запрос к объектам выполняется с учетом прав пользователя, и в случае, -// если какой-либо объект будет исключен из выборки по правам, то все реквизиты этого объекта -// вернутся со значением Неопределено; -// если Ложь, то возникнет исключение при отсутствии прав на любой из реквизитов любого -// из объектов. -// Возвращаемое значение: -// Соответствие - список объектов и значений их реквизитов: -// * Ключ - ЛюбаяСсылка - ссылка на объект; -// * Значение - Структура - значения реквизитов: -// ** Ключ - Строка - имя реквизита; -// ** Значение - Произвольный - значение реквизита. -// -&НаСервере -Функция ЗначенияРеквизитовОбъектов(МассивСсылок, ИменаРеквизитов, ВыбратьРазрешенные = Ложь) Экспорт - - ЗначенияРеквизитов = Новый Соответствие; - Если МассивСсылок.Количество() = 0 Тогда - Возврат ЗначенияРеквизитов; - КонецЕсли; - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ " + ?(ВыбратьРазрешенные, "РАЗРЕШЕННЫЕ", "") + " - | Ссылка КАК Ссылка, " + ИменаРеквизитов + " - |ИЗ - | " + МассивСсылок[0].Метаданные().ПолноеИмя() + " КАК Таблица - |ГДЕ - | Таблица.Ссылка В (&МассивСсылок)"; - Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок); - Выборка = Запрос.Выполнить().Выбрать(); - - Для Каждого Ссылка Из МассивСсылок Цикл - ЗначенияРеквизитов.Вставить(Ссылка, Новый Структура(ИменаРеквизитов)); - КонецЦикла; - - Пока Выборка.Следующий() Цикл - ЗаполнитьЗначенияСвойств(ЗначенияРеквизитов[Выборка.Ссылка], Выборка); - КонецЦикла; - - Возврат ЗначенияРеквизитов; - -КонецФункции - - -// Преобразует строку таблицы значений в структуру. -// Свойства структуры и их значения совпадают с колонками переданной строки. -// -// Параметры: -// СтрокаТаблицыЗначений - СтрокаТаблицыЗначений - строка таблицы значений. -// -// Возвращаемое значение: -// Структура - преобразованная строка таблицы значений. -// -&НаСервере -Функция СтрокаТаблицыЗначенийВСтруктуру(СтрокаТаблицыЗначений) Экспорт - - Структура = Новый Структура; - Для каждого Колонка Из СтрокаТаблицыЗначений.Владелец().Колонки Цикл - Структура.Вставить(Колонка.Имя, СтрокаТаблицыЗначений[Колонка.Имя]); - КонецЦикла; - - Возврат Структура; - -КонецФункции - -// Подставляет параметры в строку. Максимально возможное число параметров - 9. -// Параметры в строке задаются как %<номер параметра>. Нумерация параметров начинается с единицы. -// -// Параметры: -// ШаблонСтроки - Строка - шаблон строки с параметрами (вхождениями вида "%<номер параметра>", -// например, "%1 пошел в %2"); -// Параметр - Строка - значение подставляемого параметра. -// -// Возвращаемое значение: -// Строка - текстовая строка с подставленными параметрами. -// -// Пример: -// СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='%1 пошел в %2'"), "Вася", "Зоопарк") = "Вася пошел -// в Зоопарк". -// -&НаСервере -Функция ПодставитьПараметрыВСтроку(Знач ШаблонСтроки, - Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, - Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, - Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) Экспорт - - ЕстьПараметрыСПроцентом = Найти(Параметр1, "%") > 0 - Или Найти(Параметр2, "%") > 0 - Или Найти(Параметр3, "%") > 0 - Или Найти(Параметр4, "%") > 0 - Или Найти(Параметр5, "%") > 0 - Или Найти(Параметр6, "%") > 0 - Или Найти(Параметр7, "%") > 0 - Или Найти(Параметр8, "%") > 0 - Или Найти(Параметр9, "%") > 0; - - Если ЕстьПараметрыСПроцентом Тогда - Возврат ПодставитьПараметрыСПроцентом(ШаблонСтроки, Параметр1, - Параметр2, Параметр3, Параметр4, Параметр5, Параметр6, Параметр7, Параметр8, Параметр9); - КонецЕсли; - - ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%1", Параметр1); - ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%2", Параметр2); - ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%3", Параметр3); - ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%4", Параметр4); - ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%5", Параметр5); - ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%6", Параметр6); - ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%7", Параметр7); - ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%8", Параметр8); - ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%9", Параметр9); - Возврат ШаблонСтроки; - -КонецФункции - -// Вставляет параметры в строку, учитывая, что в параметрах могут использоваться подстановочные слова %1, %2 и т.д. -&НаСервере -Функция ПодставитьПараметрыСПроцентом(Знач СтрокаПодстановки, - Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, - Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, - Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) - - Результат = ""; - Позиция = Найти(СтрокаПодстановки, "%"); - Пока Позиция > 0 Цикл - Результат = Результат + Лев(СтрокаПодстановки, Позиция - 1); - СимволПослеПроцента = Сред(СтрокаПодстановки, Позиция + 1, 1); - ПодставляемыйПараметр = ""; - Если СимволПослеПроцента = "1" Тогда - ПодставляемыйПараметр = Параметр1; - ИначеЕсли СимволПослеПроцента = "2" Тогда - ПодставляемыйПараметр = Параметр2; - ИначеЕсли СимволПослеПроцента = "3" Тогда - ПодставляемыйПараметр = Параметр3; - ИначеЕсли СимволПослеПроцента = "4" Тогда - ПодставляемыйПараметр = Параметр4; - ИначеЕсли СимволПослеПроцента = "5" Тогда - ПодставляемыйПараметр = Параметр5; - ИначеЕсли СимволПослеПроцента = "6" Тогда - ПодставляемыйПараметр = Параметр6; - ИначеЕсли СимволПослеПроцента = "7" Тогда - ПодставляемыйПараметр = Параметр7 - ИначеЕсли СимволПослеПроцента = "8" Тогда - ПодставляемыйПараметр = Параметр8; - ИначеЕсли СимволПослеПроцента = "9" Тогда - ПодставляемыйПараметр = Параметр9; - КонецЕсли; - Если ПодставляемыйПараметр = "" Тогда - Результат = Результат + "%"; - СтрокаПодстановки = Сред(СтрокаПодстановки, Позиция + 1); - Иначе - Результат = Результат + ПодставляемыйПараметр; - СтрокаПодстановки = Сред(СтрокаПодстановки, Позиция + 2); - КонецЕсли; - Позиция = Найти(СтрокаПодстановки, "%"); - КонецЦикла; - Результат = Результат + СтрокаПодстановки; - - Возврат Результат; -КонецФункции - -&НаСервере -Функция РазложитьСтрокуВМассивПодстрок(Знач Строка, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено) Экспорт - - Результат = Новый Массив; - - // для обеспечения обратной совместимости - Если ПропускатьПустыеСтроки = Неопределено Тогда - ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь); - Если ПустаяСтрока(Строка) Тогда - Если Разделитель = " " Тогда - Результат.Добавить(""); - КонецЕсли; - Возврат Результат; - КонецЕсли; - КонецЕсли; - - Позиция = Найти(Строка, Разделитель); - Пока Позиция > 0 Цикл - Подстрока = Лев(Строка, Позиция - 1); - Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда - Результат.Добавить(Подстрока); - КонецЕсли; - Строка = Сред(Строка, Позиция + СтрДлина(Разделитель)); - Позиция = Найти(Строка, Разделитель); - КонецЦикла; - - Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Строка) Тогда - Результат.Добавить(Строка); - КонецЕсли; - - Возврат Результат; - -КонецФункции - -#КонецОбласти - -// -&НаКлиенте -Функция ПрочитатьСоответствиеИзСтрокиJSON(Знач ИсхСтрока) - ЧтениеJSON = Новый ЧтениеJSON; - ЧтениеJSON.УстановитьСтроку(ИсхСтрока); - - НастроенноеСоответствие = ПрочитатьJSON(ЧтениеJSON, Истина); - - Возврат НастроенноеСоответствие; - -КонецФункции - -#Область КлючиНастроек - -// -&НаКлиентеНаСервереБезКонтекста -Функция КлючНастройкиОткрытиеФорм() - - Возврат "smoke"; - -КонецФункции - -&НаКлиентеНаСервереБезКонтекста -Функция КлючНастройкиМодальныеОкна() - - Возврат "МодальныеОкна"; - -КонецФункции - -&НаКлиентеНаСервереБезКонтекста -Функция КлючНастройкиКомандныйИнтерфейс() - - Возврат "CommandInterface"; - -КонецФункции - -&НаКлиентеНаСервереБезКонтекста -Функция КлючНастройкиМакетыСКД() - - Возврат "МакетыСКД"; - -КонецФункции - -&НаКлиентеНаСервереБезКонтекста -Функция КлючНастройкиПроведениеДокументов() - - Возврат "ПроведениеДокументов"; - -КонецФункции - -&НаКлиентеНаСервереБезКонтекста -Функция КлючНастройкиФормированиеПечатныхФорм() - - Возврат "ФормированиеПечатныхФорм"; - -КонецФункции - -#КонецОбласти - -#Область ИсключениеОбъектов - -&НаСервере -Процедура ИсключитьОбъектыНеРасширениеНаСервере() - - ДеревоПроверкаФорм = РеквизитФормыВЗначение("ДеревоМетаданных"); - ОбойтиУровеньДерева(ДеревоПроверкаФорм.Строки); - ЗначениеВРеквизитФормы(ДеревоПроверкаФорм, "ДеревоМетаданных"); - - Для Каждого Строка Из ТаблицаДокументы Цикл - Строка.ИсключеноПроведение = НЕ Строка.ЕстьИзмененияРасширениями; - Строка.ИсключеноПечатныеФормы = НЕ Строка.ЕстьИзмененияРасширениями; - КонецЦикла; - - Для Каждого Строка Из ТаблицаМакетыСКД Цикл - Строка.Исключено = НЕ Строка.ЕстьИзмененияРасширениями; - КонецЦикла; - -КонецПроцедуры - -&НаСервере -Процедура ОбойтиУровеньДерева(Строки) - - Для Каждого СтрокаДерева Из Строки Цикл - - Если НЕ СтрокаДерева.ИмяМетаданного = "" Тогда - СтрокаДерева.Исключено = НЕ СтрокаДерева.ЕстьИзмененияРасширениями; - КонецЕсли; - - ОбойтиУровеньДерева(СтрокаДерева.Строки); - - КонецЦикла; - -КонецПроцедуры - -&НаСервере -Процедура УстановитьПризнакИзмененияРасширениями(СтрокаОбъекта, Метаданное) - - СтрокаОбъекта.ЕстьИзмененияРасширениями = Метаданное.ЕстьИзмененияРасширениямиКонфигурации() - ИЛИ Метаданное.РасширениеКонфигурации() <> Неопределено; - -КонецПроцедуры - -#КонецОбласти - -#Область ДобавлениеМетаданных - -&НаСервере -Процедура ДобавитьМетаданныеВТаблицуДокументов() - - ТаблицаДокументы.Очистить(); - ТаблицаПечатныеФормы.Очистить(); - - Попытка - МодульУправлениеПечатью = Вычислить("УправлениеПечатью"); //todo - Исключение - Сообщить("Не найден модуль ""УправлениеПечатью"". Анализ печатных форм не выполнен!"); - Возврат; - КонецПопытки; - - Для каждого Метаданное Из Метаданные.Документы Цикл - - СтрокаОбъекта = ТаблицаДокументы.Добавить(); - СтрокаОбъекта.ИмяМетаданного = Метаданное.Имя; - - УстановитьПризнакИзмененияРасширениями(СтрокаОбъекта, Метаданное); - - КомандыПечати = Неопределено; - Попытка - КомандыПечати = МодульУправлениеПечатью.КомандыПечатиОбъекта(Метаданное); - Исключение - Продолжить; - КонецПопытки; - - Если Не ЗначениеЗаполнено(КомандыПечати) Тогда - Продолжить; - КонецЕсли; - - Для Каждого ТекущаяКомандаПечати Из КомандыПечати Цикл - - Если ТекущаяКомандаПечати.МенеджерПечати = "" Тогда - Продолжить; - КонецЕсли; - - НоваяПФ = ТаблицаПечатныеФормы.Добавить(); - НоваяПФ.ИмяМетаданного = Метаданное.Имя; - НоваяПФ.Идентификатор = ТекущаяКомандаПечати.Идентификатор; - НоваяПФ.Исключено = СтрокаОбъекта.ИсключеноПечатныеФормы; - КонецЦикла; - - КонецЦикла; - -КонецПроцедуры - -&НаСервере -Процедура ДобавитьМетаданныеВТаблицуМакетовСКД() - - ТаблицаМакетыСКД.Очистить(); - - Для Каждого ОбщийМакет Из Метаданные.ОбщиеМакеты Цикл - - Если ОбщийМакет.ТипМакета <> Метаданные.СвойстваОбъектов.ТипМакета.СхемаКомпоновкиДанных Тогда - Продолжить; - КонецЕсли; - - СтрокаОбъекта = ТаблицаМакетыСКД.Добавить(); - СтрокаОбъекта.Объект = ОбщиеМакеты(); - СтрокаОбъекта.ИмяМетаданного = ОбщийМакет.Имя; - - УстановитьПризнакИзмененияРасширениями(СтрокаОбъекта, ОбщийМакет); - - КонецЦикла; - - ПроверяемыеОбъекты = ПроверяемыеМетаданныеМакетыСКД(); - - Для Каждого ПроверяемыйОбъект Из ПроверяемыеОбъекты Цикл - - Для Каждого ТекОбъект Из Метаданные[ПроверяемыйОбъект] Цикл - - Для Каждого ТекДанныеМакета Из ТекОбъект.Макеты Цикл - - Если ТекДанныеМакета.ТипМакета <> Метаданные.СвойстваОбъектов.ТипМакета.СхемаКомпоновкиДанных Тогда - Продолжить; - КонецЕсли; - - СтрокаОбъекта = ТаблицаМакетыСКД.Добавить(); - СтрокаОбъекта.Объект = ТекОбъект.Имя; - СтрокаОбъекта.ИмяМетаданного = МакетыОбъекта(); - - УстановитьПризнакИзмененияРасширениями(СтрокаОбъекта, ТекДанныеМакета); - - КонецЦикла; - - КонецЦикла; - - КонецЦикла; - - ТЗ = РеквизитФормыВЗначение("ТаблицаМакетыСКД"); - ТЗ.Свернуть("ИмяМетаданного, ЕстьИзмененияРасширениями, Исключено, Объект"); - ЗначениеВРеквизитФормы(ТЗ, "ТаблицаМакетыСКД"); - -КонецПроцедуры - -#КонецОбласти - -#Область ЗаписьНастроекПоКлючам - -&НаСервере -Процедура ЗаписатьНастройкуПоКлючу(Ключ, СоответствиеНастроек) - - СоответствиеНастроек.Удалить(Ключ); - Если Ключ = КлючНастройкиМодальныеОкна() Тогда - ЗаписатьНастройкуМодальныеОкна(СоответствиеНастроек); - ИначеЕсли Ключ = КлючНастройкиКомандныйИнтерфейс() Тогда - ЗаписатьНастройкуКомандныйИнтерфейс(СоответствиеНастроек); - ИначеЕсли Ключ = КлючНастройкиМакетыСКД() Тогда - ЗаписатьНастройкуМакетыСКД(СоответствиеНастроек); - ИначеЕсли Ключ = КлючНастройкиПроведениеДокументов() Тогда - ЗаписатьНастройкуПроведениеДокументов(СоответствиеНастроек); - ИначеЕсли Ключ = КлючНастройкиФормированиеПечатныхФорм() Тогда - ЗаписатьНастройкуФормированиеПечатныхФорм(СоответствиеНастроек); - Иначе - Возврат; - КонецЕсли; - -КонецПроцедуры - -&НаСервере -Процедура ЗаписатьНастройкуМодальныеОкна(СоответствиеНастроек) - - Если НЕ ЗакрыватьМодальныеОкна Тогда - Возврат; - КонецЕсли; - - Поля = Новый Массив; - Поля.Добавить("*Закрыть *?"); - - Заголовки = Новый Массив; - Заголовки.Добавить("* Шаблон *"); - - ШаблонПомощника = Новый Соответствие; - ШаблонПомощника.Вставить("Поля", Поля); - ШаблонПомощника.Вставить("Заголовки", Заголовки); - ШаблонПомощника.Вставить("Кнопка", 0); - - НастройкиМодальныеОкна = Новый Соответствие; - НастройкиМодальныеОкна.Вставить("ШаблонПомощника", ШаблонПомощника); - - СоответствиеНастроек.Вставить(КлючНастройкиМодальныеОкна(), НастройкиМодальныеОкна); - -КонецПроцедуры - -&НаСервере -Процедура ЗаписатьНастройкуКомандныйИнтерфейс(СоответствиеНастроек) - - НастройкиОткрытиеФорм = СоответствиеНастроек.Получить(КлючНастройкиОткрытиеФорм()); - - НастройкаКомандныйИнтерфейс = Новый Соответствие; - НастройкаКомандныйИнтерфейс.Вставить("Используется" , ТестироватьКомандныйИнтерфейс); - НастройкаКомандныйИнтерфейс.Вставить("СтрогийПорядокВыполнения" , Истина); - - Для Каждого ЭлементНастройки Из НастройкиОткрытиеФорм Цикл - - ТипМетаданных = ЭлементНастройки.Ключ; - ЗначениеИсключений = ЭлементНастройки.Значение; - - Если ТипЗнч(ЗначениеИсключений) = Тип("Массив") Тогда - НастройкаКомандныйИнтерфейс.Вставить(ТипМетаданных, ЗначениеИсключений); - ИначеЕсли ТипЗнч(ЗначениеИсключений) = Тип("Структура") - И ЗначениеИсключений.Свойство("Существующие") - Тогда - НастройкаКомандныйИнтерфейс.Вставить(ТипМетаданных, ЗначениеИсключений.Существующие); - Иначе - Продолжить; - КонецЕсли; - - КонецЦикла; - - ИсключенияОбщиеКоманды = Новый Массив; - ИсключенияОбщиеКоманды.Добавить("Удалить*"); - ИсключенияОбщиеКоманды.Добавить("ЗагрузитьДанныеИзФайла"); - ИсключенияОбщиеКоманды.Добавить("СверткаИнформационнойБазы"); - ИсключенияОбщиеКоманды.Добавить("УдалениеПомеченныхОбъектов"); - - ИсключенияРазделы = Новый Массив; - ИсключенияРазделы.Добавить("Настройки и администрирование"); - - НастройкаКомандныйИнтерфейс.Вставить("ОбщиеКоманды", ИсключенияОбщиеКоманды); - НастройкаКомандныйИнтерфейс.Вставить("Разделы", ИсключенияРазделы); - - СоответствиеНастроек.Вставить(КлючНастройкиКомандныйИнтерфейс(), НастройкаКомандныйИнтерфейс); - -КонецПроцедуры - -&НаСервере -Процедура ЗаписатьНастройкуМакетыСКД(СоответствиеНастроек) - - СтрокиИсключения = ТаблицаМакетыСКД.НайтиСтроки(Новый Структура("Исключено", Истина)); - - МассивИсключенийОбщиеМакеты = Новый Массив; - МассивИсключенийМетаданных = Новый Массив; - - Для Каждого СтрокаИсключение Из СтрокиИсключения Цикл - - Если СтрокаИсключение.Объект = ОбщиеМакеты() Тогда - МассивИсключенийОбщиеМакеты.Добавить(СтрокаИсключение.ИмяМетаданного); - Иначе - МассивИсключенийМетаданных.Добавить(СтрокаИсключение.Объект); - КонецЕсли; - - КонецЦикла; - - НастройкаМакетыСКД = Новый Соответствие; - НастройкаМакетыСКД.Вставить("Используется", ТестироватьМакетыСКД); - НастройкаМакетыСКД.Вставить("ИсключенияОбщихМакетов", МассивИсключенийОбщиеМакеты); - НастройкаМакетыСКД.Вставить("ИсключенияПоИмениМетаданных", МассивИсключенийМетаданных); - - СоответствиеНастроек.Вставить(КлючНастройкиМакетыСКД(), НастройкаМакетыСКД); - -КонецПроцедуры - -&НаСервере -Процедура ЗаписатьНастройкуПроведениеДокументов(СоответствиеНастроек) - - СтрокиИсключения = ТаблицаДокументы.НайтиСтроки(Новый Структура("ИсключеноПроведение", Истина)); - - МассивИсключений = Новый Массив; - Для Каждого СтрокаИсключение Из СтрокиИсключения Цикл - МассивИсключений.Добавить(СтрокаИсключение.ИмяМетаданного); - КонецЦикла; - - НастройкаПроведениеДокументов = Новый Соответствие; - НастройкаПроведениеДокументов.Вставить("Используется", ТестироватьПроведение); - НастройкаПроведениеДокументов.Вставить("КоличествоДокументов", КоличествоДокументовПроведение); - НастройкаПроведениеДокументов.Вставить("Исключения", МассивИсключений); - - СоответствиеНастроек.Вставить(КлючНастройкиПроведениеДокументов(), НастройкаПроведениеДокументов); - -КонецПроцедуры - -&НаСервере -Процедура ЗаписатьНастройкуФормированиеПечатныхФорм(СоответствиеНастроек) - - СтрокиИсключения = ТаблицаДокументы.НайтиСтроки(Новый Структура("ИсключеноПечатныеФормы", Истина)); - - ИсключенияПоОбъекту = Новый Массив; - Для Каждого СтрокаИсключение Из СтрокиИсключения Цикл - ИсключенияПоОбъекту.Добавить(СтрокаИсключение.ИмяМетаданного); - КонецЦикла; - - ИсключенияПоИдентификатору = Новый Массив; - ИсключенияПоИдентификатору.Добавить("Комплект*"); - - СтрокиИсключенныеМакеты = ТаблицаПечатныеФормы.НайтиСтроки(Новый Структура("Исключено", Истина)); - Для Каждого СтрокаИсключение Из СтрокиИсключенныеМакеты Цикл - ИсключенияПоИдентификатору.Добавить(СтрокаИсключение.Идентификатор); - КонецЦикла; - - НастройкаФормированиеПечатныхФорм = Новый Соответствие; - НастройкаФормированиеПечатныхФорм.Вставить("Используется", ТестироватьПечатныеФормы); - НастройкаФормированиеПечатныхФорм.Вставить("КоличествоДокументов", КоличествоДокументовПечатныеФормы); - НастройкаФормированиеПечатныхФорм.Вставить("ИсключенияПоОбъекту", ИсключенияПоОбъекту); - НастройкаФормированиеПечатныхФорм.Вставить("ИсключенияПоИдентификатору", ИсключенияПоИдентификатору); - - СоответствиеНастроек.Вставить(КлючНастройкиФормированиеПечатныхФорм(), НастройкаФормированиеПечатныхФорм); - -КонецПроцедуры - -#КонецОбласти - -#Область ЗагрузкаНастроекПоКлючам - -&НаСервере -Процедура ЗагрузитьНастройкиВТаблицу(Результат, Ключ) - - Если НЕ Результат.Свойство(Ключ) Тогда - Возврат; - КонецЕсли; - - Попытка - Настройки = Результат[Ключ]; - Если Ключ = КлючНастройкиМакетыСКД() Тогда - - ИсключенияОбщихМакетов = Новый Массив; - ИсключенияПоИмениМетаданных = Новый Массив; - - Настройки.Свойство("ИсключенияОбщихМакетов", ИсключенияОбщихМакетов); - Настройки.Свойство("ИсключенияПоИмениМетаданных", ИсключенияПоИмениМетаданных); - - УстановитьПризнакИсключенияМакетаСКД(ИсключенияОбщихМакетов, ИсключенияПоИмениМетаданных); - - ИначеЕсли Ключ = КлючНастройкиПроведениеДокументов() Тогда - - Исключения = Новый Массив; - - Настройки.Свойство("Исключения", Исключения); - Настройки.Свойство("КоличествоДокументов", КоличествоДокументовПроведение); - - УстановитьПризнакИсключенияДокумента(Исключения, "ИсключеноПроведение"); - - ИначеЕсли Ключ = КлючНастройкиФормированиеПечатныхФорм() Тогда - - ИсключенияПоОбъекту = Новый Массив; - ИсключенияПоИдентификатору = Новый Массив; - - Настройки.Свойство("КоличествоДокументов", КоличествоДокументовПечатныеФормы); - Настройки.Свойство("ИсключенияПоОбъекту", ИсключенияПоОбъекту); - Настройки.Свойство("ИсключенияПоИдентификатору", ИсключенияПоИдентификатору); - - УстановитьПризнакИсключенияПечатныеФормы(ИсключенияПоИдентификатору); - УстановитьПризнакИсключенияДокумента(ИсключенияПоОбъекту, "ИсключеноПечатныеФормы"); - - Иначе - Возврат; - КонецЕсли; - Исключение - ТекстОшибки = ПодставитьПараметрыВСтроку("Ошибка при загрузке настроек по ключу %1 из файла: %2", Ключ, ОписаниеОшибки()); - СообщитьПользователю(ТекстОшибки); - КонецПопытки; - -КонецПроцедуры - -&НаСервере -Процедура УстановитьПризнакИсключенияМакетаСКД(ИсключенияОбщихМакетов, ИсключенияПоИмениМетаданных) - - Для Каждого СтрокаИсключение Из ИсключенияОбщихМакетов Цикл - - СтрокиОбъекта = ТаблицаМакетыСКД.НайтиСтроки(Новый Структура("Объект, ИмяМетаданного", - ОбщиеМакеты(), СтрокаИсключение)); - - Если СтрокиОбъекта.Количество() > 0 Тогда - СтрокиОбъекта[0].Исключено = Истина; - Иначе - НоваяСтрока = ТаблицаМакетыСКД.Добавить(); - НоваяСтрока.ИмяМетаданного = СтрокаИсключение; - НоваяСтрока.Объект = ОбщиеМакеты(); - НоваяСтрока.Исключено = Истина; - КонецЕсли; - - КонецЦикла; - - Для Каждого СтрокаИсключение Из ИсключенияПоИмениМетаданных Цикл - - СтрокиОбъекта = ТаблицаМакетыСКД.НайтиСтроки(Новый Структура("Объект, ИмяМетаданного", - СтрокаИсключение, МакетыОбъекта())); - - Если СтрокиОбъекта.Количество() > 0 Тогда - СтрокиОбъекта[0].Исключено = Истина; - Иначе - НоваяСтрока = ТаблицаМакетыСКД.Добавить(); - НоваяСтрока.ИмяМетаданного = МакетыОбъекта(); - НоваяСтрока.Объект = СтрокаИсключение; - НоваяСтрока.Исключено = Истина; - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -&НаСервере -Процедура УстановитьПризнакИсключенияДокумента(Исключения, ИмяПризнака) - - Для Каждого СтрокаИсключение Из Исключения Цикл - - СтрокиДокумента = ТаблицаДокументы.НайтиСтроки(Новый Структура("ИмяМетаданного", СтрокаИсключение)); - Если СтрокиДокумента.Количество() > 0 Тогда - СтрокиДокумента[0][ИмяПризнака] = Истина; - Иначе - НоваяСтрока = ТаблицаДокументы.Добавить(); - НоваяСтрока.ИмяМетаданного = СтрокаИсключение; - НоваяСтрока[ИмяПризнака] = Истина; - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -&НаСервере -Процедура УстановитьПризнакИсключенияПечатныеФормы(Исключения) - - Для Каждого СтрокаИсключение Из Исключения Цикл - - СтрокиДокумента = ТаблицаПечатныеФормы.НайтиСтроки(Новый Структура("Идентификатор", СтрокаИсключение)); - Для Каждого СтрокаДокумент Из СтрокиДокумента Цикл - СтрокаДокумент.Исключено = Истина; - КонецЦикла; - - КонецЦикла; - -КонецПроцедуры - -#КонецОбласти - -#Область Служебные - -&НаСервере -Функция НастройкаИспользуется(СтруктураНастроек, КлючТеста, КлючНастройки = "Используется") - - Возврат СтруктураНастроек.Свойство(КлючТеста) - И СтруктураНастроек[КлючТеста].Свойство(КлючНастройки) - И СтруктураНастроек[КлючТеста][КлючНастройки]; - -КонецФункции - -&НаКлиентеНаСервереБезКонтекста -Функция ОбщиеМакеты() - Возврат "ОбщиеМакеты"; -КонецФункции - -&НаКлиентеНаСервереБезКонтекста -Функция МакетыОбъекта() - Возврат "МакетыОбъекта"; -КонецФункции - -&НаСервере -Функция ПроверяемыеМетаданныеМакетыСКД() - - ПроверяемыеОбъекты = Новый Массив(); - ПроверяемыеОбъекты.Добавить("Справочники"); - ПроверяемыеОбъекты.Добавить("Документы"); - ПроверяемыеОбъекты.Добавить("Обработки"); - ПроверяемыеОбъекты.Добавить("Отчеты"); - ПроверяемыеОбъекты.Добавить("Перечисления"); - ПроверяемыеОбъекты.Добавить("ПланыВидовХарактеристик"); - ПроверяемыеОбъекты.Добавить("ПланыСчетов"); - ПроверяемыеОбъекты.Добавить("ПланыВидовРасчета"); - ПроверяемыеОбъекты.Добавить("РегистрыСведений"); - ПроверяемыеОбъекты.Добавить("РегистрыНакопления"); - ПроверяемыеОбъекты.Добавить("РегистрыБухгалтерии"); - ПроверяемыеОбъекты.Добавить("РегистрыРасчета"); - ПроверяемыеОбъекты.Добавить("БизнесПроцессы"); - ПроверяемыеОбъекты.Добавить("Задачи"); - - Возврат ПроверяемыеОбъекты; - -КонецФункции - -#КонецОбласти - -#КонецОбласти diff --git a/xddTestRunner.epf b/xddTestRunner.epf deleted file mode 100644 index e9334238b86b4615510b0a12a82ca0fdaf364bda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106079 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