Ошибка jenkins при запуске 1с

Удаленный хост принудительно разорвал существующее подключение

Я
   bvb

07.10.19 — 19:31

Хелп.

Все работало пока не автоматически на установилось обновление на сервер WIN 12R2 standart

Сервер 1С предприятия стоит на нем

База на отдельном сервере скуль

Опубликована через апач на линукссе (публикация в конфигураторе не делалалсь)

Ошибка обращения к серверу 1С:Предприятия.

по причине:

Передача данных прервана по инициативе принимающей стороны.

server_addr=tcp://serv1:1560 descr= line=1982 file=d:jenkinsci_builderwindowsbuild2platformsrcrtrsrvcsrcdataexchangetcpclientimpl.cpp

либо сабж и тот же путь

фокус в том что диска d: нет

ЧВего делать и куда копать ума не приложу

   Волшебник

1 — 07.10.19 — 19:32

ну и зоопарк…

   bvb

2 — 07.10.19 — 19:32

Перестали работать все базы и УТ 11 и БП

   la luna llena

3 — 07.10.19 — 19:33

(0) у меня сегодня утром было похожее веселье.

включи сетевое окружение, проверь брандмауэр, слетели настройки

   Волшебник

4 — 07.10.19 — 19:33

нужно открыть порты в брандмауэре

   bvb

5 — 07.10.19 — 19:33

(3) Что конкретно проверить ?

   bvb

6 — 07.10.19 — 19:33

Какие !!!!!

   la luna llena

7 — 07.10.19 — 19:35

(6) порты открой, если не знаешь как просто отключи

   bvb

8 — 07.10.19 — 19:35

(1) Меня терзали смутные сомнения можно ли юзать базу по тонкому клиенту не выполняя публикацию в конфигураторе .

Сисадмин заверил что да всегда так делает и видимо рабоатет

   Фрэнки

9 — 07.10.19 — 19:36

Ошибка вообще из отладочной сборки библиотек. На кой хрен они ее не зачистили перед выдачей в продуктив — вопрос к выпускающим платформу.

Зависеть может вообще от кучи разных условий.

я выделил для гугла только

d:jenkinsci_builderwindowsbuild2platformsrcrtrsrvcsrcdataexchangetcpclientimpl.cpp

и он насыпал кучу ссылок, начиная с 2014 года

   Фрэнки

10 — 07.10.19 — 19:37

   bvb

11 — 07.10.19 — 19:39

(7) Нет админских прав — админ уже выпил молоко и видит сны

А зачем ей порты если я ее запускаю в терминале на том же сервере ?

(9)Платформа кстати 8.3.14.1854

   bvb

12 — 07.10.19 — 19:40

(7) У тебя эта байда после накатки обновления вынь ?

   Фрэнки

13 — 07.10.19 — 19:43

(11) так смотри в обсуждении в (10) — по тому обсуждению получается, что этот вылет связан с использованием драйверов для кассового железа.

   bvb

14 — 07.10.19 — 19:46

(13) (10)  у меня 404 Not Found

Касса да подключена в УТ, но с БП такая же хрень

   bvb

15 — 07.10.19 — 21:00

(7) Брандмауэр н сервере 1с отключили — не помогло

   Vstur

16 — 07.10.19 — 21:38

(15) ну, откатите обновления, если считаете, что дело них, что маловероятно

   bvb

17 — 08.10.19 — 12:47

Брандмауер открыли не помогло

База похоже и сама виснит и остальные из за нее глючат

Ее пытались перенести на другой сервер при запуске ее там тоже все начинает глючить

У базы возникает куча подключений с пустыми пользователями и сервер начинает виснуть

Ошибка d:jenkinsci_builderwindowsbuild2platformsrcrtrsrvcsrcdataexchangetcpclientimpl.cpp возникает даже при обращении в кон

Если убрать эту базу с сервера то копия базы до обновления вроде работает нормально

Может ли это возникнуть в результате обновления конфигурации или некорректной работы расширения ?

   H A D G E H O G s

18 — 08.10.19 — 13:18

Динамики нет?

SELECT *

  FROM Config

  where filename like ‘%dyn%’

   bvb

19 — 08.10.19 — 13:37

Восстановил базу (удалил расширение ) таже байда

Ошибка возникает даже при попытке открть свойства в консоли кластера

(18) По свеже востановленной копии базы вернулся пустой запрос.

Хотя по страрой копии вернулось

2fb04b62-48b0-441c-af8f-6404c5931561_dynupdate_4cf47490-121b-4ba9-9c41-accb6109a2dd    4019-09-09 14:37:04    4019-09-09 14:37:04    0    185    0x958E4D8A02410C46F7827718CA6D0592AA7457D57192B2FB00822B69D0A30CCC015C0EA3E815E249BC82E50F385B21BC4D5EBE7CD7C379437E3EDBE01D141F7C027D181559FB009C1581992AC89847E819B9762552D7D3E49DFDD8E9B2B5A3EDEDDBCEF67BD9D99FEDDD33C5ADD6EEBFF2D5B66FA75DBBF6887C0C03E6240AC485808BF6202A0938768994496A501FA787DB72C31D6EE13C25CCE35204AAD60138E4021A53044CD249621D8642BE95FC440FD37CF61A8FD30D    0

2fb04b62-48b0-441c-af8f-6404c5931561_dynupdate_4cf47490-121b-4ba9-9c41-accb6109a2dd.0    4019-09-09 14:37:04    4019-09-09 14:37:04    0    5830    0xED5D796F1C4776FFDB02F41D066D20908029BA8E3EAA226C009FB21C8A76481D968260D1A74499A21489A4452E04D052626543C75E385AACB1584B96BC7FE41F03B224AE699D5F61E693E42BE45555774F5F33ECEE21692A1E1D7375F5AB77FEEAD5EBEAEAFF7DFAF277AC7BF0C0EF4CD1C5F15FA2DFE33FA8E225F9034DE154687F3D3E91A893F53B1C31660C794C92EF325B88C87619122E7591E9738A5CC7B1901D4526A7A68BB9EF768DDE9DDE8FFDF5DE83DE8FBD17FD1BBD27F0E94EEF65EF45EF616FB3FFFBDE66EF796FABFF95D165BEEFDB160E51643302D4DC10F19031C442D7F56D823D2B1240ED2ED0DAEADD9194FAEBFD0D78DFEA6D195D11D1D00A020F315350644656807884036412DBE301092CDFF2D2B3EF41EF3FF51E0327CFE5D9BD6FE1D33DE0665DF1B4DEDB34BABE4B891F108E98E5013DCA09F22C9F234CECD0F779E072D74FE9FD09CECF712355564B3B52B3B504970D6BC9281BD6621E1A2A3B823595652995AF0858A798329B39C8E13647A66B45885B8E8D38B35CC70EB12F3CF77AEC58D2227F05BBAEF79E810EFE0C7A7DA6B4FA18FE3FE87FD5BBABBE6DF69EF6BF3052C71A3858EC975DDA559DB3AEA9393A7840B572BA4CFB1ED667A9C631BB580B6076FDC062C20C30728200F4EC59C0A9A00E12A0572F14B6E3E28C7CA6DD483E226D0C523D06B9C053FB5F0E7CA77FA3FF85F29C3BFDCF4046E9CFB13FC592EA78B9B26C008DDC591DA99C0E68AD785E22F7F8DA717484269A724D4F984E846C900DDC454ACCB883028F79A6436C6A61EF7AD730BA607DA403DE3012E7A0311F151C64BFCB9F584363D8662363D86D8CD1FB1A3EFD4DFDB6D9D6309D43592A8777D04E3455724A4903B07AB5AD46FAC1E3EAA7F71DB4FCACFF1F00C8EB0A989320069A709E84EE9FE46B3994495B0558EA44A6FD4B29A0E459D5DF71AC39AD349333427D2C10B5C0CD4D8F0AE4518E11E566107011463E09D5B9B239D56CA7064C86BAE495497EAE0F3E3474EA6608D3CEA9E598BAD1BF35B65BE7E8ECA1633B7BE0D839D926AEBD13AECDF7C0B5EF41EBFB32A102541AC7B581CE540712B298D21E3AB7D803E7CE6969E2DC95CE5DB08BB917A033B1C4F83063350BA0728EFE43EF76EF4E0574E8DF0738903D9699BBF4373AFDFFEA3D05624FC0D2EB70E0B9B2F2A3DE8B0EF4F2027EBE19F77503BEBD5033DB7535BB7D60A43A1A37774FCC33342D67DD9A697919A1F09891A01439F1F51DF075B3D914A8ECEB777B9B90E32848AAF0F8ECD13A7EDF7B999C904C47776C1A8A08DB156736C79D2465743471E99D70E9665962D9A5EF80296E81516EF4372A5C3A7B74B70A265408273441D680CB921C0F4D24EC90229F8A4804D87118A6BF44C1C46A06DCE5043CA3BC6D0A23B9F364869D9ED851E94E72E65E65D556B3C26439CC87883E09F99DC8D8E80EFAE576B58D519EF922776EF588D7C8B377D3A3D90E7AF4A4D8B1E33E3D6E713A6B9EED8A1A237C120CF62C53C7D8EF4E3D6E3636546B13A7AE55E418B7F894D5FF44E3C3348E075F69D3226AB3B1D2020BFD777FBD7F13A6662F41E352FB4F61A6F2932E3B0130A8ABABCA1E5BFD7F976529B0992E5B6CF69E54604D865A475D881F414ED55773F47630DFE3E9D9DA76192F323E729796C22B8B86CAB28B849389C3800D6D0D3AB067A1BD3C42AB2A21CDC7E0318C3109A8EA8032998F71E420D7A40132FD004287708138CCBB4CDB097CC7E6F188AC6936B098BC5EF012F4FD992CDB1903772B5E5318B4C939782A486EDC4C56C5247F49FC9B169EA64789B2597234A5152FB5493A1A5DEADBDE52A39DA1B6B3C08F14D0462AE52DB5C6C7569F678CAE0D5FD4FCD878DDE8D228F0C1303E72D45A02E607887BAE85B8C3226C320FDC81C7743126EAAF5E5894FFAAD8E109510B3C887AE04F3EB73D4448602197F904616C61CF0DB1EB38B6644964D8234A6BC64950938E65F93BB92EA5C83432932E42D777BCC8C58860CF04BE6D8184B07D14508B7387B88145843AC31A901D6800B083E8CEE78CC432041413061E27A001EE802E1C1E226186217222290E614CB020EF5DF182A13FC8CA32BC3F84FF3F01067CAEAFE9C448F1245942548B7EF53A9E66830C2F70298B82CF159A3D91F815CF2AFEA253841D5EC84324FF030AE9209B8AD20CA24585287BB92609570983BB8E1345BE0FB0E94412E3286500A0344244D8B61D3A72058EABBA53BD355FA4F4AD1273B3BFAE3DA728D6C1386FD7AEC21261E2C057A363C59843E2A183C1A77844180D56CDA06C3BA86A0A7539AF1A8C983463DCA654E976C3668B617230385CCF50CF387CB3EB943C6BFDFD12B999FCAD94CDE9842ECD0AD25C8C36AFF0A572BF7B6D295C0CC2E0C4A54B0B4BF3977F1D0954FCD60C5AACE6D8725B65B60FEA208B594216F2FF1059C4AB8A2C567368898DFF2A038BD5EC82141E483D8195BAB0D2FC9ADF3DB58842A666B70B4B2AEA218D334962F633D434AB43F2D10EF12AA30F6D5E621AA1890922D5452498743585247959F869FFCBBA10644DE651FB1A8248B30905CF7BC02B8D39CDAE5DE2BCE4138CA98D31CDCA6C7AA9D383FEBAF2A69AC51A4E2628B3AF51A6D9F8CE8B3EF04AE34C9BABFD19D92748531B699A4FB062BF52F75E3FD2F9631DBC21984E00675F034EF3A955852BBCD2B0D3AC8689AB3530019FDAE0D3F2A679A56D79C7D4A6BA9B46DE21B5590B82A89840D0BE86A0E675E4A10EF14A0351CB5B0AABF43081A3DA70D4FC9EA93BA0F147F14D9AF1820BB9E74C0D28B2AC0914ED6B286A3605E1C39CE19586A1E617B82A753081A0BA106436292DC66B83929778699A163299A83D1B94F8D50AB19F6B8193F36BA9409357139CCCE6CBF02A9DE1550627B3F9F5AF6A1D4C164F8F8B5AB4F9C60AF740E51B90A43EA977498C3893CBF2FB1A91186E715D3E75817D8043B82D0EB12643B6C6A1ACE413F429A30F8DEF6EA8B2018DEFC649F54F9B795EE1D68D5F656A9AC0B0E252F6D92C9D28A830737F81BE73694B3B6E952E496ABB04BEC707D08199F288D4FCFA590DA1F6015265B1A7F9F5F83A324E3029132CD9A1386B011D39CDAA04A46800B9C39CDCEC09D4AB8B9677D5864F9F4192FA425F55D89D286A1A65E5B4A74D12C146076CB3AB01A580DD5E97FB2C789B17799BCA3B09E4722093EA406E56EAA205637CDF7BA914FE3073FD6180A830EBDC368C7778289477256763ABC5B2D926E2EDAFC832C74A096B483B89AB725CD14C5C955AA5C65212E94C3EE39E694EEA748D197765FE9CBB74E9CACE794DC24AC64570C6F8698FBFD2C9401A4086912A250D2CDD5C3DC02151FE41BD1D88EAC83878E075B94910848ADE92E08B4EFEC10CFD5B103F4FE28723FC183FCAE0E76473FFFEC6C103070FFC5DF94909070FC4C3D9E710608FFB3725C14EDDC72C1CD2CF719061D8EDC82C37BE4F3759212683B5F4F488C3070FBC06FF7A7F84087EDADBEAE81565D0E299DAB564BDBF3105BD3C84BE7F5608079F0E1946EF0FBD876AB7CEFBD00A7E368CC31DF82C37F584FE3A6FBCD1E97DADD87D2869F56F7414B66C251B64DC947BA2C45B0BF7FF2DD189DC0DF469FFAB8E62FB81E4465E4B9902EE5ECB533B221956D00BBD7F9EB07E44EAF43525A17C0EC62338FEAD822429F9ADE4C9180073F7A7723B496CA9AD0AF5B62D4FD4A2DD5B70DAA6CC27E0F58EDE8EB47F536D559AEC4C0BBAFE41E9377D5AC3E1235A91F04F4A5FD27E7F23865309955B4A959B52E8A9AA9E55E3DC569252B25A0DA7EA7BCB0F2A8DBAA134F69F7A7B562585E43FD5EE6E8812F7F14D3C743E5256D5970DEF11E0B2789B467E53582025B5D1EEEC86EA291AB8A09A712488A9FD50B133EE26B83B783EB0F54C2974338D3DF0BC29E5928A307454B5144DC6EE9676984228D715BEF39B4EBD5EA6DAF7F1DBCC934E923404F0E890D2737BB25303B2528A0A1F1F97FE5F34E441C3EF14BC3CCB3E7827EBEAAA7F65DED80D062192DBF9F7480C5BB5D43D9E72DBCB5DE5FEBBE8BB522599A113141B0BD43E80614C6C333E1E49B8A90B835936A67ADFAB030FE27DCDF558F3BD1AB0E477ADB13BC91858C8BC61304C6E9DAD44EB6EC7C8A5F053E9BDE546B7C2F5E28353005BCFFA5F1D56E36566182D241ED91CE5CF6A30D6161A99A3141E2495C948923C43CD8DE48972133A38A7727C55719476A987EB644FE1FC1893A86BC8305DCDD6200D3B04A437E184976A46335840F6A2DB29BB8F52F613BDDD09FCF63FCA75E5BE544F144BA0F5C459761BD86B35CCAB70887D6AE600BB1AE93BEC8385C7871DDA31CFD3BEDCC4EF0AACB4F2BBD8A7764C49B59E1F774863441E82BBA5C901FCF24D5C8DBBA5047F727810000D33EADC24A440154652C3684AD030808E9C873C54E7DDD68543B5D91C4879283B6151538C41E765D1150373BEBBF88EBBE4C684EBFA134C38F23EF5473D638C5D206B8D07696865A78D9B255E5F2B5851FB670190A497B5E6F1AE72CC84BB74433EE8E5B6E6528D7E92CB2C243E006DABAB2BD081040BE99D374B49C761E5D2D533B821BF16E0A8B96BFD22D9764560E98CAF767E5D304AFD1E9A66D74309B5CEA74750D401761B047BAEC5545BA4EA2AE323E55229C33AF2B31B0A1AF5D3E5BCF66A01DFD0C4B9251E96DB8C52CDDE0EBDDB0F2AAF671A64AA5DFAE45605B05C52AA94705F9D0176EA7F0EAA4947C8ACCD1B8D6F2DB6073C94672B3386FD62659C115908684B4F26F2F77CC4A7FE82659D1A59CA4E3854760BC25C3D75DC9A52FD3CB3521F3FFFB6F735BCA90AA70A6A69ADAC8A6E96B993BE9795272DC7B69423E735656EAA18BFD9FFB2319755B3A3F27C331389B592D837DED8B9DADA6ED8F2AE2E2CE4D376E0AA528B43EC5A59D3D8DE6C8D3A2E9B26CF4ABD09C5EEC0DFAEC75885DEDB20EEB6BD549663CA51B24D4CD49BD5D5B944D416922AEA66858BDA20C677F0F927682C37E356B38DFA6A1D4B95792E4629B392C9DA0A1EC71F07E37159B88D43EDFC2F5F421CDDC310F58DE7797B70096877A7637B319AAB947D08CE37966C6786EE2A967667B0DEA1D029E577777A7F83F7C76965424B94A875DC69DFC84E8666CEF506CB3D9AB3354BA1EFC9ABEDEA792F3F26515BE41F32ADBF429BE7C0AFCAF52AE9946A4B70D67DE54F8F14328DACBE0CF3954CB7F2B27FF6FE00D93C3F57CCCCC6954715398281A4F0D390C26F7F431632E45EC70FA51BCA429E14F33339438CEB23A533A654D6F963EF4102C287E20AD9E35EB988ABADFDA75E66DD010CAB8651CC5CA7064F878923762BE6E345524F9385B89BFA0A924C7F33770F19BA8A565C6651BC28B1A53C3053974E1F4809DE00AD2A33507DED492ED2D0D893F60BBC57AA3E3389D7CFCC924E51DA6CB164A06EA988DADF28075CC9395B96BA8716493315CD81CBA42E914AFF42D5A1C7F7D24C775325973D922B830F61634A69E7695237EBEB5539873BFFD0C1C5A2F6289C9F92AB77A489FABF8FDD2B5D172F051DD2F93FE37FD1E5DBBBBAA92AA948CD161D7EC4258EE1A4B502BE4948A98E76C4A73398AE1893A6FB59B1F5BC8E492AABD263D73B861E546BF04CBD2C4E3D28432DFD2C3C7D25B34C2FBD5F487D79DDE8DA96EBB901351167DC43A6E00EE21EB3501888907A8119089FA7B716A62FF1333F709D2378F09E592187BB36EB1AFFB41C5E593D115E5BD2FCC40FF9308EBBF38B275C6F214CD98C7C4C3C2B889070A21099A6F080E1C0449470170B1CDA9C845D468407DF09F27D4E91C9038138B1310219B16F9B01618467A9BFED2E85E72E5D59D5BDCC28C68D7F0C574FAC5E0ED3DFB0FEEDBDF97021B89AF26391D071714091C5B07A728A893CC15D8431C7D0B1CB30CB2C5534DE595D742FCEFBEE82BC2C34172E84FED2FCA5D808FAB674E3CDE5A54BEFCD2F2CBCB9E2CE2F48EEB23D6AA502E78BCBEE82525AEE5CDDF4B87BF9D85278F1588053E659F1E08C7B31C40365CF2C5FF4C22B46B1D55CE85F5A0CDC2BAB85E699C75DA85316C211BD660ED6EBF5584052126615E3644002F4188E663BD3385DED5066BAD86381E9ED7A3C16D00101A78A679A6163D4D6DB65D64A940BBC35A29CE399A594AD4A076119CAD9BD79CB3C962815781C4929C7939952E2A48A27334329BF976799AB12AD0257DBD0CAF1650DC0413D7BB8C498952156B5F55F99BD32C9027FB548E6B8B40724A9A8E2D2CE893C6C8FB032AF65C2055E1B10CE71EC0C085B5615C74E8670F53642656ECB440BDCD6249AE3940F883A95E1C20BE62AEF2952E6B44CB4C0694DA2394E45866825188901D1D9301A8D9F22072F83F944599672B70559B6E916507830761051E9BF243F0AA9AB5C2A17D425EFAD9E5E585501F065D2458C6F403ACFF560F0A0C4AEE49A1423596780DBF15C265CE4B936E198A39C69AF4E5F728330C8A516B3E1BF4233D53E3B946B8BCADC64CE5D094F5E0DAFCC854B4BF38BE7F289C9D170E9D8E2CAFCD5F9246FF9E84A78355C5C72659A936D9AC90AE38F2A6BA53A6BFD0632D6D293319BAFB98F335EBD758A7ED2E010CAFA3E830AD2EA91D695B413BEF399F45BC68E25C9389B24E34A7531AD2EAD96C7CAE87F5373A44119F53E7C7F2957ED56CA27A7DD4396F854286F443F1D75C1FCA5BC27A35A93D0D3105D4AB0ADD4E5DC9EEAD24C74595AEF5C558D84C95EA6665AA9AB029D4AC548429DF866394DA9A48A5D5740FCF3EB9E7B35B4CDBF779CE5373E7A4798DEE94FCF05174FADFA7461C5BB80E78FCF999F1E9B7F6BC1BB38B372F6E8C2F2D9353C7FEAD4ECD1E913E7E63F5A3367DEBE70EDC4D98F67F1C18307DCD3D6A2BFFA1690B8B6EC4333F7FD59ECBF7369659A9D31A72FBC77617AF10332BD766EF9F89CF8E4CCC7B3E7A74FCFAC781FBFB5025D61F7B4580612D31FCF583E9B5DF0E6C49AA4AA491E3B171E2557BDC5E3F6D9A3336B67A858FD68EE834BC1FBB39F7E38CF57820B40F2F4F1657FF1E40A90F8F06DF3DA349D3D1F1C7D77099A2EF947C59AFBF1EC658F9A4B3E5B580B8E9E5A9AA6332BFEC593F3C7DE3FBFE41DB5D63E5C9CC1E1E96B0B922C90A8A29C21BB129CFE6405B8B4BCA33912562234901829373B75799A9E5DF11667D7A65922F04048E85600896317CFE3E0FD37EDE9554165EF6756ADD5608E03C977C112EFE13373E282C73E5800EBC42ABF4C3F7CFFD4E544375217A385C8301F2C9CB950B698B44825F360B8A362D55F15ECECE963593297BD02194962A80E0664C0D09F782C58CB086396D419B060D562C7572D309EBF72FCC29B9F02B933274E5E3B71869E5FF04EBF9BE1E4FC9A7B62C089E462FBD397800BF08FF796CFD093F3D36BE66F2A632AF7AE1F4F1ADF8848BB4E10BAA1E332E45BBE8DCC90B988BBB64061C87D414313FBC24DB6691ADCBB88CB118DE3884EEF748C77B3A321F77C8A29F2380D91C938416EE0044808467D667B0EF768BB0EA896C0F5B1CD7CC7425C043E3239779067B91C05CCF619B51C16464EBB0EE2ED0D7CC77349447D44988840453E469E4930B222E20B4C2C1A0AD2AE0333360D0F1893B7357BD80215393442221401C22626F20E5193E2A85D07965651E0428AE683FA318F4045AEED21CEA940DC0B6DDF367D62457EBB0E6CDD812F1C86AD005866A640A667830D5C8A91CB1C3864D2D07744BB0E1C7DD88BB0EFDAA605CCCB1B6539E6E0451E48E080CB820F592AEF6BD301D71258C28D02D32128C03606370D03E4C91B73B9ED59E04EA033CB6BD7411C6F4EC0FC90061E9065D0414009120175511406267179C443B3A58A481CCA21B13DC1882B7966C8242C02FD435F8E67479C59D0B9DB5247F1C64C5D800ACAAD28448E00C43003072C6C9B1EF27DD78F7C17248B5A2A89C49B9C39966DDB1E1836B203D94360234EC1914CEAB81C8290457E5B2DC5D14CE563C21DC745C2F221D884ECC1B7C1A71CCBB5A9E947A6DB329AF533A469975B987AB6C510A30043668001F108041F28CEF4C300D0226C19CE248E67CB7703EC7B1409C70AC0592D137C89511490C807D8E60E1666CB1E6C7D3C0C78147984201212400C1387106F007C44F8D8B25CE201F0B5ECC1D13230EE390E0B1C848570906989108908EC2002D7B639731C18955AF6C013CC7005E626478261B02F6301E2B2079F10D7A7BE15024435ED21CE43AFFF1F    0

319b18a1-cc82-48d9-8160-65a0c64d1318_dynupdate_52aa0173-8792-4f18-9463-07931ec04e47    4019-09-09 13:22:52    4019-09-09 13:22:52    0    12430    0xED7DDB8E5CC795E57B03FE8702FBC506328CB85FE6D1E8676380863F20AE8FF3D0E8796A0830A5B6DC3DF298D3B20636DCD3BA5876BF0D4051A2582225EA17B2BE647E61D68E7332EBE4B532935564514EAB9B64559E3C274EECDB5A117BEFF87F2FBEFF2731FBD1DFFC930AB36C925355705675954CF39459E4BA3151430BC144D99C989910A451D933913C2EB256301F746056C9525232D2703E934A65118363DEA4C0749299055D1B93C628A185693EBB59CD45D56222E32671A695728C9EC29A16BC0AEFAB7572967D6DC15BC39CAE95E9E00A8BDE58A65C693AF2D054E533EE8CCBC14A66B3F0B828091664C21075F351985C4DCD33994B514D2926A5C498021E17E94A9553B25A57E3BC9C45254215121FA996705193CCBB9859C946F1E8B9B25ED16C71FA430C7FF019BE94049EC472A639F125302F2C67D6449EAD2E4209FFCEECC1FCE3AB77AF7E3D7F7AF5EEFC8FF397F36FE797570FAF1ECE2FF1EFEFF0DB5FCE1F3F18EEF8E01FFEFB83E9E517F3E7DBAFBFF8F1FCF1FCCBF9D3F977B8E7E39F5CCC5F5ECCBFC7072FE75FE183AFE78FAF7EF5000F7E8031F2777EF437EFCC644C5234D9981178752D24672934CD9CE59867699AAB76266642CC86FF646B3A706959C0FB43902DB2608D6036195D4C4855F38A8B12D7C9D29B9320B580DE34DF98D55C6713943056CC72E5C5E6E219F7DCE2CA68A11C78BC8BDA2869B276256398349D7D7EF93B3331FC4BF6197FF0B70F66C2B816311EA6730D4C88A2A156C2308E7B62D6A3102D0C332863968A73C3B281026B29228B050F7752BA22A10AB5C63E2147DF59F1E0958491B49A1DDE435496B28756465785B022B5204EBCB3B442842698CB6434A62996540E2CF88429F722CBE64FBCB3F578E354A195D1D06CC03E8CC1DCDB228B690DE3D727DE19E3AD3204965386793ADE6039AE92CBD0A938DFA29127DE392781313696F1FA18333C4E34AAB00AA581C51A2F753EEDCE1AE3B54E6866E07F306697588AB87D81369317C9D1A513EF9C756CB26A56236EAF95D52C49889107C9A591B285A44EBBB311AA54D132B30523D5C90B32B1C2AC08A5984A4238719E8D822D7B48305498397C15B444C14B9A92F118D9A086A78ED9C6861F0A6BE436745598E7062769E06BA091F02CAD9D7667AB335C55914C3A8D31732161290DE18527276456D69C3A66EF750A51C2F2322F9867AB581010A8AF3ED72278CC2E9C78E720A3F13AB31CE9CEBC541654823E57840E519568B19E7A67E5112D15CC199EB93BE2D88286AAB8EC74F1D9DA1375035F453457647E09DE1DD19A250E319AAA9A91C517EF4E1C733411F0207386088BD928BE529CE534392D256F108BEC89776EAD72971C8397430497C1309F61E7BCD69A3547DC3975CCC9B5546C35ACC22A986E1AF02667FC589A14295AA9933BEDCE39076857A3804CBA2134A215378D35615DF2817B38D6D3EE5C82C7D86CC2EBD3E5867B16228098822BCD1E300F98EEB43BD36526C2C3F1007FAF9BD20066D9B282DF67157373A7CE73CB78EBCC01224C215F2713F3C06508E5362991A1EBBCEB06DD9CCF4C830CA0A7844731771AB02BA8802F2BA9A314DE16A56739D5E83557CC37095764248236BEC45AB03CD6A29349762696988E0FFFA661C357456502662CDA4A000783A94EB022815B003B65109EAE65721CD230AAEB7BC10FF6CFDD3B70E25C73041D26010B316595C0148FCCB55A81A514C587FE1535931A18CC034403BD344FC12460B801B81A2F962526A2C109B6C528432CC638203AA9038DB26486F89818D03C7E911B1C97ED20FF1A083AA96A0A9E259DA177C143E52C4295E35A6BBC1740DFF5DD3D66AF02992350C017C01900346A3898AA70AD531AD887F09A4C096600656B31017479384F9F224289068EC1707DB0B5DFF3670FFAE5192FA60A01120D39674D9703752B0EC7902AE2A83093CB41299C8EBA207E08DC3D91F3A831325F249422A8CC63588C38166581FB0D5059C5889D84130058852FF7D219A9622AFDDA83AE1B264CD5D84CF4B0245BE852205D0403E0BE606163DA01270F8FFF0510B7B681B7E6C0A41485BE0001066215368608756D198C693156EF38BEAE3C6B997413A801501561B234178A0A40C6500652CA3E0C5D2A57F0089885461023E06A8B982D3076155BA6074C26CD789E25223B2C882E97C633EFF118979BE7207B165377DA406CD6784107ACE360CADA57288582C7154A7AA72C628E95C7DB3E1FFFC7B6FCB1F8DFF0F8AAF0357805E5A061BA00D77A0F5F0F8B2CA1F01C4AB24B6DC81043E10E4FA63006C7C4229C3953B691753BC0DFD2B5E190EB8650EAA0E81CCE84556B685E3106F825C39482597B0F3108BE7C7B204A8D304AFAD27D309C8F0737569894E66D2A0A060F59799843880E1E5A933D388BF8024F08D78D285C843545D6D36415E0E4E0E3003678838F0C08001173CF8A75595467B8F253A509D27B183C82BD342022B640D53BBEE008F8018A8798BD1848D11660574AA624871F01D366090E15F362E1B1AAB66A50B083AE1B8853E2D273C42B3CB4089ADB84980588D72C1416BCBE06EB27A385EF8F46C325F014040522026F1E3393628C50BC10825C1A666E3A2216284C3E443C6A2248C6BA261E3FC7E39DF58D77FE7B507B8CA468A9F09F655C4AC229C42311ABA046F07BBE39ADA45B8C44255FA127050223CD08F09991483C26B578DDBC0307E8EEFD90EB8649AEAA44EB81E5409029223AF87F090F9C42D208430DD47029E3E42CA02B3829102C5C1F84C5126C1D8190EB5842532276C50456D4A3B7AC14A13A832DF80357710805A1D9E19DF1494D92FBA550E03AC1BC2AA162084F578BE8E58C01368408732E963B3F9DBA961B5496D677322D25D00B048788CAAD1670693A229C2EC60E3A06DFDEFD6F74E4B641748A0D845ABC83D316F0908B0587317A53B436E7687D8ED6E7687D8ED6E7687D8ED6E7687DCFA3B53E47EB73B43E47EB73B43E47EB73B43E47EB7B1EADD50F3C5A8B73B43E47EB73B43E47EB73B43E47EBB73E5ACB1F78B43E73EB73B43E47EB73B43E47EB73B47EABA3F518B3296BFF106F748B17FDE80E6A16BA7E6EBFF3D507BBEEFD72FE64E5EEF8F9C4FB6F7EE762B81FFED99F33C305FD994FFB25DFE1791FE022FCE3F1DAE8AE7E3B1B6E4657BEC4EFF0D6B8CF8BAB47F8CDB7571FCC9FEE9C2AFADDF577E9EFCBAB47F83EEE89F75C7CE9DDE16DAFDEFBC9034A3D1CD5027F2CE3185CBB0A305C5678D054D8034814E0D89D4939674A5E55D38216685C768E104B22DCC48D60C991E3E75E54111AAE8EE3DC2900B8E2237DE6E0C42C704DAC00518AC39E937501A6FACE72407C965330C05E16E64BB9CA117610522E4C78F8F414A9086459E3307EC505785E8EA89B5A0446B48ACA189A60880DB2E039407F6DED2B887EB5219233270824163C2A34F834C0C16CE0454BF371E52B6CA5B0C200BE5669E10343808B2B0A014D47380FAD142209626289E3D8E0A86D4A85515D1050020CD453EC495C15990D82393C4B08084BDA6A563A0C0D401C41E07DF0AA4D3ACA263562ED0538E4149C055AF2E4591A0121E03ADC97872252AE752805B9C6E92788396903F72A39F35C1124F382607D61D6C23722BEF3A8D328E660818E784A547E4008030E3A18787ED35250D63911C544CCCCACBD4EF6BC2555391C3A393359F124C2ACA235AB82B0BA64BDF6159F724084D7CC05AA292A84DD9B332C671722E09B0390BDD7224C603600658A65C47FAA6E038E32781F9012DC9922A55FF5DC9DDD2CC5B3E03BFD67395443112EEE762DB2C16C62A0C15051163049B49133C18D6E22A52C9D9E7514B914B69895E48A2770043C03EAC283A2AC6A0A435E2A9E443222E12253440363733220BA7A60AD543172E789B745E0E32667C21381800A7843B52815739BAAC18BD624344C2B815751594968061A287AF187854F48BE7B0784FA18B20AD22C676B5948E7C1C9B8518489413235F011C0A7E6CC02207030BEEA93A342BA3F2D5CF1D507AB2573D30F560ADFA609D9FD2FCCD699D99E99ED99D99E99ED99D99E99ED99D9DE7B66BB10EC329CC3BE9DD60093C90ABB103074022FCD83A942B6ECC6EA71BABA4327B724464BD0919581C3466C76392B2A0EEB601B1ED9048EB061122C9D40C77F74BE05AE05E6F50218038C6BB3667FD7454B30D2A7E1BFC67FFCC7FA0FFFEDC1D221C11F383C0BDE0A010F701562323533E9A35531432BA6256F9BDCF53FF0C497F32FAE7ED519EB25460002FB04DCF20B7A3806F11B62A65B4676F5DEC5D5435C8AEF7C459F5F5C23A89F7636D947BD508BC5DF07AE0BC8414CA3125EA39D41BA62E0DCF32F408A7FF9533CF7128C7AEBF48D208F264A533DAA47502B89FA114401C85112E41EE8F75CC93840B065CB80C389804A3A34EA5D40C6031F9BC9ED47E09AE881694B01A2E33303D70C5EE658F506CA6BE5783BC43DF80A905A63E2693CE4A0C7536CABC9379663C1473582A708589CF5A0D306201328F00E1F5F24206D454C8717C0ED8058A0A6B81CCE5E0A9B8348DCADDAEC445917BE820F3A400A20DE19B5619F79720CC8B4085C57A93836533928A8158B1AA1121840ABC6C93CFFD297661ECF9FD382485F2AA1A5964B28D29A89EEBB70BF99FA908595E08AD62360C35E812030414C8006F8162530B5DC67A6FFFBEA21B4FAF20256776D9DB47604ADFF6697857E704123846DBC9CBFB8FACDFC197EF95B7CF4F0EAD105EC7DD7AB5CCEFA8215DDF446D7B0FB3634D01DA3BA5DF720F6F957392E091C440E870587835CBAD8F049FC5634164133832B8150166A8A91A8D30C3744D71BC16230DFAA49633F87501FF765BC279B5ABAFEE17ECD9408B94A62325CC8E417550335C5230D001E9077294EA4D7AA99EFAD0C7FA98DD0BEF9D774BB0D1D5CF9C21DEB1DFF61EA5D93E0B55C1506440EF7D488B8A41C01CA82C31B1840E4427A47CD8720ECBEDA4D86FE043F4FD5ED25FEFE7C580B5F6F48D457AFFB4AF8F38B1F639EFA453FD9A79C3F27B23953D74905DBD46FCB885635829EB7530B495B766D3690765E5C2FD103E12C46DD6D4ADC9A266D029CDB11AA3356390B40281A753272B4100E0AC19CA7753B51418FCDA142FDF3E0E3F70BF59F878B0E12AAD827D4F1698B31F5718C7B1D7722EBB7429CAD452BBDD6CC670851CB04004BFC502BE1F02BF0A51A0F14E7AA183F596E5761EA5ED920B7110A08098168FE6C41285E49903FBD58C61C3CE00542C65171E73BD2A423834F7FDCD3F957F898F6270F799DBEEF7689A75D5EBDBF3722DD7FC5E3F016A5B6C044A2E67E80FF2C06ED99B35571C0125FA5DBA178AB8AB6ED82BBF0FF2B73DF7102EC1D575CD20E2D51D4BE574BF2A6FDD4EEBEBEED6EECDADF5C6ED1B2DD8E65A10E7D0F774D871E2F00CCCD5A3281382F71F7C50EF1E0097F39B2EB0E791EEE193951F17183B9BFF5D3E1B26D0378BC61756F8746AA62ADA450268C0A70851E6029537873DE26DBA232BA13BB0FFBE2C47FF65DEEB5ED9EFED1C5D5FBE367FB31B2A995768589B3D2EAA195C07121D3427CB64ABA92B2D91BCF3E5EEEC43F1D76EF29C9E13184F125AD60F48DF86F178A3A228C8BC5FEFDE3BEC4F2827E03F9D0BA0BBEF5A2ABE125B472F90AAB690797B78E75270B2E7D42F1980FC910E03B7F3D58145CFF47F3CF1E2C9A2F82F1669F9D61216762DFD4E93045C39473B4A1529430F29D2D2A22571FF687A9ABBEB6811EB52E27B1EBEBF9D3415E3F7B404AB4728FCF0698027B7D782DD38317387268C0E9780795336DD338489F969DBD55B46899B89106505FF0EA6C668207BC6D6CD401D50B26AAB6D43E4C851C6E7169C3D8C69B37984DEA50A68BCB00033A60867974B13A9F6C0703A3A856757FFCE5351C7A77915373831DC42A9B0F49B128899E364EDDC66260565493942CAAFABD76303E783662EBE7E4E6BA0550C8BECE92594B90D99E1AF376782A49DD660BF5FC246EA78D719423609828DA99024B883A939C3E83597F4BBE7C5552CB5F6F91D505B4FBE9FCD9C56876FB25A77D8BA1C083455AF187BE58468909B4CF265D03C7CB71EF32F16420DF7740D4E3133183A7177DFDF779BF601CDADB211B579B6F3C37E64DA06C04FC1154692C9B621C65FDD4185764B370703B26A67F7ABC51DDA268C611FC6024940B1CA7F29AA960C060B3A92CE8D498080D4ED95529E428A12133EEF92E192D3F3ECC5A9A2B78724EACA582785FE05843128E71A3AAD4C697C0EB7E91AC3F7001222762B9DC2196BBDC39B91DB1849811C1A56135506E484B99626161AD64013220792D6DD5703EBBC174DE9CCD1094FEA1998DAA8D2BA011EA900DC02240DD922A8285A23865F419E1C3041CAC80A8CB1D50611D5CDEA574F6C20410FD0FE62FA603FA6E0A1D96F2BC0D51DDBD29A52C43C845314BAD41B5E186F68524FD687D0E42E675535A11D62111E9F5879FE908A7C9CF3F24F0C045B611DE0E92AA8AF21D89E7F0C04CB232446E4B56628FE0768AEC75DAD9AEC7AECA6C69516F855C9CE12953CE95A2C46F5D4263D183A764E9AB88D587AACAAA5C3EC4BB3EEB7EF0CB4EB7BFEE34BDB3EB9D527AB2E73BAF4D669B8BD9B442F565DF21DB3DBEDBDD05BB2B318AEA38258733D37AFE9C942C629E403C6594553BA7A5DD82CD4F12E6E8B65EBB4CF9DB20886829A3B900822B4F891B42335F1A8C2AE1B7D6BA684C27B01FF5654820BDC502D662136758243DECD892F12617D7CB606CB1A9B458BEDFBD83B353427F875BFFDD837D4675FDDC6999CD728D6D67CDD0B7BB473AEBBB126B375BDAE7F763D0FBBE3F9816057FFB76407FAEA10B3E2BE69528746A87653E43E985E7C259C16D369D917DB2F182BF59DB74DA72C17E2B732E27419EDD252AB7D059B3949A63D5490D5F91B509DB1215DE0A2BB326C25380E84ACA11807B2B2C2A9398923172559AAC45D2B4FEAFEE9F5E74A6D4D38E16BBEDDD01EE4E805B4EFBC60D269BDA3B77386E104C6AAD5A293353DE64D00D10E5547465C22487F1FB6AFC5B2B183AE224D4042D93894E6E8895453AA1C589E08D4B8D12AA49307F188245DF89F9E7616647CEF2D935E15F15C5CEAFAC2C12EC9B7BBC93B2FB77D23F2717D61585D6CF298D010CEAF2A0276F81E66F163AF0C344E6417D13C4C57253FD488CC67CE29299C845F14A1BDDD22429B78BE81562D6F236B71CB5FE9E8A0DB60AF75E18CE7566F572EEC5CC7AC34B94785CE1947122150BCA49965D125CDB1441686786C32B940A3F1E409F80E3EA5011C7B9E2B9EA0C9CE766360513B8CA2C6B2ADFF0C6B3D08C60CD4B9394A3505366BE24ADE826CE53414C52126189CEE6B0D127174C06F21ADE6905D180648BE6324B92D09A76545F4669F02A2815ACB73A2BD28FFFDB35E27BE8C1EFFAD6DC6829B499373AC735DFBAFCC2C5802017DFA08DBBEBAFACD496ADD4CED25FE7DAB2736DD9B9B6EC5C5B76AE2D3BD7969D6BCBDE92DAB2250298008549E38EEBE03F6E683CEB19578F29F3F0A233ADCBC9DAF7D1656A3756A9111C46A0A276161496057CB1C704B00C8DCFE471118BA74B389F0CC3C598BEDEB540B378A5F19A5B597C599DA8971D4B0F33B85836B9FA9F03C25A26674F60D6D57B6FC7024A6B4184D62C427CA18616991A5A00CC446F8C0F1E0EAF75F4D9770BC6DCAE77F78964E5C22304F3F3073333DB4E3076DDFB1505D4B31A8925F59557BAC74DFBDF34C7FCC1F57C0BCEEF973473B2B9F106FC4610593B04EF14E98847A045D895523EE4B55DA0DD925CC9B139508AB7BBA3700B16F8E6B75CB732539F8B16295353184ACF0329625120F87B1B2BC256A06DA319A2B290463B264BA9D46208F4B545409158742A94DAE0EB0C923505518E81855177964227F5468211BD9B0DE86E4D409DB9221866F0361728AC01A4000B001C78F028DB928B7A0B334D39AB40483DC6BEA7488B4D193430252D2B40802C6A99D60A5EFAFB4114B46A3D7FB225BD95A4F86CE59A33F93C93CF33F93C93CF33F93C93CF33F9FC4190CF131A9B0C116B1FAE355014E33C15BC78CA20C4CB7624849164E7A0414EA51FDA7EE4EE31CD3A329E56F05CFDF6EA5F319E47446186B725124F0581EFF7169B87BDC49BDFC5B9490F00C0B24A1A56D4CB4C1CA74468205260BC281DF7320DE50B43A1D54D7874271ADD2A469333CFA0CB001115F0CB40076344F0741E004E8AA053DD9B84BDED9117BD9888F6E1C63AC05E73D799CD24E5EDD66BA74E3293B187C061A4A05F7A98D5DE95AE8082E6DA244544EA2D2995A6E009D7A365A0DEA301EE7875DFF577F33FCD3FDAB59B3A7E7A83A9276F25948139478E931ADA44045A2ABD6ABE006B3A15F7172BAF3EEEAC1F77A71F59FA1284B3AC884E15131551068216B41B2C93F0F9BEF536597BDA4E5F8E00F174512CDC6B6B7B32D36BEE352240B36833DD4762AB0AF0D90B4E1993DC019B24CD9319E5090E201307A16CC6D0E63A4119EB1BABA9821400A15AD9EEAED78890054C03BA1A4283CD52EF321F003141A7A9CF6B81FBF027F53138A415C80D2BA2B7D56FE472D485037A00BC153800AED4C5AA3803ABA0C48E90A066B6300530AC8331BE787B6E01F0C3690170FF353229B048450DD5B2A69DAD40A946864AD284CB2999805873540DDAB4CCE1CD145D3C5CAB151C7B2B3EDE84CDF7BF0CA32A20770DBA5B3439F990304115B456675741CFA2304D9ECB30EEBD18397566B74930FC03002A04CE02179925A06ED859884DA673FAEBBD4A7FAD5CD8C1E838A5572A6A69611A35A2A0B58FA4A435E91ED54CDF8B64D61BE18FF34A790F9A496764F489F5D249268BA9DCC9A64CDE568D74CFEA32F76398B7C21F3930D8D49460AD1F4091BD61C165CD72923EF0C28B4CFA5C16F63A028313B008DA76D29458240B6D0C5003EA9C7C8DBAB496DD1D96855DDC6559D85B2100098F44357860641202204FEB83AA2C66EFBDE4A5F9722EC43A213D2B49978B77F028960E422A889EB6066664CC199CC267C5CFC523AF2A85AD293ADAEB06702919779656A57261B1C0A5442978CA2E2A2FEBCCE85A8AB4949342F915AE34CABE0120C52FA550B906DE664234838060198445890D1ACE4987C62A6284E23A6A95C44C298988111D15A704CA2D819F7605A0253695E8E430A099E19DA6FA71D87156E4B25E0E5DCB7AA418EDAA03D0A7F34FF1FFCF3BB97B36AC47AC7BBB9D5FBDE80B02ABDF3DA7F49C537A96367C4EE939A7F49C537ACE293DE7949EBFB2949E9B8F2A3AE4204D22C09DF07EB37DF766FDC31BCE3C911A760BF8200917C00E13F557B430909493C92126A9F71786EC0242DF6C00A1B762F5E2A09349F1E2BFA7E506A2037DF5F2E9AA0CD63FDC2F832C22BC134056681932C8AA7BE0480111E0B7011626B54F066B4FBB18EB993684B2C8925813CB1DE44A4CDAFA7E48EB57434A1628D1FBCBADF023CE9C3DCC2CEE8CC42342A72A22064AAD0A2C552568B82C677CF60E9CA6DA361C5A8A59ED56376C003E9A2CABAF31CA8D4BA78BDA3770C6BDA54083CC07E37B77F190E9CD87EDC32F874333DEA092DC2A2975329BA2A13B80958896966B222E8A891264F406D0BC5AF08F6035A5C50104045A1ECE8431223305508D9A831B9D673ED30F080899160235D03CC0BF76CC559755A6FF737986B80CD4102403E4838710CA50E84758572944DDC08155DB24A52A956C53C8AC49EAB4CD418F53F3128C0D7047D349D7A22FC67DDAB7C1FF85B63DC6BDE4E7EB154970F17F9C1424BE9C7FBB9EC7477B91FD548769BFF2330F3DF3D0330F3DF3D0330F3DF3D0330F3DF3D03D1C881B6F0CD1904C3BB8C6C2DC0B841502F90C01BF59C5C081C61E09EBEC67F1EBFDBC07E2E5D563EAA5EE09CEB4F76AF1401FBC32AD3617C3DEF3363F5ACDFDD8D289FA5B3A0077287CA6F3287E399C0D359C22B5828C7A62D7F3555075BBD93F6A9516D1CED3771D963F06DEEECF5C1ECAA2BDF25A0328C1C5625E103730FD00114D806EC05F70E9521FDAF4861FE3565FF6D4C6EB1A9747CB5B46EF108A299FD707C2690D530DF8096371DEA8D0F0B8BC71CB4F28931E3FF6BDACEBD18118C351101BA35B898AA08670064FA913F721065EDCDDB1B17E3C2F1DBE199C26360683841F468893F0D0DAC110F3EA79103B52076E50CD573D44659AFF76D15359E90C9E77EFAC97F6DD77513001A8196018CE1AF0B71F3006D75700265C3319482A7BB59E2CB895866CD61DAD240BEEFECE1B93D89E41DD8F3EE85B5971E109C412A81ABC06713645501129C08AA54FAE1A70075D664A57C0EB6618A8191D7E9A1CF0543F015A20BA9A06B604E58A55190BCC07CC4CED858136812A33AB464B1E1D40AC0A3305E8E4089266433BC3C00AF0E3741022103890A12EA2C84D565C4B0B92328444A9887CD4113250E5894831E868B228A51CCE8A3FB9EE0C7CF5AF3D69F0CC8DCFDCF8CC8DCFDCF8CC8DCFDCF8CC8DCFDCF8D5B931624C12C12046566A2DD59CC3BCC74251D5D6D6B4524372D92B72E39CA1852E668409841D4DF6E0336CA46615A974187CBC9CB9F1991BAFA86684EF6884F3B353042D12C0105C880010028A10394B79E6C677517A92BCE9FEC4DA42B899CEDA13701140B4B2A450AB1ACE723B73E337C58DC7808098592387F7B72111DDEC21C0102776A09DCAC9562DBE08846D0A95490542DEDA4858B08BC05C8EF294E12D921E0AEF3518B6CD1037954F51B306D87B02E2CB197CCC02A14BCA99E6A3FE985DFA0346024E46A54B860A35BCAECC1B0015EFB535B9480D9F329C96BCD58F4D45B5FD921B9AB898082D25B04C4FC67CE0F15C22D65B6BC0FFC1A16ADBA71E5B9F79DD5BF7FB7E7AF6A35ECAF768363418ED1AD3F355368E0E7C89A0443F7CBB38857BA8005F730DAFB991ECDF1E7316F521F379385112DB9DD14E656A51249E81D7B8A5251DEAB912A8BD12A880F3CA7180E130149DAC44B0A940B79645DC9448D6A0F1269141D101DC0EF12F29E2AD9817E10BF05EDEDBE565EB33679B9065F5D8694227CBA62F5487B1EB14EABBD415B10E5F9650E9C182E688F5F73E4EA30E99DC3BD4285752A1CACA1604B55C254F28B3A1D65DA9810D183E34D0DD8ADBD665BC7EC19D9431ED7BE27DD4297108B83CCCB06FD7951D32FF77A778DC049E5A494C14A1689511437495D6A93522B533B5C6E1E0D59EB4466BC1FFB23D1F73DB0537289E715980941274A733A51AAD797B8C24D4986DA9DCF8BD3171CB13E9B4B94EADA04754CEFEAB55451CCF9C7BB38A285715712CEA1C5590A9776E53536FEC5D749CA61E20B0C335750703D8A9A93206C03D2399692252832F4EEBF295992273744529A3CBD0836F819D1FAFEF4B5C7FB05F3315F86A6D92786FA5A62A0A51A19AC654F6B934037F1CF7BAC43FF4F6692F7BB6E7B309E95F1C7E3EED92733974381987361C98B80FB091AABF5550ED90C9BC3BFF16B434169601859185FC5B24A048AD5832D749521D647D67F5C88ADD275BAD9C6BB1F530ABADEA1478AB3135C16CA525C782E09E3019AC89D0A44B4DF2B637F9FC93EED19EF46E5AEBDDE9771FC9393D199C1C1D9CE1A479DFC068EF32DB78CDCFFD69B4071AF01F47074C49CF432DE8F2CCB0099C5BFDFE9F4703D83C78ACF718C02094178995A4A8C39DE050370273817ECF958CC346A03A5E7F932AAA458380AC0AA53E17454C15CCDED329CA29224EAB59C10072059FB4B4E7A6215546DB8FB84821A2FB9270830543BE8BC78BEA75825BC43D2DC56EC19201E9E6050A5E354F59DA3B7CFCA1D67BBD5070B23739C496EE2E06B9CA35F7DE334C2BEDA344C5300385715D7CC6D08D737C75156A6D9178CF5917DBDAECDC6563948FE75F8CCD7B1747916C1DC56B6ED0F4F307C36F8E44B13CD5EA6B6025185A744AA4FF30C40C18649C173E0E154554BDF155F7A6CF16F532DBB0ECEECB6E58E5B1D95B6D052B02AE80520428BD4FB3A22C2260CD4DA9BD8E7E276EE888E0F1A45DDDDE0AA46F2E86FE7B934EAA972B5DD65EB34C8F5BD939600EEF0E2E149D83E5F02C863A736ACAD809BE5816B9685A78C7ADEC81E9FF748DA018F6F5E6DACEFA87FB95068F0B4AE442A5579EF252681BD0D046620E1CFE46C7B4176C7EB250984557C441136653D478397F42993DA4196B067E41AAF172D0A9AE6DFD5F0362A0CB9F91

   bvb

20 — 08.10.19 — 13:38

Имеет ли смысл пытаться делать ТиИ ?

   Волшебник

21 — 08.10.19 — 13:40

Надо всё сносить и разворачивать сервер заново.

   Волшебник

22 — 08.10.19 — 13:40

переустанови 1С-сервер

   bvb

23 — 08.10.19 — 13:46

(21) Мы брали ДТ создавали базу на абсолютно другом сервере 1С предприятия и другом СКЛ

Делали это на двух разных серверах и разных платформах

После разворачивания повалилились все остальные базы до этого нормально работающие .

У все появилась ошибка d:jenkins

Помогло только экстренное удаление базы через консоль кластера

   bvb

24 — 08.10.19 — 13:50

Я даже не понимаю в какую степь копать :

1. Обновление (но как конфигурация может весить сервер ?)

2. Расширение (аналогично)

3. Публикация (средствами 1С ее нет)

4. Проблемы сервера и платформы (почему только с этой базой ?)

   H A D G E H O G s

25 — 08.10.19 — 14:31

Готов посмотреть, если будет доступ к серверу 1С, SQL

   H A D G E H O G s

26 — 08.10.19 — 14:31

liveups@yandex.ru

   bvb

27 — 08.10.19 — 15:10

Отписался

  

Очевидно

28 — 08.10.19 — 16:16

(0) была на прошлой неделе такая проблема, правда на тестовом сервере (20 тестовых баз по 500 гб). После каких-то действий стороннего разработчика (он упорно говорит что ничего не делал), начал падать рабочий процесс, в дамп. Перенес базу на отдельный кластер для теста, начала падать процесс нового кластера. Проблема решилась восстановлением базы SQL из SQL бэкапа (Благо тестовый сервак был). Переподключение не помогало, перезапуск сервака непомогал, чистка всех кэшей не помогала, видимо какой-то сбой в связке 1С Сервер — MSSQL.

(1c 8.3.14.1779, MSSQL 2008 r2)

есть сервер 1с он стоит 192.168.0.204 там же стоит sql
есть сервер терминалов 192.168.0.2 на нем клиен 1с и там всё гуд
(тут же стоит ключ сетевой )
но есть ещё 1 сервер терминалов 192.168.11.111 на нем 1с долго запускается
иногда вообще не стартует выпадая с ошибкой

0
Sys Name_0: LUBGRSRV
Sys Type_0: System Product Name, x64-based PC
Phis Mem_0: 4109426688
BIOS_0: American Megatrends Inc., 20101029000000.000000+000, 0402 , 2, 6
CPU_0: CPU0, Intel64 Family 6 Model 37 Stepping 5, 64, 64, 512, 3200, BFEBFBFF00020655, 9477, LGA1156
NET_0: [00000000] WAN Miniport (SSTP), ROOTMS_SSTPMINIPORT000
NET_1: [00000001] WAN Miniport (IKEv2), ROOTMS_AGILEVPNMINIPORT000
NET_2: [00000002] WAN Miniport (L2TP), ROOTMS_L2TPMINIPORT000
NET_3: [00000003] WAN Miniport (PPTP), ROOTMS_PPTPMINIPORT000
NET_4: [00000004] WAN Miniport (PPPOE), ROOTMS_PPPOEMINIPORT000
NET_5: [00000005] WAN Miniport (IPv6), ROOTMS_NDISWANIPV6000
NET_6: [00000006] WAN Miniport (Network Monitor), ROOTMS_NDISWANBH000
NET_7: [00000007] Сетевая карта Realtek RTL8168D/8111D Family PCI-E Gigabit Ethernet NIC (NDIS 6.20), BC:AE:C5:BE:C8:BE, PCIVEN_10EC&DEV_8168&SUBSYS_83A31043&REV_034&FD5DF6&0&00E5
NET_8: [00000008] Адаптер D-Link DFE-520TX PCI Fast Ethernet, 00:1B:11:B2:FF:21, PCIVEN_1106&DEV_3106&SUBSYS_14051186&REV_8B4&3A440333&0&08F0
NET_9: [00000009] WAN Miniport (IP), ROOTMS_NDISWANIP000
NET_10: [00000010] Kerio Virtual Network Adapter, 44:45:53:54:4F:53, ROOTKVNETID000
NET_11: [00000011] RAS Async Adapter, 20:41:53:59:4E:FF, SW{EEAB7790-C514-11D1-B42B-00805FC1270E}ASYNCMAC
DISK_0: KINGSTON SV300S37A120G ATA Device, IDEDISKKINGSTON_SV300S37A120G__________________541ABBF05&2D5A9710&0&0.1.0, 512, 63, 14593, 255, 3721215, 234436545, 120031511040
DISK_1: ST3500413AS ATA Device, IDEDISKST3500413AS_____________________________JC45____5&2D5A9710&0&0.0.0, 512, 63, 60801, 255, 15504255, 976768065, 500105249280
PART_0: Disk #1, Partition #0, 32256, 234436482, 120031478784
PART_1: Disk #0, Partition #0, 32256, 102398247, 52427902464
PART_2: Disk #0, Partition #1, 52427934720, 874353690, 447669089280
VIDEO_0: Стандартный VGA графический адаптер, PCIVEN_8086&DEV_0042&SUBSYS_83831043&REV_183&11583659&0&10
VIDEO_1: Radmin Mirror Driver V3, ROOTDISPLAY000′
36:01.426004-0,EXCP,2,process=1cv8c,OSThread=4660,Exception=0874860b-2b41-45e1-bc2b-6e186eb37771,Descr=’srcbackbassrclicensebaseimpl.cpp(6711):
0874860b-2b41-45e1-bc2b-6e186eb37771: Ошибка программного лицензирования. Превышено максимальное количество пользователей, разрешенное файлом программной лицензии:

file://C:/ProgramData/1C/licenses/20191112145717.lic

File=d:jenkinsci_builder2windowsbuild2platformsrcbackbassrclicensebaseimpl.cpp(5435)’
36:01.426006-0,EXCP,1,process=1cv8c,OSThread=4660,Exception=9db1fa37-b455-4f3f-b8dd-7de0ea7d6da3,Descr=»srcmngclnsrcinfobaseregistry.cpp(1360):
9db1fa37-b455-4f3f-b8dd-7de0ea7d6da3: Ошибка при выполнении файловой операции ‘C:ProgramData1C1CEStartibases.v8i’. Неожиданный вызов метода ‘FileObject::setEOF’: d:jenkinsci_builder2windowsbuild2platformsrccoresrcfiles.cpp(643): Неожиданный вызов метода ‘FileObject::setEOF’»
36:01.598000-0,CONN,2,process=1cv8c,OSThread=4660,Txt=’addrBelongsToThisComputer2, address=s01, result=false’
36:01.598001-0,CONN,2,process=1cv8c,OSThread=4660,ClientID=1,Protected=1,Txt=’Connected, client=(2)192.168.11.111:13270, server=(2)192.168.0.204:1541′
36:01.598002-0,CONN,2,process=1cv8c,OSThread=4660,Txt=’Ping direction opened: address=192.168.0.204:1541,pingTimeout=15000,pingPeriod=3000,lastSentTs=155357886,lastReceivedTs=155357886,lastReceivedTestTs=,directionID=df684d5d-4d23-4e4a-82d5-ff34ae505e92′
36:01.598003-0,CONN,2,process=1cv8c,OSThread=4660,Txt=’Connection added to ping direction: address=192.168.0.204:1541,pingTimeout=15000,pingPeriod=3000,lastSentTs=155357886,lastReceivedTs=155357886,lastReceivedTestTs=,clientID=1′
36:01.598004-0,CONN,2,process=1cv8c,OSThread=4660,Txt=Clnt: MyUserName1: Администратор@LUBGRSRV
36:01.879001-0,CONN,2,process=1cv8c,OSThread=4660,Txt=Clnt: DstUserName1: S01USR1CV8 StartProtocol: 0 Success
36:01.910001-0,CONN,2,process=1cv8c,OSThread=4660,Txt=Clnt: MyUserName2: LUBGRSRVАдминистратор
36:02.050001-0,CONN,2,process=1cv8c,OSThread=4660,Txt=’Connection removed from ping direction: address=192.168.0.204:1541,pingTimeout=15000,pingPeriod=3000,lastSentTs=155357886,lastReceivedTs=155357886,lastReceivedTestTs=,clientID=1′
36:02.050002-0,CONN,2,process=1cv8c,OSThread=4660,Txt=’Ping direction closed: address=192.168.0.204:1541,pingTimeout=15000,pingPeriod=3000,lastSentTs=155357886,lastReceivedTs=155357886,lastReceivedTestTs=’
36:02.050003-0,CONN,2,process=1cv8c,OSThread=4660,Txt=’Ping direction statistics: address=192.168.0.204:1541,pingTimeout=15000,pingPeriod=3000,period=452,packetsSent=0,avgResponseTime=0,maxResponseTime=0,packetsTimedOut=0,packetsLost=0,packetsLostAndFound=0′
36:02.050004-515003,CONN,1,process=1cv8c,OSThread=4660,ClientID=1,Txt=Outgoing connection closed
36:02.113000-0,CONN,2,process=1cv8c,OSThread=4660,ClientID=2,Protected=1,Txt=’Connected, client=(2)192.168.11.111:13273, server=(2)192.168.0.204:1567′
36:02.113001-0,CONN,2,process=1cv8c,OSThread=4660,Txt=’Ping direction opened: address=192.168.0.204:1567,pingTimeout=15000,pingPeriod=3000,lastSentTs=155358401,lastReceivedTs=155358401,lastReceivedTestTs=,directionID=df684d5d-4d23-4e4a-82d5-ff34ae505e92′
36:02.113002-0,CONN,2,process=1cv8c,OSThread=4660,Txt=’Connection added to ping direction: address=192.168.0.204:1567,pingTimeout=15000,pingPeriod=3000,lastSentTs=155358401,lastReceivedTs=155358401,lastReceivedTestTs=,clientID=2′
36:02.113003-0,CONN,2,process=1cv8c,OSThread=4660,Txt=Clnt: MyUserName1: Администратор@LUBGRSRV
36:02.331001-0,CONN,2,process=1cv8c,OSThread=4660,Txt=Clnt: DstUserName1: S01USR1CV8 StartProtocol: 0 Success
36:02.362001-0,CONN,2,process=1cv8c,OSThread=4660,Txt=Clnt: MyUserName2: LUBGRSRVАдминистратор
36:02.783001-0,CONN,2,process=1cv8c,OSThread=4660,Txt=Clnt: MyUserName1: Администратор@LUBGRSRV
36:02.815001-0,CONN,2,process=1cv8c,OSThread=4660,Txt=Clnt: DstUserName1: S01USR1CV8 StartProtocol: 0 Success
36:02.846001-0,CONN,2,process=1cv8c,OSThread=4660,Txt=Clnt: MyUserName2: LUBGRSRVАдминистратор
36:03.205002-0,EXCP,2,process=1cv8c,OSThread=4660,Exception=580392e6-ba49-4280-ac67-fcd6f2180121,Descr=’srcvrscoresrcvresourcesessionimpl.cpp(529):
580392e6-ba49-4280-ac67-fcd6f2180121: Неправильное имя пользователя или пароль
Ошибка при выполнении запроса POST к ресурсу /e1cib/login:’
36:12.237000-0,CONN,0,process=1cv8c,OSThread=4160,Txt=’Ping direction statistics: address=192.168.0.204:1567,pingTimeout=15000,pingPeriod=3000,period=10124,packetsSent=3,avgResponseTime=16,maxResponseTime=16,packetsTimedOut=0,packetsLost=0,packetsLostAndFound=0′
36:14.249001-0,SCOM,3,process=1cv8c,OSThread=4660,Func=’setSrcProcessName(RHostRoot,RHostRoot)’

Оглавление

  1. Автоматизация тестирования конфигураций «1С»
    • Выбор инструмента — Jenkins, TeamCity, Bamboo и Travis
  2. Концепция работы Jenkins
    1. Первый способ: Freestyle project
    2. Второй способ: Pipeline
  3. Кейсы применения Jenkins
    1. Сборка комплектов
    2. Запуск автоматических тестов
    3. Проверка качества кодовой базы
  4. Так зачем нужен Jenkins в разработке «1С»?

Процессы разработки бизнес-приложений на платформе «1С:Предприятие» со временем усложняются. Кроме того, разработчики занимаются задачами отличными от разработки, которые решать могут только они.

Например, становится необходимым проводить дымовое тестирование некоторых функций приложения, осуществлять сборку комплектов поставки для выпуска приложения. Необходимо также обеспечивать достаточный уровень качества исходного кода приложений, для упрощения дальнейшего его сопровождения и развития.

Дымовое тестирование — минимальный набор тестов на явные ошибки. «Дымовой тест» обычно выполняется программистом; не проходившую этот тест программу не имеет смысла отдавать на более глубокое тестирование.

Эти процессы часто повторяются на разных этапах жизненного цикла приложения, и, как правило, представляют собой набор рутинных операций, слабо связанных с основной деятельностью разработчика — разработкой новых функций приложения. Возникает естественное желание автоматизировать эти процессы, дабы повысить эффективность команды разработки.

Выбор инструмента —  Jenkins, TeamCity, Bamboo и Travis

В общем виде автоматизация любого процесса сводится к поэтапному выполнению сценариев, имитирующих работу разработчика, с помощью программы-исполнителя. Как раз такие программы-исполнители представлены целым классом программных продуктов automation server (сервер автоматизации).

Выбор сервера автоматизации, в большинстве случаев, не является принципиальным решением, так как основная логика заключается именно в сценариях, поэтому универсального ответа на вопрос «какой сервер автоматизации использовать?» не существует. Более того, сервера взаимозаменяемы, так как решают одну задачу и, соответственно, имеют общие фундаментальные архитектурные шаблоны.

Таким образом критерии выбора сервера автоматизации для наших задач определялись сложившейся инфраструктурой и процессами в команде разработки.

Основными критериями при выборе сервера автоматизации были:

  • Работа под Windows.
    Так как в нашем подразделении сервера и администраторы работают преимущественно с этой операционной системой, это упростит развертывание и сопровождение.
  • Интеграция с git для перехода на EDT в будущем.
  • Распределенная архитектура рабочих процессов.
    Предпочтительно сразу заложить фундамент для масштабирования. Распределенная архитектура, позволяет наращивать пропускную способность системы, увеличивая количество исполнителей. Концепция распределения задач по исполнителям будет описана далее.
  • Хостинг на собственных серверах.

Так как задачи будут использовать внутренние ресурсы, развертывание на своих мощностях позволит полностью контролировать доступ к ресурсам.

Сравнение различных инструментов можно представить в виде таблицы. Оценка документации и удобства выполнялась по 5-ти бальной шкале.

Jenkins TeamCity Bamboo Travis
ОС Windows, Linux, macOS, any Unix-like Windows, Linux, macOS, Solaris, FreeBSD Windows, Linux, macOS, Solaris Linux, macOS
Поддержка git да да да Только GitHub
Распределенная архитектура да да да да
Документация и поддержка 3 4 4 1
Хостинг Облачный, собственный Собственный Собственный, облако BitBucket Облачный, собственный
Удобство использования 5 4 4 5
Лицензия MIT Проприетарная Проприетарная MIT

С полным списком инструментов можно ознакомиться тут en.wikipedia.org/wiki/
Comparison_of_continuous
_integration_software.

В нашем случае выбор пал на Jenkins. Он покрыл все наши требования, может интегрироваться практически с любой внешней программой. Плагины Jenkins охватывают пять областей: платформы, пользовательский интерфейс, администрирование, управление исходным кодом и, наиболее часто, управление сборкой.

Из минусов можно выделить устаревший и не всегда интуитивно понятный пользовательский интерфейс.

Концепция работы Jenkins

Jenkins — это автономное приложение на Java, которое может работать под Windows, Mac OS X и другими Unix-подобными операционными системами.

Jenkins можно запускать как в режиме единого сервера, так и в распределенном режиме, когда существует главный узел (master) и несколько подчиненных узлов (slave). В рамках подчиненного узла может существовать несколько исполнителей (executor), которые непосредственно выполняют поступающие задачи.

Запуск задачи может выполняться пользователем из веб-интерфейса, внешним приложением через http-интерфейс, при возникновении определенных событий (triggers). При завершении задачи, как правило, нужно оповестить ответственного, Jenkins позволяет настроить оповещения (notifications) через различные каналы коммуникаций (почта, мессенджер, http-запрос).

Концепция работы Jenkins

При поступлении задачи Jenkins ставит её в очередь исполнения и пытается найти свободного исполнителя, и если исполнитель найден, то задача передается ему для выполнения.

Основной единицей работы в Jenkins является задача (job), задача содержит в себе ряд этапов (stage), которые состоят из шагов (step). Под задачей подразумевается целостный набор действий, приводящий к получению конечного результата.

Например, в качестве задачи мы получаем файлы сборки для отправки в фирму «1С» при выпуске новых версий типовых отраслевых конфигураций. Этапы и шаги можно настраивать произвольно, в зависимости от поставленной задачи.

Этапы могут быть независимыми и выполняться параллельно на разных свободных исполнителях. Такой подход называется конвейер (pipeline).

Концепция работы Jenkins

На уровне шагов, как раз описывается логика выполняемых действий в виде различных сценариев. Передача параметров в сценарии выполняется с помощью установки переменных окружения.

Переменные окружения — именованные переменные, содержащие текстовую информацию, которую могут использовать запускаемые программы. Такие переменные могут содержать общие настройки системы, параметры графической или командной оболочки.

Этапы задачи можно выполнять параллельно на разных исполнителях, если этого требует задача. Jenkins позволяет по-разному описывать этапы и шаги задачи, мы используем два основных способа.

Первый способ: Freestyle project

Основной и наиболее универсальный тип задач в Jenkins — Freestyle project.

Данный тип проектов может использоваться для любых автоматизируемых задач. Это основной способ описания для задач сборки комплектов типовых отраслевых конфигураций. Описание шагов выполняется в пользовательском интерфейсе «накликиванием» различных типов шагов.

В наших сценариях в основном используются шаги с типом «Команда Windows».

Концепция работы Jenkins

Второй способ: Pipeline

Это тип задачи в Jenkins, с помощью которого мы можем описать задачу в виде специального файла (Jenkinsfile).

Такой подход является более гибким в сравнении с Freestyle описанием, так как описание конвейера выполняется на специальном декларативном языке (jenkins.io/doc/book/pipeline/syntax/). Язык предоставляет более широкие возможности, в том числе параллельное распределение этапов задачи на разных исполнителях. Также описание конвейера можно версионировать и централизованно редактировать в git.

Концепция работы Jenkins

Таким образом Jenkins позволяет пошагово выполнять любые приложения командной строки, сценарии операционной системы, а затем получать и агрегировать результат их выполнения. Этот принцип используется для решения задач автоматизации в «1С» разработке.

Кейсы применения Jenkins

Сборка комплектов

Задача сборки и концепция решения

Сборка комплектов типовых отраслевых решений представляет из себя процесс компоновки конфигурации, демонстрационной базы, дополнительных внешних обработок, расширений, описаний механизмов в комплект поставки и обновления и публикацию комплекта на публичных ресурсах для скачивания конечными пользователями.

Состав материалов в комплекте может различаться для разных продуктов, однако в общем процесс можно разделить на следующие этапы:

  • Взять предыдущие файлы поставки с общего ресурса.
  • Подключиться к хранилищу разработки, создать файлы поставки и обновления на базе предыдущих поставок.
  • Обновить демонстрационную базу текущим файлом поставки.
  • Прогнать дымовые тесты (открытие форм, корректность объединения некоторых объектов).
  • Выгрузить новую версию демонстрационной базы.
  • Подготовить сопроводительные материалы.
  • Собрать комплекты поставки и обновления.
  • Выложить собранные комплекты и материалы.

Для автоматизации выполнения этих операций система «1С:Предприятие» предоставляет интерфейс командной строки (its.1c.ru/db/v838doc/
bookmark/adm/TI000000493). Например, операция создания базы и подключения её к хранилищу для получения последней версии конфигурации выглядит примерно так:

Кейсы применения Jenkins

Здесь выполняются 2 команды и 3 операции: создание базы, подключение к хранилищу и обновление конфигурации базы данных. Команды объединяются символом &&, который прерывает выполнение следующей команды, если код возврата предыдущей был не равен 0. То есть, если базу создать не удалось, подключаться к хранилищу не нужно.

Вторая команда выводит детали процесса обновления в файл report. Сценарий выглядит довольно громоздко, учитывая, что выполняется простейшая операция. А процесс сборки состоит из десятков подобных операций. Более того, после каждой операции желательно проверить код возврата и увидеть содержимое файла report. Изначально мы использовали именно такой подход:

Кейсы применения Jenkins

Конвейер был реализован на базе Freestyle-задачи. Каждый шаг конвейера представлял собой batch-сценарий, в котором последовательно запускался процесс «1С:Предприятия» в разных режимах. Это рабочий сценарий, он справляется с задачей сборки, но такой сценарий довольно громоздкий и кажется избыточным.

Сопровождать такой сценарий трудоемко:

  • Сложно следить за изменениями в шагах и задачах Jenkins при исправлении ошибки или добавлении новых функций.
  • Не все сотрудники команды разработки знакомы с синтаксисом batch- сценариев.

Для упрощения сопровождения подобных сценариев было принято решение использовать OneScript (oscript.io) предоставляющий:

  • Среду исполнения текстовых сценариев на языке «1С».
  • Механизм построения консольных приложений, написанных на языке «1С».

На OneScript было реализовано консольное приложение — autoMate, скрывающее громоздкие конструкции batch-сценариев за сокращенным представлением команд, а также позволяющее настраивать общие параметры окружения сборки для каждой конкретной задачи единообразно.

Приложение позволяет хранить файлы сценариев в файлах на диске, автоматически загружая их при выполнении. Это позволяет редактировать команды приложения отдельно от самого приложения. Например, при вводе в терминале интерпретатора командной строки команды:

auto <ИмяКоманды> <Параметры команды>,

приложение autoMate пытается найти в указанном корневом каталоге файл сценария определяющий команду с именем <ИмяКоманды> и передать управление коду, определенному в этом файле. Параметры командной строки пробрасываются в сценарий:

Кейсы применения Jenkins

auto — имя приложения, зарегистрированное в системе. Можно использовать полное имя autoMate.

В теле процедуры команды, в свою очередь можно использовать любые конструкции языка «1С». Есть встроенный модуль, упрощающий работу с платформой «1С»:

Кейсы применения Jenkins

Для добавления команды достаточно создать процедуру с аннотацией &Команда в любом файле корневого каталога команд. Это возможно сделать без пересборки приложения, так что хранить команды можно в системе контроля версий и обновлять перед исполнением задачи в виде обычных текстовых файлов. Подключение и исполнение таких команд к приложению выполняется «на лету».

Приложение предоставляет объектную модель для встраивания в другие сценарии и набор команд для сборки комплектов, предоставляя возможность встраивания в другие сценарии:

Кейсы применения Jenkins

Команды загруженные в контекст приложения доступны для использования внутри объекта приложения, таким образом можно собирать более сложные сценарии на основе атомарных команд:

Кейсы применения Jenkins

Объединив приложение autoMate с принципом конвейера задачи Jenkins, мы значительно сократили сложность сопровождения сценариев сборки:

Кейсы применения Jenkins

Команды стали короче и понятнее. Конечно, сложность не исчезла, она была скрыта в сценариях на языке «1С».

Использование в виде декларативного описания конвейера, конечно тоже возможно, вот фрагмент файла описания:

Кейсы применения Jenkins

Окружение приложение можно настраивать через специальный файл, содержащий значения переменных окружения:

Кейсы применения Jenkins

Таким образом можно использовать одни сценарии сборки на в разных задачах сборки, настраивая сценарии без их изменения.

Пример работы конвейера сборки

Рассмотрим пошагово процесс настройки и исполнения сценария сборки очередного комплекта сборки. Для упрощения будем использовать задачу со свободной конфигурацией (Freestyle-проект).

Предположим, имеется конфигурация, сборку которой будем настраивать. Разработка конфигурации ведется на хранилище конфигураций, версия платформы 8.3.12.

История хранилища разработки выглядит так:

Кейсы применения Jenkins

Последний собранный комплект имел номер версии 1.0.1.9, необходимо собрать очередной комплект версии 1.0.2.3.

Структура каталога исходных материалов выглядит так:

Кейсы применения Jenkins

Исходные материалы расположены на внутреннем сервере разработки. Рассмотрим настройки файла settings:

Кейсы применения Jenkins

Поскольку сборка будет выполняться на другом сервере все пути к каталогам и файлам являются сетевыми.

Ответственный сотрудник через веб-интерфейс Jenkins стартует процесс сборки, если необходимо указывает некоторые параметры в диалоге:

Кейсы применения Jenkins

Далее Jenkins вызывает команды:

  • Сперва нужно получить служебные файлы в рабочий каталог сервера сборки:

    Кейсы применения Jenkins

  • Далее сформируем переменные окружения для сеанса сборки, это можно сделать с помощью встроенной команды:

    ККейсы применения Jenkins

    Эта команда создает на основании файла настроек batch файл с установкой значений переменных окружения, для исполнения перед последующими шагами сценария.

  • Получаем версии предыдущих поставок, для которых нужно создать файл обновления конфигурации:

    Кейсы применения Jenkins

  • Создаем новую рабочую базу и подключаемся к хранилищу:

    Кейсы применения Jenkins

Как видно, команда не требует большого количества параметров, практически все параметры определены в окружении. Однако, на время вызова их, конечно, можно переопределить.

Для примера ниже приведен полный текст команды make-workbase:


#Использовать "../../lib/Помощник"

Перем ПутьДляЗапуска;
Перем ОпцииВызова;

&Команда(
Псевдоним = "make-workbase",
Раздел = "Композитные команды",
Подсказка = 
"	Создание рабочей информационной базы, с получение cf из хранилища или из файла конфигурации
|
|	Опции:
|	 *--commit[-c] - номер закладки хранилища от которой выполняется формирование рабочей базы.
|					 Перегружает переменную среды ```target.repo_commit``` на время вызова
|	 *--file[-f]   - путь к файлу конфиуграции, на основе которого нужно создать базу.
|					 Если параметр указан, он перегружает переменную среды ```srt.cf.path```",

Пример = "auto make-workbase",
СОпциями = Истина,
ИспользуетКонтекстПриложения = Истина
)
Процедура Выполнение(Опции = Неопределено, ПриложениеКоманднойСтроки = Неопределено) Экспорт

	ПутьКПлатформе   = ПолучитьПеременнуюСреды("env.platform.root");
	ВерсияПлатформы  = ПолучитьПеременнуюСреды("env.platform.ver");
	ПутьДляЗапуска   = ОбъединитьПути(ПутьКПлатформе, ВерсияПлатформы, "bin1cv8.exe");
	Хранилище        = ПолучитьПеременнуюСреды("src.repo.connection");	
	ВерсияХранилища  = ПолучитьПеременнуюСреды("target.repo_commit");

	Если НЕ ЗначениеЗаполнено(ВерсияХранилища) Тогда
		ВерсияХранилища = 0;
	КонецЕсли;

	ВерсияХранилища = Помощник.ОдноИзЗначений(
		Опции,
		"--commit | -c",
		ВерсияХранилища
	);

	ФайлКонфигурации = ПолучитьПеременнуюСреды("src.cf.path");
	ФайлКонфигурации = Помощник.ОдноИзЗначений(
		Опции,
		"--file | -f",
		ФайлКонфигурации
	);

	ЗагрузитьКонфигурациюИзФайла = ЗначениеЗаполнено(ФайлКонфигурации);

	КонвейерКоманд = Новый Массив();
	КонвейерКоманд.Добавить(
		"create-db work.database -f"
	);
	
	Если ЗагрузитьКонфигурациюИзФайла Тогда
		КонвейерКоманд.Добавить(
			СтрШаблон(
				"load-cf work.database ""%1"" -upd",
				ФайлКонфигурации
			)
		);
	Иначе
		КонвейерКоманд.Добавить(
			СтрШаблон(
				"load-repo work.database ""%1"" -rap=src.repo. -c=%2 -upd",
				Хранилище,
				ВерсияХранилища
			)
		);
		
	КонецЕсли;

	ПриложениеКоманднойСтроки.Интерпретировать(
		СтрСоединить(КонвейерКоманд, Символы.ПС)
	);

КонецПроцедуры

Скачать

  • На базе последней версии хранилища и предыдущих поставок создаем новые файл поставки и файл обновления конфигурации:

    Кейсы применения Jenkins

  • После чего загружаем и обновляем демонстрационную базу:

    Кейсы применения Jenkins

    Концепция понятна, каждую команду рассматривать не станем.

  • Последним шагом размещаем итоговые материалы на внутреннем сервере и Jenkins отправляет оповещение на почту ответственному.

В веб-интерфейсе Jenkins всегда можно увидеть статус выполняемого этапа и шага:

Концепция работы Jenkins

Таким образом была решена задача автоматизации сборок при выпуске очередных релизов типовых конфигураций.

Запуск автоматических тестов

В данном разделе мы не стремимся рассмотреть технологии тестирования, ограничиваясь демонстрацией взаимодействия с сервером автоматизации.

Задача запуска автоматического тестирования сопровождается рядом постоянно выполняемых подготовительных операций. Перечень этих операций сильно разниться в зависимости от тестируемого участка конфигурации, вида тестов и ожидаемого результата, но в общем можно выделить следующие операции:

  • актуализация состава тестов;
  • развертывание информационной базы для тестирования;
  • выполнение тестовых сценариев;
  • подготовка отчета по результатам тестирования.

Для упрощения жизни тестировщикам и разработчикам эти операции мы будем автоматизировать. Рассмотрим сценарий тестирования консистентности ролей в «Альфа-Авто: Автосалон+Автосервис+Автозапчасти Корп, редакция 6».

При разработке конфигурации постоянно приходится проверять, правильно ли настроены роли, отключено ли интерактивное удаление, назначены RLS и нет ли ролей, дающих доступ к избыточно большому количеству объектов.

Ролей много, вручную отслеживать правильность их настройки трудоемко. Поэтому было принято решение автоматизировать процесс.

Для реализации тестов использовали продукт Vanessa-ADD. Следует заметить, что существует много продуктов такого класса. Например Vanessa-Automation, Tester, 1С:Сценарное тестирование. Причиной выбора продукта Vanessa-ADD явилось то, что он первым попался в руки специалиста и был получен в короткое время результат. Для реализации проверки консистентности ролей потребовались только юнит-тесты, так как нужно было только программное взаимодействие с конфигурацией.

Юнит-тестирование — процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы, наборы из одного или более программных модулей вместе с соответствующими управляющими данными, процедурами использования и обработки. Идея состоит в том, чтобы писать тесты для каждой нетривиальной функции или метода. Это позволяет достаточно быстро проверить, не привело ли очередное изменение кода к регрессии, то есть к появлению ошибок в уже протестированных местах программы, а также облегчает обнаружение и устранение таких ошибок.

Vanessa-ADD представляет собой обработку-исполнитель, которая умеет запускать внешние обработки-тесты, поддерживающие определенный программный интерфейс.

В методе ЗаполнитьНаборТестов() обработки-теста необходимо перечислить список имен экспортных процедур из этой же обработки-теста. Эти процедуры становятся шагами тестового сценария, которые будут вызваны при исполнении тестовой обработки. Если при выполнении шагов не возникло ошибок/исключений, тест считается пройденным, иначе проваленным.

Запуск автоматических тестов

Роли разбили на группы по метаданным и на каждую из групп реализовали обработку-тест. А сами обработки сохранили в git для версионирования и отслеживания истории изменения. Получился такой набор обработок:

Запуск автоматических тестов

Данные тесты можно выполнять автоматически и вручную. Ручной запуск обычно используют для процесса отладки. Загруженные в исполнитель тесты выглядят следующим образом:

Запуск автоматических тестов

Реализация конвейера тестирования

Конвейер был реализован на базе Freestyle-задачи. Для взаимодействия с «1С:Предприятием» использовали интерфейс командной строки.

Запуск был настроен по расписанию каждую ночь в пять утра. Для этого в параметре задачи «Запускать периодически» настроим расписание запуска в формате cron 0 5 * * *.

Формат cron — пять чисел, разделенных пробелом или табом в порядке:
Минуты (0–59) Часы (0–23) День месяца (1–31) Месяц (1–12) День недели (0–7)
Где:
*  — Любое значение

Первым делом после запуска задачи необходимо получить актуальную версию тестов. Для этого клонируем репозиторий с тестами в рабочую папку Jenkins.

Под рабочей папкой понимается каталог, созданный Jenkins для конвейера при запуске. Относительно этого каталога выполняются команды. Рабочую папку рекомендуется использовать для сохранения ресурсов и артефактов необходимы для работы конвейера. Рабочая папка называются по имени задачи. Расположение родительского каталога для размещения рабочих папок указывается в настройках Jenkins.

Запуск автоматических тестов

Теперь необходимо подготовить базу для тестирования. Источники для создания тестируемой базы могут быть хранилище, поставка, демо-база или выгрузка специально настроенной базы. В примере база создается по хранилищу, после чего выполняется запуск с выполнением обработчиков обновления из БСП. Тут для удобства сначала заполняются переменные окружения, потом они используются при вызове команд.

Запуск автоматических тестов

Для первого старта конфигурации используется не стандартный интерфейс командной строки «1С: Предприятие», а библиотека на onescript vanessa-runner.

Библиотека vanessa-runner (github.com/vanessa-opensource/vanessa-runner) — это обёртка над интерфейсом командной строки «1С:Предприятие», добавляющая ряд удобств в процесс работы с запуском пакетных команд «1С».

Например, нет необходимости указывать полный путь к исполняемому файлу «1С», достаточно указать версию.

Выполняем тесты:

Запуск автоматических тестов

Интересными в команде являются только последние строки с параметрами запуска исполнителя тестов:

  • xddRun — описание источника тестов. Возможно указать файл обработки или каталог с обработками как в примере.
  • xddReport — описание формата отчета о тестировании и путь для сохранения отчета. Используется отчет в формате Allure2 (docs.qameta.io/allure/).
  • xddShotdown — закрывать «1С:Предприятие» после выполнения тестов.

Для работы с Allure2 в Jenkins существует плагин Allure (plugins.jenkins.io/allure-jenkins-plugin/), который необходим для просмотра отчета в удобном виде:

Запуск автоматических тестов

Запуск автоматических тестов

Финальным штрихом стала настройка рассылки почтовых уведомлений ответственному сотруднику о проваленном тестировании. А он в дальнейшем выполняет исправлении или делегирует его коллегам. Это встроенный в Jenkins шаг после сборки:

Запуск автоматических тестов

Проверка качества кодовой базы

В этой части вы не найдете материалов, посвященных важности чистоты кода, инструментам для этого. Речь пойдет об использовании Jenkins для автоматизации процесса анализа конфигурации.

Для статического анализа конфигураций мы используем связку инструментов SonarQube и Автоматизированная проверка конфигураций.

В целом процесс выглядит так:

  • Пользователь помещает изменения в хранилище.
  • 1C:ГитКонвертер:
    • выполняет выгрузку xml файлы;
    • выполняет коммиты в локальный  каталог git;
    • отправляет изменения на сервер.
  • По расписанию стартует конвейер на сервере сборок.
    Как правило это производится в момент, когда команда разработки не вносит изменений.
  • Jenkins запускает АПК на проверку конфигурации.
    По окончанию проверки АПК, предоставляется отчет об обнаруженных ошибках.
  • Jenkins передает отчет вместе с исходниками в SonarScanner.
  • SonarScanner выполняет анализ исходников и загрузку результатов на сервер.
  • На утро разработчик видит перечень допущенных им ошибок и может приступить к исправлению.

Проверка качества кодовой базы

В данной схеме Jenkins занимает место посредника / агрегатора между инструментами. Но кроме этого он решает еще одну важнейшую задачу масштабирования. Статический анализ конфигурации может использовать значительные ресурсы сервера.

Например, анализ ERP на 12 ядрах и 16 Гб оперативной памяти занимает около 20 минут в сонар сканере, а анализ ее же в АПК в тех же условиях может занять около 2 часов. Чтобы успеть за одну ночь прогнать проверки всех наших конфигураций необходимо распределять нагрузку по нескольким серверам. Горизонтальное масштабирование реализовали за счет возможности Jenkins запускаться в распределенном режиме:

Концепция работы Jenkins

Перед реализацией, выполнив исследование, обнаружили плагин для работы с SonarQube:

Проверка качества кодовой базы

Плагин позволяет настроить доступы к серверам SonarQube, а также берет на себя ответственность за доставку инструментария SonarScanner по нодам. Это означает, что как только на новом slave-сервере происходит обращение к SonarScanner, он будет установлен со всеми необходимыми ему для работы зависимостями.

В настройках плагина описываем параметры доступа к серверу SonarQube:

Проверка качества кодовой базы

Плагин предоставляет интерфейс для работы с SonarScanner из задачи:

Проверка качества кодовой базы

Реализация конвейера проверки качества кода

Настраиваем работу ГитКонвертера так, чтобы исходники конфигурации оказались на сервере, используемом для запуска задачи.

Так как задача в Jenkins выглядит почти одинаково и отличается только рядом параметров, для удобства копирования выбрали вид задачи Pipeline.

На самый верх скрипта вынесли изменяемые параметры:

Проверка качества кодовой базы

  • SRC_BASE_DIR — путь к каталогу с исходными файлами.
  • PROJECT_KEY — ключ проекта в АПК и SonarQube.
  • PROJECT_NAME — имя проекта на русском языке.
  • ACC_INSTANCE — строка подключения к АПК.
  • V8_VERSION — версия на которой крутиться АПК.

Указываем агента, на котором требуется выполнять сборку. Можно указать конкретный сервер по имени или набор меток, тогда задача выполнится на сервере подходящим под указанный набор.

Метки задаются при создании агента:

Проверка качества кодовой базы

Также можно указать параметры самой задачи в Jenkins. Например, сбросить через 8 часов, если задача не завершиться и хранить информацию только о последних 10 сборках.

Процедура запуска сканнера с передачей в него результатов анализа в АПК занимает всего несколько строк:

Проверка качества кодовой базы

После выполнения проверки результат отображается в информации о задаче Jenkins и есть возможность перейти к проекту в SonarQube.

Проверка качества кодовой базы

Так зачем нужен Jenkins в разработке «1С»?

Что же мы увидели в результате прочтения статьи. Во-первых, что существуют рутинные операции, связанные с разработкой продуктов на базе «1С». Во-вторых, что качественное исполнение таких операцией вручную может приводить к ошибкам сборки комплектов, некачественному функционированию и другим не очень приятным вещам.

Применение инструментов подобных Jenkins позволяет сэкономить время на рутинных операциях, обеспечить качественное устойчивое исполнение, исключающее человеческий фактор. Безусловно применение инструментов автоматизации требует новых знаний, навыков и некоторого первичного осознания, погружения в философию и функционал таких инструментов. Но это полностью оправдывается повышением качества разработки проектных и типовых решений.

Интересующиеся проверкой качества кода могут посмотреть доклад Эдуарда Иванова с 1C-RarusTechDay 2020 «Инструменты проверки качества кода» здесь.

Авторы статьи

Эдуард Иванов

Эдуард Иванов

Черанев Андрей

Черанев Андрей

FAQ

  • Проблемы с первичным запуском

    1. Появляется ошибка, в которой есть текст: «Неизвестный идентификатор формы».
    2. При открытии внешних обработок могут появляться окна с предупреждениями безопасности.
    3. При открытии bddRunner или xddTestRunner появляются сообщения Неизвестный идентификатор плагина: <ЗагрузчикКаталога> при попытке загрузить тесты
    4. При интерактивном запуске не загружаются и не выполняются фичи, открывается только форма bddRunner.
    5. При пакетном запуске не загружаются и не выполняются фичи, открывается только форма bddRunner.
    6. Я подключаюсь по RDP к серверу. И фича выполняется нормально. Но если свернуть окно RDP, то возникает ошибка.
  • Запуск из командной строки

    1. Как решать проблемы при автоматическом запуске тестовфичсценариев

    2. Как быстро выполнить одну фичу или фичи из одного каталога?

    3. Каким образом увидеть лог выполнения фич, сценариев и шагов или подробный лог при выполнении в командной строке, например, в логе CI-сервера — Jenkins, Gitlab и т.п.

  • BDD

    1. Как мне удалить в транзакции созданные данные?
    2. Где мне лучше создавать служебные данные для выполнения сценария?
    3. Если в сценарии возникла ошибка, модальное окно и т.д., как мне гарантированно закрыть все эти окна, чтобы следующий сценарий не падал?
    4. Как проверять поведение системы под разными ролями?
    5. Почему у меня не работает тэг @tree?
    6. Я вызвал метод Ванесса.ЗапретитьВыполнениеШагов(), затем я подключаю свой таймер, и мне надо сделать, чтобы шаг упал.
    7. Как использовать Sikuli-скрипты?
    8. Как для УФ (управляемой формы) и ОФ (обычной формы) шаги сделать общими?
    9. Что нужно сделать, чтобы увидеть собственные шаги в форме Известные шаги?
    10. Не удается выполнить шаги для выбора типа метаданного в форме «Выбор типа данных».
    11. Не удается установить поле отбора.
    12. Как правильно заполнить каталоги библиотечных шагов в json-файле настройки bdd-части Ванесса-АДД?
    13. Как пропустить сценарий, чтобы он не падал?
    14. Можно ли использовать быстрый выбор из списков 1С в полях ссылочных реквизитов?
    15. Как использовать поискпроверку содержимого в таблицахдинамических списках?
    16. Как фильтроватьвключать отбор в таблицахдинамических списках?
    17. Как проверить правильность проведения документа?
    18. Где можно посмотреть список всех тегов?
  • Плагины

    1. Как вызвать код плагина на сервере при запуске в управляемой форме?
    2. Как работать с файлами внутри тестов/шагов? Как получить путь к текущему файлу или к файлу рядом с ним?
    3. Описание плагинов
  • Клиенты тестирования

    1. Как приложению понять, что оно запущено в режиме тест-клиент через опцию /TESTCLIENT?
  • Скриншоты

    1. Как сохранять скриншоты при ошибках сценариев?
    2. На CI сервере скриншот формируется, но вместо изображения чёрный экран. Как настроить сервер CI?
    3. Как при возникновении ошибки на CI получить скриншоты всех окон 1С?
  • Отчет Allure

    1. Как получить отчет Allure у себя на компьютере под Windows?
    2. Можно в отчет Аллюр передавать дополнительные данные для отображения в шаге?
  • Общие вопросы работы

    1. Как поставить точку останова (брейкпоинт) во внешней обработке для отладки?
  • Доработка ADD

    1. Как запустить фичу из поставки Vanessa.ADD у себя в базе?
    2. Как быстро написать проверочную фичу для новой возможности, реализуемой внутри самого Vanessa.ADD или его плагина?

Проблемы с первичным запуском

1. Появляется ошибка, в которой есть текст: «Неизвестный идентификатор формы».

Это означает, что есть два или более epf файла, у которых совпадает поле Имя (которое находится около Синонима и Комментария).

Решение:

Переименовать один epf файл.

2. При открытии внешних обработок могут появляться окна с предупреждениями безопасности.

Если вы используете версию платформы 8.3.9.2033 или новее, тогда может появиться окно Предупреждение безопасности.

Подробно этот механизм описан здесь.

Решение описано по ссылке

Кратко: Если хотите выключить этот механизм для всех баз, пропишите в файле conf.cfg строку: DisableUnsafeActionProtection=.*

3. При открытии bddRunner или xddTestRunner появляются сообщения Неизвестный идентификатор плагина: <ЗагрузчикКаталога> при попытке загрузить тесты

Возможно, запущено 1С:Предприятие без пользователей. В этом случае 1С не применяет настройки безопасного режима.

Решение:

  • нужно создать хотя бы одного пользователя,
  • снять у него флаг «Защита от опасных действий» и
  • запустить 1С:Предприятие для этого пользователя.

4. При интерактивном запуске не загружаются и не выполняются фичи, открывается только форма bddRunner

Возможные причины:

  • У Вас не задан список библиотек на закладке Библиотеки

    Решение:

    • Сначала очистите список библиотек — например, кнопкой Очистить
    • Далее Перезапустите bddRunner
    • Автоматически подставится путь к системным библиотекам Vanessa.ADD$instrumentsRoot/features/libraries
    • Новые настройки будут сохранены автоматически
  • У Вас заданы неверные библиотеки,
    например, используются библиотеки от нашего старого продукта vanessa-behavior

    Решение:

    • Или примените решение выше с полной очисткой библиотек
    • Или добавьте системную библиотеку $instrumentsRoot/features/libraries в список библиотек
    • И далее обязательно нажмите Сохранить настройки

5. При пакетном запуске не загружаются и не выполняются фичи, открывается только форма bddRunner

У Вас неверный/устаревший/ json-файл настроек, несовместимый формат со штатным json, например, что читает 1С 😦

Например:

  • одинарный слеш не разрешен — используйте или или /
  • или одинарные кавычки ` или ’ не разрешены — используйте "
  • Пример правильной настройки
	"КомандаСделатьСкриншот": ""C:Program Files (x86)IrfanViewi_view32.exe" /capture=1 /convert=",

Разбор проблемы в https://xdd.silverbulleters.org/t/pri-paketnom-zapuske-ne-zagruzhayutsya-i-ne-vypolnyayutsya-fichi-otkryvaetsya-tolko-bddrunner/2132

6. Я подключаюсь по RDP к серверу. И фича выполняется нормально. Но если свернуть окно RDP, то возникает ошибка.

Это связано с особенностью платформы 1С. Некоторые методы платформы (кнопконажималки) не работают, когда погашена видеокарта (а RDP клиент её гасит, когда вы его сворачиваете). Поэтому не надо использовать RDP для доступа к CI (или другим) серверам, когда вы хотите использовать кнопконажималку.

Запуск из командной строки

1. Как решать проблемы при автоматическом запуске тестовфичсценариев

Автоматический запуск рекомендуется выполнять с помощью команд инструмента Vanessa-Runner.

  • ‘vrunner vanessa’ — для запуска фич и сценариев
  • ‘vrunner xunit’ — для запуска тестов, в т.ч. и дымовых тестов

Простой чек-лист проверки правильности

  • убедитесь в правильности указания строки подключения
    • правильная строка подключения к ИБ формируется по ключам запуска 1С — или ‘/FfilePath’ или ‘/SserverPath’
      • Например, для файловых баз —ibconnection /FC:base1 или —ibconnection /F./base1 или —ibconnection /Fbase1
      • Или для серверных баз —ibconnection /Sservernamebasename
  • в json-файлах нужно указывать двойные обратные слеши "buildsmoke" или для строки подключения "/Sservernamebasename"
  • проверьте кодировку json-файла, требуется кодировка UTF-8
  • убедитесь, что указана необходимая версия платформы 1С
    • проверьте строковый ключ —v8version вида «8.3», «8.3.15», «8.3.10.2650»
    • убедитесь, что указанная платформа 1С установлена на машине
  • включите полный отладочный лог при выполнение пакетов OneScript
    • выполните ‘SET LOGOS_LEVEL=DEBUG’ перед выполнением нужной команды
    • посмотрите лог команды и определите правильность указания платформы 1С, строки соединения с ИБ и другие параметров
    • выключение полного лога выполняется через ‘SET LOGOS_LEVEL=’

2. Как быстро выполнить одну фичу или фичи из одного каталога?

Правильнее запускать фичи из командной строки с помощью инструмента Vanessa-Runner.

Для прогона одной фичи используйте команду

vrunner vanessa --settings toolsvrunner.json --path ПутьКФиче

или

vrunner vanessa --settings toolsvrunner.json --path ПутьККаталогуФич

где

  • toolsvrunner.json — путь к файлу настройки запуска, документированный в

    • Настройка запуска тестов или проверки поведения через Vanessa-ADD и Vanessa-Runner
    • Пример запуска проверки поведения через Vanessa-ADD и Vanessa-Runner
  • ПутьКФиче или ПутьККаталогуФич — прямые или относительные пути к конкретной фиче или каталогу с фичами

3. Каким образом увидеть лог выполнения фич, сценариев и шагов или подробный лог при выполнении в командной строке, например, в логе CI-сервера — Jenkins, Gitlab и т.п.

  • Для этого нужно настроить файл настройки в json-формате и указать его использование при запуске в командной строке с помощью vanessa-runner или в командной строке запуска 1С

  • В файле настройки нужно включить 2 параметра

    • включить "ДелатьЛогВыполненияСценариевВТекстовыйФайл": true
    • установить путь к логу выполнения. Например, "ИмяФайлаЛогВыполненияСценариев": "$workspaceRoot/build/log.txt"
  • После включения данных настроек в логе выполнения будут видны пути выполняемых фич и названия выполняемых сценариев

  • Также можно включить более подробный лог с показом выполнения каждого шага, а не только сценариев

    • в файле настройки нужно включить параметр "ВыводитьВЛогВыполнениеШагов": true
  • Также можно включить намного более подробный лог с показом всех отладочных сообщений

    • в файле настройки нужно включить параметр "DebugLog": true

BDD

1. Как мне удалить в транзакции созданные данные?

  • В BDD не обязательно их удалять за собой.
  • Если всё же хотите, Вы можете гарантированно удалить их в процедуре ПередОкончаниемСценария(). Она срабатывает в любом случае, даже если сценарий упал.
  • Если создавались данные из макета (Данные = Ванесса.СоздатьДанныеПоТабличномуДокументу(Макет)), то можно использовать метод Ванесса.УдалитьСозданныеДанные(Данные).
  • Лучше стремиться к тому, чтобы сценарий сам обеспечивал себе окружение, чтобы успешно выполниться.

2. Где мне лучше создавать служебные данные для выполнения сценария?

  • В секции Контекст feature файла
  • В процедуре ПередНачаломСценария()

3. Если в сценарии возникла ошибка, модальное окно и т.д., как мне гарантированно закрыть все эти окна, чтобы следующий сценарий не падал?

В секции контекст надо добавить шаг И Я закрыл все окна клиентского приложения.

А ещё лучше создать экспортный сценарий и в него добавить этот шаг. А в секции Контекст вызывать экспортный сценарий.

4. Как проверять поведение системы под разными ролями?

Надо запустить несколько TestClient на разных портах и переключаться между ними.

5. Почему у меня не работает тэг @tree?

Для работы тега @tree надо использовать либо только табы, либо только пробелы. В пределах одной фичи нельзя в отступах строк использовать и пробелы, и табы.

6. Я вызвал метод Ванесса.ЗапретитьВыполнениеШагов(), затем я подключаю свой таймер, и мне надо сделать, чтобы шаг упал.

В этом случае вместо вызова исключения надо сделать Ванесса.ПродолжитьВыполнениеШагов(Истина)

7. Как использовать Sikuli-скрипты?

  • Установите SikuliX согласно инструкции http://sikulix.com/quickstart/
  • Ознакомьтесь с http://sikulix-2014.readthedocs.io/en/latest/faq/010-command-line.html
  • Укажите через path путь к каталогу с runsikulix(.cmd)
  • Разрабатывайте свои Sikuli-скрипты с помощью SikuiliX IDE (http://sikulix-2014.readthedocs.io/en/latest/index.html) либо используйте имеющиеся
  • Выполнение скрипта в реализации шага вызывайте через Ванесса.ВыполнитьSikuliСкрипт()

8. Как для УФ (управляемой формы) и ОФ (обычной формы) шаги сделать общими?

  • Разместить код шага в модуле объекта обработки,
  • В коде управляемой формы в клиентском методе шага нужно вызвать серверный метод, в котором
    • выполнить ОбъектНаСервере = ЗначениеФормыВОбъект("Объект") и
    • вызвать код из модуля обработки ОбъектНаСервере.НужныйМетод(...)
  • Сигнатуры методов в УФ и ОФ должны совпадать соответственно

9. Что нужно сделать, чтобы увидеть собственные шаги в форме Известные шаги?

  • В строке описания шага нужно заполнить последние параметры (4 и 5 параметры) в процедуре ДобавитьШагВМассивТестов. Там как раз задается развернутое описание шага и место в дереве.
  • Место в группе можно задавать с учетом иерархии.
    • Указание группы как UI.Формы.Кнопки.Мой шаг расположит шаг в иерархии дерева UIФормыКнопки
  • Например,
Ванесса.ДобавитьШагВМассивТестов(ВсеТесты, "Пауза(Парам01)","Пауза", "И     Пауза 1",
	"Позволяет сделать паузу нужной длительности.", "Прочее.Сделать паузу");

10. Не удается выполнить шаги для выбора типа метаданного в форме «Выбор типа данных».

  • В последних версиях Vanessa.ADD реализована автоматическая генерация правильных шагов выбора метаданного на основе записи действий пользователя с необходимыми подсказками.

  • Важно использовать правильную последовательность шагов, например, вместо созданных на старых версиях Vanessa.ADD

     # И я нажимаю кнопку выбора у поля "Реквизит1"
     Тогда открылось окно 'Выбор типа данных'
     И В форме "Выбор типа данных" в таблице "" я перехожу к строке:
     	| ''       |
     	| 'Нужное метаданное' |
     И В форме "Выбор типа данных" в ТЧ "" я выбираю текущую строку

11. Не удается установить поле отбора.

Проблема:

Если пытаться установить поле отбора (колонка «поле») у динамического списка, используя шаг «И в таблице «Source» я разворачиваю строку:», то 1С почему-то не хочет выполнять этот шаг (не разворачивает ветку).

Например: мне нужен отбор по Юр. или Физ.Лиц у контрагента.

Решение:

Можно просто установить текст в поле отбора:

И в таблице "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0Отбор" из выпадающего списка с именем "КомпоновщикНастроекПользовательскиеНастройкиЭлемент0ОтборЛевоеЗначение" я выбираю по строке 'Контрагент.Юр/Физлицо'

12. Как правильно заполнить каталоги библиотечных шагов в json-файле настройки bdd-части Ванесса-АДД?

Важно правильно указать каталог библиотек Ванесса-АДД.

Если у вас Linux, регистр имен каталогов также важен — используйте имена в нижнем регистре.

В json-файл нужно добавить следующие строки

"КаталогиБиблиотек": [
			"$instrumentsRoot/./features/libraries"
	]

также можно использовать устаревший вариант ./features/libraries

Если есть собственные каталоги библиотечных шагов, их нужно добавить после библиотек Ванесса-АДД.

Например, следующим образом

"КаталогиБиблиотек": [
		"$instrumentsRoot/./features/libraries",
		"$workspaceRoot/feature-libs"
	]

13. Как пропустить сценарий, чтобы он не падал?

  • Можно его закомментировать в тексте фичи (символ #).
  • Можно поставить сценарию тег — и использовать фильтры по тегу.
  • Да пусть падает. Тем более если он не реализован, то он будет желтым, а если реализован — тогда почему он падает?

14. Можно ли использовать быстрый выбор из списков 1С в полях ссылочных реквизитов?

Опасно использовать следующие варианты шагов

  • И из выпадающего списка "Принял" я выбираю точное значение 'Иванов Иван Иванович'
  • И из выпадающего списка с именем "ПлательщикМестоОплаты" я выбираю точное значение 'Москва'

Проблема в том, что подобный «быстрый выбор» актуален только для текущей базы и вашего пользователя.

При запуске на другой базе в списке «быстрого выбора» наверняка не будет этих значений, а будет пусто или будут какие-то другие значения (

Вместо этих шагов нужно

  • использовать кнопку «Показать все» (или кнопка с тремя точками)
  • далее искать в форме выбора
  • и затем выбирать найденный элемент в форме выбора

15. Как использовать поискпроверку содержимого в таблицахдинамических списках?

При работе с тест-клиенто нужно помнить про особенности его работы с тест-клиентом.
Анализ таблиц на нем часто может выполняться только полным перебором (от первой до последней строки).
Фактически, если активна большая таблица (динамический список), то переход к нужной строке или проверка содержимого могут долго выполняться.

Для ускорения анализа динамических таблиц и больших таблиц правильнее включить отбор любым из способом (средствами настройки списка через СКД или поиск) и только потом проверять содержимое или выполнять переход к нужной строке. см.ниже п.16

Есть несколько вариантов проверки содержимого таблиц на тест-клиенте.

Важно — Все следующие шаги умеют проверять только те колонки, которые указаны в таблице для шага.
Неуказанные колонки будут игнорироваться.

15.1. Шаги поиска только нужных строк — подходят для большинства сценариев

Эти шаги проверяют только наличие нужного количества строк в таблице. При этом в таблице могут быть и другие строки.

Возможно использовать шаблонный символ *(звездочка) для пропуска каких-то значений.

  • шаг И таблица "ИмяТаблицы" содержит строки:
  • шаг И таблица "ИмяТаблицы" не содержит строки:

Пример:

И таблица "ИмяТаблицы" содержит строки:
    | ИмяКолонки1 					| ИмяКолонки2 |
    | Значение1 					| Значение2 |
    | Значение * из другой строки 	| Значение * из строк* |

15.2. Шаги равенства по шаблону

  • шаг И таблица "ИмяТаблицы" стала равной по шаблону:

Возможно использовать шаблонный символ *(звездочка) для пропуска каких-то значений.

И таблица "ИмяТаблицы" стала равной по шаблону:
    | ИмяКолонки1 					| ИмяКолонки2 |
    | Значение1 					| Значение2 |
    | Значение * из другой строки 	| Значение * из строк* |

15.3. Шаги точного равенства

Эти шаги проверяют только таблицу полностью. В таблице должны быть только указанные строки.
Никаких других строк в таблице быть не должно!

Использование этих шагов требуется крайне редко. Рекомендуется использовать либо шаги из 15.1 либо из 15.2

  • шаг И таблица "ИмяТаблицы" стала равной:
  • шаг И я жду, что таблица "ИмяТаблицы" станет равна данной в течение 20 секунд:
И таблица "ИмяТаблицы" стала равной:
    | ИмяКолонки1 					| ИмяКолонки2 |
    | Значение1 					| Значение2 |
    | Значение1 из другой строки 	| Значение2 из другой строки |

И я жду, что таблица "ИмяТаблицы" станет равна данной в течение 20 секунд:
    | ИмяКолонки1	| ИмяКолонки2	|
    | Значение1 	| Значение2 	|

16. Как фильтроватьвключать отбор в таблицахдинамических списках?

Для ускорения анализа динамических таблиц и больших таблиц правильнее включить отбор любым из способом (средствами настройки списка через СКД или поиск) и только потом проверять содержимое или выполнять переход к нужной строке.

Для фильтрации списков существует шаги

  • И Я устанавливаю фильтр на список:
  • И Я устанавливаю фильтр на список если это возможно:

Эти шаги позволяют установить фильтр на список через меню «Ещё/Настроить список».

Шаг И Я устанавливаю фильтр на список если это возможно не выдает исключения, если поля отбора не существует.

Пример:

И Я устанавливаю фильтр на список:
        | Наименование | Содержит | Товар1 |

17. Как проверить правильность проведения документа?

Всегда проверять результаты проведения документа одним из 2х способов (желательно даже совместить их)

  • наличие нового документа в форме списке. см. п. 17.1 ниже.
  • проверкой отчетов, в которых видны результаты движений документа
    • или отчет «движения документа»
    • или бизнес-отчеты
    • использовать шаги сравнения табличных документов с макетами по шаблону
  • но из образцовмакетов отчетов нужно удалять уникальную слабо повторимую инфу — текущие даты, время, имена пользователей, номеракоды, заменяя их на * (шаблон)

Полезные шаги

  • Дано Табличный документ "РеквизитТабличныйДокумент" равен макету "ПутьМакета" по шаблону
  • И область "R1C1:R10C10" табличного документа "РеквизитТабличныйДокумент" равна макету "ПутьМакета" по шаблону

17.1 Пример проведения документа и проверка наличия документа в форме списка

И я фиксирую номер документа после записи
	И я нажимаю на кнопку 'Записать'
	И я жду, что поле "Номер" перестанет быть пустым в течение 10 секунд
	И     я запоминаю значение поля с именем "Номер" как "НомерДокумента"
И я провожу документ
	И я нажимаю на кнопку 'Провести и закрыть'
	И я жду закрытия окна 'Реализация * от *' в течение 20 секунд
Тогда вижу новый документ с результатами тестирования
	И Я устанавливаю фильтр на список:
		| Организация	| Равно | Первая 				|
		| Контрагент	| Равно | Основной покупатель	|
	Тогда таблица "Список" содержит строки:
		| Номер       		| Организация	| Контрагент 			|
		| $НомерДокумента$	| Первая  		| Основной покупатель	|

18. Где можно посмотреть список всех тегов?

Общего списка всех тегов не ведется.
Основные служебные теги:

  • @tree — в фича файле используется иерархия шагов.
  • @ExportScenarios — это файл экспортных сценариев.
  • Есть еще специальные теги для записи видеоинструкций и инструкций в формате -markdown, -html.
  • Также можно задаватьиспользовать собственные теги.

Плагины

1. Как вызвать код плагина на сервере при запуске в управляемой форме?

Практически любой плагин можно подключать на сервере.
Например:

ЗапросыИзБД = ВнешниеОбработки.Создать("ЗапросыИзБД");
ЗапросыИзБД.ПолучитьКоличествоЭлементовСправочникаПоОтбору(...);

Ожидаем = ВнешниеОбработки.Создать("УтвержденияBDD");
Ожидаем.Что(Значение, "Должно быть равно 5, а это не так!").
	Равно(5);
  • Небольшое ограничение: нужно помнить, что на сервере нет состояний, поэтому плагины запускаются без состояния.

2. Как работать с файлами внутри тестов/шагов? Как получить путь к текущему файлу или к файлу рядом с ним?

Возможные варианты:

  • Используйте организацию файлов через рабочий каталог проекта (рекомендуемый путь)

    • В BDD – Ванесса.Объект.КаталогПроекта
    • В TDD — КонтекстЯдра.Объект.КаталогПроекта
    • Эта настройка задается
      • либо через командную строку (например, через vanessa-runner)
      • либо интерактивно, через форму настроек (Сервис)
  • В TDD можно использовать Получить полный путь к текущему файлу теста

    • В тесте нужно определить свойство «ПутьКФайлуПолный»
      • это или Глобальная публичная переменная модуля,
      • или реквизит обработки (для серверных модулей)
    • В этой переменной будет клиентский путь к файлу теста
    • Переменная доступна как на этапе заполнения набора/списка тестов, так и при выполнении
  • В BDD также можно использовать шаг И я буду выбирать внешний файл "ИмяФайла" для подмены интерактивных действий пользователя по выбору файла/каталога в окне выбора файлов/каталогов

3. Описание плагинов

  • Проверка орфографиии. Плагин использует сервис YaSpeller и позволяет проверять наличие орфографических ошибок в тексте.

    • Подключение и использование плагина:
ПроверкаОрфографии = КонтекстЯдра.Плагин("ПроверкаОрфографии");
Результат = ПроверкаОрфографии.ВыполнитьПроверкуТекста(ТекстНаПроверку); // локальная проверка. Результат - массив с ошибками
ПроверкаОрфографии.ОжидаемЧтоНетОшибок(ТекстНаПроверку); // выбрасывает исключение если были ошибки с подробным описанием
  • Настройки:

    • Пропускать слова с цифрами:
ПроверкаОрфографии.ПропускатьСловаСЦифрами(Истина);
- Пропускать url и интернет адреса
ПроверкаОрфографии.ПропускатьУРЛ(Истина);
- Словарь слов исключений
ПроверкаОрфографии.ИспользоватьШаблонДляСловаря(Истина); // проверка вхождения в словарь по рег. выражению
ПроверкаОрфографии.ИспользоватьСловарьИсключений(Словарь); // список слов или текстовый документ с словами-исключениями
                                                      // каждое слово с новой строки

Клиенты тестирования

1. Как приложению понять, что оно запущено в режиме тест-клиент через опцию /TESTCLIENT?

Платформа 1С не предоставляет такой возможности.

Вообще приложение лучше бы не понимать, что он работает в тестовом окружении.

Надежнее юзать режим установки нужных настроек передпри запуске приложения.
Например, json-файлы настройки или другой формат устанавливают нужные тест-настройки.
В БСП используется механизм расширений, которые переустанавливают адреса сервисов на тестовые.

Также в Ванесса-АДД можно при запуске клиента тестирования указать спец. параметр через /C.
например, передавать путь к json-файлу настройки или еще что-то

А затем приложение прочитает этот параметрфайл

  • и выставит нужные настройки.
  • или определит, что работает в режиме тестирования, если без этого все-таки никак )

Скриншоты

1. Как сохранять скриншоты при ошибках сценариев?

Интерактивная настройка:
	+ Закладка `Сервис`
	+ далее `Автоинструкции`
	+ поле `Консольная команда создания скриншотов`
	  + после строки команды вставляется имя файла и в таком виде команда запускается!

Можно устанавливать
+ как `NirCMD`
+ http://www.nirsoft.net/utils/nircmd.zip
	+ команда `nircmd savescreenshot `

+ так и `IrfanView`
	+ команда `"C:Program Files (x86)IrfanViewi_view32.exe" /capture=1 /convert=`
	+ команда
		""C:Program Files (x86)IrfanViewi_view32.exe" /capture=1 /convert=",
+ Важно только устанавливать 32-разрядные версии !!

Примеры json-файла настройки фиксации скриншотов
	для `NirCMD`:
	"ДелатьСкриншотПриВозникновенииОшибки": true,
	"СниматьСкриншотКаждогоОкна1С": true,
	"КаталогOutputСкриншоты": "$workspaceRoot/build/out/ScreenShots",
	"КомандаСделатьСкриншот": "nircmd savescreenshot "
	"ДелатьСкриншотПриВозникновенииОшибки": true,
	"СниматьСкриншотКаждогоОкна1С": true,
	"КаталогOutputСкриншоты": "$workspaceRoot/build/out/ScreenShots",
	"КомандаСделатьСкриншот": ""C:Program Files (x86)IrfanViewi_view32.exe" /capture=1 /convert=",

2. На CI сервере скриншот формируется, но вместо изображения чёрный экран. Как настроить сервер CI?

Возможные причины и решения:

  • Нельзя запускать джоб Jenkins в режиме сервиса. На CI надо настроить автовход под какой-либо учётной записью и в автозагрузку поместить команду запуска джоба Jenkins.
  • Нельзя использовать для доступа к CI RDP. Вообще. Надо использовать другой софт для удаленного доступа к нему, например TightVNC. RDP полностью гасит видеокарту (виртуальную или настоящую) при отключении.
  • Надо посмотреть схему энергосбережения в Панели управления, там может стоять отключение дисплея через пару минут. Это надо выключить.

3. Как при возникновении ошибки на CI получить скриншоты всех окон 1С?

Пока эта фича работает только под Windows.

  • В json-файле, в котором указываются параметры запуска Vanessa-ADD, указать строку: "СниматьСкриншотКаждогоОкна1С": "Истина".
  • Установить на CI сервер java 8 (если у вас Jenkins, то скорее всего она у вас уже есть).
  • Установить SikuliX версии 1.1 или выше. Брать отсюда. Там надо скачать sikulixsetup-1.1.1.jar.
  • Прописать в переменной PATH файл runsikulix.cmd.

Отчет Allure

1. Как получить отчет Allure у себя на компьютере под Windows?

  • Скачать дистрибутив Allure отсюда и установить.
  • Прописать в переменную Path путь к каталогу, где лежит allure.bat

Далее для получения отчета используйте один из трех вариантов:

  • Для использования через командную строку:
    • Вызвать команду call allure generate {каталог, где лежат ваши xml в формате Allure}
    • Вызвать команду call allure open
  • или установить флаг «Показать отчет Allure в браузере» на закладке Сервис > Отчет о запуске сценариев и сохранить настройки.
    • В этом случае после выполнения тестов и формирования отчетов Allure BDDRunner самостоятельно выполнит обе команды и покажет отчет Allure в браузере
  • или выполнить команду Внешние инструменты > Отобразить отчет Allure в браузере.

2. Можно в отчет Аллюр передавать дополнительные данные для отображения в шаге?

Можно.

Решение:

Использовать шаг:

И Я подключаю файл '$instrumentsRoot/features/libraries/manually/setlabelsallure.feature' к шагу
ПлагинАллюра = Ванесса.Плагин("Аллюр2Отчет");
ПлагинАллюра.ДобавитьФайлКТекущемуШагу(ПутьКФайлу);
ПлагинАллюра.ДобавитьJSONКТекущемуШагу(ТекстДляДобавления, ИмяФайла);
ДобавитьXMLКТекущемуШагу(ТекстXML, Наименование);

Если необходимо прикрепить данные, тогда:

ПлагинАллюра.ДобавитьДвоичныеДанныеКТекущемуШагу(...)
ПлагинАллюра.ДобавитьТекстКТекущемуШагу(ТекстДляДобавления, ИмяФайла)

Общие вопросы работы

1. Как поставить точку останова (брейкпоинт) во внешней обработке для отладки?

  • Используйте штатный механизм отладки 1С, если у вас
    • файловая база
    • или клиент 1С и сервер 1С находятся на одной машине.
  • Если это не так, тогда более сложный путь:
    • Закрыть сеанс TestManager.
    • Открыть сеанс TestManager.
    • Открыть через меню Файл > Открыть файл обработку, в которой стоит точка останова.
    • Только после этого открыть bddRunner.epf.
    • Теперь остановка на точке остановки во внешней обработке будет работать. Но до первого изменения кода в ней. Если изменили код, то надо повторить все действия с начала.

Доработка ADD

1. Как запустить фичу из поставки Vanessa.ADD у себя в базе?

Большинство фич, которые идут в поставке Vanessa.ADD, требуют, чтобы их запускали в специальной служебной базе. Т.е. надо собрать служебную базу и подготовить другие файлы.

Самый простой способ

  • выполнить команду opm run init согласно Руководству контрибьютора
  • и немного подождать

2. Как быстро написать проверочную фичу для новой возможности, реализуемой внутри самого Vanessa.ADD или его плагина?

Для этого нужно выполнить самотестирование Ванесса-АДД.
Самый простой способ — использовать режим тест-клиент и специальные шаги для самотестирования.

Чек-лист:

  • создаются 2 фичи
    • служебная фича
      • назначение фичи — выполнить шаги с новыми возможностями внутри Ванесса-АДД, подключенной внутри тест-клиента
      • в служебном каталоге features/Support/Templates
      • обязательно установить тег @IgnoreOnCIMainBuild для исключения выполнения этой фичи
    • основная проверочная фича
      • назначение фичи — протестировать результаты служебной фичи в Ванесса-АДД, подключенной внутри тест-клиента
        • например, проверить состояние формы, полей, посмотреть служебные сообщения c обычных шагов тест-клиента и других шагов Ванесса-АДД
      • ее можно создать в этом же служебном каталоге
        • или в любом другом подкаталоге features/libraries
      • В этой фиче рекомендуется использовать специальный шаг `Когда Я выполняю служебную фичу «ИнформаторСлужебнаяФича» в VanessaADD в режиме TestClient’
      • а далее обращаться к шагам работы с тест-клиентом

Примеры таких фич:

  • основная фича Информатор.feature
    • служебная фича ИнформаторСлужебнаяФича.feature
  • основная фича РедактированиеТаблицыGherkin.feature
    • служебная фича ФичаДляПроверкиРедактораТаблицыGherkin.feature

TDD

Дымовые тесты

Возникающая ошибка «1С: Нет ответа от сервера server_addr= d:/jenkins/ci_builder …»

появляется при первом запуске 1С, при втором и последующих может не проявлятся.


Можем появлятся при наличии лишней записи у сервера с ключем 1С
а также проблемах ДНС, проявляется при наличии домена и не верных настройках ДНС

исправление,
1. перевести имя сервера в сервере предприятия 1С на IP адресс вместо имени сервера.
2. проверить разрешение имен сервера в сервере днс.
3. проверить физические проблемы соединения по сети и доступ к домену.

есть сервер 1с он стоит 192.168.0.204 там же стоит sql
есть сервер терминалов 192.168.0.2 на нем клиен 1с и там всё гуд
(тут же стоит ключ сетевой )
но есть ещё 1 сервер терминалов 192.168.11.111 на нем 1с долго запускается
иногда вообще не стартует выпадая с ошибкой

0
Sys Name_0: LUBGRSRV
Sys Type_0: System Product Name, x64-based PC
Phis Mem_0: 4109426688
BIOS_0: American Megatrends Inc., 20101029000000.000000+000, 0402 , 2, 6
CPU_0: CPU0, Intel64 Family 6 Model 37 Stepping 5, 64, 64, 512, 3200, BFEBFBFF00020655, 9477, LGA1156
NET_0: [00000000] WAN Miniport (SSTP), ROOTMS_SSTPMINIPORT000
NET_1: [00000001] WAN Miniport (IKEv2), ROOTMS_AGILEVPNMINIPORT000
NET_2: [00000002] WAN Miniport (L2TP), ROOTMS_L2TPMINIPORT000
NET_3: [00000003] WAN Miniport (PPTP), ROOTMS_PPTPMINIPORT000
NET_4: [00000004] WAN Miniport (PPPOE), ROOTMS_PPPOEMINIPORT000
NET_5: [00000005] WAN Miniport (IPv6), ROOTMS_NDISWANIPV6000
NET_6: [00000006] WAN Miniport (Network Monitor), ROOTMS_NDISWANBH000
NET_7: [00000007] Сетевая карта Realtek RTL8168D/8111D Family PCI-E Gigabit Ethernet NIC (NDIS 6.20), BC:AE:C5:BE:C8:BE, PCIVEN_10EC&DEV_8168&SUBSYS_83A31043&REV_034&FD5DF6&0&00E5
NET_8: [00000008] Адаптер D-Link DFE-520TX PCI Fast Ethernet, 00:1B:11:B2:FF:21, PCIVEN_1106&DEV_3106&SUBSYS_14051186&REV_8B4&3A440333&0&08F0
NET_9: [00000009] WAN Miniport (IP), ROOTMS_NDISWANIP000
NET_10: [00000010] Kerio Virtual Network Adapter, 44:45:53:54:4F:53, ROOTKVNETID000
NET_11: [00000011] RAS Async Adapter, 20:41:53:59:4E:FF, SW{EEAB7790-C514-11D1-B42B-00805FC1270E}ASYNCMAC
DISK_0: KINGSTON SV300S37A120G ATA Device, IDEDISKKINGSTON_SV300S37A120G__________________541ABBF05&2D5A9710&0&0.1.0, 512, 63, 14593, 255, 3721215, 234436545, 120031511040
DISK_1: ST3500413AS ATA Device, IDEDISKST3500413AS_____________________________JC45____5&2D5A9710&0&0.0.0, 512, 63, 60801, 255, 15504255, 976768065, 500105249280
PART_0: Disk #1, Partition #0, 32256, 234436482, 120031478784
PART_1: Disk #0, Partition #0, 32256, 102398247, 52427902464
PART_2: Disk #0, Partition #1, 52427934720, 874353690, 447669089280
VIDEO_0: Стандартный VGA графический адаптер, PCIVEN_8086&DEV_0042&SUBSYS_83831043&REV_183&11583659&0&10
VIDEO_1: Radmin Mirror Driver V3, ROOTDISPLAY000′
36:01.426004-0,EXCP,2,process=1cv8c,OSThread=4660,Exception=0874860b-2b41-45e1-bc2b-6e186eb37771,Descr=’srcbackbassrclicensebaseimpl.cpp(6711):
0874860b-2b41-45e1-bc2b-6e186eb37771: Ошибка программного лицензирования. Превышено максимальное количество пользователей, разрешенное файлом программной лицензии:

file://C:/ProgramData/1C/licenses/20191112145717.lic

File=d:jenkinsci_builder2windowsbuild2platformsrcbackbassrclicensebaseimpl.cpp(5435)’
36:01.426006-0,EXCP,1,process=1cv8c,OSThread=4660,Exception=9db1fa37-b455-4f3f-b8dd-7de0ea7d6da3,Descr=»srcmngclnsrcinfobaseregistry.cpp(1360):
9db1fa37-b455-4f3f-b8dd-7de0ea7d6da3: Ошибка при выполнении файловой операции ‘C:ProgramData1C1CEStartibases.v8i’. Неожиданный вызов метода ‘FileObject::setEOF’: d:jenkinsci_builder2windowsbuild2platformsrccoresrcfiles.cpp(643): Неожиданный вызов метода ‘FileObject::setEOF'»
36:01.598000-0,CONN,2,process=1cv8c,OSThread=4660,Txt=’addrBelongsToThisComputer2, address=s01, result=false’
36:01.598001-0,CONN,2,process=1cv8c,OSThread=4660,ClientID=1,Protected=1,Txt=’Connected, client=(2)192.168.11.111:13270, server=(2)192.168.0.204:1541′
36:01.598002-0,CONN,2,process=1cv8c,OSThread=4660,Txt=’Ping direction opened: address=192.168.0.204:1541,pingTimeout=15000,pingPeriod=3000,lastSentTs=155357886,lastReceivedTs=155357886,lastReceivedTestTs=,directionID=df684d5d-4d23-4e4a-82d5-ff34ae505e92′
36:01.598003-0,CONN,2,process=1cv8c,OSThread=4660,Txt=’Connection added to ping direction: address=192.168.0.204:1541,pingTimeout=15000,pingPeriod=3000,lastSentTs=155357886,lastReceivedTs=155357886,lastReceivedTestTs=,clientID=1′
36:01.598004-0,CONN,2,process=1cv8c,OSThread=4660,Txt=Clnt: MyUserName1: Администратор@LUBGRSRV
36:01.879001-0,CONN,2,process=1cv8c,OSThread=4660,Txt=Clnt: DstUserName1: S01USR1CV8 StartProtocol: 0 Success
36:01.910001-0,CONN,2,process=1cv8c,OSThread=4660,Txt=Clnt: MyUserName2: LUBGRSRVАдминистратор
36:02.050001-0,CONN,2,process=1cv8c,OSThread=4660,Txt=’Connection removed from ping direction: address=192.168.0.204:1541,pingTimeout=15000,pingPeriod=3000,lastSentTs=155357886,lastReceivedTs=155357886,lastReceivedTestTs=,clientID=1′
36:02.050002-0,CONN,2,process=1cv8c,OSThread=4660,Txt=’Ping direction closed: address=192.168.0.204:1541,pingTimeout=15000,pingPeriod=3000,lastSentTs=155357886,lastReceivedTs=155357886,lastReceivedTestTs=’
36:02.050003-0,CONN,2,process=1cv8c,OSThread=4660,Txt=’Ping direction statistics: address=192.168.0.204:1541,pingTimeout=15000,pingPeriod=3000,period=452,packetsSent=0,avgResponseTime=0,maxResponseTime=0,packetsTimedOut=0,packetsLost=0,packetsLostAndFound=0′
36:02.050004-515003,CONN,1,process=1cv8c,OSThread=4660,ClientID=1,Txt=Outgoing connection closed
36:02.113000-0,CONN,2,process=1cv8c,OSThread=4660,ClientID=2,Protected=1,Txt=’Connected, client=(2)192.168.11.111:13273, server=(2)192.168.0.204:1567′
36:02.113001-0,CONN,2,process=1cv8c,OSThread=4660,Txt=’Ping direction opened: address=192.168.0.204:1567,pingTimeout=15000,pingPeriod=3000,lastSentTs=155358401,lastReceivedTs=155358401,lastReceivedTestTs=,directionID=df684d5d-4d23-4e4a-82d5-ff34ae505e92′
36:02.113002-0,CONN,2,process=1cv8c,OSThread=4660,Txt=’Connection added to ping direction: address=192.168.0.204:1567,pingTimeout=15000,pingPeriod=3000,lastSentTs=155358401,lastReceivedTs=155358401,lastReceivedTestTs=,clientID=2′
36:02.113003-0,CONN,2,process=1cv8c,OSThread=4660,Txt=Clnt: MyUserName1: Администратор@LUBGRSRV
36:02.331001-0,CONN,2,process=1cv8c,OSThread=4660,Txt=Clnt: DstUserName1: S01USR1CV8 StartProtocol: 0 Success
36:02.362001-0,CONN,2,process=1cv8c,OSThread=4660,Txt=Clnt: MyUserName2: LUBGRSRVАдминистратор
36:02.783001-0,CONN,2,process=1cv8c,OSThread=4660,Txt=Clnt: MyUserName1: Администратор@LUBGRSRV
36:02.815001-0,CONN,2,process=1cv8c,OSThread=4660,Txt=Clnt: DstUserName1: S01USR1CV8 StartProtocol: 0 Success
36:02.846001-0,CONN,2,process=1cv8c,OSThread=4660,Txt=Clnt: MyUserName2: LUBGRSRVАдминистратор
36:03.205002-0,EXCP,2,process=1cv8c,OSThread=4660,Exception=580392e6-ba49-4280-ac67-fcd6f2180121,Descr=’srcvrscoresrcvresourcesessionimpl.cpp(529):
580392e6-ba49-4280-ac67-fcd6f2180121: Неправильное имя пользователя или пароль
Ошибка при выполнении запроса POST к ресурсу /e1cib/login:’
36:12.237000-0,CONN,0,process=1cv8c,OSThread=4160,Txt=’Ping direction statistics: address=192.168.0.204:1567,pingTimeout=15000,pingPeriod=3000,period=10124,packetsSent=3,avgResponseTime=16,maxResponseTime=16,packetsTimedOut=0,packetsLost=0,packetsLostAndFound=0′
36:14.249001-0,SCOM,3,process=1cv8c,OSThread=4660,Func=’setSrcProcessName(RHostRoot,RHostRoot)’

Оглавление

  1. Автоматизация тестирования конфигураций «1С»
    • Выбор инструмента — Jenkins, TeamCity, Bamboo и Travis
  2. Концепция работы Jenkins
    1. Первый способ: Freestyle project
    2. Второй способ: Pipeline
  3. Кейсы применения Jenkins
    1. Сборка комплектов
    2. Запуск автоматических тестов
    3. Проверка качества кодовой базы
  4. Так зачем нужен Jenkins в разработке «1С»?

Автоматизация тестирования конфигураций «1С»

Процессы разработки бизнес-приложений на платформе «1С:Предприятие» со временем усложняются. Кроме того, разработчики занимаются задачами отличными от разработки, которые решать могут только они.

Например, становится необходимым проводить дымовое тестирование некоторых функций приложения, осуществлять сборку комплектов поставки для выпуска приложения. Необходимо также обеспечивать достаточный уровень качества исходного кода приложений, для упрощения дальнейшего его сопровождения и развития.

Дымовое тестирование — минимальный набор тестов на явные ошибки. «Дымовой тест» обычно выполняется программистом; не проходившую этот тест программу не имеет смысла отдавать на более глубокое тестирование.

Эти процессы часто повторяются на разных этапах жизненного цикла приложения, и, как правило, представляют собой набор рутинных операций, слабо связанных с основной деятельностью разработчика — разработкой новых функций приложения. Возникает естественное желание автоматизировать эти процессы, дабы повысить эффективность команды разработки.

Выбор инструмента —  Jenkins, TeamCity, Bamboo и Travis

В общем виде автоматизация любого процесса сводится к поэтапному выполнению сценариев, имитирующих работу разработчика, с помощью программы-исполнителя. Как раз такие программы-исполнители представлены целым классом программных продуктов automation server (сервер автоматизации).

Выбор сервера автоматизации, в большинстве случаев, не является принципиальным решением, так как основная логика заключается именно в сценариях, поэтому универсального ответа на вопрос «какой сервер автоматизации использовать?» не существует. Более того, сервера взаимозаменяемы, так как решают одну задачу и, соответственно, имеют общие фундаментальные архитектурные шаблоны.

Таким образом критерии выбора сервера автоматизации для наших задач определялись сложившейся инфраструктурой и процессами в команде разработки.

Основными критериями при выборе сервера автоматизации были:

  • Работа под Windows.
    Так как в нашем подразделении сервера и администраторы работают преимущественно с этой операционной системой, это упростит развертывание и сопровождение.
  • Интеграция с git для перехода на EDT в будущем.
  • Распределенная архитектура рабочих процессов.
    Предпочтительно сразу заложить фундамент для масштабирования. Распределенная архитектура, позволяет наращивать пропускную способность системы, увеличивая количество исполнителей. Концепция распределения задач по исполнителям будет описана далее.
  • Хостинг на собственных серверах.

Так как задачи будут использовать внутренние ресурсы, развертывание на своих мощностях позволит полностью контролировать доступ к ресурсам.

Сравнение различных инструментов можно представить в виде таблицы. Оценка документации и удобства выполнялась по 5-ти бальной шкале.

Jenkins TeamCity Bamboo Travis
ОС Windows, Linux, macOS, any Unix-like Windows, Linux, macOS, Solaris, FreeBSD Windows, Linux, macOS, Solaris Linux, macOS
Поддержка git да да да Только GitHub
Распределенная архитектура да да да да
Документация и поддержка 3 4 4 1
Хостинг Облачный, собственный Собственный Собственный, облако BitBucket Облачный, собственный
Удобство использования 5 4 4 5
Лицензия MIT Проприетарная Проприетарная MIT

С полным списком инструментов можно ознакомиться тут en.wikipedia.org/wiki/
Comparison_of_continuous
_integration_software.

В нашем случае выбор пал на Jenkins. Он покрыл все наши требования, может интегрироваться практически с любой внешней программой. Плагины Jenkins охватывают пять областей: платформы, пользовательский интерфейс, администрирование, управление исходным кодом и, наиболее часто, управление сборкой.

Из минусов можно выделить устаревший и не всегда интуитивно понятный пользовательский интерфейс.

Концепция работы Jenkins

Jenkins — это автономное приложение на Java, которое может работать под Windows, Mac OS X и другими Unix-подобными операционными системами.

Jenkins можно запускать как в режиме единого сервера, так и в распределенном режиме, когда существует главный узел (master) и несколько подчиненных узлов (slave). В рамках подчиненного узла может существовать несколько исполнителей (executor), которые непосредственно выполняют поступающие задачи.

Запуск задачи может выполняться пользователем из веб-интерфейса, внешним приложением через http-интерфейс, при возникновении определенных событий (triggers). При завершении задачи, как правило, нужно оповестить ответственного, Jenkins позволяет настроить оповещения (notifications) через различные каналы коммуникаций (почта, мессенджер, http-запрос).

Концепция работы Jenkins

При поступлении задачи Jenkins ставит её в очередь исполнения и пытается найти свободного исполнителя, и если исполнитель найден, то задача передается ему для выполнения.

Основной единицей работы в Jenkins является задача (job), задача содержит в себе ряд этапов (stage), которые состоят из шагов (step). Под задачей подразумевается целостный набор действий, приводящий к получению конечного результата.

Например, в качестве задачи мы получаем файлы сборки для отправки в фирму «1С» при выпуске новых версий типовых отраслевых конфигураций. Этапы и шаги можно настраивать произвольно, в зависимости от поставленной задачи.

Этапы могут быть независимыми и выполняться параллельно на разных свободных исполнителях. Такой подход называется конвейер (pipeline).

Концепция работы Jenkins

На уровне шагов, как раз описывается логика выполняемых действий в виде различных сценариев. Передача параметров в сценарии выполняется с помощью установки переменных окружения.

Переменные окружения — именованные переменные, содержащие текстовую информацию, которую могут использовать запускаемые программы. Такие переменные могут содержать общие настройки системы, параметры графической или командной оболочки.

Этапы задачи можно выполнять параллельно на разных исполнителях, если этого требует задача. Jenkins позволяет по-разному описывать этапы и шаги задачи, мы используем два основных способа.

Первый способ: Freestyle project

Основной и наиболее универсальный тип задач в Jenkins — Freestyle project.

Данный тип проектов может использоваться для любых автоматизируемых задач. Это основной способ описания для задач сборки комплектов типовых отраслевых конфигураций. Описание шагов выполняется в пользовательском интерфейсе «накликиванием» различных типов шагов.

В наших сценариях в основном используются шаги с типом «Команда Windows».

Концепция работы Jenkins

Второй способ: Pipeline

Это тип задачи в Jenkins, с помощью которого мы можем описать задачу в виде специального файла (Jenkinsfile).

Такой подход является более гибким в сравнении с Freestyle описанием, так как описание конвейера выполняется на специальном декларативном языке (jenkins.io/doc/book/pipeline/syntax/). Язык предоставляет более широкие возможности, в том числе параллельное распределение этапов задачи на разных исполнителях. Также описание конвейера можно версионировать и централизованно редактировать в git.

Концепция работы Jenkins

Таким образом Jenkins позволяет пошагово выполнять любые приложения командной строки, сценарии операционной системы, а затем получать и агрегировать результат их выполнения. Этот принцип используется для решения задач автоматизации в «1С» разработке.

Кейсы применения Jenkins

Сборка комплектов

Задача сборки и концепция решения

Сборка комплектов типовых отраслевых решений представляет из себя процесс компоновки конфигурации, демонстрационной базы, дополнительных внешних обработок, расширений, описаний механизмов в комплект поставки и обновления и публикацию комплекта на публичных ресурсах для скачивания конечными пользователями.

Состав материалов в комплекте может различаться для разных продуктов, однако в общем процесс можно разделить на следующие этапы:

  • Взять предыдущие файлы поставки с общего ресурса.
  • Подключиться к хранилищу разработки, создать файлы поставки и обновления на базе предыдущих поставок.
  • Обновить демонстрационную базу текущим файлом поставки.
  • Прогнать дымовые тесты (открытие форм, корректность объединения некоторых объектов).
  • Выгрузить новую версию демонстрационной базы.
  • Подготовить сопроводительные материалы.
  • Собрать комплекты поставки и обновления.
  • Выложить собранные комплекты и материалы.

Для автоматизации выполнения этих операций система «1С:Предприятие» предоставляет интерфейс командной строки (its.1c.ru/db/v838doc/
bookmark/adm/TI000000493). Например, операция создания базы и подключения её к хранилищу для получения последней версии конфигурации выглядит примерно так:

Кейсы применения Jenkins

Здесь выполняются 2 команды и 3 операции: создание базы, подключение к хранилищу и обновление конфигурации базы данных. Команды объединяются символом &&, который прерывает выполнение следующей команды, если код возврата предыдущей был не равен 0. То есть, если базу создать не удалось, подключаться к хранилищу не нужно.

Вторая команда выводит детали процесса обновления в файл report. Сценарий выглядит довольно громоздко, учитывая, что выполняется простейшая операция. А процесс сборки состоит из десятков подобных операций. Более того, после каждой операции желательно проверить код возврата и увидеть содержимое файла report. Изначально мы использовали именно такой подход:

Кейсы применения Jenkins

Конвейер был реализован на базе Freestyle-задачи. Каждый шаг конвейера представлял собой batch-сценарий, в котором последовательно запускался процесс «1С:Предприятия» в разных режимах. Это рабочий сценарий, он справляется с задачей сборки, но такой сценарий довольно громоздкий и кажется избыточным.

Сопровождать такой сценарий трудоемко:

  • Сложно следить за изменениями в шагах и задачах Jenkins при исправлении ошибки или добавлении новых функций.
  • Не все сотрудники команды разработки знакомы с синтаксисом batch- сценариев.

Для упрощения сопровождения подобных сценариев было принято решение использовать OneScript (oscript.io) предоставляющий:

  • Среду исполнения текстовых сценариев на языке «1С».
  • Механизм построения консольных приложений, написанных на языке «1С».

На OneScript было реализовано консольное приложение — autoMate, скрывающее громоздкие конструкции batch-сценариев за сокращенным представлением команд, а также позволяющее настраивать общие параметры окружения сборки для каждой конкретной задачи единообразно.

Приложение позволяет хранить файлы сценариев в файлах на диске, автоматически загружая их при выполнении. Это позволяет редактировать команды приложения отдельно от самого приложения. Например, при вводе в терминале интерпретатора командной строки команды:

auto <ИмяКоманды> <Параметры команды>,

приложение autoMate пытается найти в указанном корневом каталоге файл сценария определяющий команду с именем <ИмяКоманды> и передать управление коду, определенному в этом файле. Параметры командной строки пробрасываются в сценарий:

Кейсы применения Jenkins

auto — имя приложения, зарегистрированное в системе. Можно использовать полное имя autoMate.

В теле процедуры команды, в свою очередь можно использовать любые конструкции языка «1С». Есть встроенный модуль, упрощающий работу с платформой «1С»:

Кейсы применения Jenkins

Для добавления команды достаточно создать процедуру с аннотацией &Команда в любом файле корневого каталога команд. Это возможно сделать без пересборки приложения, так что хранить команды можно в системе контроля версий и обновлять перед исполнением задачи в виде обычных текстовых файлов. Подключение и исполнение таких команд к приложению выполняется «на лету».

Приложение предоставляет объектную модель для встраивания в другие сценарии и набор команд для сборки комплектов, предоставляя возможность встраивания в другие сценарии:

Кейсы применения Jenkins

Команды загруженные в контекст приложения доступны для использования внутри объекта приложения, таким образом можно собирать более сложные сценарии на основе атомарных команд:

Кейсы применения Jenkins

Объединив приложение autoMate с принципом конвейера задачи Jenkins, мы значительно сократили сложность сопровождения сценариев сборки:

Кейсы применения Jenkins

Команды стали короче и понятнее. Конечно, сложность не исчезла, она была скрыта в сценариях на языке «1С».

Использование в виде декларативного описания конвейера, конечно тоже возможно, вот фрагмент файла описания:

Кейсы применения Jenkins

Окружение приложение можно настраивать через специальный файл, содержащий значения переменных окружения:

Кейсы применения Jenkins

Таким образом можно использовать одни сценарии сборки на в разных задачах сборки, настраивая сценарии без их изменения.

Пример работы конвейера сборки

Рассмотрим пошагово процесс настройки и исполнения сценария сборки очередного комплекта сборки. Для упрощения будем использовать задачу со свободной конфигурацией (Freestyle-проект).

Предположим, имеется конфигурация, сборку которой будем настраивать. Разработка конфигурации ведется на хранилище конфигураций, версия платформы 8.3.12.

История хранилища разработки выглядит так:

Кейсы применения Jenkins

Последний собранный комплект имел номер версии 1.0.1.9, необходимо собрать очередной комплект версии 1.0.2.3.

Структура каталога исходных материалов выглядит так:

Кейсы применения Jenkins

Исходные материалы расположены на внутреннем сервере разработки. Рассмотрим настройки файла settings:

Кейсы применения Jenkins

Поскольку сборка будет выполняться на другом сервере все пути к каталогам и файлам являются сетевыми.

Ответственный сотрудник через веб-интерфейс Jenkins стартует процесс сборки, если необходимо указывает некоторые параметры в диалоге:

Кейсы применения Jenkins

Далее Jenkins вызывает команды:

  • Сперва нужно получить служебные файлы в рабочий каталог сервера сборки:

    Кейсы применения Jenkins

  • Далее сформируем переменные окружения для сеанса сборки, это можно сделать с помощью встроенной команды:

    ККейсы применения Jenkins

    Эта команда создает на основании файла настроек batch файл с установкой значений переменных окружения, для исполнения перед последующими шагами сценария.

  • Получаем версии предыдущих поставок, для которых нужно создать файл обновления конфигурации:

    Кейсы применения Jenkins

  • Создаем новую рабочую базу и подключаемся к хранилищу:

    Кейсы применения Jenkins

Как видно, команда не требует большого количества параметров, практически все параметры определены в окружении. Однако, на время вызова их, конечно, можно переопределить.

Для примера ниже приведен полный текст команды make-workbase:


#Использовать "../../lib/Помощник"

Перем ПутьДляЗапуска;
Перем ОпцииВызова;

&Команда(
Псевдоним = "make-workbase",
Раздел = "Композитные команды",
Подсказка = 
"	Создание рабочей информационной базы, с получение cf из хранилища или из файла конфигурации
|
|	Опции:
|	 *--commit[-c] - номер закладки хранилища от которой выполняется формирование рабочей базы.
|					 Перегружает переменную среды ```target.repo_commit``` на время вызова
|	 *--file[-f]   - путь к файлу конфиуграции, на основе которого нужно создать базу.
|					 Если параметр указан, он перегружает переменную среды ```srt.cf.path```",

Пример = "auto make-workbase",
СОпциями = Истина,
ИспользуетКонтекстПриложения = Истина
)
Процедура Выполнение(Опции = Неопределено, ПриложениеКоманднойСтроки = Неопределено) Экспорт

	ПутьКПлатформе   = ПолучитьПеременнуюСреды("env.platform.root");
	ВерсияПлатформы  = ПолучитьПеременнуюСреды("env.platform.ver");
	ПутьДляЗапуска   = ОбъединитьПути(ПутьКПлатформе, ВерсияПлатформы, "bin1cv8.exe");
	Хранилище        = ПолучитьПеременнуюСреды("src.repo.connection");	
	ВерсияХранилища  = ПолучитьПеременнуюСреды("target.repo_commit");

	Если НЕ ЗначениеЗаполнено(ВерсияХранилища) Тогда
		ВерсияХранилища = 0;
	КонецЕсли;

	ВерсияХранилища = Помощник.ОдноИзЗначений(
		Опции,
		"--commit | -c",
		ВерсияХранилища
	);

	ФайлКонфигурации = ПолучитьПеременнуюСреды("src.cf.path");
	ФайлКонфигурации = Помощник.ОдноИзЗначений(
		Опции,
		"--file | -f",
		ФайлКонфигурации
	);

	ЗагрузитьКонфигурациюИзФайла = ЗначениеЗаполнено(ФайлКонфигурации);

	КонвейерКоманд = Новый Массив();
	КонвейерКоманд.Добавить(
		"create-db work.database -f"
	);
	
	Если ЗагрузитьКонфигурациюИзФайла Тогда
		КонвейерКоманд.Добавить(
			СтрШаблон(
				"load-cf work.database ""%1"" -upd",
				ФайлКонфигурации
			)
		);
	Иначе
		КонвейерКоманд.Добавить(
			СтрШаблон(
				"load-repo work.database ""%1"" -rap=src.repo. -c=%2 -upd",
				Хранилище,
				ВерсияХранилища
			)
		);
		
	КонецЕсли;

	ПриложениеКоманднойСтроки.Интерпретировать(
		СтрСоединить(КонвейерКоманд, Символы.ПС)
	);

КонецПроцедуры

Скачать

  • На базе последней версии хранилища и предыдущих поставок создаем новые файл поставки и файл обновления конфигурации:

    Кейсы применения Jenkins

  • После чего загружаем и обновляем демонстрационную базу:

    Кейсы применения Jenkins

    Концепция понятна, каждую команду рассматривать не станем.

  • Последним шагом размещаем итоговые материалы на внутреннем сервере и Jenkins отправляет оповещение на почту ответственному.

В веб-интерфейсе Jenkins всегда можно увидеть статус выполняемого этапа и шага:

Концепция работы Jenkins

Таким образом была решена задача автоматизации сборок при выпуске очередных релизов типовых конфигураций.

Запуск автоматических тестов

В данном разделе мы не стремимся рассмотреть технологии тестирования, ограничиваясь демонстрацией взаимодействия с сервером автоматизации.

Задача запуска автоматического тестирования сопровождается рядом постоянно выполняемых подготовительных операций. Перечень этих операций сильно разниться в зависимости от тестируемого участка конфигурации, вида тестов и ожидаемого результата, но в общем можно выделить следующие операции:

  • актуализация состава тестов;
  • развертывание информационной базы для тестирования;
  • выполнение тестовых сценариев;
  • подготовка отчета по результатам тестирования.

Для упрощения жизни тестировщикам и разработчикам эти операции мы будем автоматизировать. Рассмотрим сценарий тестирования консистентности ролей в «Альфа-Авто: Автосалон+Автосервис+Автозапчасти Корп, редакция 6».

При разработке конфигурации постоянно приходится проверять, правильно ли настроены роли, отключено ли интерактивное удаление, назначены RLS и нет ли ролей, дающих доступ к избыточно большому количеству объектов.

Ролей много, вручную отслеживать правильность их настройки трудоемко. Поэтому было принято решение автоматизировать процесс.

Для реализации тестов использовали продукт Vanessa-ADD. Следует заметить, что существует много продуктов такого класса. Например Vanessa-Automation, Tester, 1С:Сценарное тестирование. Причиной выбора продукта Vanessa-ADD явилось то, что он первым попался в руки специалиста и был получен в короткое время результат. Для реализации проверки консистентности ролей потребовались только юнит-тесты, так как нужно было только программное взаимодействие с конфигурацией.

Юнит-тестирование — процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы, наборы из одного или более программных модулей вместе с соответствующими управляющими данными, процедурами использования и обработки. Идея состоит в том, чтобы писать тесты для каждой нетривиальной функции или метода. Это позволяет достаточно быстро проверить, не привело ли очередное изменение кода к регрессии, то есть к появлению ошибок в уже протестированных местах программы, а также облегчает обнаружение и устранение таких ошибок.

Vanessa-ADD представляет собой обработку-исполнитель, которая умеет запускать внешние обработки-тесты, поддерживающие определенный программный интерфейс.

В методе ЗаполнитьНаборТестов() обработки-теста необходимо перечислить список имен экспортных процедур из этой же обработки-теста. Эти процедуры становятся шагами тестового сценария, которые будут вызваны при исполнении тестовой обработки. Если при выполнении шагов не возникло ошибок/исключений, тест считается пройденным, иначе проваленным.

Запуск автоматических тестов

Роли разбили на группы по метаданным и на каждую из групп реализовали обработку-тест. А сами обработки сохранили в git для версионирования и отслеживания истории изменения. Получился такой набор обработок:

Запуск автоматических тестов

Данные тесты можно выполнять автоматически и вручную. Ручной запуск обычно используют для процесса отладки. Загруженные в исполнитель тесты выглядят следующим образом:

Запуск автоматических тестов

Реализация конвейера тестирования

Конвейер был реализован на базе Freestyle-задачи. Для взаимодействия с «1С:Предприятием» использовали интерфейс командной строки.

Запуск был настроен по расписанию каждую ночь в пять утра. Для этого в параметре задачи «Запускать периодически» настроим расписание запуска в формате cron 0 5 * * *.

Формат cron — пять чисел, разделенных пробелом или табом в порядке:
Минуты (0–59) Часы (0–23) День месяца (1–31) Месяц (1–12) День недели (0–7)
Где:
*  — Любое значение

Первым делом после запуска задачи необходимо получить актуальную версию тестов. Для этого клонируем репозиторий с тестами в рабочую папку Jenkins.

Под рабочей папкой понимается каталог, созданный Jenkins для конвейера при запуске. Относительно этого каталога выполняются команды. Рабочую папку рекомендуется использовать для сохранения ресурсов и артефактов необходимы для работы конвейера. Рабочая папка называются по имени задачи. Расположение родительского каталога для размещения рабочих папок указывается в настройках Jenkins.

Запуск автоматических тестов

Теперь необходимо подготовить базу для тестирования. Источники для создания тестируемой базы могут быть хранилище, поставка, демо-база или выгрузка специально настроенной базы. В примере база создается по хранилищу, после чего выполняется запуск с выполнением обработчиков обновления из БСП. Тут для удобства сначала заполняются переменные окружения, потом они используются при вызове команд.

Запуск автоматических тестов

Для первого старта конфигурации используется не стандартный интерфейс командной строки «1С: Предприятие», а библиотека на onescript vanessa-runner.

Библиотека vanessa-runner (github.com/vanessa-opensource/vanessa-runner) — это обёртка над интерфейсом командной строки «1С:Предприятие», добавляющая ряд удобств в процесс работы с запуском пакетных команд «1С».

Например, нет необходимости указывать полный путь к исполняемому файлу «1С», достаточно указать версию.

Выполняем тесты:

Запуск автоматических тестов

Интересными в команде являются только последние строки с параметрами запуска исполнителя тестов:

  • xddRun — описание источника тестов. Возможно указать файл обработки или каталог с обработками как в примере.
  • xddReport — описание формата отчета о тестировании и путь для сохранения отчета. Используется отчет в формате Allure2 (docs.qameta.io/allure/).
  • xddShotdown — закрывать «1С:Предприятие» после выполнения тестов.

Для работы с Allure2 в Jenkins существует плагин Allure (plugins.jenkins.io/allure-jenkins-plugin/), который необходим для просмотра отчета в удобном виде:

Запуск автоматических тестов

Запуск автоматических тестов

Финальным штрихом стала настройка рассылки почтовых уведомлений ответственному сотруднику о проваленном тестировании. А он в дальнейшем выполняет исправлении или делегирует его коллегам. Это встроенный в Jenkins шаг после сборки:

Запуск автоматических тестов

Проверка качества кодовой базы

В этой части вы не найдете материалов, посвященных важности чистоты кода, инструментам для этого. Речь пойдет об использовании Jenkins для автоматизации процесса анализа конфигурации.

Для статического анализа конфигураций мы используем связку инструментов SonarQube и Автоматизированная проверка конфигураций.

В целом процесс выглядит так:

  • Пользователь помещает изменения в хранилище.
  • 1C:ГитКонвертер:
    • выполняет выгрузку xml файлы;
    • выполняет коммиты в локальный  каталог git;
    • отправляет изменения на сервер.
  • По расписанию стартует конвейер на сервере сборок.
    Как правило это производится в момент, когда команда разработки не вносит изменений.
  • Jenkins запускает АПК на проверку конфигурации.
    По окончанию проверки АПК, предоставляется отчет об обнаруженных ошибках.
  • Jenkins передает отчет вместе с исходниками в SonarScanner.
  • SonarScanner выполняет анализ исходников и загрузку результатов на сервер.
  • На утро разработчик видит перечень допущенных им ошибок и может приступить к исправлению.

Проверка качества кодовой базы

В данной схеме Jenkins занимает место посредника / агрегатора между инструментами. Но кроме этого он решает еще одну важнейшую задачу масштабирования. Статический анализ конфигурации может использовать значительные ресурсы сервера.

Например, анализ ERP на 12 ядрах и 16 Гб оперативной памяти занимает около 20 минут в сонар сканере, а анализ ее же в АПК в тех же условиях может занять около 2 часов. Чтобы успеть за одну ночь прогнать проверки всех наших конфигураций необходимо распределять нагрузку по нескольким серверам. Горизонтальное масштабирование реализовали за счет возможности Jenkins запускаться в распределенном режиме:

Концепция работы Jenkins

Перед реализацией, выполнив исследование, обнаружили плагин для работы с SonarQube:

Проверка качества кодовой базы

Плагин позволяет настроить доступы к серверам SonarQube, а также берет на себя ответственность за доставку инструментария SonarScanner по нодам. Это означает, что как только на новом slave-сервере происходит обращение к SonarScanner, он будет установлен со всеми необходимыми ему для работы зависимостями.

В настройках плагина описываем параметры доступа к серверу SonarQube:

Проверка качества кодовой базы

Плагин предоставляет интерфейс для работы с SonarScanner из задачи:

Проверка качества кодовой базы

Реализация конвейера проверки качества кода

Настраиваем работу ГитКонвертера так, чтобы исходники конфигурации оказались на сервере, используемом для запуска задачи.

Так как задача в Jenkins выглядит почти одинаково и отличается только рядом параметров, для удобства копирования выбрали вид задачи Pipeline.

На самый верх скрипта вынесли изменяемые параметры:

Проверка качества кодовой базы

  • SRC_BASE_DIR — путь к каталогу с исходными файлами.
  • PROJECT_KEY — ключ проекта в АПК и SonarQube.
  • PROJECT_NAME — имя проекта на русском языке.
  • ACC_INSTANCE — строка подключения к АПК.
  • V8_VERSION — версия на которой крутиться АПК.

Указываем агента, на котором требуется выполнять сборку. Можно указать конкретный сервер по имени или набор меток, тогда задача выполнится на сервере подходящим под указанный набор.

Метки задаются при создании агента:

Проверка качества кодовой базы

Также можно указать параметры самой задачи в Jenkins. Например, сбросить через 8 часов, если задача не завершиться и хранить информацию только о последних 10 сборках.

Процедура запуска сканнера с передачей в него результатов анализа в АПК занимает всего несколько строк:

Проверка качества кодовой базы

После выполнения проверки результат отображается в информации о задаче Jenkins и есть возможность перейти к проекту в SonarQube.

Проверка качества кодовой базы

Так зачем нужен Jenkins в разработке «1С»?

Что же мы увидели в результате прочтения статьи. Во-первых, что существуют рутинные операции, связанные с разработкой продуктов на базе «1С». Во-вторых, что качественное исполнение таких операцией вручную может приводить к ошибкам сборки комплектов, некачественному функционированию и другим не очень приятным вещам.

Применение инструментов подобных Jenkins позволяет сэкономить время на рутинных операциях, обеспечить качественное устойчивое исполнение, исключающее человеческий фактор. Безусловно применение инструментов автоматизации требует новых знаний, навыков и некоторого первичного осознания, погружения в философию и функционал таких инструментов. Но это полностью оправдывается повышением качества разработки проектных и типовых решений.

Интересующиеся проверкой качества кода могут посмотреть доклад Эдуарда Иванова с 1C-RarusTechDay 2020 «Инструменты проверки качества кода» здесь.

Авторы статьи

Эдуард Иванов

Эдуард Иванов

Черанев Андрей

Черанев Андрей

  • Ошибка jeep grand cherokee wj p0420
  • Ошибка jeep grand cherokee p0456
  • Ошибка jcb l 071
  • Ошибка jcb 220 p0380
  • Ошибка javax net ssl sslhandshakeexception