{"id":280740,"date":"2016-11-10T14:00:08","date_gmt":"2016-11-10T11:00:08","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=280740"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=280740","title":{"rendered":"\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043d\u0430 \u0431\u0430\u0437\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 COREmanager. \u041a\u0430\u043a \u043d\u0430\u0448\u0438 \u043f\u0430\u0440\u0442\u043d\u0451\u0440\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0430\u0443\u0442\u0441\u043e\u0440\u0441\u0438\u043d\u0433\u0430 \u0442\u0435\u0445\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438"},"content":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/d82\/2ad\/713\/d822ad71353241199d42e23f3d67c8be.jpg\"\/><\/p>\n<p>  <i>\u0415\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u0447\u0430\u0442\u044c \u0441\u0432\u043e\u0451 \u0434\u0435\u043b\u043e \u0438 \u0445\u043e\u0447\u0435\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u043d\u043b\u0430\u0439\u043d-\u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u043e \u043f\u0440\u043e\u0434\u0430\u0436\u0435 \u0446\u0432\u0435\u0442\u043e\u0432 \u0438\u043b\u0438 \u043a\u043e\u0444\u0435 \u043f\u043e \u0444\u0440\u0430\u043d\u0448\u0438\u0437\u0435, \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0431\u0438\u0437\u043d\u0435\u0441 \u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u0430\u0434\u043e \u0431\u044b\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u043c \u043a \u0431\u043e\u043b\u044c\u0448\u043e\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043e\u0432 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0444\u0435\u0440\u0435. \u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u201c\u043f\u0440\u043e\u0433\u043e\u0440\u0435\u0442\u044c\u201d \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442\u0441\u044f.<br \/>  \u0415\u0441\u043b\u0438 \u0436\u0435 \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043c\u0430\u043b\u043e \u043e\u0441\u0432\u043e\u0435\u043d\u043d\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c, \u0433\u0434\u0435 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0446\u0438\u044f \u043c\u0435\u043d\u044c\u0448\u0435, \u0442\u043e \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u0434\u0430\u0447 \u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0435 \u0431\u044b\u0442\u044c. \u0414\u0430, \u043f\u0435\u0440\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0451 \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u043e\u0434\u043d\u0430\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u0434\u0440\u0430\u0441\u0442\u0451\u0442, \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0432\u0441\u0435\u0440\u044c\u0451\u0437 \u0437\u0430\u0434\u0443\u043c\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u0434 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432.<br \/>  \u041f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a COREmanager \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u0443, \u0441\u043a\u0435\u043b\u0435\u0442, \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430. \u042d\u0442\u043e \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442 \u0437\u0430\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0435 \u043d\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<br \/>  \u041f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u2014 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0434\u043b\u044f \u0430\u0443\u0442\u0441\u043e\u0440\u0441-\u0442\u0435\u0445\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0435\u0439 ISPlicense.<\/i><br \/>  <a name=\"habracut\"><\/a><br \/>  <a href=\"https:\/\/www.isplicense.ru\/\">ISPlicense<\/a> \u2014 \u044f\u0440\u043a\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0449\u0435\u0439 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0443\u0441\u043b\u0443\u0433\u0438 \u0432 \u043e\u0447\u0435\u043d\u044c \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0439 \u0441\u0444\u0435\u0440\u0435 \u0431\u0438\u0437\u043d\u0435\u0441\u0430. \u041e\u043d\u0438 \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u0441\u0444\u0435\u0440\u0443 \u0445\u043e\u0441\u0442\u0438\u043d\u0433\u0430, \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0432 \u0431\u0438\u0437\u043d\u0435\u0441 \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0430 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0438 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0438 \u0432\u043d\u043e\u0432\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u0440\u044b\u043d\u043e\u043a \u0438\u0433\u0440\u043e\u043a\u043e\u0432. \u041a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441 \u0440\u0435\u0441\u0435\u043b\u043b\u0438\u043d\u0433\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0445 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 ISPsystem, \u0441\u0442\u0430\u0432 \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043d\u0430\u0448\u0438\u0445 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043f\u0430\u0440\u0442\u043d\u0451\u0440\u043e\u0432. \u0421\u043f\u0443\u0441\u0442\u044f \u0432\u0440\u0435\u043c\u044f, \u043f\u0430\u043a\u0435\u0442 \u0443\u0441\u043b\u0443\u0433 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u043b\u0441\u044f \u043e\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/www.isplicense.ru\/services\/administration\/outsource\/\">\u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043d\u0430 \u0430\u0443\u0442\u0441\u043e\u0440\u0441\u0438\u043d\u0433\u0435<\/a>, \u0447\u0442\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043e\u0447\u0435\u043d\u044c \u0432\u043e\u0441\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u043d\u044b\u043c. \u041d\u0435\u0445\u0432\u0430\u0442\u043a\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0441\u0442\u044c \u043e\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u043f\u043e\u0431\u0443\u0434\u0438\u043b\u0438 \u043d\u0435\u043c\u0430\u043b\u043e \u0445\u043e\u0441\u0442\u0435\u0440\u043e\u0432 \u0432\u0441\u0435\u0440\u044c\u0451\u0437 \u0437\u0430\u0434\u0443\u043c\u0430\u0442\u044c\u0441\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0434\u0430\u0442\u044c \u0442\u0435\u0445\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0432 \u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>  ISPlicense \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0430\u0443\u0442\u0441\u043e\u0440\u0441\u0438\u043d\u0433\u043e\u0432\u0443\u044e \u0442\u0435\u0445\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043f\u043e \u0434\u0432\u0443\u043c \u0441\u0445\u0435\u043c\u0430\u043c:<\/p>\n<ol>\n<li>\u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0445\u043e\u0441\u0442\u0435\u0440\u043e\u043c, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0434\u043b\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0442\u0435\u0445\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0443\u0447\u0451\u0442 \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0430 \u043e\u0442\u0432\u0435\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0447\u0451\u0442\u0430 \u0445\u043e\u0441\u0442\u0435\u0440\u0443 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0430.<\/li>\n<li>\u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043d\u0435 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0430, \u0442\u043e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0440\u0430\u0439\u0441\u0430, \u0433\u0434\u0435 \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u043b\u0430\u0442\u044b \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438\u043b\u0438 \u043e\u0442 \u043f\u0435\u0440\u0435\u0447\u043d\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0443\u0441\u043b\u0443\u0433. \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0447\u0451\u0442 \u043e\u0442 \u043b\u0438\u0446\u0430 \u0445\u043e\u0441\u0442\u0435\u0440\u0430, ISPlicense \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u043d\u0442 \u043e\u0442 \u0441\u0443\u043c\u043c\u044b.<\/li>\n<\/ol>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438.<br \/>  \u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0445 \u043f\u043e\u0440\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430\u043c\u0438 \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u0441\u0445\u0435\u043c\u0430\u043c: \u043a\u0442\u043e-\u0442\u043e \u0434\u0430\u0451\u0442 \u043b\u043e\u0433\u0438\u043d-\u043f\u0430\u0440\u043e\u043b\u044c \u0441\u0432\u043e\u0435\u0433\u043e \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430, \u043a\u0442\u043e-\u0442\u043e \u0437\u0430\u0432\u043e\u0434\u0438\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043a \u043a\u043e\u043c\u0443-\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 BILLmanager. \u041d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0435\u0441\u043b\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0445\u043e\u0441\u0442\u0435\u0440\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u043e\u0441\u044c \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0442\u0435\u0445\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u0443\u0442\u0430\u0435\u0442\u0441\u044f \u0432 \u0434\u0435\u0441\u044f\u0442\u043a\u0430\u0445 \u0432\u043a\u043b\u0430\u0434\u043e\u043a \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0442\u0438\u043a\u0435\u0442\u0430\u0445.<br \/>  \u0414\u043b\u044f \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f ISPlicense \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u043d\u0430 \u0431\u0430\u0437\u0435 COREmanager \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0442\u0435\u0445\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438, \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0441 BILLmanager \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0431\u0438\u043b\u043b\u0438\u043d\u0433\u0430\u043c\u0438. \u041f\u0440\u043e\u0434\u0443\u043a\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 TicketManager.<\/p>\n<p>  \u041f\u043e\u0436\u0430\u043b\u0443\u0439, \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0442\u043e\u0438\u0442 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0443\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e <a href=\"https:\/\/www.ispsystem.ru\/software\/coremanager\">COREmanager<\/a>. \u042d\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 C++ \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a, \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440.<br \/>  \u0415\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0432 2010 \u0433\u043e\u0434\u0443. COREmanager \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0441\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u043e\u0431\u0449\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0438 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432. BILLmanager, ISPmanager, VMmanager, DCImanager \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u043b\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c\u0438 \u201c\u044f\u0434\u0440\u0430\u201d, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 ISPsystem. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u043b\u043e\u0441\u044c \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b\u0430\u0441\u044c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0430\u0433\u043e\u0432 \u0438 \u043f\u043e\u0434\u043d\u044f\u043b\u0430\u0441\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432.<br \/>  COREmanager \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e, \u0438\u043c\u0435\u0435\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u044e\u0431\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043c\u0435\u043d\u044e \u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438\u043b\u0438 \u043f\u0443\u0442\u0451\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f xml-\u0444\u0430\u0439\u043b\u0430, \u0430 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0435\u0441\u043b\u0438 \u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.<br \/>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 ISPlicense \u0432\u044b\u0431\u0440\u0430\u043b\u0430 COREmanager \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f TicketManager. \u0414\u0430, \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0433\u043e\u0442\u043e\u0432\u044b\u043c\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u0434\u043b\u044f \u0442\u0435\u0445\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0438\u043b\u0438 \u0440\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u043f\u0443\u0442\u0451\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0434\u043b\u044f BILLmanager, \u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c ISPlicense \u043e\u0447\u0435\u043d\u044c \u0443\u0436 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0441\u0430\u043c\u0438\u043c \u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 COREmanager. \ud83d\ude42<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0443\u0441\u043b\u0443\u0433\u0438 \u0430\u0443\u0442\u0441\u043e\u0440\u0441\u0438\u043d\u0433\u0430, \u0441 \u0442\u0435\u0447\u0435\u043d\u0438\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0444\u043e\u0440\u043c\u0438\u043b\u0430\u0441\u044c \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0430\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u043a\u0430 \u0438 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u0432\u043e\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0435\u0445\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438. \u041e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u0441\u044b\u043b\u043a\u0438 \u0438 \u0437\u0430\u0434\u0430\u0447\u0438:<\/p>\n<ul>\n<li>\u0415\u0441\u043b\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u0434\u043b\u044f \u043a\u043e\u043d\u0441\u0443\u043b\u044c\u0442\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u044d\u0442\u043e \u043e\u0442\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041a\u0440\u043e\u043c\u0435 \u044d\u0442\u043e\u0433\u043e, \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a \u0442\u0435\u0445\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430\u043c\u0438, \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043f\u0443\u0442\u0430\u043d\u0438\u0446\u0430, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0440\u0430\u0431\u043e\u0442\u043d\u0438\u043a\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u043a\u043b\u0430\u0434\u043e\u043a \u0438\u043b\u0438 \u043e\u043a\u043e\u043d \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0445\u043e\u0441\u0442\u0435\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u043b\u043b\u0438\u043d\u0433\u0438 \u043e\u0442 \u0440\u0430\u0437\u043d\u044b\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0421\u0442\u0430\u043b\u043e \u0431\u044b\u0442\u044c, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u0438 \u0442\u0438\u043a\u0435\u0442\u043e\u0432 \u0432 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u0438 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0438\u0445 \u043a \u0435\u0434\u0438\u043d\u043e\u043c\u0443 \u0432\u0438\u0434\u0443.<\/li>\n<li>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0442\u0430\u0440\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u043e\u0447\u0430\u0441\u043e\u0432\u0430\u044f, \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0443\u0447\u0451\u0442 \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0430 \u0442\u0438\u043a\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/li>\n<li>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0438 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0447\u0435\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0437\u0430 \u043f\u043b\u0430\u0442\u043d\u043e\u0435 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435).<\/li>\n<li>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0442\u0447\u0451\u0442\u043e\u0432 \u0438 \u0441\u0447\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u0445\u043e\u0441\u0442\u0435\u0440\u043e\u0432 \u0442\u043e\u0436\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/li>\n<li>\u0412\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u043d\u0438\u0435 \u043b\u0438\u0448\u043d\u0438\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043a\u0430\u043a \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430, \u0442\u0430\u043a \u0438 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 ISPlicense \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u043d\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0435\u0445\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0430\u0443\u0442\u0441\u043e\u0440\u0441\u0438\u043d\u0433\u043e\u0432\u0430\u044f.<\/li>\n<\/ul>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0447\u0430\u0441\u0442\u0435\u0439: \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u0430\u043c\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0438\u043a\u0435\u0442\u043e\u0432 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0431\u0438\u043b\u043b\u0438\u043d\u0433 \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c API, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0442\u0435\u0445\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0438\u043b\u0438 \u0431\u0438\u043b\u043b\u0438\u043d\u0433\u043e\u043c.<\/p>\n<p>  \u041f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043c\u0441\u044f \u0441 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c\u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u0442\u0435\u0445\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438.<br \/>  \u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0438\u043a\u0435\u0442\u043e\u0432 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u043e, \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0442\u043e\u043d\u043a\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0437\u0430\u044f\u0432\u043a\u0430\u043c\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432 \u043c\u0435\u043d\u044e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0437\u0430\u044f\u0432\u043a\u0438.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/bb3\/37e\/ca6\/bb337eca685e49b6a58278f5149f155f.png\"\/><\/p>\n<p>  \u041e\u0442\u043a\u0440\u043e\u0435\u043c \u043b\u044e\u0431\u043e\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043d\u0438\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0438\u0442\u044c.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/efa\/2a3\/0c4\/efa2a30c481f4989ad7d1f8424845a63.png\"\/><\/p>\n<ul>\n<li><b>\u041e\u0442\u0432\u0435\u0442\u0438\u0442\u044c<\/b>. \u0411\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u0442\u0438\u043a\u0435\u0442 \u0437\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c, \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0432\u0432\u043e\u0434\u0430 \u043e\u0442\u0432\u0435\u0442\u0430 \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0443\u0447\u0451\u0442 \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/li>\n<li><b>\u0417\u0430\u043c\u0435\u0442\u043a\u0430<\/b>. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u043b\u044f \u043a\u043e\u043b\u043b\u0435\u0433 \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435, \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0435 \u043a \u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0443. \u041e\u043d\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434\u043d\u043e \u043d\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u043d\u0438 \u0434\u043b\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430.<\/li>\n<li><b>\u041a\u043b\u0438\u0435\u043d\u0442<\/b>. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \u0434\u043b\u044f \u0437\u0430\u043c\u0435\u0442\u043e\u043a, \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0435 \u043a \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0443.<\/li>\n<li><b>\u041f\u0440\u043e\u0435\u043a\u0442<\/b>. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u043f\u043e \u0445\u043e\u0441\u0442\u0435\u0440\u0443.<\/li>\n<li><b>\u0421\u043d\u044f\u0442\u044c \u0434\u0435\u043d\u044c\u0433\u0438<\/b>. \u0421\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0434\u0435\u043d\u044c\u0433\u0438 \u0437\u0430 \u043e\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0443\u0441\u043b\u0443\u0433 \u0441 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0432 \u0431\u0438\u043b\u043b\u0438\u043d\u0433\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0445\u043e\u0441\u0442\u0435\u0440\u0430.<\/li>\n<li><b>\u0417\u0430\u043a\u0440\u044b\u0442\u044c<\/b>. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a \u0441\u043f\u0438\u0441\u043a\u0443 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0442\u0438\u043a\u0435\u0442\u043e\u0432.<\/li>\n<\/ul>\n<p>  \u041a\u0440\u043e\u043c\u0435 \u044d\u0442\u043e\u0433\u043e, \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 \u0438\u043d\u0438\u0446\u0438\u0430\u0442\u043e\u0440\u0435 \u0442\u0438\u043a\u0435\u0442\u0430. \u041f\u0440\u0438 \u0449\u0435\u043b\u0447\u043a\u0435 \u043d\u0430 id \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0432 \u0435\u0433\u043e \u0431\u0438\u043b\u043b\u0438\u043d\u0433, \u043f\u0440\u0438 \u0449\u0435\u043b\u0447\u043a\u0435 \u043d\u0430 \u0438\u043c\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c.<br \/>  \u0422\u0430\u043a\u0436\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 \u0443\u0441\u043b\u0443\u0433\u0435, \u0432 \u0441\u0432\u044f\u0437\u0438 \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u043b\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u0433\u0434\u0435 \u0440\u0430\u0437\u0432\u0451\u0440\u043d\u0443\u0442\u0430 \u0443\u0441\u043b\u0443\u0433\u0430, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430.<\/p>\n<p>  \u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c \u0442\u0438\u043a\u0435\u0442 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043e\u0442\u043a\u0440\u044b\u0432\u0448\u0435\u0439\u0441\u044f \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043e\u0442\u0432\u0435\u0442\u0430.<\/p>\n<ul>\n<li><b>\u0420\u0430\u0437\u0431\u043b\u043e\u043a<\/b>. \u041e\u0442\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u0438\u043a\u0435\u0442 \u043e\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0437\u044f\u0442\u044c\u0441\u044f \u0437\u0430 \u043e\u0442\u0432\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443.<\/li>\n<li><b>\u041e\u0442\u0434\u0435\u043b<\/b>. \u0421\u043b\u0443\u0436\u0438\u0442 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0437\u0430\u044f\u0432\u043a\u0438 \u0432 \u0434\u0440\u0443\u0433\u043e\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0445\u043e\u0441\u0442\u0438\u043d\u0433-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0442 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432 \u0432 \u0431\u0443\u0445\u0433\u0430\u043b\u0442\u0435\u0440\u0438\u044e, \u0435\u0441\u043b\u0438 \u0440\u0435\u0447\u044c \u0438\u0434\u0451\u0442 \u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432.<\/li>\n<li><b>\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439<\/b>. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0442\u0438\u043a\u0435\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u0440\u044b\u0442\u043e \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438 \u043e\u0442 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430.<\/li>\n<li><b>\u041f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f<\/b>. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u0442\u0438\u043a\u0435\u0442. \u0418\u0437\u043c\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0432 \u043c\u0438\u043d\u0443\u0442\u0430\u0445. \u041f\u0440\u0438 \u0440\u0443\u0447\u043d\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0434\u0441\u0447\u0451\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f.<\/li>\n<li><b>\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/b>. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0442\u0435\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043d\u0435 \u043f\u0440\u0435\u0434\u043f\u0440\u0438\u043c\u0435\u0442 \u0432 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043f\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044e \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a \u043f\u0435\u0440\u0435\u0434 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435\u043c ISPmanager \u0436\u0434\u0451\u0442 \u043f\u043e\u043a\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435.<\/li>\n<li><b>\u0421\u0442\u0430\u0442\u0443\u0441<\/b>. \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0442\u0438\u043a\u0435\u0442\u0430.<br \/> \n<ul>\n<li><b>\u041e\u0442\u043a\u0440\u044b\u0442<\/b>. \u0412\u0435\u0434\u0451\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043d\u0430\u0434 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c.<\/li>\n<li><b>\u0417\u0430\u043a\u0440\u044b\u0442<\/b>. \u0417\u0430\u043f\u0440\u043e\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d.<\/li>\n<li><b>\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435<\/b>. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u0440\u0435\u0442\u044c\u0438\u043c \u043b\u0438\u0446\u043e\u043c, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f, \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430. \u0417\u0430\u043f\u0440\u043e\u0441 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043d\u0438\u0436\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043a\u0430, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043e\u0442\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u043e\u0442 \u201c\u0433\u043e\u0440\u044f\u0449\u0438\u0445\u201d \u0437\u0430\u0434\u0430\u0447.<\/li>\n<li><b>\u041e\u0442\u043b\u043e\u0436\u0435\u043d<\/b>. \u0422\u0438\u043a\u0435\u0442 \u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u0434\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u043b\u0435 \u201c\u041e\u0442\u043b\u043e\u0436\u0438\u0442\u044c \u0434\u043e\u201d.<\/li>\n<\/ul>\n<\/li>\n<li><b>\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0443<\/b>. \u041d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434\u043d\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e, \u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430\u043c \u0445\u043e\u0441\u0442\u0438\u043d\u0433-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430.<\/li>\n<li><b>\u0417\u0430\u043f\u0440\u0435\u0442\u0438\u0442\u044c \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u0442\u0438\u043a\u0435\u0442\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c<\/b>. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0437\u0430\u0434\u043e\u043b\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0437\u0430\u043a\u043e\u043d\u043d\u043e\u0439 \u0434\u0435\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/li>\n<\/ul>\n<p>  \u0412 \u0445\u043e\u0434\u0435 \u043a\u043e\u043d\u0441\u0443\u043b\u044c\u0442\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0430 \u0435\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442 ISPlicense; \u043e\u043d \u0432\u0438\u0434\u0438\u0442, \u0447\u0442\u043e \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440 \u0438\u0434\u0451\u0442 \u0441 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u043c \u0435\u0433\u043e \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430.<br \/>  \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u0437\u0430\u043d\u044f\u043b\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 5000 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u043f\u0430\u043d\u0435\u043b\u0438 \u0442\u0435\u0445\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0438 \u043f\u043e 500 \u0441\u0442\u0440\u043e\u043a \u0434\u043b\u044f \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 BILLmanager \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0431\u0438\u043b\u043b\u0438\u043d\u0433\u0430\u043c\u0438.<br \/>  \u0416\u0435\u043b\u0430\u044e\u0449\u0438\u0435 \u043c\u043e\u0433\u0443\u0442 \u0438\u0437\u0443\u0447\u0438\u0442\u044c <a href=\"https:\/\/github.com\/bdolgov\/ticketmgri\/wiki\/Client-API\">API TicketManager<\/a>, \u0430 \u043d\u0438\u0436\u0435 \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u0430\u043c\u0438 \u2014 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u043e\u0434\u0443\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f BILLmanager.<br \/>  \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b\u0438 \u043d\u0430 \u043f\u043e\u0434\u0431\u0438\u0432\u043a\u0443 \u043d\u0443\u0436\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432 \u0435\u0434\u0438\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u0447\u0435\u043c \u043d\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043b\u044c\u0432\u0438\u043d\u0430\u044f \u0434\u043e\u043b\u044f \u043d\u0443\u0436\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0443\u0436\u0435 \u0431\u044b\u043b\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0432 COREmanager. \u041d\u0443 \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0442\u043e\u0436\u0435 \u043d\u0435 \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u043f\u0438\u0441\u0430\u0442\u044c, \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0433\u0434\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Makefile<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>MGR = billmgr PLUGIN = ticketmgri VERSION = 5.0.1 LIB += ticketmgri ticketmgri_SOURCES = ticketmgri.cpp  WRAPPER += ticketmgri_syncticket ticketmgri_syncticket_SOURCES = ticketmgri_syncticket.cpp ticketmgri_syncticket_LDADD = -lbase  BASE ?= \/usr\/local\/mgr5 include $(BASE)\/src\/isp.mk<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">billmgr_mod_ticketmgri.xml<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"xml\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;mgrdata&gt;   &lt;library name=&quot;ticketmgri&quot; \/&gt; &lt;\/mgrdata&gt;<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">ticketmgri.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &lt;api\/action.h&gt; #include &lt;api\/module.h&gt; #include &lt;api\/stdconfig.h&gt; #include &lt;billmgr\/db.h&gt; #include &lt;mgr\/mgrdb_struct.h&gt; #include &lt;mgr\/mgrlog.h&gt; #include &lt;mgr\/mgrtask.h&gt;  MODULE(&quot;ticketmgri&quot;);  using namespace isp_api;  namespace {  StringVector allowedDepartments, hideDepartments;  \/**  * \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0442\u0438\u043a\u0435\u0442, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 LongTask (\u0444\u043e\u043d\u043e\u0432\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u044f) \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0444\u0430\u0439\u043b sbin\/ticketmgri_syncticket  *  * [in] _id \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u0438\u043a\u0435\u0442\u0430  *\/ void SyncTicket(int _id) {   string id = str::Str(_id);   Warning(&quot;Sync %s&quot;, id.c_str());   if (!_id) return;   mgr_task::LongTask(&quot;sbin\/ticketmgri_syncticket&quot;, &quot;ticket_&quot; + id,                      &quot;ticketmgri_sync&quot;)       .SetParam(id)       .Start(); }  \/**  * \u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0442\u0438\u043a\u0435\u0442\u0430  *  * \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u0438\u043a\u0435\u0442\u0430 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e  *\/ struct eTicketEdit : public Event { \t\/** \t * \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \t * \t * \u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0442\u0438\u043a\u0435\u0442\u0430 \t * \t * ev\t\u0438\u043c\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f \t * elid_name\t\u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438. \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \t * \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u0438\u043a\u0435\u0442\u0430 \u0438\u0437 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u0438\u0437 \u0441\u0435\u0441\u0441\u0438\u0438 \t *\/   eTicketEdit(const string &ev, const string &elid_name = &quot;elid&quot;)       : Event(ev, &quot;ticketmgri_&quot; + ev), elid_name_(elid_name) {     Warning(&quot;eTicketEdit created&quot;);   }    \/**    * \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0442\u0438\u043a\u0435\u0442 \u043f\u0440\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438    *    * \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f    * [in] ses\t\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u0435\u0441\u0441\u0438\u044f    *\/   void AfterExecute(Session &ses) const override {     Warning(&quot;subm %d cb %s elid %s&quot;, ses.IsSubmitted(),             ses.Param(&quot;clicked_button&quot;).c_str(), ses.Param(&quot;elid&quot;).c_str());     string button = ses.Param(&quot;clicked_button&quot;);      string elid;     if (elid_name_ == &quot;elid_ticket2user&quot;) {       elid = db-&gt;Query(&quot;SELECT ticket FROM ticket2user WHERE id='&quot; +                        ses.Param(&quot;elid&quot;) + &quot;'&quot;)                  -&gt;Str();     } else {       elid = ses.Param(&quot;elid&quot;);     }      if ((ses.IsSubmitted() || ses.Param(&quot;sv_field&quot;) == &quot;ok_message&quot;) &&         (button == &quot;ok&quot; || button == &quot;&quot; || button == &quot;ok_message&quot;)) {       if (!ses.Has(elid_name_)) {         SyncTicket(db-&gt;Query(&quot;SELECT MAX(id) FROM ticket&quot;)-&gt;Int());       } else {         SyncTicket(str::Int(elid));       }     }   }    string elid_name_; };  \/**  * \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0442\u0434\u0435\u043b\u043e\u0432  *\/ struct eClientTicketEdit : public eTicketEdit {   eClientTicketEdit() : eTicketEdit(&quot;clientticket.edit&quot;) {}    \/**    * \u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u043e\u0442\u0434\u0435\u043b\u043e\u0432, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c, \u0441\u043a\u0440\u044b\u0442\u044b\u0435 \u043e\u0442\u0434\u0435\u043b\u044b    *    * \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f    *    * [in] ses\t\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u0435\u0441\u0441\u0438\u044f    *\/   void AfterExecute(Session &ses) const override {     eTicketEdit::AfterExecute(ses);     for (auto &i : hideDepartments) {       ses.xml.RemoveNodes(&quot;\/\/slist[@name='client_department']\/val[@key='&quot; + i +                           &quot;']&quot;);     }   } };  \/**  * \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0449\u0430\u044f \u0444\u0438\u043b\u044c\u0442\u0440 \u043f\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0443  *\/ struct aTicketintegrationSetFilter : public Action {   aTicketintegrationSetFilter()       : Action(&quot;ticketintegration.setfilter&quot;, MinLevel(lvAdmin)) {}    \/**    * \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0444\u0438\u043b\u044c\u0442\u0440 \u043f\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0443    *    * \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0432\u044b\u0437\u043e\u0432 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u043f\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0443    *    * [in] ses\t\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u0435\u0441\u0441\u0438\u044f    *\/   void Execute(Session &ses) const override {     InternalCall(ses, &quot;account.setfilter&quot;, &quot;elid=&quot; + ses.Param(&quot;elid&quot;));     ses.Ok(ses.okTop);   } };  \/**  * \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0449\u0430\u044f \u0442\u0438\u043a\u0435\u0442  *\/ struct aTicketintegrationPost : public Action {   aTicketintegrationPost()       : Action(&quot;ticketintegration.post&quot;, MinLevel(lvAdmin)) {}    void Execute(Session &ses) const override { Execute(ses, true); }    \/**    * \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0442\u0438\u043a\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e    *    * [in] ses\t\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u0435\u0441\u0441\u0438\u044f    * [in] retry\t\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0442\u0438\u043a\u0435\u0442\u0430 \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043d\u043e\u043c\u0443 \u043e\u0442\u0434\u0435\u043b\u0443,    * \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0442\u0438\u043a\u0435\u0442\u043e\u0432    *\/   void Execute(Session &ses, bool retry) const {     auto openTickets = db-&gt;Query(&quot;SELECT id FROM ticket2user WHERE ticket=&quot; +                                  ses.Param(&quot;elid&quot;) + &quot; AND user IN (&quot; +                                  str::Join(allowedDepartments, &quot;,&quot;) + &quot;)&quot;);     string elid;     if (openTickets-&gt;Eof()) {       if (ses.Param(&quot;type&quot;) == &quot;setstatus&quot; && ses.Param(&quot;status&quot;) == &quot;closed&quot;) {         ses.NewNode(&quot;ok&quot;);         return;       }       if (retry) {         InternalCall(ses, &quot;support_tool_responsible&quot;,                      &quot;set_responsible_default=off&sok=ok&set_responsible=e%5F&quot; +                          allowedDepartments[0] + &quot;&elid=&quot; + ses.Param(&quot;elid&quot;));         Execute(ses, false);         return;       } else {         throw mgr_err::Error(&quot;cannot_open_ticket&quot;);       }     } else {       elid = openTickets-&gt;Str();     }      if (ses.Param(&quot;type&quot;) == &quot;setstatus&quot; && ses.Param(&quot;status&quot;) == &quot;new&quot;) {       return;     }      auto ret2 = InternalCall(         ses, &quot;ticket.edit&quot;,         string() + &quot;sok=ok&show_optional=on&quot; + &quot;&clicked_button=&quot; +             (ses.Param(&quot;status&quot;) == &quot;new&quot; ? &quot;ok_message&quot; : &quot;ok&quot;) + &quot;&&quot; +             (!ses.Checked(&quot;internal&quot;) ? &quot;message&quot; : &quot;note_message&quot;) + &quot;=&quot; +             str::url::Encode(ses.Param(&quot;message&quot;)) + &quot;&elid=&quot; + elid);     \/\/ TODO: attachments, sender_name     ses.NewNode(&quot;ok&quot;);   } };  \/**  * \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043a \u0442\u0438\u043a\u0435\u0442\u0443  *\/ struct TicketmgriLastNote : public mgr_db::CustomTable {   mgr_db::ReferenceField Ticket;   mgr_db::ReferenceField LastNote;    TicketmgriLastNote()       : mgr_db::CustomTable(&quot;ticketmgri_last_note&quot;),         Ticket(this, &quot;ticket&quot;, mgr_db::rtRestrict),         LastNote(this, &quot;last_note&quot;, &quot;ticket_note&quot;, mgr_db::rtRestrict) {     Ticket.info().set_primary();   } };  \/**  * \u041a\u043b\u0430\u0441\u0441, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 last_note \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 ticketmgri_last_note  *\/ struct aTicketintegrationLastNote : public Action {   aTicketintegrationLastNote()       : Action(&quot;ticketintegraion.last_note&quot;, MinLevel(lvSuper)) {}    \/**    * \u0424\u0443\u043d\u043a\u0446\u0438\u044f, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0449\u0430\u044f \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0430\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 last_note \u0434\u043b\u044f \u0442\u0438\u043a\u0435\u0442\u0430    * \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 ticketmgri_last_note    *    * [in] ses\t\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u0435\u0441\u0441\u0438\u044f    *\/   void Execute(Session &ses) const override {     auto t = db-&gt;Get&lt;TicketmgriLastNote&gt;();     if (!t-&gt;Find(ses.Param(&quot;elid&quot;))) {       t-&gt;New();       t-&gt;Ticket = str::Int(ses.Param(&quot;elid&quot;));     }     if (ses.IsSubmitted()) {       t-&gt;LastNote = str::Int(ses.Param(&quot;last_note&quot;));       t-&gt;Post();       ses.Ok();     } else {       ses.NewNode(&quot;last_note&quot;, t-&gt;LastNote);     }   } };  \/**  * \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0449\u0430\u044f \u0444\u043e\u043d\u043e\u0432\u044b\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0438\u043a\u0435\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0438\u0441\u044c \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439  *\/ struct aTicketintegrationPushTasks : public Action {   aTicketintegrationPushTasks()       : Action(&quot;ticketintegraion.push_tasks&quot;, MinLevel(lvSuper)) {}    \/**    * \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u043e\u043d\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u043d\u0438\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0438\u043a\u0435\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0438\u0441\u044c \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u0438    * \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0438\u0445    *    * [in] ses\t\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u0435\u0441\u0441\u0438\u044f    *\/   void Execute(Session &ses) const override {     mgr_xml::XPath xpath =         InternalCall(&quot;longtask&quot;, &quot;filter=yes&state=err&queue=ticketmgri_sync&quot;)             .GetNodes(&quot;\/\/elem[queue='ticketmgri_sync' and status='err']&quot;);     for (auto elem : xpath) {       auto data = InternalCall(&quot;longtask.edit&quot;,                                &quot;elid=&quot; + elem.FindNode(&quot;pidfile&quot;).Str());       mgr_task::LongTask(data.GetNode(&quot;\/\/realname&quot;), data.GetNode(&quot;\/\/id&quot;),                          &quot;ticketmgri_sync&quot;)           .SetParam(data.GetNode(&quot;\/\/params&quot;))           .Start();     }   } };  \/**  * \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430  *\/ struct aTicketintegrationGetBalance : public Action {   aTicketintegrationGetBalance()       : Action(&quot;ticketintegration.getbalance&quot;, MinLevel(lvAdmin)) {}    \/**    * \u041f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430    *    * [in] ses\t\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u0435\u0441\u0441\u0438\u044f    *\/   void Execute(Session &ses) const override {     ses.NewNode(&quot;balance&quot;,                 InternalCall(ses, &quot;account.edit&quot;, &quot;elid=&quot; + ses.Param(&quot;elid&quot;))                     .GetNode(&quot;\/\/balance&quot;)                     .Str());   }    bool IsModify(const Session &) const override { return false; } };  \/**  * \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u0441\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0441\u043e \u0441\u0447\u0435\u0442\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430  *\/ struct aTicketintegrationDeduct : public Action {   aTicketintegrationDeduct()       : Action(&quot;ticketintegration.deduct&quot;, MinLevel(lvAdmin)) {}    \/**    * \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0434\u0435\u043d\u0435\u0436\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0437\u0430 \u0442\u0438\u043a\u0435\u0442    *    * \u041f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438\u0449\u0435\u0442 \u0442\u0438\u043a\u0435\u0442 \u0432 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043d\u044b\u0445 \u043e\u0442\u0434\u0435\u043b\u0430\u0445.    * \u0414\u0430\u043b\u0435\u0435 \u0447\u0435\u0440\u0435\u0437 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u0438\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u0435\u043d\u0435\u0436\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0437\u0430 \u0442\u0438\u043a\u0435\u0442.    * \u0415\u0441\u043b\u0438 \u0442\u0438\u043a\u0435\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0431\u0440\u043e\u0441\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435    *    * [in] ses\t\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u0435\u0441\u0441\u0438\u044f    *\/   void Execute(Session &ses) const override {     auto openTickets = db-&gt;Query(&quot;SELECT id FROM ticket2user WHERE ticket=&quot; +                                  ses.Param(&quot;ticket&quot;) + &quot; AND user IN (&quot; +                                  str::Join(allowedDepartments, &quot;,&quot;) + &quot;)&quot;);     if (openTickets-&gt;Eof()) {       throw mgr_err::Value(&quot;ticket&quot;);     }     string elid = openTickets-&gt;AsString(0);     InternalCall(ses, &quot;ticket.edit&quot;, &quot;sok=ok&show_optional=on&elid=&quot; + elid +                                          &quot;&ticket_expense=&quot; +                                          ses.Param(&quot;amount&quot;));   } };  }  \/\/ namespace  \/\/\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u044f, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \/\/\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 MODULE_INIT(ticketmgri, &quot;&quot;) {   Warning(&quot;Init TICKETmanager integtration&quot;);   mgr_cf::AddParam(&quot;TicketmgrUrl&quot;,                    &quot;https:\/\/tickets.isplicense.ru:1500\/ticketmgr&quot;);   mgr_cf::AddParam(&quot;TicketmgrLogin&quot;);   mgr_cf::AddParam(&quot;TicketmgrPassword&quot;);   mgr_cf::AddParam(&quot;TicketmgrBillmgrUrl&quot;);   mgr_cf::AddParam(&quot;TicketmgrUserId&quot;);   mgr_cf::AddParam(&quot;TicketmgrAllowedDepartments&quot;);   mgr_cf::AddParam(&quot;TicketmgrHideDepartments&quot;);   str::Split(mgr_cf::GetParam(&quot;TicketmgrAllowedDepartments&quot;), &quot;,&quot;,              allowedDepartments);   if (allowedDepartments.empty()) {     allowedDepartments.push_back(0);   }   str::Split(mgr_cf::GetParam(&quot;TicketmgrHideDepartments&quot;), &quot;,&quot;,              hideDepartments);   db-&gt;Register&lt;TicketmgriLastNote&gt;();   new eClientTicketEdit;   new eTicketEdit(&quot;ticket.edit&quot;, &quot;elid_ticket2user&quot;);   new eTicketEdit(&quot;support_tool_responsible&quot;, &quot;plid&quot;);   new aTicketintegrationSetFilter;   new aTicketintegrationPost;   new aTicketintegrationLastNote;   new aTicketintegrationPushTasks;   new aTicketintegrationGetBalance;   new aTicketintegrationDeduct; } <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">ticketmgri_syncticket.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &lt;billmgr\/db.h&gt; #include &lt;billmgr\/defines.h&gt; #include &lt;billmgr\/sbin_utils.h&gt; #include &lt;ispbin.h&gt; #include &lt;mgr\/mgrclient.h&gt; #include &lt;mgr\/mgrdb_struct.h&gt; #include &lt;mgr\/mgrenv.h&gt; #include &lt;mgr\/mgrlog.h&gt; #include &lt;mgr\/mgrproc.h&gt; #include &lt;mgr\/mgrrpc.h&gt;  MODULE(&quot;syncticket&quot;);  using sbin::DB; using sbin::GetMgrConfParam; using sbin::Client; using sbin::ClientQuery;  \/**  * \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 Ticketmanager  *  * \u0410\u0434\u0440\u0435\u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u0438\u0437 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432  * \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430  *\/ mgr_client::Client &ticketmgr() {   static mgr_client::Client *ret = []() {     mgr_client::Remote *ret =         new mgr_client::Remote(GetMgrConfParam(&quot;TicketmgrUrl&quot;));     ret-&gt;AddParam(&quot;authinfo&quot;, GetMgrConfParam(&quot;TicketmgrLogin&quot;) + &quot;:&quot; +                                   GetMgrConfParam(&quot;TicketmgrPassword&quot;));     return ret;   }();   return *ret; }  \/**  * \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0442\u0438\u043a\u0435\u0442\u043e\u0432 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 TICKETmanager  *  * \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 xml \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0435,  * \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435, \u0441\u0441\u044b\u043b\u043a\u043e\u0439, \u043c\u043e\u0434\u0443\u043b\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u0438\u043a\u0435\u0442\u0435  *\/ void PostTicket(const string &elid) {   \/\/\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0442\u0438\u043a\u0435\u0442\u0435, \u043a\u043b\u0438\u0435\u043d\u0442\u0435, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435   auto ticket = DB()-&gt;Query(&quot;SELECT * FROM ticket WHERE id=&quot; + elid);   if (ticket-&gt;Eof()) throw mgr_err::Missed(&quot;ticket&quot;);   auto account = DB()-&gt;Query(&quot;SELECT * FROM account WHERE id=&quot; +                              ticket-&gt;AsString(&quot;account_client&quot;));   if (account-&gt;Eof()) throw mgr_err::Missed(&quot;account&quot;);   auto user = DB()-&gt;Query(&quot;SELECT * FROM user WHERE account=&quot; +                           account-&gt;AsString(&quot;id&quot;) + &quot; ORDER BY id LIMIT 1&quot;);   if (user-&gt;Eof()) throw mgr_err::Missed(&quot;user&quot;);    \/\/\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 xml-\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0435 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435   mgr_xml::Xml infoXml;   auto info = infoXml.GetRoot();   auto customer = info.AppendChild(&quot;customer&quot;);   customer.AppendChild(&quot;id&quot;, account-&gt;AsString(&quot;id&quot;));   customer.AppendChild(&quot;name&quot;, account-&gt;AsString(&quot;name&quot;));   customer.AppendChild(&quot;email&quot;, user-&gt;AsString(&quot;email&quot;));   customer.AppendChild(&quot;phone&quot;, user-&gt;AsString(&quot;phone&quot;));   customer.AppendChild(&quot;link&quot;,                        GetMgrConfParam(&quot;TicketmgrBillmgrUrl&quot;) +                            &quot;?startform=ticketintegration.setfilter&elid=&quot; +                            account-&gt;AsString(&quot;id&quot;));    if (!ticket-&gt;IsNull(&quot;item&quot;)) {     auto item =         DB()-&gt;Query(&quot;SELECT id, name, processingmodule FROM item WHERE id=&quot; +                     ticket-&gt;AsString(&quot;item&quot;));     if (item-&gt;Eof()) throw mgr_err::Missed(&quot;item&quot;);     auto iteminfo = info.AppendChild(&quot;item&quot;); \t\/\/\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043c\u043e\u0434\u0443\u043b\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438     iteminfo.SetProp(&quot;selected&quot;, &quot;yes&quot;);     iteminfo.AppendChild(&quot;id&quot;, item-&gt;AsString(&quot;id&quot;));     iteminfo.AppendChild(&quot;name&quot;, item-&gt;AsString(&quot;name&quot;));     iteminfo.AppendChild(&quot;serverid&quot;, item-&gt;AsString(&quot;processingmodule&quot;)); \t\/\/\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u0443\u0441\u043b\u0443\u0433\u0438     ForEachQuery(DB(), &quot;SELECT intname, value FROM itemparam WHERE item=&quot; +                            ticket-&gt;AsString(&quot;item&quot;),                  i) {       if (i-&gt;AsString(0) == &quot;ip&quot;) {         iteminfo.AppendChild(&quot;ip&quot;, i-&gt;AsString(1));       } else if (i-&gt;AsString(0) == &quot;username&quot;) {         iteminfo.AppendChild(&quot;login&quot;, i-&gt;AsString(1));       } else if (i-&gt;AsString(0) == &quot;password&quot;) {         iteminfo.AppendChild(&quot;password&quot;, i-&gt;AsString(1));       } else if (i-&gt;AsString(0) == &quot;domain&quot;) {         iteminfo.AppendChild(&quot;domain&quot;, i-&gt;AsString(1));       }     }   }    \/\/\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0442\u0438\u043a\u0435\u0442\u0435 \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b Ticketmanager   StringMap args = {{&quot;remoteid&quot;, ticket-&gt;AsString(&quot;id&quot;)},                     {&quot;department&quot;, ticket-&gt;AsString(&quot;responsible&quot;)},                     {&quot;info&quot;, infoXml.Str()},                     {&quot;subject&quot;, ticket-&gt;AsString(&quot;name&quot;)}};    ticketmgr().Query(&quot;func=clientticket.add&sok=ok&quot;, args); }  int ISP_MAIN(int ac, char **av) {   if (ac != 2) {     fprintf(stderr, &quot;Usage: ticketmgri_syncticket ID&quot;);     return 1;   }    string elid = av[1];    try {     mgr_log::Init(&quot;ticketmgri&quot;);     string status = &quot;closed&quot;;     int lastmessage = 0;  \t\/\/\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0442\u0438\u043a\u0435\u0442\u0430, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e\u0441\u044f \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u043e\u0442\u0434\u0435\u043b\u0430\u0445     string newStatus =         DB()-&gt;Query(&quot;SELECT COUNT(*) FROM ticket2user WHERE ticket=&quot; + elid +                     &quot; AND user IN (&quot; +                     GetMgrConfParam(&quot;TicketmgrAllowedDepartments&quot;) + &quot;)&quot;)                 -&gt;Int()             ? &quot;new&quot;             : &quot;closed&quot;;     bool inDepartment =         DB()-&gt;Query(&quot;SELECT COUNT(*) FROM ticket WHERE id=&quot; + elid +                     &quot; AND responsible IN (&quot; +                     GetMgrConfParam(&quot;TicketmgrAllowedDepartments&quot;) + &quot;)&quot;)             -&gt;Int();     if (newStatus != &quot;new&quot; && !inDepartment) {       LogNote(&quot;Skip ticket %s: status=%s, inDepartment=%d&quot;, elid.c_str(),               newStatus.c_str(), inDepartment);       return 0;     }     try { \t  \/\/\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0442\u0438\u043a\u0435\u0442\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 Ticketmanager       auto r = ticketmgr().Query(&quot;func=clientticket.info&remoteid=?&quot;, elid);       status = r.value(&quot;status&quot;);       lastmessage = str::Int(r.value(&quot;lastmessage&quot;));     } catch (mgr_err::Error &e) {       if (e.type() == &quot;missed&quot; && e.object() == &quot;remoteid&quot;) { \t\t\/\/\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0438\u043a\u0435\u0442\u0430, \u0435\u0441\u043b\u0438 \u043e\u043d \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435         PostTicket(elid);       } else {         throw;       }     }  \t\/\/\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 last_note \u0434\u043b\u044f \u0442\u0438\u043a\u0435\u0442\u0430     int lastnote =         str::Int(Client()                      .Query(&quot;func=ticketintegraion.last_note&elid=&quot; + elid)                      .value(&quot;last_note&quot;));  \t\/\/\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0442\u0438\u043a\u0435\u0442\u0430     auto msg = DB()-&gt;Query(         string() +         &quot;SELECT ticket_message.id, user.realname AS username, user.level AS &quot;         &quot;userlevel, message, 1 AS type, ticket_message.date_post &quot; +         &quot;FROM ticket_message &quot; + &quot;JOIN user ON ticket_message.user=user.id &quot; +         &quot;WHERE ticket_message.id &gt; &quot; + str::Str(lastmessage) + &quot; &quot; +         &quot;AND user != &quot; + GetMgrConfParam(&quot;TicketmgrUserId&quot;) + &quot; &quot; +         &quot;AND ticket = &quot; + elid + &quot; &quot; +         &quot;UNION &quot;         &quot;SELECT ticket_note.id, user.realname AS username, user.level AS &quot;         &quot;userlevel, note AS message, 2 AS type, ticket_note.date_post &quot; +         &quot;FROM ticket_note &quot; + &quot;JOIN user ON ticket_note.user=user.id &quot; +         &quot;WHERE ticket_note.id &gt; &quot; + str::Str(lastnote) + &quot; &quot; + &quot;AND user != &quot; +         GetMgrConfParam(&quot;TicketmgrUserId&quot;) + &quot; &quot; + &quot;AND ticket = &quot; + elid +         &quot; &quot; + &quot;ORDER BY date_post&quot;);  \t\/\/\u0435\u0441\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0438 \u0441\u0442\u0430\u0442\u0443\u0441 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442, \u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0432 Ticketmanager     if (msg-&gt;Eof() && status != newStatus) {       StringMap params = {           {&quot;remoteid&quot;, elid}, {&quot;status&quot;, newStatus},       };       ticketmgr().Query(           &quot;func=clientticket.post&sok=ok&sender=staff&sender_name=System&type=&quot;           &quot;setstatus&quot;,           params);     } else { \t\t\/\/\u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 Ticketmanager       lastnote = 0;       for (msg-&gt;First(); !msg-&gt;Eof(); msg-&gt;Next()) {         StringMap params = {             {&quot;remoteid&quot;, elid},             {&quot;status&quot;, newStatus},             {&quot;sender_name&quot;, msg-&gt;AsString(&quot;username&quot;)},             {&quot;sender&quot;, msg-&gt;AsInt(&quot;userlevel&quot;) &gt;= 28 ? &quot;staff&quot; : &quot;client&quot;},             {&quot;message&quot;, msg-&gt;AsString(&quot;message&quot;)},         };          int attachments = 0;          if (msg-&gt;AsInt(&quot;type&quot;) == 1) {           params[&quot;messageid&quot;] = msg-&gt;AsString(&quot;id&quot;); \t\t\t\/\/\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u0439           ForEachQuery(               DB(),               &quot;SELECT * FROM ticket_message_attach WHERE ticket_message=&quot; +                   msg-&gt;AsString(&quot;id&quot;),               attach) {             string id = str::Str(attachments++);             auto info =                 ClientQuery(&quot;func=ticket.file&elid=&quot; + attach-&gt;AsString(&quot;id&quot;));             params[&quot;attachment_name_&quot; + id] =                 info.xml.GetNode(&quot;\/\/content\/name&quot;).Str();             params[&quot;attachment_content_&quot; + id] = str::base64::Encode(                 mgr_file::Read(info.xml.GetNode(&quot;\/\/content\/data&quot;).Str()));           }         } else {           lastnote = std::max(lastnote, msg-&gt;AsInt(&quot;id&quot;));           params[&quot;internal&quot;] = &quot;on&quot;;         }         params[&quot;attachments&quot;] = str::Str(attachments);          ticketmgr().Query(&quot;func=clientticket.post&sok=ok&type=message&quot;, params);       } \t  \/\/ \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 last_note       if (lastnote) {         Client().Query(&quot;func=ticketintegraion.last_note&sok=ok&elid=&quot; + elid +                        &quot;&last_note=&quot; + str::Str(lastnote));       }     }   } catch (std::exception &e) {     fprintf(stderr, &quot;%s\\n&quot;, e.what());     return 1;   }   return 0; } <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0418\u0442\u043e\u0433 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u2014 \u043f\u0440\u043e\u0434\u0443\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0434\u0435\u043b\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0443 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0442\u0435\u0445\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0443\u0434\u043e\u0431\u043d\u0435\u0435, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u043b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0441\u0442\u0430\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u0435\u0435.<\/p>\n<p>  \u0412 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0445 \u043f\u043b\u0430\u043d\u0430\u0445 ISPlicense \u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u043e\u0433\u043e \u043c\u0438\u043d\u0438-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u043b \u043f\u0440\u0438 \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0438 \u043d\u043e\u0432\u043e\u0439 \u0437\u0430\u044f\u0432\u043a\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0438 \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0443\u0447\u0451\u0442 \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0430 \u0442\u043e\u0442 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u0442\u0438\u043a\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 \u0434\u0432\u0430 \u043a\u043b\u0438\u043a\u0430.<\/p>\n<p>  \u0412 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c, \u0447\u0442\u043e COREmanager \u0441\u0442\u0430\u043b \u043e\u0441\u043d\u043e\u0432\u043e\u0439 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e TicketManager \u0438 \u0432\u0441\u0435\u0445 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432. \u041d\u0430 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0443\u0447\u0451\u0442\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u043e\u0433\u043e \u0444\u043e\u043d\u0434\u0430, \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a\u0430\u043c\u0438, \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u044b\u0445 \u043f\u043e\u0435\u0437\u0434\u043e\u043a, \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0434\u0430\u0447 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u043e\u0432, \u0438 \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043c\u043e\u0434\u0443\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442, \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u0432\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u0432 \u0432\u0430\u0448\u0443 \u043c\u043e\u0434\u0435\u043b\u044c \u0431\u0438\u0437\u043d\u0435\u0441\u0430.<br \/>  \u0412 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 COREmanager \u0432 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0438, \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 MMO \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0443\u0447\u0451\u0442\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c\u0438, \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0438 \u043c\u043d\u043e\u0433\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0437\u0430\u0434\u0430\u0447.<\/p>\n<p>  <b>P.S.<\/b> \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 COREmanager, \u0442\u043e \u043a \u0432\u0430\u0448\u0438\u043c \u0443\u0441\u043b\u0443\u0433\u0430\u043c <a href=\"https:\/\/www.ispsystem.ru\/software\/coremanager\/download\">\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435<\/a> \u0438 <a href=\"http:\/\/doc.ispsystem.ru\/index.php\/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:COREmanager\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a> \u043f\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0443.<br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/314886\/\"> https:\/\/habrahabr.ru\/post\/314886\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/d82\/2ad\/713\/d822ad71353241199d42e23f3d67c8be.jpg\"\/><\/p>\n<p>  <i>\u0415\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u0447\u0430\u0442\u044c \u0441\u0432\u043e\u0451 \u0434\u0435\u043b\u043e \u0438 \u0445\u043e\u0447\u0435\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u043d\u043b\u0430\u0439\u043d-\u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u043e \u043f\u0440\u043e\u0434\u0430\u0436\u0435 \u0446\u0432\u0435\u0442\u043e\u0432 \u0438\u043b\u0438 \u043a\u043e\u0444\u0435 \u043f\u043e \u0444\u0440\u0430\u043d\u0448\u0438\u0437\u0435, \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0431\u0438\u0437\u043d\u0435\u0441 \u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u0430\u0434\u043e \u0431\u044b\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u043c \u043a \u0431\u043e\u043b\u044c\u0448\u043e\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043e\u0432 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0444\u0435\u0440\u0435. \u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u201c\u043f\u0440\u043e\u0433\u043e\u0440\u0435\u0442\u044c\u201d \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442\u0441\u044f.<br \/>  \u0415\u0441\u043b\u0438 \u0436\u0435 \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043c\u0430\u043b\u043e \u043e\u0441\u0432\u043e\u0435\u043d\u043d\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c, \u0433\u0434\u0435 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0446\u0438\u044f \u043c\u0435\u043d\u044c\u0448\u0435, \u0442\u043e \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u0434\u0430\u0447 \u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0435 \u0431\u044b\u0442\u044c. \u0414\u0430, \u043f\u0435\u0440\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0451 \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u043e\u0434\u043d\u0430\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u0434\u0440\u0430\u0441\u0442\u0451\u0442, \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0432\u0441\u0435\u0440\u044c\u0451\u0437 \u0437\u0430\u0434\u0443\u043c\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u0434 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432.<br \/>  \u041f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a COREmanager \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u0443, \u0441\u043a\u0435\u043b\u0435\u0442, \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430. \u042d\u0442\u043e \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442 \u0437\u0430\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0435 \u043d\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<br \/>  \u041f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u2014 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0434\u043b\u044f \u0430\u0443\u0442\u0441\u043e\u0440\u0441-\u0442\u0435\u0445\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0435\u0439 ISPlicense.<\/i>  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-280740","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/280740","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=280740"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/280740\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=280740"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=280740"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=280740"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}