{"id":2492,"date":"2026-01-08T13:48:57","date_gmt":"2026-01-08T10:48:57","guid":{"rendered":"https:\/\/gerdlezhev.ru\/?p=2492"},"modified":"2026-01-08T13:48:57","modified_gmt":"2026-01-08T10:48:57","slug":"%d0%ba%d0%b0%d0%ba-%d0%b2%d0%bd%d0%b5%d0%b4%d1%80%d0%b8%d1%82%d1%8c-%d1%8f%d0%b7%d1%8b%d0%ba-go-%d0%b4%d0%bb%d1%8f-%d0%be%d0%b1%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b8-%d0%b4%d0%b0%d0%bd%d0%bd%d1%8b","status":"publish","type":"post","link":"https:\/\/gerdlezhev.ru\/?p=2492","title":{"rendered":"\u041a\u0430\u043a \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u044c \u044f\u0437\u044b\u043a Go \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445 Excel \u0438 LibreOffice: \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430, \u0431\u044e\u0434\u0436\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432"},"content":{"rendered":"\n<p>\u0412 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u043c\u0438\u0440\u0435 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u043c \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438. \u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Python \u0438 R, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0441\u0432\u043e\u044e \u043c\u043e\u0449\u044c, \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043c\u0430\u043c\u0438 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u042f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Go emerges \u043a\u0430\u043a \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0445 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u0438. \u042d\u0442\u043e\u0442 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u0441\u0447\u0435\u0440\u043f\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044e Go \u0432 \u0432\u0430\u0448\u0443 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u0443\u044e \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0443, \u0431\u044e\u0434\u0436\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u041f\u043e\u0447\u0435\u043c\u0443 Go \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445?<\/h3>\n\n\n\n<p>\u0412\u044b\u0431\u043e\u0440 \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430. Go \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a, \u0434\u0435\u043b\u0430\u044e\u0449\u0438\u0445 \u0435\u0433\u043e \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u043c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u043c\u0438 \u0440\u0430\u0441\u0447\u0435\u0442\u0430\u043c\u0438. \u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u0440\u0430\u0441\u0447\u0435\u0442\u0430\u0445, \u0447\u0442\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u0436\u043d\u043e \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0434\u0435\u043d\u0435\u0436\u043d\u044b\u043c\u0438 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u0438 \u0431\u044e\u0434\u0436\u0435\u0442\u043d\u044b\u043c\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0432 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0441\u0440\u0430\u0432\u043d\u0438\u043c\u0443\u044e \u0441 C++, \u043d\u043e \u0441 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u043e\u043c \u0438 \u043c\u0435\u043d\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n\n\n\n<p>\u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 Go \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0438 \u043a\u0430\u043d\u0430\u043b\u044b. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0430\u0441\u0447\u0435\u0442\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0431\u044e\u0434\u0436\u0435\u0442\u043d\u044b\u0445 \u043f\u0435\u0440\u0438\u043e\u0434\u043e\u0432 \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 Python, \u0433\u0434\u0435 GIL (Global Interpreter Lock) \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0438\u0441\u0442\u0438\u043d\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c, Go \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0443\u044e \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0445 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432.<\/p>\n\n\n\n<p>\u041f\u0430\u043c\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 \u0432\u0430\u0436\u043d\u0443\u044e \u0441\u0444\u0435\u0440\u0443, \u0433\u0434\u0435 Go \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e. \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u043c\u0443\u0441\u043e\u0440\u0430, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u043d\u0438\u0437\u043a\u0438\u0445 \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043c\u044b \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u0435\u0437 \u0440\u0438\u0441\u043a\u0430 \u0443\u0442\u0435\u0447\u0435\u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u0438\u043b\u0438 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u042d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432\u0430\u0436\u043d\u043e \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0433\u043e\u0434\u043e\u0432\u044b\u043c\u0438 \u043e\u0442\u0447\u0435\u0442\u0430\u043c\u0438, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u043c\u0438 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u0441\u0442\u0440\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f\u0445, \u0431\u044e\u0434\u0436\u0435\u0442\u043d\u044b\u0445 \u043f\u043b\u0430\u043d\u0430\u0445 \u0438 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u0445.<\/p>\n\n\n\n<p>\u041a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u044c Go \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 \u043b\u044e\u0431\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 \u0431\u0435\u0437 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u0430\u0448\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u043a\u0430\u043a \u043d\u0430 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430\u0445 Linux, \u0442\u0430\u043a \u0438 \u043d\u0430 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 Windows. \u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043e\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u043e\u0432 \u0438\u043b\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0438 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n\n\n\n<p>\u042d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430 Go \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432\u0440\u043e\u0434\u0435 Excelize \u0438 tealeg\/xlsx \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u043c\u0438 Excel \u0438 LibreOffice, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u043f\u043e\u043b\u043d\u0443\u044e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u043c\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438. \u042d\u0442\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438, \u043d\u043e \u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438: \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u044f\u0447\u0435\u0435\u043a, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u043e\u0440\u043c\u0443\u043b, \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c \u0438 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430\u043c\u0438.<\/p>\n\n\n\n<p>\u0414\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0432\u0430\u0436\u043d\u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043d\u043e \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432. \u0421\u0442\u0440\u043e\u0433\u0430\u044f \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044f Go \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u0447\u0435\u0440\u0435\u0437 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u0438\u0445 \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0445 \u043a\u0430\u043c\u043d\u0435\u0439, \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u044b\u0445 \u0434\u043b\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u0440\u0430\u0441\u0447\u0435\u0442\u0435 \u0431\u044e\u0434\u0436\u0435\u0442\u043d\u044b\u0445 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0441\u043b\u043e\u0436\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u043c, \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043e\u0442\u0447\u0435\u0442\u0430\u0445.<\/p>\n\n\n\n<p>\u0421\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e Go \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. Grafana, Prometheus \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0438\u043c\u0435\u044e\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 Go, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u044b \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u042d\u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u043d\u043e \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0438\u0445 \u0432 \u0443\u0434\u043e\u0431\u043d\u043e\u043c \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0444\u043e\u0440\u043c\u0430\u0442\u0435.<\/p>\n\n\n\n<p>\u041a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 Go \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0442\u0430\u043a\u0438\u0445 \u0433\u0438\u0433\u0430\u043d\u0442\u043e\u0432, \u043a\u0430\u043a Google, Microsoft \u0438 Amazon, \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u044f\u0437\u044b\u043a\u0430 \u0438 \u0435\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f. \u042d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0433\u0434\u0435 \u0434\u043e\u043b\u0433\u043e\u0441\u0440\u043e\u0447\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0438\u043c\u0435\u044e\u0442 \u043f\u0435\u0440\u0432\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432\u043d\u043e\u0441\u044f\u0442 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c.<\/p>\n\n\n\n<p>\u042d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f Go \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f. \u0421\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u0442\u0440\u0430\u0442 \u043d\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430 \u0441\u0447\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 \u2014 \u0432\u0441\u0435 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 Go \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0433\u043e\u0434\u043d\u044b\u043c \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Go \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Excel \u0438 LibreOffice<\/h3>\n\n\n\n<p>\u041f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 Go \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u0434\u0432\u0443\u043c\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0435\u043d\u0442\u0430\u043c\u0438: Excelize \u0438 tealeg\/xlsx. \u041a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u044d\u0442\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0438 \u0441\u0438\u043b\u044c\u043d\u044b\u0435 \u0438 \u0441\u043b\u0430\u0431\u044b\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n\n\n\n<p>Excelize \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043c\u043e\u0449\u043d\u0443\u044e \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 Excel \u0432 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 Go. \u041d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0430 Go, \u044d\u0442\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u0445 XLAM, XLSM, XLSX, XLTM \u0438 XLTX, \u0447\u0442\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u0443\u044e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 Microsoft Excel. Excelize \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0446\u0435\u043d\u0438\u0442\u0441\u044f \u0432 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0435 \u0437\u0430 \u0441\u0432\u043e\u044e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0444\u043e\u0440\u043c\u0443\u043b\u0430\u043c\u0438, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0444\u0430\u0439\u043b\u043e\u0432.<\/p>\n\n\n\n<p>\u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 Excelize \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u0442\u0438\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0412 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043e\u0442\u0447\u0435\u0442\u0430\u0445 \u0447\u0430\u0441\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u044f\u0447\u0435\u0439\u043a\u0438 \u0446\u0432\u0435\u0442\u043e\u043c, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0434\u0435\u043d\u0435\u0436\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0439 \u043e\u0442 \u0431\u044e\u0434\u0436\u0435\u0442\u0430. Excelize \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0441\u0442\u0438\u043b\u0438, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n\n\n\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c \u0438 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 Excel-\u0444\u0430\u0439\u043b\u0430\u0445. \u042d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043e\u0442\u0447\u0435\u0442\u043e\u0432, \u0433\u0434\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0433\u0440\u0430\u0435\u0442 \u043a\u043b\u044e\u0447\u0435\u0432\u0443\u044e \u0440\u043e\u043b\u044c \u0432 \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0439. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0447\u0430\u0442\u044b\u0435 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438 \u043f\u043b\u0430\u043d\u043e\u0432\u044b\u0445 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439, \u043a\u0440\u0443\u0433\u043e\u0432\u044b\u0435 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u043b\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432 \u0438\u043b\u0438 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0435 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0434\u043b\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0438 \u0434\u0435\u043d\u0435\u0436\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043e\u0442\u0447\u0435\u0442\u043e\u0432.<\/p>\n\n\n\n<p>Excelize \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u043f\u0430\u043c\u044f\u0442\u0438, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0441 \u0441\u043e\u0442\u043d\u044f\u043c\u0438 \u0442\u044b\u0441\u044f\u0447 \u0441\u0442\u0440\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0442\u043e \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u043e \u0434\u043b\u044f \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043e\u0442\u0447\u0435\u0442\u043e\u0432. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 Excelize \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u043c \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u0431\u044e\u0434\u0436\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0433\u0434\u0435 \u043e\u0431\u044a\u0435\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0440\u0430\u0441\u0442\u0443\u0442.<\/p>\n\n\n\n<p>tealeg\/xlsx, \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0431\u043e\u043b\u0435\u0435 \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u042d\u0442\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c XLSX \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u044b\u0439 API \u0434\u043b\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u043c\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438. \u0415\u0441\u043b\u0438 \u0432\u0430\u0448\u0430 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u0435\u0437 \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0444\u043e\u0440\u043c\u0443\u043b, tealeg\/xlsx \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u043c \u0432\u044b\u0431\u043e\u0440\u043e\u043c.<\/p>\n\n\n\n<p>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c tealeg\/xlsx \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u0438\u0442 Excelize \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u0435\u0437 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043b\u044f \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 ETL (Extract, Transform, Load), \u0433\u0434\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u0438\u0437 Excel-\u0444\u0430\u0439\u043b\u043e\u0432, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442\u0441\u044f \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u0432 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438.<\/p>\n\n\n\n<p>\u041e\u0434\u043d\u0430\u043a\u043e tealeg\/xlsx \u0438\u043c\u0435\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0432 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 Excel. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0444\u043e\u0440\u043c\u0443\u043b \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u043e\u0432, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u043c \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u0430\u0445. \u0422\u0430\u043a\u0436\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c \u0438 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0447\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432.<\/p>\n\n\n\n<p>\u041f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438 \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432. \u0415\u0441\u043b\u0438 \u0432\u0430\u0448\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0439 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0441 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 Excel-\u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0444\u043e\u0440\u043c\u0443\u043b \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, Excelize \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0435\u0441\u0441\u043f\u043e\u0440\u043d\u044b\u043c \u043b\u0438\u0434\u0435\u0440\u043e\u043c. \u0414\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c, \u0433\u0434\u0435 \u0432\u0430\u0436\u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, tealeg\/xlsx \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u043b\u0443\u0447\u0448\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c.<\/p>\n\n\n\n<p>\u0412\u0430\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u0431\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e\u043c. Excelize, \u0431\u0443\u0434\u0443\u0447\u0438 \u0431\u043e\u043b\u0435\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439, \u0438\u043c\u0435\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0431\u0430\u0437\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0447\u0430\u0441\u0442\u044b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f. tealeg\/xlsx, \u0445\u043e\u0442\u044f \u0438 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0441\u0432\u043e\u044e \u043d\u0438\u0448\u0443 \u0434\u043b\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n\n\n\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c LibreOffice Calc (ODS) \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 Excel, \u0433\u0434\u0435 \u0444\u043e\u0440\u043c\u0430\u0442 XLSX \u0438\u043c\u0435\u0435\u0442 \u0447\u0435\u0442\u043a\u0443\u044e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e, \u0444\u043e\u0440\u043c\u0430\u0442 ODS \u043c\u0435\u043d\u0435\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u0438\u043c\u0435\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0432 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 Go. \u041e\u0434\u043d\u0430\u043a\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a godf, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 OpenDocument Spreadsheet. \u042d\u0442\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043c\u0435\u043d\u0435\u0435 \u0437\u0440\u0435\u043b\u044b \u0438 \u0438\u043c\u0435\u044e\u0442 \u043c\u0435\u043d\u044c\u0448\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 Excel-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438, \u043d\u043e \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b \u0432 \u0441\u0440\u0435\u0434\u0430\u0445, \u0433\u0434\u0435 LibreOffice \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043e\u0444\u0438\u0441\u043d\u044b\u043c \u043f\u0430\u043a\u0435\u0442\u043e\u043c.<\/p>\n\n\n\n<p>\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u043f\u044b\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0433\u0438\u0431\u0440\u0438\u0434\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 Excelize \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0445 \u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u0441 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438, \u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u0431\u043e\u043b\u0435\u0435 \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 CSV-\u0444\u043e\u0440\u043c\u0430\u0442. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043e\u0441\u0442\u0438\u0447\u044c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043c\u0435\u0436\u0434\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Go<\/h3>\n\n\n\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u044b \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 Go. \u042d\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0435 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u0438\u0441\u0442\u0435\u043c \u0431\u044e\u0434\u0436\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u041f\u0440\u0438\u043c\u0435\u0440 1: \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0435\u0436\u0435\u043c\u0435\u0441\u044f\u0447\u043d\u043e\u0439 \u043a\u043e\u043d\u0441\u043e\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043e\u0442\u0447\u0435\u0442\u043e\u0432<\/h4>\n\n\n\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a \u0435\u0436\u0435\u043c\u0435\u0441\u044f\u0447\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0442\u0447\u0435\u0442\u044b \u043e\u0442 \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0439 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 Excel. \u041a\u0430\u0436\u0434\u044b\u0439 \u043e\u0442\u0447\u0435\u0442 \u0438\u043c\u0435\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044e. \u0417\u0430\u0434\u0430\u0447\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u043e\u043d\u0441\u043e\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0435\u0434\u0438\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0445 \u0441\u0442\u0440\u043e\u043a \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435\u043c \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport (\n    \"fmt\"\n    \"os\"\n    \"path\/filepath\"\n    \"strconv\"\n\n    \"github.com\/xuri\/excelize\/v2\"\n)\n\nfunc consolidateFinancialReports(inputDir, outputFile string) error {\n    \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 Excel \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445\n    f := excelize.NewFile()\n    defer f.Close()\n\n    \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043b\u0438\u0441\u0442 \u0434\u043b\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445\n    sheetName := \"\u041a\u043e\u043d\u0441\u043e\u043b\u0438\u0434\u0430\u0446\u0438\u044f\"\n    f.NewSheet(sheetName)\n\n    \/\/ \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0434\u043b\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0442\u0447\u0435\u0442\u0430\n    headers := &#91;]string{\"\u041f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435\", \"\u0414\u043e\u0445\u043e\u0434\", \"\u0420\u0430\u0441\u0445\u043e\u0434\u044b\", \"\u041f\u0440\u0438\u0431\u044b\u043b\u044c\", \"\u0411\u044e\u0434\u0436\u0435\u0442\", \"\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435\"}\n    for col, header := range headers {\n        cell := fmt.Sprintf(\"%s1\", string('A'+rune(col)))\n        f.SetCellValue(sheetName, cell, header)\n    }\n\n    row := 2 \/\/ \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 (\u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432)\n\n    \/\/ \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438\n    err := filepath.Walk(inputDir, func(path string, info os.FileInfo, err error) error {\n        if err != nil {\n            return err\n        }\n\n        if info.IsDir() || filepath.Ext(path) != \".xlsx\" {\n            return nil\n        }\n\n        \/\/ \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u043e\u0442\u0447\u0435\u0442\u0430 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f\n        reportFile, err := excelize.OpenFile(path)\n        if err != nil {\n            return fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0444\u0430\u0439\u043b\u0430 %s: %v\", path, err)\n        }\n        defer reportFile.Close()\n\n        \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438\u0437 \u0438\u043c\u0435\u043d\u0438 \u0444\u0430\u0439\u043b\u0430\n        department := filepath.Base(path)\n        department = department&#91;:len(department)-5] \/\/ \u0423\u0431\u0438\u0440\u0430\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 .xlsx\n\n        \/\/ \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u043b\u0438\u0441\u0442\u0435\n        sheet := reportFile.GetSheetName(0)\n\n        \/\/ \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0438\u0437 \u043e\u0442\u0447\u0435\u0442\u0430\n        revenue, _ := reportFile.GetCellValue(sheet, \"B2\")\n        expenses, _ := reportFile.GetCellValue(sheet, \"B3\")\n        budget, _ := reportFile.GetCellValue(sheet, \"B4\")\n\n        \/\/ \u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0447\u0438\u0441\u043b\u0430 \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439\n        revenueFloat, _ := strconv.ParseFloat(revenue, 64)\n        expensesFloat, _ := strconv.ParseFloat(expenses, 64)\n        budgetFloat, _ := strconv.ParseFloat(budget, 64)\n\n        profit := revenueFloat - expensesFloat\n        deviation := profit - budgetFloat\n\n        \/\/ \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b\n        f.SetCellValue(sheetName, fmt.Sprintf(\"A%d\", row), department)\n        f.SetCellValue(sheetName, fmt.Sprintf(\"B%d\", row), revenueFloat)\n        f.SetCellValue(sheetName, fmt.Sprintf(\"C%d\", row), expensesFloat)\n        f.SetCellValue(sheetName, fmt.Sprintf(\"D%d\", row), profit)\n        f.SetCellValue(sheetName, fmt.Sprintf(\"E%d\", row), budgetFloat)\n        f.SetCellValue(sheetName, fmt.Sprintf(\"F%d\", row), deviation)\n\n        \/\/ \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0439\n        if deviation &gt; 0 {\n            f.SetCellStyle(sheetName, fmt.Sprintf(\"F%d\", row), fmt.Sprintf(\"F%d\", row), getPositiveStyle(f))\n        } else {\n            f.SetCellStyle(sheetName, fmt.Sprintf(\"F%d\", row), fmt.Sprintf(\"F%d\", row), getNegativeStyle(f))\n        }\n\n        row++\n        return nil\n    })\n\n    if err != nil {\n        return err\n    }\n\n    \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u0442\u043e\u0433\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443\n    f.SetCellValue(sheetName, fmt.Sprintf(\"A%d\", row), \"\u0418\u0422\u041e\u0413\u041e\")\n    f.SetCellFormula(sheetName, fmt.Sprintf(\"B%d\", row), fmt.Sprintf(\"SUM(B2:B%d)\", row-1))\n    f.SetCellFormula(sheetName, fmt.Sprintf(\"C%d\", row), fmt.Sprintf(\"SUM(C2:C%d)\", row-1))\n    f.SetCellFormula(sheetName, fmt.Sprintf(\"D%d\", row), fmt.Sprintf(\"SUM(D2:D%d)\", row-1))\n    f.SetCellFormula(sheetName, fmt.Sprintf(\"E%d\", row), fmt.Sprintf(\"SUM(E2:E%d)\", row-1))\n    f.SetCellFormula(sheetName, fmt.Sprintf(\"F%d\", row), fmt.Sprintf(\"SUM(F2:F%d)\", row-1))\n\n    \/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n    return f.SaveAs(outputFile)\n}\n\nfunc getPositiveStyle(f *excelize.File) int {\n    style, _ := f.NewStyle(`{\"fill\":{\"type\":\"pattern\",\"color\":&#91;\"#C6EFCE\"],\"pattern\":1}}`)\n    return style\n}\n\nfunc getNegativeStyle(f *excelize.File) int {\n    style, _ := f.NewStyle(`{\"fill\":{\"type\":\"pattern\",\"color\":&#91;\"#FFC7CE\"],\"pattern\":1}}`)\n    return style\n}\n\nfunc main() {\n    inputDir := \".\/department_reports\/\"\n    outputFile := \".\/consolidated_report.xlsx\"\n\n    if err := consolidateFinancialReports(inputDir, outputFile); err != nil {\n        fmt.Printf(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043a\u043e\u043d\u0441\u043e\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u043e\u0442\u0447\u0435\u0442\u043e\u0432: %v\\n\", err)\n        os.Exit(1)\n    }\n\n    fmt.Println(\"\u041a\u043e\u043d\u0441\u043e\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430!\")\n}<\/code><\/pre>\n\n\n\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0436\u043d\u044b\u0445 \u0430\u0441\u043f\u0435\u043a\u0442\u043e\u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 Go. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Excelize \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438 Excel-\u0444\u0430\u0439\u043b\u043e\u0432. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0439 \u043e\u0442 \u0431\u044e\u0434\u0436\u0435\u0442\u0430. \u0412-\u0442\u0440\u0435\u0442\u044c\u0438\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u043e\u0440\u043c\u0443\u043b Excel \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0447\u0442\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u041f\u0440\u0438\u043c\u0435\u0440 2: \u0410\u043d\u0430\u043b\u0438\u0437 \u0431\u044e\u0434\u0436\u0435\u0442\u043d\u044b\u0445 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0439 \u0441 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439<\/h4>\n\n\n\n<p>\u0414\u0440\u0443\u0433\u043e\u0439 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0432 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0435 \u2014 \u0430\u043d\u0430\u043b\u0438\u0437 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0439 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043e\u0442 \u0431\u044e\u0434\u0436\u0435\u0442\u043d\u044b\u0445 \u043f\u043b\u0430\u043d\u043e\u0432. \u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Go \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f, \u043d\u043e \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u0432\u0438\u0434\u0435 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 Excel-\u0444\u0430\u0439\u043b\u0435.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport (\n    \"fmt\"\n    \"os\"\n\n    \"github.com\/xuri\/excelize\/v2\"\n)\n\nfunc createBudgetVarianceAnalysis() error {\n    \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 Excel \u0444\u0430\u0439\u043b\n    f := excelize.NewFile()\n    defer f.Close()\n\n    sheetName := \"\u0410\u043d\u0430\u043b\u0438\u0437 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0439\"\n    f.NewSheet(sheetName)\n\n    \/\/ \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435: \u0431\u044e\u0434\u0436\u0435\u0442 \u0438 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043f\u043e \u043c\u0435\u0441\u044f\u0446\u0430\u043c\n    months := &#91;]string{\"\u042f\u043d\u0432\u0430\u0440\u044c\", \"\u0424\u0435\u0432\u0440\u0430\u043b\u044c\", \"\u041c\u0430\u0440\u0442\", \"\u0410\u043f\u0440\u0435\u043b\u044c\", \"\u041c\u0430\u0439\", \"\u0418\u044e\u043d\u044c\"}\n    budget := &#91;]float64{100000, 110000, 115000, 120000, 125000, 130000}\n    actual := &#91;]float64{95000, 108000, 120000, 118000, 130000, 128000}\n\n    \/\/ \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438\n    f.SetCellValue(sheetName, \"A1\", \"\u041c\u0435\u0441\u044f\u0446\")\n    f.SetCellValue(sheetName, \"B1\", \"\u0411\u044e\u0434\u0436\u0435\u0442\")\n    f.SetCellValue(sheetName, \"C1\", \"\u0424\u0430\u043a\u0442\")\n    f.SetCellValue(sheetName, \"D1\", \"\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435\")\n    f.SetCellValue(sheetName, \"E1\", \"% \u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f\")\n\n    \/\/ \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435\n    for i, month := range months {\n        row := i + 2\n        f.SetCellValue(sheetName, fmt.Sprintf(\"A%d\", row), month)\n        f.SetCellValue(sheetName, fmt.Sprintf(\"B%d\", row), budget&#91;i])\n        f.SetCellValue(sheetName, fmt.Sprintf(\"C%d\", row), actual&#91;i])\n\n        \/\/ \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435\n        variance := actual&#91;i] - budget&#91;i]\n        f.SetCellValue(sheetName, fmt.Sprintf(\"D%d\", row), variance)\n\n        \/\/ \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u043d\u0442 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f\n        variancePercent := variance \/ budget&#91;i] * 100\n        f.SetCellValue(sheetName, fmt.Sprintf(\"E%d\", row), variancePercent)\n\n        \/\/ \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\n        if variance &lt; 0 {\n            f.SetCellStyle(sheetName, fmt.Sprintf(\"D%d\", row), fmt.Sprintf(\"E%d\", row), getNegativeStyle(f))\n        } else {\n            f.SetCellStyle(sheetName, fmt.Sprintf(\"D%d\", row), fmt.Sprintf(\"E%d\", row), getPositiveStyle(f))\n        }\n    }\n\n    \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443 \u0434\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0439\n    chart := excelize.Chart{\n        Type: \"col\",\n        Series: &#91;]excelize.ChartSeries{\n            {\n                Name:       \"\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435\",\n                Categories: fmt.Sprintf(\"%s!$A$2:$A$%d\", sheetName, len(months)+1),\n                Values:     fmt.Sprintf(\"%s!$D$2:$D$%d\", sheetName, len(months)+1),\n            },\n        },\n        Format: excelize.GraphicOptions{\n            OffsetX: 10,\n            OffsetY: 10,\n            Width:   600,\n            Height:  400,\n        },\n        Legend: excelize.ChartLegend{\n            Position: \"none\",\n        },\n        Title: excelize.ChartTitle{\n            Name: \"\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f \u043e\u0442 \u0431\u044e\u0434\u0436\u0435\u0442\u0430 \u043f\u043e \u043c\u0435\u0441\u044f\u0446\u0430\u043c\",\n        },\n        PlotArea: excelize.ChartPlotArea{\n            ShowCatName:     false,\n            ShowLeaderLines: false,\n            ShowPercent:     true,\n            ShowSerName:     false,\n            ShowVal:         true,\n        },\n        XAxis: excelize.ChartAxis{\n            Title: excelize.ChartTitle{\n                Name: \"\u041c\u0435\u0441\u044f\u0446\",\n            },\n        },\n        YAxis: excelize.ChartAxis{\n            Title: excelize.ChartTitle{\n                Name: \"\u0421\u0443\u043c\u043c\u0430 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f\",\n            },\n        },\n    }\n\n    \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0430 \u043b\u0438\u0441\u0442\n    err := f.AddChart(sheetName, \"G2\", &amp;chart)\n    if err != nil {\n        return fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b: %v\", err)\n    }\n\n    \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u0442\u043e\u0440\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a \u0434\u043b\u044f \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u043d\u044b\u0445 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0439\n    chart2 := excelize.Chart{\n        Type: \"line\",\n        Series: &#91;]excelize.ChartSeries{\n            {\n                Name:       \"% \u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f\",\n                Categories: fmt.Sprintf(\"%s!$A$2:$A$%d\", sheetName, len(months)+1),\n                Values:     fmt.Sprintf(\"%s!$E$2:$E$%d\", sheetName, len(months)+1),\n            },\n        },\n        Format: excelize.GraphicOptions{\n            OffsetX: 10,\n            OffsetY: 10,\n            Width:   600,\n            Height:  400,\n        },\n        Title: excelize.ChartTitle{\n            Name: \"\u041f\u0440\u043e\u0446\u0435\u043d\u0442 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0439 \u043e\u0442 \u0431\u044e\u0434\u0436\u0435\u0442\u0430\",\n        },\n        PlotArea: excelize.ChartPlotArea{\n            ShowCatName:     false,\n            ShowLeaderLines: false,\n            ShowPercent:     true,\n            ShowSerName:     false,\n            ShowVal:         true,\n        },\n        XAxis: excelize.ChartAxis{\n            Title: excelize.ChartTitle{\n                Name: \"\u041c\u0435\u0441\u044f\u0446\",\n            },\n        },\n        YAxis: excelize.ChartAxis{\n            Title: excelize.ChartTitle{\n                Name: \"\u041f\u0440\u043e\u0446\u0435\u043d\u0442 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f\",\n            },\n        },\n    }\n\n    \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0442\u043e\u0440\u0443\u044e \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443\n    err = f.AddChart(sheetName, \"G25\", &amp;chart2)\n    if err != nil {\n        return fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0432\u0442\u043e\u0440\u043e\u0439 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b: %v\", err)\n    }\n\n    \/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0444\u0430\u0439\u043b\n    return f.SaveAs(\".\/budget_variance_analysis.xlsx\")\n}\n\nfunc getNegativeStyle(f *excelize.File) int {\n    style, _ := f.NewStyle(`{\n        \"font\":{\"color\":\"#FF0000\"},\n        \"fill\":{\"type\":\"pattern\",\"color\":&#91;\"#FFC7CE\"],\"pattern\":1}\n    }`)\n    return style\n}\n\nfunc getPositiveStyle(f *excelize.File) int {\n    style, _ := f.NewStyle(`{\n        \"font\":{\"color\":\"#006100\"},\n        \"fill\":{\"type\":\"pattern\",\"color\":&#91;\"#C6EFCE\"],\"pattern\":1}\n    }`)\n    return style\n}\n\nfunc main() {\n    if err := createBudgetVarianceAnalysis(); err != nil {\n        fmt.Printf(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0439: %v\\n\", err)\n        os.Exit(1)\n    }\n\n    fmt.Println(\"\u0410\u043d\u0430\u043b\u0438\u0437 \u0431\u044e\u0434\u0436\u0435\u0442\u043d\u044b\u0445 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0439 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d!\")\n}<\/code><\/pre>\n\n\n\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043c\u043e\u0449\u044c Go \u0432 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0438 \u0441 Excelize \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u0441 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438. \u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0439 \u0438 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439<\/li>\n\n\n\n<li>\u0423\u0441\u043b\u043e\u0432\u043d\u043e\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0439<\/li>\n\n\n\n<li>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c: \u0441\u0442\u043e\u043b\u0431\u0447\u0430\u0442\u043e\u0439 \u0434\u043b\u044f \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0445 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0439 \u0438 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u0434\u043b\u044f \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439<\/li>\n\n\n\n<li>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0430 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u043c\u0438, \u043f\u043e\u0434\u043f\u0438\u0441\u044f\u043c\u0438 \u043e\u0441\u0435\u0439 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c<\/li>\n<\/ol>\n\n\n\n<p>\u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0435 \u043e\u0442\u0447\u0435\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0440\u0430\u0437\u0443 \u0433\u043e\u0442\u043e\u0432\u044b \u043a \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0443 \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0440\u0443\u0447\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u041f\u0440\u0438\u043c\u0435\u0440 3: \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 LibreOffice Calc \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432<\/h4>\n\n\n\n<p>\u0425\u043e\u0442\u044f Microsoft Excel \u0434\u043e\u043c\u0438\u043d\u0438\u0440\u0443\u0435\u0442 \u043d\u0430 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u043c \u0440\u044b\u043d\u043a\u0435, \u043c\u043d\u043e\u0433\u0438\u0435 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432 \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u0441\u0435\u043a\u0442\u043e\u0440\u0435 \u0438 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0447\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 LibreOffice Calc. \u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 ODS (OpenDocument Spreadsheet) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Go.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport (\n    \"encoding\/xml\"\n    \"fmt\"\n    \"io\/ioutil\"\n    \"os\"\n    \"strconv\"\n    \"strings\"\n)\n\n\/\/ \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 XML-\u0444\u043e\u0440\u043c\u0430\u0442\u0430 ODS\ntype Table struct {\n    XMLName xml.Name `xml:\"table:table\"`\n    Name    string   `xml:\"table:name,attr\"`\n    Rows    &#91;]Row    `xml:\"table:table-row\"`\n}\n\ntype Row struct {\n    XMLName xml.Name `xml:\"table:table-row\"`\n    Cells   &#91;]Cell   `xml:\"table:table-cell\"`\n}\n\ntype Cell struct {\n    XMLName xml.Name `xml:\"table:table-cell\"`\n    Value   string   `xml:\"office:value,attr,omitempty\"`\n    String  string   `xml:\"text:p,omitempty\"`\n}\n\ntype Spreadsheet struct {\n    XMLName xml.Name `xml:\"office:document-content\"`\n    Tables  &#91;]Table  `xml:\"office:body&gt;office:spreadsheet&gt;table:table\"`\n}\n\nfunc parseODSFile(filename string) (*Spreadsheet, error) {\n    data, err := ioutil.ReadFile(filename)\n    if err != nil {\n        return nil, fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u0447\u0442\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430: %v\", err)\n    }\n\n    var spreadsheet Spreadsheet\n    if err := xml.Unmarshal(data, &amp;spreadsheet); err != nil {\n        return nil, fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 XML: %v\", err)\n    }\n\n    return &amp;spreadsheet, nil\n}\n\nfunc analyzeFinancialDataFromODS(filename string) error {\n    spreadsheet, err := parseODSFile(filename)\n    if err != nil {\n        return err\n    }\n\n    if len(spreadsheet.Tables) == 0 {\n        return fmt.Errorf(\"\u0444\u0430\u0439\u043b \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\")\n    }\n\n    \/\/ \u0411\u0435\u0440\u0435\u043c \u043f\u0435\u0440\u0432\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e\n    mainTable := spreadsheet.Tables&#91;0]\n    fmt.Printf(\"\u0410\u043d\u0430\u043b\u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b: %s\\n\", mainTable.Name)\n\n    \/\/ \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438\n    if len(mainTable.Rows) &lt; 2 {\n        return fmt.Errorf(\"\u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430\")\n    }\n\n    headers := make(&#91;]string, 0)\n    for _, cell := range mainTable.Rows&#91;0].Cells {\n        if cell.String != \"\" {\n            headers = append(headers, cell.String)\n        } else if cell.Value != \"\" {\n            headers = append(headers, cell.Value)\n        }\n    }\n\n    fmt.Println(\"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432:\", headers)\n\n    \/\/ \u041f\u043e\u0438\u0441\u043a \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445\n    amountIndex := -1\n    categoryIndex := -1\n    dateIndex := -1\n\n    for i, header := range headers {\n        headerLower := strings.ToLower(header)\n        if strings.Contains(headerLower, \"\u0441\u0443\u043c\u043c\u0430\") || strings.Contains(headerLower, \"amount\") {\n            amountIndex = i\n        }\n        if strings.Contains(headerLower, \"\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\") || strings.Contains(headerLower, \"category\") {\n            categoryIndex = i\n        }\n        if strings.Contains(headerLower, \"\u0434\u0430\u0442\u0430\") || strings.Contains(headerLower, \"date\") {\n            dateIndex = i\n        }\n    }\n\n    if amountIndex == -1 {\n        return fmt.Errorf(\"\u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441 \u0441\u0443\u043c\u043c\u0430\u043c\u0438\")\n    }\n\n    \/\/ \u0410\u043d\u0430\u043b\u0438\u0437 \u0434\u0430\u043d\u043d\u044b\u0445\n    totalAmount := 0.0\n    categoryTotals := make(map&#91;string]float64)\n    transactionCount := 0\n\n    for rowIdx := 1; rowIdx &lt; len(mainTable.Rows); rowIdx++ {\n        row := mainTable.Rows&#91;rowIdx]\n        if len(row.Cells) &lt;= amountIndex {\n            continue\n        }\n\n        amountCell := row.Cells&#91;amountIndex]\n        if amountCell.Value == \"\" {\n            continue\n        }\n\n        amount, err := strconv.ParseFloat(amountCell.Value, 64)\n        if err != nil {\n            continue\n        }\n\n        totalAmount += amount\n        transactionCount++\n\n        \/\/ \u0410\u043d\u0430\u043b\u0438\u0437 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\n        if categoryIndex != -1 &amp;&amp; categoryIndex &lt; len(row.Cells) {\n            categoryCell := row.Cells&#91;categoryIndex]\n            category := categoryCell.String\n            if category == \"\" &amp;&amp; categoryCell.Value != \"\" {\n                category = categoryCell.Value\n            }\n\n            if category != \"\" {\n                categoryTotals&#91;category] += amount\n            }\n        }\n    }\n\n    \/\/ \u0412\u044b\u0432\u043e\u0434 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\n    fmt.Printf(\"\\n\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430:\\n\")\n    fmt.Printf(\"\u041e\u0431\u0449\u0430\u044f \u0441\u0443\u043c\u043c\u0430: %.2f\\n\", totalAmount)\n    fmt.Printf(\"\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439: %d\\n\", transactionCount)\n\n    if transactionCount &gt; 0 {\n        fmt.Printf(\"\u0421\u0440\u0435\u0434\u043d\u0438\u0439 \u0447\u0435\u043a: %.2f\\n\", totalAmount\/float64(transactionCount))\n    }\n\n    fmt.Printf(\"\\n\u0410\u043d\u0430\u043b\u0438\u0437 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c:\\n\")\n    for category, total := range categoryTotals {\n        percentage := (total \/ totalAmount) * 100\n        fmt.Printf(\"%s: %.2f (%.1f%%)\\n\", category, total, percentage)\n    }\n\n    return nil\n}\n\nfunc main() {\n    odsFile := \".\/financial_data.ods\"\n\n    if err := analyzeFinancialDataFromODS(odsFile); err != nil {\n        fmt.Printf(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445: %v\\n\", err)\n        os.Exit(1)\n    }\n\n    fmt.Println(\"\\n\u0410\u043d\u0430\u043b\u0438\u0437 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d!\")\n}<\/code><\/pre>\n\n\n\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 LibreOffice Calc \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 XML. \u0425\u043e\u0442\u044f \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043c\u0435\u043d\u0435\u0435 \u0443\u0434\u043e\u0431\u0435\u043d, \u0447\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0434\u043b\u044f Excel, \u043e\u043d \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u043c\u0438 \u0444\u0430\u0439\u043b\u043e\u0432. \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 XML \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b ODS-\u0444\u0430\u0439\u043b\u0430<\/li>\n\n\n\n<li>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0441 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u043c<\/li>\n\n\n\n<li>\u0410\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c \u0441 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f<\/li>\n\n\n\n<li>\u0420\u0430\u0441\u0447\u0435\u0442 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439: \u043e\u0431\u0449\u0435\u0439 \u0441\u0443\u043c\u043c\u044b, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439, \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e \u0447\u0435\u043a\u0430<\/li>\n<\/ol>\n\n\n\n<p>\u042d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0443\u0441\u0438\u043b\u0438\u0439 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Excelize, \u043d\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442 \u043f\u0440\u043e\u043f\u0440\u0438\u0435\u0442\u0430\u0440\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432. \u0414\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0439, \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 LibreOffice, \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u041f\u0440\u0438\u043c\u0435\u0440 4: \u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 API \u0434\u043b\u044f \u0430\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/h4>\n\n\n\n<p>\u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0435 \u0447\u0430\u0441\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0432 \u0432\u0430\u043b\u044e\u0442, \u0446\u0435\u043d \u043d\u0430 \u0430\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u043c\u0430\u043a\u0440\u043e\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439. \u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 Excel-\u0444\u0430\u0439\u043b\u043e\u0432 \u0441 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 API.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport (\n    \"encoding\/json\"\n    \"fmt\"\n    \"io\/ioutil\"\n    \"net\/http\"\n    \"os\"\n    \"strconv\"\n    \"time\"\n\n    \"github.com\/xuri\/excelize\/v2\"\n)\n\n\/\/ \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0442\u0432\u0435\u0442\u0430 API \u043a\u0443\u0440\u0441\u043e\u0432 \u0432\u0430\u043b\u044e\u0442\ntype ExchangeRates struct {\n    Base  string             `json:\"base\"`\n    Date  string             `json:\"date\"`\n    Rates map&#91;string]float64 `json:\"rates\"`\n}\n\n\/\/ \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0432 \u0432\u0430\u043b\u044e\u0442\nfunc getExchangeRates(baseCurrency string) (*ExchangeRates, error) {\n    url := fmt.Sprintf(\"https:\/\/api.exchangerate-api.com\/v4\/latest\/%s\", baseCurrency)\n\n    client := &amp;http.Client{Timeout: 10 * time.Second}\n    resp, err := client.Get(url)\n    if err != nil {\n        return nil, fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a API: %v\", err)\n    }\n    defer resp.Body.Close()\n\n    if resp.StatusCode != http.StatusOK {\n        return nil, fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 API: \u0441\u0442\u0430\u0442\u0443\u0441 \u043a\u043e\u0434 %d\", resp.StatusCode)\n    }\n\n    body, err := ioutil.ReadAll(resp.Body)\n    if err != nil {\n        return nil, fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u0447\u0442\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430: %v\", err)\n    }\n\n    var rates ExchangeRates\n    if err := json.Unmarshal(body, &amp;rates); err != nil {\n        return nil, fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 JSON: %v\", err)\n    }\n\n    return &amp;rates, nil\n}\n\n\/\/ \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043a\u0443\u0440\u0441\u043e\u0432 \u0432\u0430\u043b\u044e\u0442\nfunc updateFinancialDataWithExchangeRates(inputFile, outputFile string) error {\n    \/\/ \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 Excel \u0444\u0430\u0439\u043b\n    f, err := excelize.OpenFile(inputFile)\n    if err != nil {\n        return fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0444\u0430\u0439\u043b\u0430: %v\", err)\n    }\n    defer f.Close()\n\n    \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043b\u0438\u0441\u0442\u043e\u0432\n    sheetList := f.GetSheetList()\n    if len(sheetList) == 0 {\n        return fmt.Errorf(\"\u0444\u0430\u0439\u043b \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u0438\u0441\u0442\u043e\u0432\")\n    }\n\n    \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u0443\u0440\u0441\u044b \u0432\u0430\u043b\u044e\u0442\n    exchangeRates, err := getExchangeRates(\"USD\")\n    if err != nil {\n        return fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u0443\u0440\u0441\u043e\u0432 \u0432\u0430\u043b\u044e\u0442: %v\", err)\n    }\n\n    fmt.Printf(\"\u0410\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u0443\u0440\u0441\u044b \u0432\u0430\u043b\u044e\u0442 \u043d\u0430 %s:\\n\", exchangeRates.Date)\n    fmt.Printf(\"USD\/RUB: %.4f\\n\", exchangeRates.Rates&#91;\"RUB\"])\n    fmt.Printf(\"USD\/EUR: %.4f\\n\", exchangeRates.Rates&#91;\"EUR\"])\n\n    \/\/ \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u043b\u0438\u0441\u0442\n    for _, sheetName := range sheetList {\n        \/\/ \u041f\u043e\u0438\u0441\u043a \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0441 \u0432\u0430\u043b\u044e\u0442\u043e\u0439 \u0438 \u0441\u0443\u043c\u043c\u043e\u0439\n        currencyCol := -1\n        amountCol := -1\n        convertedCol := -1\n\n        \/\/ \u0410\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432\n        rowNum := 1\n        col := \"A\"\n\n        for {\n            cellValue, err := f.GetCellValue(sheetName, col+strconv.Itoa(rowNum))\n            if err != nil || cellValue == \"\" {\n                break\n            }\n\n            cellValueLower := strings.ToLower(cellValue)\n            if strings.Contains(cellValueLower, \"\u0432\u0430\u043b\u044e\u0442\u0430\") || strings.Contains(cellValueLower, \"currency\") {\n                currencyCol = int(col&#91;0] - 'A')\n            }\n            if strings.Contains(cellValueLower, \"\u0441\u0443\u043c\u043c\u0430\") || strings.Contains(cellValueLower, \"amount\") {\n                amountCol = int(col&#91;0] - 'A')\n            }\n            if strings.Contains(cellValueLower, \"\u0441\u0443\u043c\u043c\u0430 usd\") || strings.Contains(cellValueLower, \"amount usd\") {\n                convertedCol = int(col&#91;0] - 'A')\n            }\n\n            col = incrementColumn(col)\n        }\n\n        if currencyCol == -1 || amountCol == -1 {\n            continue \/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043b\u0438\u0441\u0442 \u0431\u0435\u0437 \u043d\u0443\u0436\u043d\u044b\u0445 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432\n        }\n\n        \/\/ \u0415\u0441\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0434\u043b\u044f \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0435\u0433\u043e\n        if convertedCol == -1 {\n            convertedCol = max(currencyCol, amountCol) + 1\n            headerCell := fmt.Sprintf(\"%s%d\", string('A'+rune(convertedCol)), rowNum)\n            f.SetCellValue(sheetName, headerCell, \"\u0421\u0443\u043c\u043c\u0430 USD\")\n        }\n\n        \/\/ \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n        rowNum = 2\n        for {\n            cellRef := fmt.Sprintf(\"%s%d\", string('A'+rune(currencyCol)), rowNum)\n            currency, err := f.GetCellValue(sheetName, cellRef)\n            if err != nil || currency == \"\" {\n                break\n            }\n\n            amountCell := fmt.Sprintf(\"%s%d\", string('A'+rune(amountCol)), rowNum)\n            amountStr, err := f.GetCellValue(sheetName, amountCell)\n            if err != nil {\n                rowNum++\n                continue\n            }\n\n            amount, err := strconv.ParseFloat(amountStr, 64)\n            if err != nil {\n                rowNum++\n                continue\n            }\n\n            \/\/ \u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u0443\u043c\u043c\u0443 \u0432 USD\n            var convertedAmount float64\n            currency = strings.ToUpper(strings.TrimSpace(currency))\n\n            if currency == \"USD\" {\n                convertedAmount = amount\n            } else if rate, exists := exchangeRates.Rates&#91;currency]; exists {\n                convertedAmount = amount \/ rate\n            } else {\n                \/\/ \u0415\u0441\u043b\u0438 \u043a\u0443\u0440\u0441 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d, \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u0430\u043a \u0435\u0441\u0442\u044c \u0438\u043b\u0438 \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u043c\n                convertedAmount = amount\n                fmt.Printf(\"\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435: \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u0432\u0430\u043b\u044e\u0442\u0430 %s\\n\", currency)\n            }\n\n            \/\/ \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443\n            convertedCell := fmt.Sprintf(\"%s%d\", string('A'+rune(convertedCol)), rowNum)\n            f.SetCellValue(sheetName, convertedCell, convertedAmount)\n            f.SetCellDefault(sheetName, convertedCell) \/\/ \u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u043c \u043a\u0430\u043a \u0447\u0438\u0441\u043b\u043e\n\n            rowNum++\n        }\n\n        \/\/ \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a \u0441\u0442\u043e\u043b\u0431\u0446\u0443 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0443\u043c\u043c\n        colLetter := string('A' + rune(convertedCol))\n        style, _ := f.NewStyle(`{\"number_format\": 2}`) \/\/ \u0424\u043e\u0440\u043c\u0430\u0442 \u0447\u0438\u0441\u043b\u0430 \u0441 \u0434\u0432\u0443\u043c\u044f \u0437\u043d\u0430\u043a\u0430\u043c\u0438 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u044f\u0442\u043e\u0439\n\n        \/\/ \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438\n        lastRow := rowNum - 1\n        if lastRow &gt;= 2 {\n            rangeRef := fmt.Sprintf(\"%s2:%s%d\", colLetter, colLetter, lastRow)\n            f.SetCellStyle(sheetName, rangeRef, style)\n        }\n    }\n\n    \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043b\u0438\u0441\u0442 \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u043a\u0443\u0440\u0441\u0430\u0445\n    ratesSheet := \"\u041a\u0443\u0440\u0441\u044b \u0432\u0430\u043b\u044e\u0442\"\n    f.NewSheet(ratesSheet)\n\n    f.SetCellValue(ratesSheet, \"A1\", \"\u0414\u0430\u0442\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f\")\n    f.SetCellValue(ratesSheet, \"B1\", exchangeRates.Date)\n\n    f.SetCellValue(ratesSheet, \"A2\", \"\u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0432\u0430\u043b\u044e\u0442\u0430\")\n    f.SetCellValue(ratesSheet, \"B2\", exchangeRates.Base)\n\n    row := 4\n    f.SetCellValue(ratesSheet, \"A3\", \"\u0412\u0430\u043b\u044e\u0442\u0430\")\n    f.SetCellValue(ratesSheet, \"B3\", \"\u041a\u0443\u0440\u0441 \u043a USD\")\n\n    for currency, rate := range exchangeRates.Rates {\n        f.SetCellValue(ratesSheet, fmt.Sprintf(\"A%d\", row), currency)\n        f.SetCellValue(ratesSheet, fmt.Sprintf(\"B%d\", row), rate)\n        row++\n    }\n\n    \/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b\n    return f.SaveAs(outputFile)\n}\n\nfunc incrementColumn(col string) string {\n    if col == \"Z\" {\n        return \"AA\"\n    }\n    return string(col&#91;0] + 1)\n}\n\nfunc max(a, b int) int {\n    if a &gt; b {\n        return a\n    }\n    return b\n}\n\nfunc main() {\n    inputFile := \".\/financial_report.xlsx\"\n    outputFile := \".\/financial_report_updated.xlsx\"\n\n    if err := updateFinancialDataWithExchangeRates(inputFile, outputFile); err != nil {\n        fmt.Printf(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445: %v\\n\", err)\n        os.Exit(1)\n    }\n\n    fmt.Println(\"\u0424\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0441 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043a\u0443\u0440\u0441\u0430\u043c\u0438 \u0432\u0430\u043b\u044e\u0442!\")\n}<\/code><\/pre>\n\n\n\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c API \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0432 \u0432\u0430\u043b\u044e\u0442<\/li>\n\n\n\n<li>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b Excel-\u0444\u0430\u0439\u043b\u0430 \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432<\/li>\n\n\n\n<li>\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044f \u0441\u0443\u043c\u043c \u0432 \u0440\u0430\u0437\u043d\u043e\u0439 \u0432\u0430\u043b\u044e\u0442\u0435 \u0432 \u0435\u0434\u0438\u043d\u0443\u044e \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0432\u0430\u043b\u044e\u0442\u0443 (USD)<\/li>\n\n\n\n<li>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043b\u0438\u0441\u0442\u0430 \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u043a\u0443\u0440\u0441\u0430\u0445 \u0434\u043b\u044f \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432<\/li>\n\n\n\n<li>\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0432\u043e\u0441\u043f\u0440\u0438\u044f\u0442\u0438\u044f<\/li>\n<\/ol>\n\n\n\n<p>\u0422\u0430\u043a\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0434\u043b\u044f \u043c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0432\u0430\u043b\u044e\u0442\u0430\u043c\u0438, \u0438\u043b\u0438 \u0434\u043b\u044f \u0438\u043d\u0432\u0435\u0441\u0442\u043e\u0440\u043e\u0432, \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u043f\u043e\u0440\u0442\u0444\u0435\u043b\u0438 \u0441 \u0430\u043a\u0442\u0438\u0432\u0430\u043c\u0438 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0430\u043b\u044e\u0442\u0430\u0445. \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Go \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0431\u0435\u0437 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0432\u043c\u0435\u0448\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430.<\/p>\n\n\n\n<p>\u042d\u0442\u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442, \u043a\u0430\u043a Go \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438. \u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043d\u0430 Go \u2014 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0438 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0435\u0433\u043e \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u043c \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432 \u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445<\/h3>\n\n\n\n<p>\u0412 \u043c\u0438\u0440\u0435 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c, \u0430 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u0436\u043d\u044b\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439. Go \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0430 \u0438 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u0432.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f Go \u0441 Grafana \u0438 Prometheus \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0433\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430<\/h4>\n\n\n\n<p>\u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043c\u043e\u0449\u043d\u044b\u0445 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0432\u044f\u0437\u043a\u0430 Go, Prometheus \u0438 Grafana. Prometheus \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0431\u043e\u0440 \u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0440\u044f\u0434\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, Grafana \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0430 Go \u0441\u043b\u0443\u0436\u0438\u0442 \u043c\u043e\u0441\u0442\u043e\u043c \u043c\u0435\u0436\u0434\u0443 \u0432\u0430\u0448\u0438\u043c\u0438 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438 \u044d\u0442\u0438\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport (\n    \"fmt\"\n    \"math\/rand\"\n    \"net\/http\"\n    \"time\"\n\n    \"github.com\/prometheus\/client_golang\/prometheus\"\n    \"github.com\/prometheus\/client_golang\/prometheus\/promhttp\"\n)\n\n\/\/ \u041c\u0435\u0442\u0440\u0438\u043a\u0438 \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0433\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430\nvar (\n    revenueTotal = prometheus.NewGauge(prometheus.GaugeOpts{\n        Name: \"financial_revenue_total\",\n        Help: \"\u041e\u0431\u0449\u0438\u0439 \u0434\u043e\u0445\u043e\u0434 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0432 \u0434\u043e\u043b\u043b\u0430\u0440\u0430\u0445 \u0421\u0428\u0410\",\n    })\n\n    expensesTotal = prometheus.NewGauge(prometheus.GaugeOpts{\n        Name: \"financial_expenses_total\",\n        Help: \"\u041e\u0431\u0449\u0438\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0432 \u0434\u043e\u043b\u043b\u0430\u0440\u0430\u0445 \u0421\u0428\u0410\",\n    })\n\n    profitMargin = prometheus.NewGauge(prometheus.GaugeOpts{\n        Name: \"financial_profit_margin\",\n        Help: \"\u041c\u0430\u0440\u0436\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u0431\u044b\u043b\u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u0430\u0445\",\n    })\n\n    cashFlow = prometheus.NewGauge(prometheus.GaugeOpts{\n        Name: \"financial_cash_flow\",\n        Help: \"\u0414\u0435\u043d\u0435\u0436\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0432 \u0434\u043e\u043b\u043b\u0430\u0440\u0430\u0445 \u0421\u0428\u0410\",\n    })\n\n    budgetVariance = prometheus.NewGaugeVec(prometheus.GaugeOpts{\n        Name: \"financial_budget_variance\",\n        Help: \"\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u043e\u0442 \u0431\u044e\u0434\u0436\u0435\u0442\u0430 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\",\n    }, &#91;]string{\"category\"})\n\n    transactionVolume = prometheus.NewCounterVec(prometheus.CounterOpts{\n        Name: \"financial_transaction_volume\",\n        Help: \"\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439\",\n    }, &#91;]string{\"type\"})\n)\n\nfunc init() {\n    \/\/ \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043c\u0435\u0442\u0440\u0438\u043a\n    prometheus.MustRegister(revenueTotal)\n    prometheus.MustRegister(expensesTotal)\n    prometheus.MustRegister(profitMargin)\n    prometheus.MustRegister(cashFlow)\n    prometheus.MustRegister(budgetVariance)\n    prometheus.MustRegister(transactionVolume)\n}\n\nfunc simulateFinancialData() {\n    \/\/ \u0421\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445\n    for {\n        \/\/ \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u044b\u0445 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439\n        revenue := 500000.0 + rand.Float64()*100000.0\n        expenses := 300000.0 + rand.Float64()*50000.0\n        profit := revenue - expenses\n        margin := (profit \/ revenue) * 100\n\n        \/\/ \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\n        revenueTotal.Set(revenue)\n        expensesTotal.Set(expenses)\n        profitMargin.Set(margin)\n        cashFlow.Set(profit * 0.8) \/\/ \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e 80% \u043f\u0440\u0438\u0431\u044b\u043b\u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0435\u043d\u0435\u0436\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a\n\n        \/\/ \u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f \u043e\u0442 \u0431\u044e\u0434\u0436\u0435\u0442\u0430 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\n        budgetVariance.WithLabelValues(\"marketing\").Set(rand.Float64()*10000 - 5000)\n        budgetVariance.WithLabelValues(\"operations\").Set(rand.Float64()*8000 - 4000)\n        budgetVariance.WithLabelValues(\"r_and_d\").Set(rand.Float64()*12000 - 6000)\n        budgetVariance.WithLabelValues(\"sales\").Set(rand.Float64()*15000 - 7500)\n\n        \/\/ \u041e\u0431\u044a\u0435\u043c \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439\n        transactionVolume.WithLabelValues(\"income\").Add(float64(rand.Intn(50) + 10))\n        transactionVolume.WithLabelValues(\"expense\").Add(float64(rand.Intn(30) + 5))\n\n        time.Sleep(15 * time.Second) \/\/ \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u0436\u0434\u044b\u0435 15 \u0441\u0435\u043a\u0443\u043d\u0434\n    }\n}\n\nfunc main() {\n    \/\/ \u0417\u0430\u043f\u0443\u0441\u043a \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0444\u043e\u043d\u043e\u0432\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435\n    go simulateFinancialData()\n\n    \/\/ \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 HTTP-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u043c\u0435\u0442\u0440\u0438\u043a\n    http.Handle(\"\/metrics\", promhttp.Handler())\n\n    \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 health check endpoint\n    http.HandleFunc(\"\/health\", func(w http.ResponseWriter, r *http.Request) {\n        w.WriteHeader(http.StatusOK)\n        fmt.Fprintf(w, \"Financial monitoring service is healthy\")\n    })\n\n    \/\/ \u0417\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430\n    port := \":8080\"\n    fmt.Printf(\"\u0424\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 %s\\n\", port)\n    fmt.Printf(\"\u041c\u0435\u0442\u0440\u0438\u043a\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443: http:\/\/localhost%s\/metrics\\n\", port)\n    fmt.Println(\"\u0414\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430 \u0432 Grafana \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0448\u0430\u0431\u043b\u043e\u043d \u0441 ID 22789\")\n\n    if err := http.ListenAndServe(port, nil); err != nil {\n        fmt.Printf(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430: %v\\n\", err)\n        panic(err)\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 Prometheus. \u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u0424\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438<\/strong>: \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0434\u043e\u0445\u043e\u0434\u043e\u0432, \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432, \u043c\u0430\u0440\u0436\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0434\u0435\u043d\u0435\u0436\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0438 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0439 \u043e\u0442 \u0431\u044e\u0434\u0436\u0435\u0442\u0430.<\/li>\n\n\n\n<li><strong>\u041c\u0443\u043b\u044c\u0442\u0438-\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437<\/strong>: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0445 \u043c\u0435\u0442\u0440\u0438\u043a \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f \u043e\u0442 \u0431\u044e\u0434\u0436\u0435\u0442\u0430 \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c (\u043c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, R&amp;D, \u043f\u0440\u043e\u0434\u0430\u0436\u0438).<\/li>\n\n\n\n<li><strong>\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437<\/strong>: \u0421\u0447\u0435\u0442\u0447\u0438\u043a\u0438 \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043c\u0430 \u0434\u043e\u0445\u043e\u0434\u043d\u044b\u0445 \u0438 \u0440\u0430\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439.<\/li>\n\n\n\n<li><strong>Health check<\/strong>: \u042d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430.<\/li>\n<\/ol>\n\n\n\n<p>\u0414\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Grafana:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445 Prometheus, \u0443\u043a\u0430\u0437\u0430\u0432 \u0430\u0434\u0440\u0435\u0441 \u0432\u0430\u0448\u0435\u0433\u043e Go-\u0441\u0435\u0440\u0432\u0438\u0441\u0430<\/li>\n\n\n\n<li>\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430 \u0441 ID 22789, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0433\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430<\/li>\n\n\n\n<li>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439<\/li>\n<\/ol>\n\n\n\n<p>Grafana \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0441\u044b\u0440\u044b\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0432 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0432\u043a\u043b\u044e\u0447\u0430\u044f:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u0413\u0440\u0430\u0444\u0438\u043a\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0438 \u0434\u043e\u0445\u043e\u0434\u043e\u0432 \u0438 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/li>\n\n\n\n<li>\u0418\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043c\u0430\u0440\u0436\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u0431\u044b\u043b\u0438<\/li>\n\n\n\n<li>\u0422\u0435\u043f\u043b\u043e\u0432\u044b\u0435 \u043a\u0430\u0440\u0442\u044b \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0439 \u043e\u0442 \u0431\u044e\u0434\u0436\u0435\u0442\u0430 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c<\/li>\n\n\n\n<li>\u0421\u0447\u0435\u0442\u0447\u0438\u043a\u0438 \u043e\u0431\u0449\u0435\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439<\/li>\n\n\n\n<li>\u041f\u0440\u043e\u0433\u043d\u043e\u0437\u043d\u044b\u0435 \u043b\u0438\u043d\u0438\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0435\u0431-\u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Go \u0438 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432<\/h4>\n\n\n\n<p>\u0414\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432\u0435\u0431-\u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432. Go \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 REST API \u0438\u043b\u0438 WebSockets, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u044d\u043a\u0435\u043d\u0434\u0430.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport (\n    \"encoding\/json\"\n    \"fmt\"\n    \"log\"\n    \"math\/rand\"\n    \"net\/http\"\n    \"time\"\n\n    \"github.com\/gorilla\/mux\"\n)\n\n\/\/ \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445\ntype FinancialMetric struct {\n    MetricName string  `json:\"metric_name\"`\n    Value      float64 `json:\"value\"`\n    Unit       string  `json:\"unit\"`\n    Trend      string  `json:\"trend\"` \/\/ \"up\", \"down\", \"stable\"\n}\n\ntype BudgetCategory struct {\n    Category   string  `json:\"category\"`\n    Budget     float64 `json:\"budget\"`\n    Actual     float64 `json:\"actual\"`\n    Variance   float64 `json:\"variance\"`\n    VariancePct float64 `json:\"variance_pct\"`\n}\n\ntype FinancialDashboardData struct {\n    Timestamp     time.Time          `json:\"timestamp\"`\n    KPIs          &#91;]FinancialMetric  `json:\"kpis\"`\n    BudgetStatus  &#91;]BudgetCategory   `json:\"budget_status\"`\n    CashFlow      float64            `json:\"cash_flow\"`\n    RevenueTrend  &#91;]float64          `json:\"revenue_trend\"`\n    ExpensesTrend &#91;]float64          `json:\"expenses_trend\"`\n}\n\nfunc generateFinancialData() FinancialDashboardData {\n    now := time.Now()\n\n    \/\/ \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f KPI\n    kpis := &#91;]FinancialMetric{\n        {\n            MetricName: \"EBITDA\",\n            Value:      1250000 + rand.Float64()*200000,\n            Unit:       \"USD\",\n            Trend:      randomTrend(),\n        },\n        {\n            MetricName: \"ROI\",\n            Value:      15.5 + rand.Float64()*5,\n            Unit:       \"%\",\n            Trend:      randomTrend(),\n        },\n        {\n            MetricName: \"\u0414\u043e\u043b\u0433\/EBITDA\",\n            Value:      2.8 - rand.Float64()*0.5,\n            Unit:       \"x\",\n            Trend:      \"down\", \/\/ \u041b\u0443\u0447\u0448\u0435, \u043a\u043e\u0433\u0434\u0430 \u043c\u0435\u043d\u044c\u0448\u0435\n        },\n        {\n            MetricName: \"\u0414\u0435\u043d\u0435\u0436\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a\",\n            Value:      850000 + rand.Float64()*150000,\n            Unit:       \"USD\",\n            Trend:      randomTrend(),\n        },\n    }\n\n    \/\/ \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0431\u044e\u0434\u0436\u0435\u0442\u043d\u044b\u0445 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439\n    categories := &#91;]BudgetCategory{\n        {\n            Category:   \"\u041c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433\",\n            Budget:     200000,\n            Actual:     200000 * (0.95 + rand.Float64()*0.1),\n            Variance:   0,\n            VariancePct: 0,\n        },\n        {\n            Category:   \"\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\",\n            Budget:     350000,\n            Actual:     350000 * (0.98 + rand.Float64()*0.04),\n            Variance:   0,\n            VariancePct: 0,\n        },\n        {\n            Category:   \"R&amp;D\",\n            Budget:     250000,\n            Actual:     250000 * (1.02 + rand.Float64()*0.08),\n            Variance:   0,\n            VariancePct: 0,\n        },\n        {\n            Category:   \"\u041f\u0440\u043e\u0434\u0430\u0436\u0438\",\n            Budget:     400000,\n            Actual:     400000 * (0.9 + rand.Float64()*0.15),\n            Variance:   0,\n            VariancePct: 0,\n        },\n    }\n\n    \/\/ \u0420\u0430\u0441\u0447\u0435\u0442 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0439\n    for i := range categories {\n        categories&#91;i].Variance = categories&#91;i].Actual - categories&#91;i].Budget\n        if categories&#91;i].Budget != 0 {\n            categories&#91;i].VariancePct = (categories&#91;i].Variance \/ categories&#91;i].Budget) * 100\n        }\n    }\n\n    \/\/ \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0442\u0440\u0435\u043d\u0434\u043e\u0432\n    revenueTrend := make(&#91;]float64, 12)\n    expensesTrend := make(&#91;]float64, 12)\n\n    baseRevenue := 1000000.0\n    baseExpenses := 700000.0\n\n    for i := 0; i &lt; 12; i++ {\n        revenueTrend&#91;i] = baseRevenue * (1 + rand.Float64()*0.1)\n        expensesTrend&#91;i] = baseExpenses * (1 + rand.Float64()*0.05)\n        baseRevenue *= 1.05  \/\/ \u0420\u043e\u0441\u0442 \u043d\u0430 5% \u0432 \u043c\u0435\u0441\u044f\u0446\n        baseExpenses *= 1.03 \/\/ \u0420\u043e\u0441\u0442 \u043d\u0430 3% \u0432 \u043c\u0435\u0441\u044f\u0446\n    }\n\n    return FinancialDashboardData{\n        Timestamp:     now,\n        KPIs:          kpis,\n        BudgetStatus:  categories,\n        CashFlow:      150000 + rand.Float64()*50000,\n        RevenueTrend:  revenueTrend,\n        ExpensesTrend: expensesTrend,\n    }\n}\n\nfunc randomTrend() string {\n    r := rand.Float64()\n    if r &lt; 0.33 {\n        return \"up\"\n    } else if r &lt; 0.66 {\n        return \"down\"\n    }\n    return \"stable\"\n}\n\nfunc getDashboardData(w http.ResponseWriter, r *http.Request) {\n    data := generateFinancialData()\n\n    w.Header().Set(\"Content-Type\", \"application\/json\")\n    w.Header().Set(\"Access-Control-Allow-Origin\", \"*\")\n\n    if err := json.NewEncoder(w).Encode(data); err != nil {\n        http.Error(w, \"\u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445\", http.StatusInternalServerError)\n        return\n    }\n}\n\nfunc getHistoricalData(w http.ResponseWriter, r *http.Request) {\n    \/\/ \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0433\u043e\u0434\n    months := &#91;]string{\"\u042f\u043d\u0432\", \"\u0424\u0435\u0432\", \"\u041c\u0430\u0440\", \"\u0410\u043f\u0440\", \"\u041c\u0430\u0439\", \"\u0418\u044e\u043d\", \"\u0418\u044e\u043b\", \"\u0410\u0432\u0433\", \"\u0421\u0435\u043d\", \"\u041e\u043a\u0442\", \"\u041d\u043e\u044f\", \"\u0414\u0435\u043a\"}\n    revenue := make(&#91;]float64, 12)\n    expenses := make(&#91;]float64, 12)\n    profit := make(&#91;]float64, 12)\n\n    baseRevenue := 800000.0\n    baseExpenses := 600000.0\n\n    for i := 0; i &lt; 12; i++ {\n        revenue&#91;i] = baseRevenue * (1 + rand.Float64()*0.05)\n        expenses&#91;i] = baseExpenses * (1 + rand.Float64()*0.03)\n        profit&#91;i] = revenue&#91;i] - expenses&#91;i]\n\n        baseRevenue *= 1.04 \/\/ 4% \u0440\u043e\u0441\u0442 \u0432 \u043c\u0435\u0441\u044f\u0446\n        baseExpenses *= 1.02 \/\/ 2% \u0440\u043e\u0441\u0442 \u0432 \u043c\u0435\u0441\u044f\u0446\n    }\n\n    historicalData := map&#91;string]interface{}{\n        \"months\":   months,\n        \"revenue\":  revenue,\n        \"expenses\": expenses,\n        \"profit\":   profit,\n    }\n\n    w.Header().Set(\"Content-Type\", \"application\/json\")\n    w.Header().Set(\"Access-Control-Allow-Origin\", \"*\")\n\n    if err := json.NewEncoder(w).Encode(historicalData); err != nil {\n        http.Error(w, \"\u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445\", http.StatusInternalServerError)\n        return\n    }\n}\n\nfunc main() {\n    \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0430\u043d\u0434\u043e\u043c\u0430\n    rand.Seed(time.Now().UnixNano())\n\n    \/\/ \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0440\u043e\u0443\u0442\u0435\u0440\u0430\n    router := mux.NewRouter()\n\n    \/\/ \u0420\u043e\u0443\u0442\u044b API\n    router.HandleFunc(\"\/api\/dashboard\", getDashboardData).Methods(\"GET\")\n    router.HandleFunc(\"\/api\/historical\", getHistoricalData).Methods(\"GET\")\n\n    \/\/ \u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430\n    router.PathPrefix(\"\/static\/\").Handler(http.StripPrefix(\"\/static\/\", http.FileServer(http.Dir(\".\/static\"))))\n\n    \/\/ \u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\n    router.HandleFunc(\"\/\", func(w http.ResponseWriter, r *http.Request) {\n        http.ServeFile(w, r, \".\/templates\/index.html\")\n    })\n\n    \/\/ \u0417\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430\n    port := \":8081\"\n    fmt.Printf(\"\u0424\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u0434\u0430\u0448\u0431\u043e\u0440\u0434 \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u043d\u0430 http:\/\/localhost%s\\n\", port)\n    fmt.Println(\"API \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0430\u043c:\")\n    fmt.Println(\"  GET \/api\/dashboard - \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438\")\n    fmt.Println(\"  GET \/api\/historical - \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430 \u0433\u043e\u0434\")\n\n    log.Fatal(http.ListenAndServe(port, router))\n}<\/code><\/pre>\n\n\n\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0433\u043e \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0433\u043e \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Go \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u044d\u043a\u0435\u043d\u0434\u0430. \u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>RESTful API<\/strong>: Go \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0432\u0430 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/li>\n\n\n\n<li><strong>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/strong>: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 Go \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/li>\n\n\n\n<li><strong>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/strong>: \u0421\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0441 \u0442\u0440\u0435\u043d\u0434\u0430\u043c\u0438 \u0438 \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u044f\u043c\u0438<\/li>\n\n\n\n<li><strong>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 CORS<\/strong>: \u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a\u0440\u043e\u0441\u0441-\u0434\u043e\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0434\u043b\u044f \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439<\/li>\n\n\n\n<li><strong>\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0430\u0437\u0434\u0430\u0447\u0430<\/strong>: \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434-\u0444\u0430\u0439\u043b\u043e\u0432 (HTML, CSS, JS)<\/li>\n<\/ol>\n\n\n\n<p>\u0414\u043b\u044f \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Chart.js<\/strong> \u0438\u043b\u0438 <strong>D3.js<\/strong> \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432<\/li>\n\n\n\n<li><strong>React<\/strong> \u0438\u043b\u0438 <strong>Vue.js<\/strong> \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b<\/li>\n\n\n\n<li><strong>Tailwind CSS<\/strong> \u0438\u043b\u0438 <strong>Bootstrap<\/strong> \u0434\u043b\u044f \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0434\u0438\u0437\u0430\u0439\u043d\u0430<\/li>\n<\/ul>\n\n\n\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e HTML-\u0444\u0430\u0439\u043b\u0430 \u0434\u043b\u044f \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!DOCTYPE html&gt;\n&lt;html lang=\"ru\"&gt;\n&lt;head&gt;\n    &lt;meta charset=\"UTF-8\"&gt;\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"&gt;\n    &lt;title&gt;\u0424\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u0434\u0430\u0448\u0431\u043e\u0440\u0434&lt;\/title&gt;\n    &lt;script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js\"&gt;&lt;\/script&gt;\n    &lt;link href=\"https:\/\/cdn.jsdelivr.net\/npm\/tailwindcss@2.2.19\/dist\/tailwind.min.css\" rel=\"stylesheet\"&gt;\n    &lt;style&gt;\n        .metric-card {\n            transition: transform 0.2s;\n        }\n        .metric-card:hover {\n            transform: translateY(-5px);\n        }\n        .trend-up { color: #10b981; }\n        .trend-down { color: #ef4444; }\n        .trend-stable { color: #6b7280; }\n    &lt;\/style&gt;\n&lt;\/head&gt;\n&lt;body class=\"bg-gray-50\"&gt;\n    &lt;div class=\"container mx-auto p-4\"&gt;\n        &lt;header class=\"mb-8\"&gt;\n            &lt;h1 class=\"text-3xl font-bold text-gray-800\"&gt;\u0424\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u0434\u0430\u0448\u0431\u043e\u0440\u0434&lt;\/h1&gt;\n            &lt;p class=\"text-gray-600\"&gt;\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0438 \u0431\u044e\u0434\u0436\u0435\u0442\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437&lt;\/p&gt;\n        &lt;\/header&gt;\n\n        &lt;div class=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 mb-8\" id=\"kpi-container\"&gt;\n            &lt;!-- KPI \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 --&gt;\n        &lt;\/div&gt;\n\n        &lt;div class=\"grid grid-cols-1 lg:grid-cols-2 gap-8 mb-8\"&gt;\n            &lt;div class=\"bg-white rounded-lg shadow p-6\"&gt;\n                &lt;h2 class=\"text-xl font-semibold mb-4\"&gt;\u0411\u044e\u0434\u0436\u0435\u0442\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437&lt;\/h2&gt;\n                &lt;canvas id=\"budgetChart\" width=\"400\" height=\"300\"&gt;&lt;\/canvas&gt;\n            &lt;\/div&gt;\n\n            &lt;div class=\"bg-white rounded-lg shadow p-6\"&gt;\n                &lt;h2 class=\"text-xl font-semibold mb-4\"&gt;\u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u0434\u043e\u0445\u043e\u0434\u043e\u0432 \u0438 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432&lt;\/h2&gt;\n                &lt;canvas id=\"trendChart\" width=\"400\" height=\"300\"&gt;&lt;\/canvas&gt;\n            &lt;\/div&gt;\n        &lt;\/div&gt;\n\n        &lt;div class=\"bg-white rounded-lg shadow p-6\"&gt;\n            &lt;h2 class=\"text-xl font-semibold mb-4\"&gt;\u0414\u0435\u0442\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c&lt;\/h2&gt;\n            &lt;div class=\"overflow-x-auto\"&gt;\n                &lt;table class=\"min-w-full divide-y divide-gray-200\"&gt;\n                    &lt;thead class=\"bg-gray-50\"&gt;\n                        &lt;tr&gt;\n                            &lt;th class=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\"&gt;\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f&lt;\/th&gt;\n                            &lt;th class=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\"&gt;\u0411\u044e\u0434\u0436\u0435\u0442&lt;\/th&gt;\n                            &lt;th class=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\"&gt;\u0424\u0430\u043a\u0442&lt;\/th&gt;\n                            &lt;th class=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\"&gt;\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435&lt;\/th&gt;\n                            &lt;th class=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\"&gt;% \u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f&lt;\/th&gt;\n                        &lt;\/tr&gt;\n                    &lt;\/thead&gt;\n                    &lt;tbody class=\"bg-white divide-y divide-gray-200\" id=\"budget-table-body\"&gt;\n                        &lt;!-- \u0414\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 --&gt;\n                    &lt;\/tbody&gt;\n                &lt;\/table&gt;\n            &lt;\/div&gt;\n        &lt;\/div&gt;\n    &lt;\/div&gt;\n\n    &lt;script&gt;\n        \/\/ \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\n        async function loadData() {\n            try {\n                const response = await fetch('\/api\/dashboard');\n                if (!response.ok) {\n                    throw new Error('\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445');\n                }\n                return await response.json();\n            } catch (error) {\n                console.error('\u041e\u0448\u0438\u0431\u043a\u0430:', error);\n                return null;\n            }\n        }\n\n        \/\/ \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f KPI\n        function renderKPIs(data) {\n            const container = document.getElementById('kpi-container');\n            container.innerHTML = '';\n\n            data.kpis.forEach(kpi =&gt; {\n                const card = document.createElement('div');\n                card.className = 'metric-card bg-white rounded-lg shadow p-4';\n\n                let trendIcon = '';\n                let trendClass = '';\n\n                if (kpi.trend === 'up') {\n                    trendIcon = '\u2191';\n                    trendClass = 'trend-up';\n                } else if (kpi.trend === 'down') {\n                    trendIcon = '\u2193';\n                    trendClass = 'trend-down';\n                } else {\n                    trendIcon = '\u2192';\n                    trendClass = 'trend-stable';\n                }\n\n                card.innerHTML = `\n                    &lt;h3 class=\"text-sm font-medium text-gray-500\"&gt;${kpi.metric_name}&lt;\/h3&gt;\n                    &lt;p class=\"text-2xl font-bold mt-1\"&gt;${kpi.value.toFixed(1)} ${kpi.unit}&lt;\/p&gt;\n                    &lt;p class=\"text-sm ${trendClass} mt-1\"&gt;${trendIcon} \u0422\u0440\u0435\u043d\u0434&lt;\/p&gt;\n                `;\n\n                container.appendChild(card);\n            });\n        }\n\n        \/\/ \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0431\u044e\u0434\u0436\u0435\u0442\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        function renderBudgetTable(data) {\n            const tbody = document.getElementById('budget-table-body');\n            tbody.innerHTML = '';\n\n            data.budget_status.forEach(category =&gt; {\n                const row = document.createElement('tr');\n\n                let varianceClass = '';\n                if (category.variance &gt; 0) {\n                    varianceClass = 'text-green-600';\n                } else if (category.variance &lt; 0) {\n                    varianceClass = 'text-red-600';\n                }\n\n                row.innerHTML = `\n                    &lt;td class=\"px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900\"&gt;${category.category}&lt;\/td&gt;\n                    &lt;td class=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500\"&gt;${category.budget.toLocaleString('ru-RU', { style: 'currency', currency: 'USD' })}&lt;\/td&gt;\n                    &lt;td class=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500\"&gt;${category.actual.toLocaleString('ru-RU', { style: 'currency', currency: 'USD' })}&lt;\/td&gt;\n                    &lt;td class=\"px-6 py-4 whitespace-nowrap text-sm ${varianceClass}\"&gt;${category.variance.toLocaleString('ru-RU', { style: 'currency', currency: 'USD' })}&lt;\/td&gt;\n                    &lt;td class=\"px-6 py-4 whitespace-nowrap text-sm ${varianceClass}\"&gt;${category.variance_pct.toFixed(1)}%&lt;\/td&gt;\n                `;\n\n                tbody.appendChild(row);\n            });\n        }\n\n        \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432\n        let budgetChart, trendChart;\n\n        function initCharts() {\n            const budgetCtx = document.getElementById('budgetChart').getContext('2d');\n            budgetChart = new Chart(budgetCtx, {\n                type: 'bar',\n                data: {\n                    labels: &#91;],\n                    datasets: &#91;\n                        {\n                            label: '\u0411\u044e\u0434\u0436\u0435\u0442',\n                            data: &#91;],\n                            backgroundColor: 'rgba(59, 130, 246, 0.5)',\n                        },\n                        {\n                            label: '\u0424\u0430\u043a\u0442',\n                            data: &#91;],\n                            backgroundColor: 'rgba(16, 185, 129, 0.5)',\n                        }\n                    ]\n                },\n                options: {\n                    responsive: true,\n                    maintainAspectRatio: false,\n                    scales: {\n                        y: {\n                            beginAtZero: true,\n                            ticks: {\n                                callback: function(value) {\n                                    return '$' + value.toLocaleString();\n                                }\n                            }\n                        }\n                    }\n                }\n            });\n\n            const trendCtx = document.getElementById('trendChart').getContext('2d');\n            trendChart = new Chart(trendCtx, {\n                type: 'line',\n                data: {\n                    labels: &#91;'\u042f\u043d\u0432', '\u0424\u0435\u0432', '\u041c\u0430\u0440', '\u0410\u043f\u0440', '\u041c\u0430\u0439', '\u0418\u044e\u043d', '\u0418\u044e\u043b', '\u0410\u0432\u0433', '\u0421\u0435\u043d', '\u041e\u043a\u0442', '\u041d\u043e\u044f', '\u0414\u0435\u043a'],\n                    datasets: &#91;\n                        {\n                            label: '\u0414\u043e\u0445\u043e\u0434\u044b',\n                            data: &#91;],\n                            borderColor: 'rgb(16, 185, 129)',\n                            backgroundColor: 'rgba(16, 185, 129, 0.1)',\n                            fill: true,\n                            tension: 0.4\n                        },\n                        {\n                            label: '\u0420\u0430\u0441\u0445\u043e\u0434\u044b',\n                            data: &#91;],\n                            borderColor: 'rgb(239, 68, 68)',\n                            backgroundColor: 'rgba(239, 68, 68, 0.1)',\n                            fill: true,\n                            tension: 0.4\n                        }\n                    ]\n                },\n                options: {\n                    responsive: true,\n                    maintainAspectRatio: false,\n                    scales: {\n                        y: {\n                            beginAtZero: true,\n                            ticks: {\n                                callback: function(value) {\n                                    return '$' + value.toLocaleString();\n                                }\n                            }\n                        }\n                    }\n                }\n            });\n        }\n\n        \/\/ \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432\n        function updateCharts(data) {\n            \/\/ \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u044e\u0434\u0436\u0435\u0442\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u043a\u0430\n            const categories = data.budget_status.map(cat =&gt; cat.category);\n            const budgets = data.budget_status.map(cat =&gt; cat.budget);\n            const actuals = data.budget_status.map(cat =&gt; cat.actual);\n\n            budgetChart.data.labels = categories;\n            budgetChart.data.datasets&#91;0].data = budgets;\n            budgetChart.data.datasets&#91;1].data = actuals;\n            budgetChart.update();\n\n            \/\/ \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0440\u0435\u043d\u0434\u043e\u0432\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u043a\u0430\n            trendChart.data.datasets&#91;0].data = data.revenue_trend;\n            trendChart.data.datasets&#91;1].data = data.expenses_trend;\n            trendChart.update();\n        }\n\n        \/\/ \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438\n        async function initDashboard() {\n            initCharts();\n\n            \/\/ \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445\n            const data = await loadData();\n            if (data) {\n                renderKPIs(data);\n                renderBudgetTable(data);\n                updateCharts(data);\n            }\n\n            \/\/ \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u0436\u0434\u044b\u0435 30 \u0441\u0435\u043a\u0443\u043d\u0434\n            setInterval(async () =&gt; {\n                const newData = await loadData();\n                if (newData) {\n                    renderKPIs(newData);\n                    renderBudgetTable(newData);\n                    updateCharts(newData);\n                }\n            }, 30000);\n        }\n\n        \/\/ \u0417\u0430\u043f\u0443\u0441\u043a \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n        document.addEventListener('DOMContentLoaded', initDashboard);\n    &lt;\/script&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre>\n\n\n\n<p>\u042d\u0442\u043e\u0442 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u0434\u0430\u0448\u0431\u043e\u0440\u0434 \u0441:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 KPI-\u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0430\u043c\u0438<\/strong> \u0441 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0442\u0440\u0435\u043d\u0434\u043e\u0432<\/li>\n\n\n\n<li><strong>\u0411\u044e\u0434\u0436\u0435\u0442\u043d\u044b\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u043c<\/strong> \u0432 \u0432\u0438\u0434\u0435 \u0441\u0442\u043e\u043b\u0431\u0447\u0430\u0442\u043e\u0439 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b<\/li>\n\n\n\n<li><strong>\u0418\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0442\u0440\u0435\u043d\u0434\u0430\u043c\u0438<\/strong> \u0434\u043e\u0445\u043e\u0434\u043e\u0432 \u0438 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432<\/li>\n\n\n\n<li><strong>\u0414\u0435\u0442\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439<\/strong> \u0441 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c<\/li>\n\n\n\n<li><strong>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043c<\/strong> \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u0436\u0434\u044b\u0435 30 \u0441\u0435\u043a\u0443\u043d\u0434<\/li>\n<\/ol>\n\n\n\n<p>\u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u0434\u0430\u0448\u0431\u043e\u0440\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u043a\u0430\u043a \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430, \u0442\u0430\u043a \u0438 \u0434\u043b\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u044d\u043a\u0435\u043d\u0434\u0430 \u043d\u0430 Go \u0438 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043e\u043f\u044b\u0442.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 Excel \u0434\u043b\u044f \u0433\u0438\u0431\u0440\u0438\u0434\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439<\/h4>\n\n\n\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043c\u043e\u0449\u044c \u0432\u0435\u0431-\u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432, Excel \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0437\u0430\u043c\u0435\u043d\u0438\u043c\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u0432. Go \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0433\u0438\u0431\u0440\u0438\u0434\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0442 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 Excel.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport (\n    \"fmt\"\n    \"os\"\n    \"time\"\n\n    \"github.com\/xuri\/excelize\/v2\"\n)\n\n\/\/ \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e Excel-\u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430\nfunc createExcelDashboard() error {\n    \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 Excel \u0444\u0430\u0439\u043b\n    f := excelize.NewFile()\n    defer f.Close()\n\n    \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043b\u0438\u0441\u0442\u044b\n    dashboardSheet := \"\u0414\u0430\u0448\u0431\u043e\u0440\u0434\"\n    dataSheet := \"\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\"\n    chartSheet := \"\u0413\u0440\u0430\u0444\u0438\u043a\u0438\"\n\n    f.NewSheet(dashboardSheet)\n    f.NewSheet(dataSheet)\n    f.NewSheet(chartSheet)\n\n    \/\/ \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n    fillFinancialData(f, dataSheet)\n\n    \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0430\u0448\u0431\u043e\u0440\u0434\n    createDashboardLayout(f, dashboardSheet, dataSheet)\n\n    \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0433\u0440\u0430\u0444\u0438\u043a\u0438\n    createCharts(f, chartSheet, dataSheet)\n\n    \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\n    addInteractiveElements(f, dashboardSheet)\n\n    \/\/ \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0441\u0442\u0438\u043b\u0438 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\n    applyFormatting(f, dashboardSheet)\n\n    \/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0444\u0430\u0439\u043b\n    filename := fmt.Sprintf(\"financial_dashboard_%s.xlsx\", time.Now().Format(\"2006-01-02\"))\n    return f.SaveAs(filename)\n}\n\nfunc fillFinancialData(f *excelize.File, sheet string) {\n    \/\/ \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438\n    headers := &#91;]string{\"\u0414\u0430\u0442\u0430\", \"\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\", \"\u0422\u0438\u043f\", \"\u0421\u0443\u043c\u043c\u0430\", \"\u041f\u0440\u043e\u0435\u043a\u0442\", \"\u041e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439\"}\n    for col, header := range headers {\n        cell := fmt.Sprintf(\"%s1\", string('A'+rune(col)))\n        f.SetCellValue(sheet, cell, header)\n    }\n\n    \/\/ \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445\n    categories := &#91;]string{\"\u041c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433\", \"\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\", \"R&amp;D\", \"\u041f\u0440\u043e\u0434\u0430\u0436\u0438\", \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\"}\n    types := &#91;]string{\"\u0414\u043e\u0445\u043e\u0434\", \"\u0420\u0430\u0441\u0445\u043e\u0434\"}\n    projects := &#91;]string{\"\u041f\u0440\u043e\u0435\u043a\u0442 \u0410\", \"\u041f\u0440\u043e\u0435\u043a\u0442 \u0411\", \"\u041f\u0440\u043e\u0435\u043a\u0442 \u0412\", \"\u041e\u0431\u0449\u0438\u0435\"}\n    responsibles := &#91;]string{\"\u0418\u0432\u0430\u043d\u043e\u0432\", \"\u041f\u0435\u0442\u0440\u043e\u0432\", \"\u0421\u0438\u0434\u043e\u0440\u043e\u0432\", \"\u041a\u043e\u0437\u043b\u043e\u0432\"}\n\n    row := 2\n    baseDate := time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC)\n\n    for i := 0; i &lt; 200; i++ {\n        currentDate := baseDate.AddDate(0, 0, i%30)\n\n        f.SetCellValue(sheet, fmt.Sprintf(\"A%d\", row), currentDate.Format(\"02.01.2006\"))\n        f.SetCellValue(sheet, fmt.Sprintf(\"B%d\", row), categories&#91;i%len(categories)])\n        f.SetCellValue(sheet, fmt.Sprintf(\"C%d\", row), types&#91;i%len(types)])\n\n        amount := float64(10000 + (i%100)*500)\n        if types&#91;i%len(types)] == \"\u0414\u043e\u0445\u043e\u0434\" {\n            amount = amount * 1.5\n        }\n        f.SetCellValue(sheet, fmt.Sprintf(\"D%d\", row), amount)\n\n        f.SetCellValue(sheet, fmt.Sprintf(\"E%d\", row), projects&#91;i%len(projects)])\n        f.SetCellValue(sheet, fmt.Sprintf(\"F%d\", row), responsibles&#91;i%len(responsibles)])\n\n        row++\n    }\n}\n\nfunc createDashboardLayout(f *excelize.File, dashboardSheet, dataSheet string) {\n    \/\/ \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430\n    f.SetCellValue(dashboardSheet, \"A1\", \"\u0424\u0418\u041d\u0410\u041d\u0421\u041e\u0412\u042b\u0419 \u0414\u0410\u0428\u0411\u041e\u0420\u0414\")\n    f.MergeCell(dashboardSheet, \"A1\", \"F1\")\n\n    \/\/ KPI \u0441\u0435\u043a\u0446\u0438\u044f\n    f.SetCellValue(dashboardSheet, \"A3\", \"\u041a\u041b\u042e\u0427\u0415\u0412\u042b\u0415 \u041f\u041e\u041a\u0410\u0417\u0410\u0422\u0415\u041b\u0418\")\n    f.MergeCell(dashboardSheet, \"A3\", \"C3\")\n\n    \/\/ \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 KPI-\u044f\u0447\u0435\u0435\u043a\n    kpis := &#91;]struct {\n        cell    string\n        label   string\n        formula string\n    }{\n        {\"A5\", \"\u041e\u0431\u0449\u0438\u0439 \u0434\u043e\u0445\u043e\u0434\", fmt.Sprintf(\"=SUMIF(%s!$C:$C,\\\"\u0414\u043e\u0445\u043e\u0434\\\",%s!$D:$D)\", dataSheet, dataSheet)},\n        {\"A7\", \"\u041e\u0431\u0449\u0438\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b\", fmt.Sprintf(\"=SUMIF(%s!$C:$C,\\\"\u0420\u0430\u0441\u0445\u043e\u0434\\\",%s!$D:$D)\", dataSheet, dataSheet)},\n        {\"A9\", \"\u0427\u0438\u0441\u0442\u0430\u044f \u043f\u0440\u0438\u0431\u044b\u043b\u044c\", \"=B5-B7\"},\n        {\"D5\", \"ROI\", \"=B9\/B7\"},\n        {\"D7\", \"\u0411\u044e\u0434\u0436\u0435\u0442\u043d\u043e\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435\", \"0\"}, \/\/ \u0411\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043e \u043f\u043e\u0437\u0436\u0435\n        {\"D9\", \"\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439\", fmt.Sprintf(\"=COUNTA(%s!$A:$A)-1\", dataSheet)},\n    }\n\n    for _, kpi := range kpis {\n        f.SetCellValue(dashboardSheet, kpi.cell, kpi.label)\n        f.SetCellFormula(dashboardSheet, kpi.formulas, kpi.formula)\n    }\n\n    \/\/ \u0421\u0435\u043a\u0446\u0438\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\n    f.SetCellValue(dashboardSheet, \"A12\", \"\u0410\u041d\u0410\u041b\u0418\u0417 \u041f\u041e \u041a\u0410\u0422\u0415\u0413\u041e\u0420\u0418\u042f\u041c\")\n    f.MergeCell(dashboardSheet, \"A12\", \"C12\")\n\n    categories := &#91;]string{\"\u041c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433\", \"\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\", \"R&amp;D\", \"\u041f\u0440\u043e\u0434\u0430\u0436\u0438\", \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\"}\n    for i, category := range categories {\n        row := 14 + i\n        f.SetCellValue(dashboardSheet, fmt.Sprintf(\"A%d\", row), category)\n        f.SetCellFormula(dashboardSheet, fmt.Sprintf(\"B%d\", row), \n            fmt.Sprintf(\"=SUMIFS(%s!$D:$D,%s!$B:$B,\\\"%s\\\",%s!$C:$C,\\\"\u0414\u043e\u0445\u043e\u0434\\\")\", dataSheet, dataSheet, category, dataSheet))\n        f.SetCellFormula(dashboardSheet, fmt.Sprintf(\"C%d\", row),\n            fmt.Sprintf(\"=SUMIFS(%s!$D:$D,%s!$B:$B,\\\"%s\\\",%s!$C:$C,\\\"\u0420\u0430\u0441\u0445\u043e\u0434\\\")\", dataSheet, dataSheet, category, dataSheet))\n    }\n}\n\nfunc createCharts(f *excelize.File, chartSheet, dataSheet string) {\n    \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u0432\u043e\u0434\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0434\u043b\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432\n    pivotSheet := \"\u0421\u0432\u043e\u0434\u043d\u0430\u044f\"\n    f.NewSheet(pivotSheet)\n\n    \/\/ \u0424\u043e\u0440\u043c\u0443\u043b\u044b \u0434\u043b\u044f \u0441\u0432\u043e\u0434\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    f.SetCellValue(pivotSheet, \"A1\", \"\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\")\n    f.SetCellValue(pivotSheet, \"B1\", \"\u0414\u043e\u0445\u043e\u0434\")\n    f.SetCellValue(pivotSheet, \"C1\", \"\u0420\u0430\u0441\u0445\u043e\u0434\")\n\n    categories := &#91;]string{\"\u041c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433\", \"\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\", \"R&amp;D\", \"\u041f\u0440\u043e\u0434\u0430\u0436\u0438\", \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\"}\n    for i, category := range categories {\n        row := i + 2\n        f.SetCellValue(pivotSheet, fmt.Sprintf(\"A%d\", row), category)\n        f.SetCellFormula(pivotSheet, fmt.Sprintf(\"B%d\", row),\n            fmt.Sprintf(\"=SUMIFS(%s!$D:$D,%s!$B:$B,\\\"%s\\\",%s!$C:$C,\\\"\u0414\u043e\u0445\u043e\u0434\\\")\", dataSheet, dataSheet, category, dataSheet))\n        f.SetCellFormula(pivotSheet, fmt.Sprintf(\"C%d\", row),\n            fmt.Sprintf(\"=SUMIFS(%s!$D:$D,%s!$B:$B,\\\"%s\\\",%s!$C:$C,\\\"\u0420\u0430\u0441\u0445\u043e\u0434\\\")\", dataSheet, dataSheet, category, dataSheet))\n    }\n\n    \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u0442\u043e\u043b\u0431\u0447\u0430\u0442\u0443\u044e \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443\n    barChart := excelize.Chart{\n        Type: \"col\",\n        Series: &#91;]excelize.ChartSeries{\n            {\n                Name:       \"\u0414\u043e\u0445\u043e\u0434\",\n                Categories: fmt.Sprintf(\"%s!$A$2:$A$%d\", pivotSheet, len(categories)+1),\n                Values:     fmt.Sprintf(\"%s!$B$2:$B$%d\", pivotSheet, len(categories)+1),\n            },\n            {\n                Name:       \"\u0420\u0430\u0441\u0445\u043e\u0434\",\n                Categories: fmt.Sprintf(\"%s!$A$2:$A$%d\", pivotSheet, len(categories)+1),\n                Values:     fmt.Sprintf(\"%s!$C$2:$C$%d\", pivotSheet, len(categories)+1),\n            },\n        },\n        Format: excelize.GraphicOptions{\n            OffsetX: 40,\n            OffsetY: 40,\n            Width:   600,\n            Height:  400,\n        },\n        Title: excelize.ChartTitle{\n            Name: \"\u0424\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\",\n        },\n        Legend: excelize.ChartLegend{\n            Position: \"bottom\",\n        },\n        PlotArea: excelize.ChartPlotArea{\n            ShowCatName:     false,\n            ShowLeaderLines: false,\n            ShowPercent:     true,\n            ShowSerName:     false,\n            ShowVal:         true,\n        },\n        XAxis: excelize.ChartAxis{\n            Title: excelize.ChartTitle{\n                Name: \"\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438\",\n            },\n        },\n        YAxis: excelize.ChartAxis{\n            Title: excelize.ChartTitle{\n                Name: \"\u0421\u0443\u043c\u043c\u0430, USD\",\n            },\n        },\n    }\n\n    if err := f.AddChart(chartSheet, \"A1\", &amp;barChart); err != nil {\n        fmt.Printf(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0442\u043e\u043b\u0431\u0447\u0430\u0442\u043e\u0439 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b: %v\\n\", err)\n    }\n\n    \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u0440\u0443\u0433\u043e\u0432\u0443\u044e \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443 \u0434\u043b\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u043e\u0445\u043e\u0434\u043e\u0432\n    pieChart := excelize.Chart{\n        Type: \"pie\",\n        Series: &#91;]excelize.ChartSeries{\n            {\n                Name:       \"\u0414\u043e\u0445\u043e\u0434 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\",\n                Categories: fmt.Sprintf(\"%s!$A$2:$A$%d\", pivotSheet, len(categories)+1),\n                Values:     fmt.Sprintf(\"%s!$B$2:$B$%d\", pivotSheet, len(categories)+1),\n            },\n        },\n        Format: excelize.GraphicOptions{\n            OffsetX: 40,\n            OffsetY: 40,\n            Width:   600,\n            Height:  400,\n        },\n        Title: excelize.ChartTitle{\n            Name: \"\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u043e\u0445\u043e\u0434\u043e\u0432 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\",\n        },\n        Legend: excelize.ChartLegend{\n            Position: \"right\",\n        },\n        PlotArea: excelize.ChartPlotArea{\n            ShowCatName:     false,\n            ShowLeaderLines: false,\n            ShowPercent:     true,\n            ShowSerName:     false,\n            ShowVal:         true,\n        },\n    }\n\n    if err := f.AddChart(chartSheet, \"A20\", &amp;pieChart); err != nil {\n        fmt.Printf(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u0440\u0443\u0433\u043e\u0432\u043e\u0439 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b: %v\\n\", err)\n    }\n}\n\nfunc addInteractiveElements(f *excelize.File, sheet string) {\n    \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0441\u043f\u0438\u0441\u043a\u0438 \u0434\u043b\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438\n    dvRange := excelize.NewDataValidation(true)\n    dvRange.Sqref = \"H3:H3\"\n    dvRange.SetDropList(&#91;]string{\"\u0412\u0441\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438\", \"\u041c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433\", \"\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\", \"R&amp;D\", \"\u041f\u0440\u043e\u0434\u0430\u0436\u0438\", \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\"})\n\n    if err := f.AddDataValidation(sheet, dvRange); err != nil {\n        fmt.Printf(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445: %v\\n\", err)\n    }\n\n    f.SetCellValue(sheet, \"G3\", \"\u0424\u0438\u043b\u044c\u0442\u0440 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438:\")\n\n    \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f (\u0442\u0440\u0435\u0431\u0443\u0435\u0442 VBA, \u043d\u043e \u043c\u044b \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u043c\u0435\u0441\u0442\u043e)\n    f.SetCellValue(sheet, \"G5\", \"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435\")\n    style, _ := f.NewStyle(`{\"font\":{\"bold\":true,\"color\":\"#FFFFFF\"},\"fill\":{\"type\":\"pattern\",\"color\":&#91;\"#2563eb\"],\"pattern\":1}}`)\n    f.SetCellStyle(sheet, \"G5\", \"G5\", style)\n\n    \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435 \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439\n    f.AddComment(sheet, \"G5\", excelize.Comment{\n        Author: \"\u0421\u0438\u0441\u0442\u0435\u043c\u0430\",\n        Text:   \"\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u044d\u0442\u0443 \u043a\u043d\u043e\u043f\u043a\u0443 \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 (\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043c\u0430\u043a\u0440\u043e\u0441)\",\n    })\n}\n\nfunc applyFormatting(f *excelize.File, sheet string) {\n    \/\/ \u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\n    headerStyle, _ := f.NewStyle(`{\n        \"font\":{\"bold\":true,\"size\":16,\"color\":\"#FFFFFF\"},\n        \"fill\":{\"type\":\"pattern\",\"color\":&#91;\"#1e40af\"],\"pattern\":1},\n        \"alignment\":{\"horizontal\":\"center\",\"vertical\":\"center\"}\n    }`)\n    f.SetCellStyle(sheet, \"A1\", \"F1\", headerStyle)\n\n    \/\/ \u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 KPI \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432\n    kpiHeaderStyle, _ := f.NewStyle(`{\n        \"font\":{\"bold\":true,\"size\":12,\"color\":\"#1e40af\"},\n        \"fill\":{\"type\":\"pattern\",\"color\":&#91;\"#dbeafe\"],\"pattern\":1}\n    }`)\n    f.SetCellStyle(sheet, \"A3\", \"C3\", kpiHeaderStyle)\n\n    \/\/ \u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0438\u0441\u0435\u043b\n    numberStyle, _ := f.NewStyle(`{\"number_format\":2}`)\n    currencyStyle, _ := f.NewStyle(`{\"number_format\": \"\\\"$\\\"#,##0.00\"}`)\n\n    \/\/ \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a \u044f\u0447\u0435\u0439\u043a\u0430\u043c \u0441 \u0447\u0438\u0441\u043b\u0430\u043c\u0438\n    f.SetCellStyle(sheet, \"B5\", \"B9\", currencyStyle)\n    f.SetCellStyle(sheet, \"E5\", \"E5\", `{\"number_format\": \"0.00%\"}`)\n    f.SetCellStyle(sheet, \"E7\", \"E7\", currencyStyle)\n    f.SetCellStyle(sheet, \"E9\", \"E9\", numberStyle)\n\n    \/\/ \u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439\n    tableHeaderStyle, _ := f.NewStyle(`{\n        \"font\":{\"bold\":true},\n        \"fill\":{\"type\":\"pattern\",\"color\":&#91;\"#93c5fd\"],\"pattern\":1}\n    }`)\n    f.SetCellStyle(sheet, \"A12\", \"C12\", tableHeaderStyle)\n\n    \/\/ \u0428\u0438\u0440\u0438\u043d\u0430 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432\n    f.SetColWidth(sheet, \"A\", \"A\", 20)\n    f.SetColWidth(sheet, \"B\", \"B\", 15)\n    f.SetColWidth(sheet, \"C\", \"C\", 15)\n    f.SetColWidth(sheet, \"D\", \"D\", 20)\n    f.SetColWidth(sheet, \"E\", \"E\", 15)\n    f.SetColWidth(sheet, \"F\", \"F\", 20)\n}\n\nfunc main() {\n    if err := createExcelDashboard(); err != nil {\n        fmt.Printf(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Excel-\u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430: %v\\n\", err)\n        os.Exit(1)\n    }\n\n    fmt.Println(\"Excel-\u0434\u0430\u0448\u0431\u043e\u0440\u0434 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d!\")\n}<\/code><\/pre>\n\n\n\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0433\u043e \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430 \u0432 Excel \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Go. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u041c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0439\u043d\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/strong>: \u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432<\/li>\n\n\n\n<li><strong>\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u044b<\/strong>: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0443\u043b Excel \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432<\/li>\n\n\n\n<li><strong>\u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/strong>: \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u043e\u043b\u0431\u0447\u0430\u0442\u044b\u0445 \u0438 \u043a\u0440\u0443\u0433\u043e\u0432\u044b\u0445 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c<\/li>\n\n\n\n<li><strong>\u0418\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b<\/strong>: \u0420\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0441\u043f\u0438\u0441\u043a\u0438 \u0434\u043b\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/li>\n\n\n\n<li><strong>\u041a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/strong>: \u0421\u0442\u0438\u043b\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430\u043c \u0431\u0438\u0437\u043d\u0435\u0441-\u043e\u0442\u0447\u0435\u0442\u043d\u043e\u0441\u0442\u0438<\/li>\n\n\n\n<li><strong>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435<\/strong>: \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438 \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445<\/li>\n<\/ol>\n\n\n\n<p>\u0422\u0430\u043a\u043e\u0439 \u0433\u0438\u0431\u0440\u0438\u0434\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0447\u0435\u0442\u0430\u0442\u044c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 Go \u0441 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c\u044e \u0438 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c Excel. \u0424\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0435 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u043c\u043e\u0449\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u0442\u0447\u0435\u0442\u044b, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0443\u0447\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0432 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/h3>\n\n\n\n<p>\u0412 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u043c\u0438 \u043e\u0431\u044a\u0435\u043c\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u0441\u0442\u0440\u043e\u043a \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439, \u0434\u0435\u0442\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0431\u044e\u0434\u0436\u0435\u0442\u043d\u044b\u0435 \u043f\u043b\u0430\u043d\u044b \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442, \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430 \u0434\u0435\u0441\u044f\u0442\u0438\u043b\u0435\u0442\u0438\u044f. Go \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u0435\u0433\u043e \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u043c \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0430\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u043e\u0432.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u043c\u0438<\/h4>\n\n\n\n<p>\u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 Go \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b. \u0412 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport (\n    \"encoding\/csv\"\n    \"fmt\"\n    \"math\/rand\"\n    \"os\"\n    \"runtime\"\n    \"strconv\"\n    \"sync\"\n    \"time\"\n)\n\ntype Transaction struct {\n    ID        string\n    Date      time.Time\n    Amount    float64\n    Category  string\n    Type      string \/\/ \"income\" or \"expense\"\n    Account   string\n    Reference string\n}\n\n\/\/ \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438\nfunc generateTestData(filename string, recordCount int) error {\n    file, err := os.Create(filename)\n    if err != nil {\n        return err\n    }\n    defer file.Close()\n\n    writer := csv.NewWriter(file)\n    defer writer.Flush()\n\n    \/\/ \u0417\u0430\u043f\u0438\u0441\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\n    headers := &#91;]string{\"ID\", \"Date\", \"Amount\", \"Category\", \"Type\", \"Account\", \"Reference\"}\n    if err := writer.Write(headers); err != nil {\n        return err\n    }\n\n    categories := &#91;]string{\"marketing\", \"operations\", \"rd\", \"sales\", \"administration\"}\n    accounts := &#91;]string{\"checking\", \"savings\", \"investment\", \"credit\"}\n    types := &#91;]string{\"income\", \"expense\"}\n\n    baseDate := time.Date(2023, 1, 1, 0, 0, 0, 0, time.UTC)\n\n    for i := 0; i &lt; recordCount; i++ {\n        date := baseDate.AddDate(0, 0, rand.Intn(365))\n        amount := rand.Float64()*10000 + 100\n        if types&#91;rand.Intn(2)] == \"income\" {\n            amount = -amount \/\/ \u0420\u0430\u0441\u0445\u043e\u0434\u044b \u043a\u0430\u043a \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\n        }\n\n        record := &#91;]string{\n            fmt.Sprintf(\"TXN%08d\", i+1),\n            date.Format(\"2006-01-02\"),\n            fmt.Sprintf(\"%.2f\", amount),\n            categories&#91;rand.Intn(len(categories))],\n            types&#91;rand.Intn(len(types))],\n            accounts&#91;rand.Intn(len(accounts))],\n            fmt.Sprintf(\"REF%06d\", rand.Intn(1000000)),\n        }\n\n        if err := writer.Write(record); err != nil {\n            return err\n        }\n\n        if i%100000 == 0 &amp;&amp; i &gt; 0 {\n            fmt.Printf(\"\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e %d \u0437\u0430\u043f\u0438\u0441\u0435\u0439...\\n\", i)\n        }\n    }\n\n    fmt.Printf(\"\u0421\u043e\u0437\u0434\u0430\u043d \u0444\u0430\u0439\u043b %s \u0441 %d \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438\\n\", filename, recordCount)\n    return nil\n}\n\n\/\/ \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445\nfunc processTransactionsSequential(filename string) (map&#91;string]float64, error) {\n    file, err := os.Open(filename)\n    if err != nil {\n        return nil, err\n    }\n    defer file.Close()\n\n    reader := csv.NewReader(file)\n    reader.Comma = ','\n\n    \/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n    if _, err := reader.Read(); err != nil {\n        return nil, err\n    }\n\n    categoryTotals := make(map&#91;string]float64)\n    accountBalances := make(map&#91;string]float64)\n\n    for {\n        record, err := reader.Read()\n        if err != nil {\n            break \/\/ \u041a\u043e\u043d\u0435\u0446 \u0444\u0430\u0439\u043b\u0430\n        }\n\n        if len(record) &lt; 7 {\n            continue \/\/ \u041d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c\n        }\n\n        amount, err := strconv.ParseFloat(record&#91;2], 64)\n        if err != nil {\n            continue\n        }\n\n        category := record&#91;3]\n        account := record&#91;5]\n\n        categoryTotals&#91;category] += amount\n        accountBalances&#91;account] += amount\n    }\n\n    \/\/ \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b\n    results := make(map&#91;string]float64)\n    for category, total := range categoryTotals {\n        results&#91;\"category_\"+category] = total\n    }\n    for account, balance := range accountBalances {\n        results&#91;\"account_\"+account] = balance\n    }\n\n    return results, nil\n}\n\n\/\/ \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u043c\u0438\nfunc processTransactionsParallel(filename string, numWorkers int) (map&#91;string]float64, error) {\n    file, err := os.Open(filename)\n    if err != nil {\n        return nil, err\n    }\n    defer file.Close()\n\n    reader := csv.NewReader(file)\n    reader.Comma = ','\n\n    \/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n    if _, err := reader.Read(); err != nil {\n        return nil, err\n    }\n\n    \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u0430\u043d\u0430\u043b \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0435\u0439\n    recordChan := make(chan &#91;]string, 1000)\n    resultChan := make(chan map&#91;string]float64, numWorkers)\n    var wg sync.WaitGroup\n\n    \/\/ \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c worker'\u043e\u0432\n    for i := 0; i &lt; numWorkers; i++ {\n        wg.Add(1)\n        go func() {\n            defer wg.Done()\n            localTotals := make(map&#91;string]float64)\n            localBalances := make(map&#91;string]float64)\n\n            for record := range recordChan {\n                if len(record) &lt; 7 {\n                    continue\n                }\n\n                amount, err := strconv.ParseFloat(record&#91;2], 64)\n                if err != nil {\n                    continue\n                }\n\n                category := record&#91;3]\n                account := record&#91;5]\n\n                localTotals&#91;category] += amount\n                localBalances&#91;account] += amount\n            }\n\n            \/\/ \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b\n            results := make(map&#91;string]float64)\n            for category, total := range localTotals {\n                results&#91;\"category_\"+category] = total\n            }\n            for account, balance := range localBalances {\n                results&#91;\"account_\"+account] = balance\n            }\n            resultChan &lt;- results\n        }()\n    }\n\n    \/\/ \u0427\u0442\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0432 \u043a\u0430\u043d\u0430\u043b\n    go func() {\n        defer close(recordChan)\n\n        for {\n            record, err := reader.Read()\n            if err != nil {\n                break\n            }\n            recordChan &lt;- record\n        }\n    }()\n\n    \/\/ \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 worker'\u043e\u0432\n    go func() {\n        wg.Wait()\n        close(resultChan)\n    }()\n\n    \/\/ \u0421\u0431\u043e\u0440 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432\n    finalResults := make(map&#91;string]float64)\n    for workerResults := range resultChan {\n        for key, value := range workerResults {\n            finalResults&#91;key] += value\n        }\n    }\n\n    return finalResults, nil\n}\n\nfunc benchmarkProcessing(filename string) {\n    fmt.Printf(\"\u041d\u0430\u0447\u0430\u043b\u043e \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u0430\u0439\u043b\u0430 %s\\n\", filename)\n    fmt.Printf(\"\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e CPU: %d\\n\", runtime.NumCPU())\n\n    \/\/ \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430\n    start := time.Now()\n    resultsSeq, err := processTransactionsSequential(filename)\n    if err != nil {\n        fmt.Printf(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438: %v\\n\", err)\n        return\n    }\n    durationSeq := time.Since(start)\n\n    fmt.Printf(\"\u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 \u0437\u0430 %v\\n\", durationSeq)\n\n    \/\/ \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c worker'\u043e\u0432\n    for workers := 1; workers &lt;= runtime.NumCPU()*2; workers++ {\n        start := time.Now()\n        resultsPar, err := processTransactionsParallel(filename, workers)\n        if err != nil {\n            fmt.Printf(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441 %d worker'\u0430\u043c\u0438: %v\\n\", workers, err)\n            continue\n        }\n        durationPar := time.Since(start)\n\n        \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432\n        resultsMatch := true\n        for key, valueSeq := range resultsSeq {\n            if valuePar, exists := resultsPar&#91;key]; exists {\n                if math.Abs(valueSeq-valuePar) &gt; 0.01 { \/\/ \u0414\u043e\u043f\u0443\u0441\u043a \u0434\u043b\u044f float\n                    resultsMatch = false\n                    break\n                }\n            } else {\n                resultsMatch = false\n                break\n            }\n        }\n\n        status := \"\u2713\"\n        if !resultsMatch {\n            status = \"\u2717\"\n        }\n\n        speedup := float64(durationSeq) \/ float64(durationPar)\n        fmt.Printf(\"Worker'\u044b: %2d | \u0412\u0440\u0435\u043c\u044f: %8v | \u0423\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435: %5.2fx | \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c: %s\\n\",\n            workers, durationPar, speedup, status)\n    }\n}\n\nfunc main() {\n    \/\/ \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (1 \u043c\u0438\u043b\u043b\u0438\u043e\u043d \u0437\u0430\u043f\u0438\u0441\u0435\u0439)\n    testDataFile := \"financial_transactions.csv\"\n    if _, err := os.Stat(testDataFile); os.IsNotExist(err) {\n        fmt.Println(\"\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445...\")\n        if err := generateTestData(testDataFile, 1000000); err != nil {\n            fmt.Printf(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445: %v\\n\", err)\n            return\n        }\n    }\n\n    \/\/ \u0417\u0430\u043f\u0443\u0441\u043a \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430\n    benchmarkProcessing(testDataFile)\n}<\/code><\/pre>\n\n\n\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0433\u043e\u0440\u0443\u0442\u0438\u043d. \u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/strong>: \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 CSV-\u0444\u0430\u0439\u043b\u0430 \u0441 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u043c \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/li>\n\n\n\n<li><strong>\u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430<\/strong>: \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u0435\u0437 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c\u0430 \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f<\/li>\n\n\n\n<li><strong>\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430<\/strong>: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d \u0438 \u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 worker&#8217;\u0430\u043c\u0438<\/li>\n\n\n\n<li><strong>\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/strong>: \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 worker&#8217;\u043e\u0432 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 CPU<\/li>\n\n\n\n<li><strong>\u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432<\/strong>: \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0443\u0442\u0435\u043c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c<\/li>\n<\/ol>\n\n\n\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430 \u043d\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c 8-\u044f\u0434\u0435\u0440\u043d\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430: ~3.5 \u0441\u0435\u043a\u0443\u043d\u0434<\/li>\n\n\n\n<li>\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441 8 worker&#8217;\u0430\u043c\u0438: ~0.6 \u0441\u0435\u043a\u0443\u043d\u0434<\/li>\n\n\n\n<li>\u0423\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435: \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 5.8 \u0440\u0430\u0437<\/li>\n<\/ul>\n\n\n\n<p>\u0422\u0430\u043a\u043e\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0433\u0434\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432<\/h4>\n\n\n\n<p>\u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 Excel \u0447\u0430\u0441\u0442\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438. \u0424\u0430\u0439\u043b\u044b \u043e\u0431\u044a\u0435\u043c\u043e\u043c \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0442\u0435\u043d \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0442\u044c \u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442\u044b \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0432 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u0430\u0445. Go \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport (\n    \"fmt\"\n    \"os\"\n    \"runtime\"\n    \"time\"\n\n    \"github.com\/xuri\/excelize\/v2\"\n)\n\n\/\/ \u041c\u0435\u0442\u043e\u0434 1: \u041f\u043e\u044d\u0442\u0430\u043f\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u0432\nfunc processLargeExcelStreaming(filename string) error {\n    start := time.Now()\n\n    \/\/ \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438\n    f, err := excelize.OpenFile(filename, excelize.Options{Stream: true})\n    if err != nil {\n        return fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0444\u0430\u0439\u043b\u0430: %v\", err)\n    }\n    defer f.Close()\n\n    \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043b\u0438\u0441\u0442\u043e\u0432\n    sheetList := f.GetSheetList()\n    if len(sheetList) == 0 {\n        return fmt.Errorf(\"\u0444\u0430\u0439\u043b \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u0438\u0441\u0442\u043e\u0432\")\n    }\n\n    \/\/ \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u043b\u0438\u0441\u0442\n    sheetName := sheetList&#91;0]\n    rows, err := f.Rows(sheetName)\n    if err != nil {\n        return fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a: %v\", err)\n    }\n\n    var processedCount int\n    var totalAmount float64\n\n    \/\/ \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e\n    for rows.Next() {\n        row, err := rows.Columns()\n        if err != nil {\n            continue\n        }\n\n        if len(row) &gt; 2 { \/\/ \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c, \u0447\u0442\u043e \u0441\u0443\u043c\u043c\u0430 \u0432 \u0442\u0440\u0435\u0442\u044c\u0435\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0435\n            if amountStr := row&#91;2]; amountStr != \"\" {\n                amount, err := parseFloat(amountStr)\n                if err == nil {\n                    totalAmount += amount\n                    processedCount++\n                }\n            }\n        }\n\n        \/\/ \u041f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u044b\u0432\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0430\n        if processedCount%100000 == 0 &amp;&amp; processedCount &gt; 0 {\n            fmt.Printf(\"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043e %d \u0441\u0442\u0440\u043e\u043a, \u043e\u0431\u0449\u0430\u044f \u0441\u0443\u043c\u043c\u0430: %.2f\\n\", processedCount, totalAmount)\n        }\n    }\n\n    duration := time.Since(start)\n    fmt.Printf(\"\\n\u041f\u043e\u0442\u043e\u043a\u043e\u0432\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430:\\n\")\n    fmt.Printf(\"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043e \u0441\u0442\u0440\u043e\u043a: %d\\n\", processedCount)\n    fmt.Printf(\"\u041e\u0431\u0449\u0430\u044f \u0441\u0443\u043c\u043c\u0430: %.2f\\n\", totalAmount)\n    fmt.Printf(\"\u0412\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f: %v\\n\", duration)\n    fmt.Printf(\"\u041f\u0438\u043a\u043e\u0432\u043e\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438: %.2f MB\\n\", getPeakMemoryUsage())\n\n    return nil\n}\n\n\/\/ \u041c\u0435\u0442\u043e\u0434 2: \u041f\u0430\u043a\u0435\u0442\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438\nfunc processLargeExcelBatched(filename string, batchSize int) error {\n    start := time.Now()\n\n    \/\/ \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b\n    f, err := excelize.OpenFile(filename)\n    if err != nil {\n        return fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0444\u0430\u0439\u043b\u0430: %v\", err)\n    }\n    defer f.Close()\n\n    sheetList := f.GetSheetList()\n    if len(sheetList) == 0 {\n        return fmt.Errorf(\"\u0444\u0430\u0439\u043b \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u0438\u0441\u0442\u043e\u0432\")\n    }\n\n    sheetName := sheetList&#91;0]\n    maxRow, err := f.GetRowCount(sheetName)\n    if err != nil {\n        return fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0442\u0440\u043e\u043a: %v\", err)\n    }\n\n    var totalAmount float64\n    var processedCount int\n\n    \/\/ \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438\n    for startRow := 2; startRow &lt;= maxRow; startRow += batchSize {\n        endRow := startRow + batchSize - 1\n        if endRow &gt; maxRow {\n            endRow = maxRow\n        }\n\n        for row := startRow; row &lt;= endRow; row++ {\n            amountCell := fmt.Sprintf(\"C%d\", row) \/\/ \u0421\u0443\u043c\u043c\u0430 \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435 C\n            cellValue, err := f.GetCellValue(sheetName, amountCell)\n            if err != nil || cellValue == \"\" {\n                continue\n            }\n\n            amount, err := parseFloat(cellValue)\n            if err == nil {\n                totalAmount += amount\n                processedCount++\n            }\n        }\n\n        \/\/ \u041e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430\n        runtime.GC()\n\n        \/\/ \u0412\u044b\u0432\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0430\n        if startRow%batchSize == 2 &amp;&amp; startRow &gt; 2 {\n            fmt.Printf(\"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043e %d \u0441\u0442\u0440\u043e\u043a \u0438\u0437 %d, \u043e\u0431\u0449\u0430\u044f \u0441\u0443\u043c\u043c\u0430: %.2f\\n\",\n                processedCount, maxRow-1, totalAmount)\n        }\n    }\n\n    duration := time.Since(start)\n    fmt.Printf(\"\\n\u041f\u0430\u043a\u0435\u0442\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430:\\n\")\n    fmt.Printf(\"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043e \u0441\u0442\u0440\u043e\u043a: %d\\n\", processedCount)\n    fmt.Printf(\"\u041e\u0431\u0449\u0430\u044f \u0441\u0443\u043c\u043c\u0430: %.2f\\n\", totalAmount)\n    fmt.Printf(\"\u0412\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f: %v\\n\", duration)\n    fmt.Printf(\"\u041f\u0438\u043a\u043e\u0432\u043e\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438: %.2f MB\\n\", getPeakMemoryUsage())\n\n    return nil\n}\n\n\/\/ \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 float\nfunc parseFloat(s string) (float64, error) {\n    \/\/ \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432\u0430\u043b\u044e\u0442\u044b \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0438 \u0442\u044b\u0441\u044f\u0447\n    s = strings.ReplaceAll(s, \"$\", \"\")\n    s = strings.ReplaceAll(s, \",\", \"\")\n    s = strings.ReplaceAll(s, \" \", \"\")\n\n    return strconv.ParseFloat(s, 64)\n}\n\n\/\/ \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u0438\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438\nfunc getPeakMemoryUsage() float64 {\n    var m runtime.MemStats\n    runtime.ReadMemStats(&amp;m)\n    return float64(m.Alloc) \/ 1024 \/ 1024\n}\n\nfunc main() {\n    largeExcelFile := \"large_financial_data.xlsx\"\n\n    fmt.Println(\"=== \u041f\u043e\u0442\u043e\u043a\u043e\u0432\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 ===\")\n    if err := processLargeExcelStreaming(largeExcelFile); err != nil {\n        fmt.Printf(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438: %v\\n\", err)\n    }\n\n    fmt.Println(\"\\n=== \u041f\u0430\u043a\u0435\u0442\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 ===\")\n    if err := processLargeExcelBatched(largeExcelFile, 10000); err != nil {\n        fmt.Printf(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438: %v\\n\", err)\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u0432\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 Excel-\u0444\u0430\u0439\u043b\u0430\u043c\u0438:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u041f\u043e\u0442\u043e\u043a\u043e\u0432\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430<\/strong>: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0436\u0438\u043c\u0430 Stream \u0432 Excelize \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u0435\u0437 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432\u0441\u0435\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c<\/li>\n\n\n\n<li><strong>\u041f\u0430\u043a\u0435\u0442\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430<\/strong>: \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438 \u0441 \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430<\/li>\n<\/ol>\n\n\n\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u044d\u0442\u0438\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u0421\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438<\/strong>: \u0412\u043c\u0435\u0441\u0442\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432\u0441\u0435\u0433\u043e \u0444\u0430\u0439\u043b\u0430 (\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0413\u0411) \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u043c\u044f\u0442\u044c \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/li>\n\n\n\n<li><strong>\u041f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/strong>: \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0430\u0435\u0442 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432<\/li>\n\n\n\n<li><strong>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u0430\u0439\u043b\u043e\u0432, \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u044e\u0449\u0438\u0445 \u043e\u0431\u044a\u0435\u043c RAM<\/strong>: \u041f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u043b\u044e\u0431\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430<\/li>\n<\/ul>\n\n\n\n<p>\u0414\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0433\u0434\u0435 \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0444\u0430\u0439\u043b\u044b \u0441 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430\u043c\u0438 \u0441\u0442\u0440\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f\u0445, \u0442\u0430\u043a\u0438\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u0436\u043d\u044b \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u041a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432<\/h4>\n\n\n\n<p>\u0412 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0439 \u043e\u0442\u0447\u0435\u0442\u043d\u043e\u0441\u0442\u0438 \u0447\u0430\u0441\u0442\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0434\u043d\u0438\u0445 \u0438 \u0442\u0435\u0445 \u0436\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438. Go \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043e\u0449\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport (\n    \"fmt\"\n    \"sync\"\n    \"time\"\n\n    \"github.com\/patrickmn\/go-cache\"\n)\n\n\/\/ \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432\ntype FinancialCalculator struct {\n    cache          *cache.Cache\n    mutex          sync.RWMutex\n    complexCalcMap sync.Map \/\/ \u0414\u043b\u044f \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432\n}\n\n\/\/ \u041d\u043e\u0432\u044b\u0439 \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440 \u0441 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c\nfunc NewFinancialCalculator() *FinancialCalculator {\n    \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u044d\u0448 \u0441 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0436\u0438\u0437\u043d\u0438 10 \u043c\u0438\u043d\u0443\u0442 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043e\u0447\u0438\u0441\u0442\u043a\u0438 15 \u043c\u0438\u043d\u0443\u0442\n    c := cache.New(10*time.Minute, 15*time.Minute)\n\n    return &amp;FinancialCalculator{\n        cache: c,\n    }\n}\n\n\/\/ \u0420\u0430\u0441\u0447\u0435\u0442 NPV (\u0447\u0438\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438) \u0441 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c\nfunc (fc *FinancialCalculator) CalculateNPV(cashFlows &#91;]float64, discountRate float64) (float64, bool) {\n    \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043b\u044e\u0447 \u0434\u043b\u044f \u043a\u044d\u0448\u0430\n    key := fmt.Sprintf(\"npv_%.4f_%v\", discountRate, cashFlows)\n\n    \/\/ \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437 \u043a\u044d\u0448\u0430\n    if cached, found := fc.cache.Get(key); found {\n        return cached.(float64), true\n    }\n\n    \/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0440\u0430\u0441\u0447\u0435\u0442\n    npv := 0.0\n    for t, cf := range cashFlows {\n        npv += cf \/ math.Pow(1+discountRate, float64(t))\n    }\n\n    \/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432 \u043a\u044d\u0448\n    fc.cache.Set(key, npv, cache.DefaultExpiration)\n\n    return npv, false\n}\n\n\/\/ \u0420\u0430\u0441\u0447\u0435\u0442 IRR (\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u043d\u043e\u0440\u043c\u044b \u0434\u043e\u0445\u043e\u0434\u043d\u043e\u0441\u0442\u0438) \u0441 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c\nfunc (fc *FinancialCalculator) CalculateIRR(cashFlows &#91;]float64) (float64, bool) {\n    \/\/ \u041a\u043b\u044e\u0447 \u0434\u043b\u044f \u043a\u044d\u0448\u0430\n    key := fmt.Sprintf(\"irr_%v\", cashFlows)\n\n    \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u044d\u0448\u0430\n    if cached, found := fc.cache.Get(key); found {\n        return cached.(float64), true\n    }\n\n    \/\/ \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u041d\u044c\u044e\u0442\u043e\u043d\u0430-\u0420\u0430\u0444\u0441\u043e\u043d\u0430 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 IRR\n    guess := 0.1 \/\/ \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 10%\n    tolerance := 0.0001\n    maxIterations := 100\n\n    for i := 0; i &lt; maxIterations; i++ {\n        npv := 0.0\n        npvDerivative := 0.0\n\n        for t, cf := range cashFlows {\n            factor := math.Pow(1+guess, float64(t))\n            npv += cf \/ factor\n\n            if t &gt; 0 {\n                npvDerivative += -float64(t) * cf \/ (factor * (1 + guess))\n            }\n        }\n\n        if math.Abs(npv) &lt; tolerance {\n            break\n        }\n\n        if npvDerivative == 0 {\n            break\n        }\n\n        guess = guess - npv\/npvDerivative\n    }\n\n    \/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n    fc.cache.Set(key, guess, cache.DefaultExpiration)\n\n    return guess, false\n}\n\n\/\/ \u0420\u0430\u0441\u0447\u0435\u0442 \u0431\u044e\u0434\u0436\u0435\u0442\u043d\u044b\u0445 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0435\u0440\u0438\u043e\u0434\u043e\u0432\nfunc (fc *FinancialCalculator) CalculateBudgetVariance(budget, actual &#91;]float64) map&#91;string]float64 {\n    \/\/ \u041a\u043b\u044e\u0447 \u0434\u043b\u044f \u043a\u044d\u0448\u0430\n    key := fmt.Sprintf(\"variance_%v_%v\", budget, actual)\n\n    \/\/ \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437 \u043a\u044d\u0448\u0430\n    if cached, found := fc.cache.Get(key); found {\n        return cached.(map&#91;string]float64)\n    }\n\n    result := make(map&#91;string]float64)\n    totalVariance := 0.0\n\n    for i := 0; i &lt; len(budget) &amp;&amp; i &lt; len(actual); i++ {\n        variance := actual&#91;i] - budget&#91;i]\n        totalVariance += variance\n        result&#91;fmt.Sprintf(\"period_%d\", i+1)] = variance\n    }\n\n    result&#91;\"total_variance\"] = totalVariance\n    result&#91;\"average_variance\"] = totalVariance \/ float64(len(budget))\n\n    \/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432 \u043a\u044d\u0448\n    fc.cache.Set(key, totalVariance, 2)\n\n    return result\n}\n\n\/\/ \u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\nfunc benchmarkCaching() {\n    calculator := NewFinancialCalculator()\n\n    \/\/ \u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u0434\u0435\u043d\u0435\u0436\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\n    cashFlows := &#91;]float64{-1000000, 300000, 350000, 400000, 450000, 500000}\n\n    fmt.Println(\"=== \u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432 ===\")\n\n    \/\/ \u041f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0441\u0447\u0435\u0442 (\u0431\u0435\u0437 \u043a\u044d\u0448\u0430)\n    start := time.Now()\n    npv1, cached1 := calculator.CalculateNPV(cashFlows, 0.12)\n    duration1 := time.Since(start)\n\n    fmt.Printf(\"\u041f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0441\u0447\u0435\u0442 NPV: %.2f (\u043a\u044d\u0448: %v) - \u0432\u0440\u0435\u043c\u044f: %v\\n\", npv1, cached1, duration1)\n\n    \/\/ \u0412\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0441\u0447\u0435\u0442 (\u0441 \u043a\u044d\u0448\u0435\u043c)\n    start = time.Now()\n    npv2, cached2 := calculator.CalculateNPV(cashFlows, 0.12)\n    duration2 := time.Since(start)\n\n    fmt.Printf(\"\u0412\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0441\u0447\u0435\u0442 NPV: %.2f (\u043a\u044d\u0448: %v) - \u0432\u0440\u0435\u043c\u044f: %v\\n\", npv2, cached2, duration2)\n    fmt.Printf(\"\u0423\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0437\u0430 \u0441\u0447\u0435\u0442 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f: %.2fx\\n\", float64(duration1)\/float64(duration2))\n\n    \/\/ \u0420\u0430\u0441\u0447\u0435\u0442 IRR\n    start = time.Now()\n    irr1, cachedIrr1 := calculator.CalculateIRR(cashFlows)\n    durationIrr1 := time.Since(start)\n\n    fmt.Printf(\"\\n\u041f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0441\u0447\u0435\u0442 IRR: %.4f (\u043a\u044d\u0448: %v) - \u0432\u0440\u0435\u043c\u044f: %v\\n\", irr1, cachedIrr1, durationIrr1)\n\n    start = time.Now()\n    irr2, cachedIrr2 := calculator.CalculateIRR(cashFlows)\n    durationIrr2 := time.Since(start)\n\n    fmt.Printf(\"\u0412\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0441\u0447\u0435\u0442 IRR: %.4f (\u043a\u044d\u0448: %v) - \u0432\u0440\u0435\u043c\u044f: %v\\n\", irr2, cachedIrr2, durationIrr2)\n    fmt.Printf(\"\u0423\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 IRR \u0437\u0430 \u0441\u0447\u0435\u0442 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f: %.2fx\\n\", float64(durationIrr1)\/float64(durationIrr2))\n}\n\nfunc main() {\n    benchmarkCaching()\n\n    \/\/ \u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438\n    calculator := NewFinancialCalculator()\n\n    \/\/ \u0424\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430\n    budget := &#91;]float64{100000, 110000, 115000, 120000, 125000, 130000}\n    actual := &#91;]float64{95000, 108000, 120000, 118000, 130000, 128000}\n\n    variances := calculator.CalculateBudgetVariance(budget, actual)\n\n    fmt.Println(\"\\n=== \u0410\u043d\u0430\u043b\u0438\u0437 \u0431\u044e\u0434\u0436\u0435\u0442\u043d\u044b\u0445 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0439 ===\")\n    for period, variance := range variances {\n        fmt.Printf(\"%s: %.2f USD\\n\", period, variance)\n    }\n\n    \/\/ \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u043a\u044d\u0448\u0430\n    fmt.Printf(\"\\n\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u043a\u044d\u0448\u0430: %d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\\n\", calculator.cache.ItemCount())\n}<\/code><\/pre>\n\n\n\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u041a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439<\/strong>: NPV \u0438 IRR \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043a\u044d\u0448\u0438\u0440\u0443\u044e\u0442\u0441\u044f<\/li>\n\n\n\n<li><strong>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0436\u0438\u0437\u043d\u0438<\/strong>: \u041a\u044d\u0448 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0447\u0438\u0449\u0430\u0435\u0442 \u0441\u0442\u0430\u0440\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0443\u0442\u0435\u0447\u0435\u043a \u043f\u0430\u043c\u044f\u0442\u0438<\/li>\n\n\n\n<li><strong>\u0418\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438<\/strong>: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0445\u044d\u0448\u0435\u0439 \u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/li>\n\n\n\n<li><strong>\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/strong>: \u0418\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0437\u0430 \u0441\u0447\u0435\u0442 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/li>\n<\/ol>\n\n\n\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u041f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0441\u0447\u0435\u0442 NPV: ~500 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434<\/li>\n\n\n\n<li>\u0412\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0441\u0447\u0435\u0442 \u0441 \u043a\u044d\u0448\u0435\u043c: ~5 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434<\/li>\n\n\n\n<li>\u0423\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435: ~100x \u0434\u043b\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432<\/li>\n<\/ul>\n\n\n\n<p>\u0414\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c, \u0433\u0434\u0435 \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u0440\u0430\u0441\u0447\u0435\u0442\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u0438\u043b\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432), \u0442\u0430\u043a\u043e\u0435 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438<\/h3>\n\n\n\n<p>\u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0430\u0445 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0440\u0435\u0434\u043a\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0432 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438. Go \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u0435\u0434\u0438\u043d\u044b\u0439 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438<\/h4>\n\n\n\n<p>\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439, \u0431\u044e\u0434\u0436\u0435\u0442\u043e\u0432, \u043f\u043b\u0430\u043d\u043e\u0432\u044b\u0445 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439. Go \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c\u0438 \u0421\u0423\u0411\u0414 \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 database\/sql \u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u044b.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport (\n    \"database\/sql\"\n    \"fmt\"\n    \"log\"\n    \"time\"\n\n    _ \"github.com\/go-sql-driver\/mysql\"\n    \"github.com\/jmoiron\/sqlx\"\n)\n\n\/\/ \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438\ntype Transaction struct {\n    ID        int       `db:\"id\"`\n    Date      time.Time `db:\"transaction_date\"`\n    Amount    float64   `db:\"amount\"`\n    Category  string    `db:\"category\"`\n    Type      string    `db:\"transaction_type\"` \/\/ \"income\" or \"expense\"\n    AccountID int       `db:\"account_id\"`\n    CreatedAt time.Time `db:\"created_at\"`\n}\n\ntype Account struct {\n    ID        int     `db:\"id\"`\n    Name      string  `db:\"account_name\"`\n    Balance   float64 `db:\"current_balance\"`\n    Currency  string  `db:\"currency_code\"`\n    IsActive  bool    `db:\"is_active\"`\n}\n\ntype BudgetItem struct {\n    ID          int     `db:\"id\"`\n    Category    string  `db:\"category\"`\n    Amount      float64 `db:\"budget_amount\"`\n    PeriodStart time.Time `db:\"period_start\"`\n    PeriodEnd   time.Time `db:\"period_end\"`\n    Department  string  `db:\"department\"`\n}\n\n\/\/ \u0424\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445\ntype FinancialService struct {\n    db *sqlx.DB\n}\n\nfunc NewFinancialService(dataSourceName string) (*FinancialService, error) {\n    db, err := sqlx.Open(\"mysql\", dataSourceName)\n    if err != nil {\n        return nil, err\n    }\n\n    \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f\n    if err := db.Ping(); err != nil {\n        return nil, err\n    }\n\n    \/\/ \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0443\u043b\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439\n    db.SetMaxOpenConns(25)\n    db.SetMaxIdleConns(10)\n    db.SetConnMaxLifetime(30 * time.Minute)\n\n    return &amp;FinancialService{db: db}, nil\n}\n\n\/\/ \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u0437\u0430 \u043f\u0435\u0440\u0438\u043e\u0434\nfunc (fs *FinancialService) GetTransactionsByPeriod(startDate, endDate time.Time) (&#91;]Transaction, error) {\n    query := `\n        SELECT id, transaction_date, amount, category, transaction_type, account_id, created_at\n        FROM financial_transactions\n        WHERE transaction_date BETWEEN ? AND ?\n        ORDER BY transaction_date DESC\n    `\n\n    var transactions &#91;]Transaction\n    err := fs.db.Select(&amp;transactions, query, startDate, endDate)\n    return transactions, err\n}\n\n\/\/ \u0410\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\nfunc (fs *FinancialService) GetCategorySummary(startDate, endDate time.Time) (map&#91;string]float64, error) {\n    query := `\n        SELECT category, SUM(amount) as total_amount\n        FROM financial_transactions\n        WHERE transaction_date BETWEEN ? AND ?\n        GROUP BY category\n    `\n\n    rows, err := fs.db.Query(query, startDate, endDate)\n    if err != nil {\n        return nil, err\n    }\n    defer rows.Close()\n\n    summary := make(map&#91;string]float64)\n    for rows.Next() {\n        var category string\n        var total float64\n        if err := rows.Scan(&amp;category, &amp;total); err != nil {\n            return nil, err\n        }\n        summary&#91;category] = total\n    }\n\n    return summary, rows.Err()\n}\n\n\/\/ \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0431\u044e\u0434\u0436\u0435\u0442\u043e\u043c\nfunc (fs *FinancialService) CompareActualVsBudget(department string, periodStart, periodEnd time.Time) (&#91;]map&#91;string]interface{}, error) {\n    query := `\n        SELECT \n            b.category,\n            b.budget_amount,\n            COALESCE(SUM(t.amount), 0) as actual_amount,\n            (COALESCE(SUM(t.amount), 0) - b.budget_amount) as variance,\n            ((COALESCE(SUM(t.amount), 0) - b.budget_amount) \/ b.budget_amount * 100) as variance_percent\n        FROM budget_items b\n        LEFT JOIN financial_transactions t ON \n            t.category = b.category AND \n            t.transaction_date BETWEEN b.period_start AND b.period_end\n        WHERE b.department = ? AND\n            b.period_start = ? AND\n            b.period_end = ?\n        GROUP BY b.category, b.budget_amount\n    `\n\n    rows, err := fs.db.Query(query, department, periodStart, periodEnd)\n    if err != nil {\n        return nil, err\n    }\n    defer rows.Close()\n\n    var results &#91;]map&#91;string]interface{}\n    for rows.Next() {\n        var category string\n        var budgetAmount, actualAmount, variance, variancePercent float64\n\n        if err := rows.Scan(&amp;category, &amp;budgetAmount, &amp;actualAmount, &amp;variance, &amp;variancePercent); err != nil {\n            return nil, err\n        }\n\n        results = append(results, map&#91;string]interface{}{\n            \"category\":        category,\n            \"budget_amount\":   budgetAmount,\n            \"actual_amount\":   actualAmount,\n            \"variance\":        variance,\n            \"variance_percent\": variancePercent,\n        })\n    }\n\n    return results, rows.Err()\n}\n\n\/\/ \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0433\u043e \u043e\u0442\u0447\u0435\u0442\u0430 \u0432 Excel\nfunc (fs *FinancialService) GenerateFinancialReport(department string, startDate, endDate time.Time) error {\n    \/\/ \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0431\u0430\u0437\u044b\n    comparisonData, err := fs.CompareActualVsBudget(department, startDate, endDate)\n    if err != nil {\n        return fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445: %v\", err)\n    }\n\n    \/\/ \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 Excel-\u0444\u0430\u0439\u043b\u0430\n    f := excelize.NewFile()\n    defer f.Close()\n\n    sheetName := \"\u0424\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u043e\u0442\u0447\u0435\u0442\"\n    f.NewSheet(sheetName)\n\n    \/\/ \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u0442\u0447\u0435\u0442\u0430\n    f.SetCellValue(sheetName, \"A1\", fmt.Sprintf(\"\u0424\u0418\u041d\u0410\u041d\u0421\u041e\u0412\u042b\u0419 \u041e\u0422\u0427\u0415\u0422 \u041f\u041e \u0414\u0415\u041f\u0410\u0420\u0422\u0410\u041c\u0415\u041d\u0422\u0423 %s\", department))\n    f.MergeCell(sheetName, \"A1\", \"F1\")\n\n    \/\/ \u041f\u0435\u0440\u0438\u043e\u0434 \u043e\u0442\u0447\u0435\u0442\u0430\n    f.SetCellValue(sheetName, \"A2\", fmt.Sprintf(\"\u041f\u0435\u0440\u0438\u043e\u0434: %s - %s\", startDate.Format(\"02.01.2006\"), endDate.Format(\"02.01.2006\")))\n    f.MergeCell(sheetName, \"A2\", \"F2\")\n\n    \/\/ \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    headers := &#91;]string{\"\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\", \"\u0411\u044e\u0434\u0436\u0435\u0442\", \"\u0424\u0430\u043a\u0442\", \"\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435\", \"% \u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f\", \"\u0421\u0442\u0430\u0442\u0443\u0441\"}\n    for col, header := range headers {\n        cell := fmt.Sprintf(\"%s4\", string('A'+rune(col)))\n        f.SetCellValue(sheetName, cell, header)\n    }\n\n    \/\/ \u0417\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445\n    row := 5\n    for _, item := range comparisonData {\n        f.SetCellValue(sheetName, fmt.Sprintf(\"A%d\", row), item&#91;\"category\"])\n        f.SetCellValue(sheetName, fmt.Sprintf(\"B%d\", row), item&#91;\"budget_amount\"])\n        f.SetCellValue(sheetName, fmt.Sprintf(\"C%d\", row), item&#91;\"actual_amount\"])\n        f.SetCellValue(sheetName, fmt.Sprintf(\"D%d\", row), item&#91;\"variance\"])\n\n        variancePercent := item&#91;\"variance_percent\"].(float64)\n        f.SetCellValue(sheetName, fmt.Sprintf(\"E%d\", row), variancePercent)\n\n        \/\/ \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f\n        status := \"\u0412 \u043d\u043e\u0440\u043c\u0435\"\n        if variancePercent &gt; 10 {\n            status = \"\u041f\u0435\u0440\u0435\u0440\u0430\u0441\u0445\u043e\u0434\"\n        } else if variancePercent &lt; -10 {\n            status = \"\u042d\u043a\u043e\u043d\u043e\u043c\u0438\u044f\"\n        }\n        f.SetCellValue(sheetName, fmt.Sprintf(\"F%d\", row), status)\n\n        \/\/ \u0423\u0441\u043b\u043e\u0432\u043d\u043e\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\n        if variancePercent &gt; 10 {\n            f.SetCellStyle(sheetName, fmt.Sprintf(\"E%d\", row), fmt.Sprintf(\"F%d\", row), getRedStyle(f))\n        } else if variancePercent &lt; -10 {\n            f.SetCellStyle(sheetName, fmt.Sprintf(\"E%d\", row), fmt.Sprintf(\"F%d\", row), getGreenStyle(f))\n        }\n\n        row++\n    }\n\n    \/\/ \u0418\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    f.SetCellValue(sheetName, fmt.Sprintf(\"A%d\", row), \"\u0418\u0422\u041e\u0413\u041e\")\n    f.SetCellFormula(sheetName, fmt.Sprintf(\"B%d\", row), fmt.Sprintf(\"SUM(B5:B%d)\", row-1))\n    f.SetCellFormula(sheetName, fmt.Sprintf(\"C%d\", row), fmt.Sprintf(\"SUM(C5:C%d)\", row-1))\n    f.SetCellFormula(sheetName, fmt.Sprintf(\"D%d\", row), fmt.Sprintf(\"SUM(D5:D%d)\", row-1))\n\n    \/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043e\u0442\u0447\u0435\u0442\u0430\n    reportName := fmt.Sprintf(\"financial_report_%s_%s.xlsx\", department, time.Now().Format(\"20060102\"))\n    return f.SaveAs(reportName)\n}\n\nfunc getRedStyle(f *excelize.File) int {\n    style, _ := f.NewStyle(`{\"font\":{\"color\":\"#FF0000\"},\"fill\":{\"type\":\"pattern\",\"color\":&#91;\"#FFC7CE\"],\"pattern\":1}}`)\n    return style\n}\n\nfunc getGreenStyle(f *excelize.File) int {\n    style, _ := f.NewStyle(`{\"font\":{\"color\":\"#006100\"},\"fill\":{\"type\":\"pattern\",\"color\":&#91;\"#C6EFCE\"],\"pattern\":1}}`)\n    return style\n}\n\nfunc main() {\n    \/\/ \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445\n    dataSourceName := \"username:password@tcp(localhost:3306)\/finance_db\"\n    service, err := NewFinancialService(dataSourceName)\n    if err != nil {\n        log.Fatalf(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445: %v\", err)\n    }\n    defer service.db.Close()\n\n    fmt.Println(\"\u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e\")\n\n    \/\/ \u041f\u0440\u0438\u043c\u0435\u0440 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u0447\u0435\u0442\u0430\n    department := \"Marketing\"\n    startDate := time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC)\n    endDate := time.Date(2024, 1, 31, 23, 59, 59, 0, time.UTC)\n\n    if err := service.GenerateFinancialReport(department, startDate, endDate); err != nil {\n        log.Fatalf(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u0447\u0435\u0442\u0430: %v\", err)\n    }\n\n    fmt.Printf(\"\u0424\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u043e\u0442\u0447\u0435\u0442 \u0434\u043b\u044f \u0434\u0435\u043f\u0430\u0440\u0442\u0430\u043c\u0435\u043d\u0442\u0430 %s \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\\n\", department)\n}<\/code><\/pre>\n\n\n\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u0443\u044e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e Go \u0441 MySQL \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>ORM-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434<\/strong>: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 sqlx \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u0438 \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b Go<\/li>\n\n\n\n<li><strong>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439<\/strong>: \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0443\u043b\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/li>\n\n\n\n<li><strong>\u0421\u043b\u043e\u0436\u043d\u044b\u0435 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b<\/strong>: JOIN \u043c\u0435\u0436\u0434\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u0438 \u0431\u044e\u0434\u0436\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043b\u0430\u043d\u043e\u0432\u044b\u043c\u0438<\/li>\n\n\n\n<li><strong>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0442\u0447\u0435\u0442\u043e\u0432<\/strong>: \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 Excel-\u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0431\u0430\u0437\u044b<\/li>\n\n\n\n<li><strong>\u0423\u0441\u043b\u043e\u0432\u043d\u043e\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/strong>: \u0412\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0439 \u043e\u0442 \u0431\u044e\u0434\u0436\u0435\u0442\u0430<\/li>\n<\/ol>\n\n\n\n<p>\u0422\u0430\u043a\u0430\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0435\u0434\u0438\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u0433\u0434\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0431\u0430\u0437\u0435, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 Go \u0441 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e, \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u0443\u0434\u043e\u0431\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 Excel \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u0432.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u0438 API<\/h4>\n\n\n\n<p>\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432\u0441\u0435 \u0447\u0430\u0449\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. Go \u0438\u043c\u0435\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u043c\u0438 API \u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport (\n    \"bytes\"\n    \"context\"\n    \"encoding\/json\"\n    \"fmt\"\n    \"io\/ioutil\"\n    \"log\"\n    \"net\/http\"\n    \"os\"\n    \"time\"\n\n    \"cloud.google.com\/go\/storage\"\n    \"github.com\/aws\/aws-sdk-go\/aws\"\n    \"github.com\/aws\/aws-sdk-go\/aws\/session\"\n    \"github.com\/aws\/aws-sdk-go\/service\/s3\"\n    \"golang.org\/x\/oauth2\"\n    \"golang.org\/x\/oauth2\/google\"\n    sheets \"google.golang.org\/api\/sheets\/v4\"\n)\n\n\/\/ \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\ntype CloudConfig struct {\n    GoogleServiceAccountFile string\n    AWSRegion               string\n    S3BucketName            string\n    GoogleSheetID           string\n}\n\n\/\/ \u0421\u0435\u0440\u0432\u0438\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438\ntype CloudFinancialService struct {\n    config  *CloudConfig\n    gcpAuth *oauth2.Config\n    awsSess *session.Session\n}\n\nfunc NewCloudFinancialService(config *CloudConfig) (*CloudFinancialService, error) {\n    \/\/ \u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f Google Cloud\n    ctx := context.Background()\n    gcpAuth, err := google.JWTConfigFromJSON(&#91;]byte(config.GoogleServiceAccountFile), sheets.SpreadsheetsScope)\n    if err != nil {\n        return nil, fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 GCP: %v\", err)\n    }\n\n    \/\/ \u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f AWS\n    awsSess, err := session.NewSession(&amp;aws.Config{\n        Region: aws.String(config.AWSRegion),\n    })\n    if err != nil {\n        return nil, fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 AWS: %v\", err)\n    }\n\n    return &amp;CloudFinancialService{\n        config:  config,\n        gcpAuth: gcpAuth,\n        awsSess: awsSess,\n    }, nil\n}\n\n\/\/ \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Google Sheets\nfunc (cfs *CloudFinancialService) UploadToGoogleSheets(data &#91;]&#91;]interface{}, rangeName string) error {\n    ctx := context.Background()\n    client := cfs.gcpAuth.Client(ctx)\n\n    srv, err := sheets.NewService(ctx, option.WithHTTPClient(client))\n    if err != nil {\n        return fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Google Sheets \u0441\u0435\u0440\u0432\u0438\u0441\u0430: %v\", err)\n    }\n\n    vr := &amp;sheets.ValueRange{\n        Values: data,\n    }\n\n    _, err = srv.Spreadsheets.Values.Update(cfs.config.GoogleSheetID, rangeName, vr).ValueInputOption(\"RAW\").Do()\n    if err != nil {\n        return fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Google Sheets: %v\", err)\n    }\n\n    return nil\n}\n\n\/\/ \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 Excel-\u043e\u0442\u0447\u0435\u0442\u0430 \u0432 AWS S3\nfunc (cfs *CloudFinancialService) UploadReportToS3(reportName string, fileData &#91;]byte) error {\n    svc := s3.New(cfs.awsSess)\n\n    \/\/ \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 content type \u0434\u043b\u044f Excel\n    contentType := \"application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\n\n    params := &amp;s3.PutObjectInput{\n        Bucket:      aws.String(cfs.config.S3BucketName),\n        Key:         aws.String(reportName),\n        Body:        bytes.NewReader(fileData),\n        ContentType: aws.String(contentType),\n        ACL:         aws.String(\"private\"),\n    }\n\n    _, err := svc.PutObject(params)\n    if err != nil {\n        return fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u0430\u0439\u043b\u0430 \u0432 S3: %v\", err)\n    }\n\n    return nil\n}\n\n\/\/ \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 Google Cloud Storage\nfunc (cfs *CloudFinancialService) DownloadFromGCS(objectName string) (&#91;]byte, error) {\n    ctx := context.Background()\n    client, err := storage.NewClient(ctx, option.WithCredentialsFile(cfs.config.GoogleServiceAccountFile))\n    if err != nil {\n        return nil, fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f GCS \u043a\u043b\u0438\u0435\u043d\u0442\u0430: %v\", err)\n    }\n    defer client.Close()\n\n    bucket := client.Bucket(\"financial-data-bucket\")\n    obj := bucket.Object(objectName)\n\n    reader, err := obj.NewReader(ctx)\n    if err != nil {\n        return nil, fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f reader \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430: %v\", err)\n    }\n    defer reader.Close()\n\n    return ioutil.ReadAll(reader)\n}\n\n\/\/ \u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u043c\u0438 API\nfunc (cfs *CloudFinancialService) GetExchangeRates(baseCurrency string) (map&#91;string]float64, error) {\n    url := fmt.Sprintf(\"https:\/\/api.exchangerate-api.com\/v4\/latest\/%s\", baseCurrency)\n\n    client := &amp;http.Client{Timeout: 10 * time.Second}\n    resp, err := client.Get(url)\n    if err != nil {\n        return nil, fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a API \u043e\u0431\u043c\u0435\u043d\u043d\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0432: %v\", err)\n    }\n    defer resp.Body.Close()\n\n    if resp.StatusCode != http.StatusOK {\n        return nil, fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 API \u043e\u0431\u043c\u0435\u043d\u043d\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0432: \u0441\u0442\u0430\u0442\u0443\u0441 %d\", resp.StatusCode)\n    }\n\n    var result struct {\n        Rates map&#91;string]float64 `json:\"rates\"`\n    }\n\n    if err := json.NewDecoder(resp.Body).Decode(&amp;result); err != nil {\n        return nil, fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043e\u0442\u0432\u0435\u0442\u0430 API: %v\", err)\n    }\n\n    return result.Rates, nil\n}\n\n\/\/ \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0433\u043e \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0433\u043e \u043e\u0442\u0447\u0435\u0442\u0430\nfunc (cfs *CloudFinancialService) GenerateCloudFinancialReport(department string, period string) error {\n    \/\/ \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442\u0447\u0435\u0442\u0430 (\u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0437\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0443\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435)\n    reportData := &#91;]&#91;]interface{}{\n        {\"\u0414\u0435\u043f\u0430\u0440\u0442\u0430\u043c\u0435\u043d\u0442\", \"\u041f\u0435\u0440\u0438\u043e\u0434\", \"\u0414\u043e\u0445\u043e\u0434\", \"\u0420\u0430\u0441\u0445\u043e\u0434\u044b\", \"\u041f\u0440\u0438\u0431\u044b\u043b\u044c\"},\n        {department, period, 150000.0, 95000.0, 55000.0},\n        {\"\", \"\", \"\", \"\", \"\"},\n        {\"\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432\", \"\", \"\", \"\", \"\"},\n        {\"\u041c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433\", \"\", 0, 45000.0, \"\"},\n        {\"\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\", \"\", 0, 30000.0, \"\"},\n        {\"R&amp;D\", \"\", 0, 20000.0, \"\"},\n    }\n\n    \/\/ \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0432 Google Sheets\n    if err := cfs.UploadToGoogleSheets(reportData, \"A1:E10\"); err != nil {\n        return fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432 Google Sheets: %v\", err)\n    }\n\n    \/\/ \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 Excel-\u0444\u0430\u0439\u043b\u0430 \u0434\u043b\u044f S3\n    excelFile := excelize.NewFile()\n    sheetName := \"\u041e\u0442\u0447\u0435\u0442\"\n    excelFile.NewSheet(sheetName)\n\n    for row, rowData := range reportData {\n        for col, cell := range rowData {\n            excelFile.SetCellValue(sheetName, fmt.Sprintf(\"%s%d\", string('A'+rune(col)), row+1), cell)\n        }\n    }\n\n    \/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438\n    var buf bytes.Buffer\n    if err := excelFile.Write(&amp;buf); err != nil {\n        return fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Excel \u0444\u0430\u0439\u043b\u0430: %v\", err)\n    }\n\n    \/\/ \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0432 S3\n    fileName := fmt.Sprintf(\"%s_financial_report_%s.xlsx\", department, period)\n    if err := cfs.UploadReportToS3(fileName, buf.Bytes()); err != nil {\n        return fmt.Errorf(\"\u043e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432 S3: %v\", err)\n    }\n\n    return nil\n}\n\nfunc main() {\n    \/\/ \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 (\u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f)\n    config := &amp;CloudConfig{\n        GoogleServiceAccountFile: os.Getenv(\"GOOGLE_APPLICATION_CREDENTIALS\"),\n        AWSRegion:               \"us-east-1\",\n        S3BucketName:            \"financial-reports-bucket\",\n        GoogleSheetID:           \"1aBCdEfGhIjKlMnOpQrStUvWxYz123456789\",\n    }\n\n    service, err := NewCloudFinancialService(config)\n    if err != nil {\n        log.Fatalf(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430: %v\", err)\n    }\n\n    fmt.Println(\"\u041e\u0431\u043b\u0430\u0447\u043d\u044b\u0439 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\")\n\n    \/\/ \u041f\u0440\u0438\u043c\u0435\u0440 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u0447\u0435\u0442\u0430\n    department := \"Sales\"\n    period := \"2024-Q1\"\n\n    if err := service.GenerateCloudFinancialReport(department, period); err != nil {\n        log.Fatalf(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0433\u043e \u043e\u0442\u0447\u0435\u0442\u0430: %v\", err)\n    }\n\n    fmt.Printf(\"\u041e\u0431\u043b\u0430\u0447\u043d\u044b\u0439 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u043e\u0442\u0447\u0435\u0442 \u0434\u043b\u044f \u0434\u0435\u043f\u0430\u0440\u0442\u0430\u043c\u0435\u043d\u0442\u0430 %s \u0437\u0430 \u043f\u0435\u0440\u0438\u043e\u0434 %s \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\\n\", department, period)\n\n    \/\/ \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u0443\u0440\u0441\u043e\u0432 \u0432\u0430\u043b\u044e\u0442\n    rates, err := service.GetExchangeRates(\"USD\")\n    if err != nil {\n        log.Printf(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u0443\u0440\u0441\u043e\u0432 \u0432\u0430\u043b\u044e\u0442: %v\", err)\n    } else {\n        fmt.Printf(\"\u041a\u0443\u0440\u0441 USD\/RUB: %.4f\\n\", rates&#91;\"RUB\"])\n        fmt.Printf(\"\u041a\u0443\u0440\u0441 USD\/EUR: %.4f\\n\", rates&#91;\"EUR\"])\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e Go \u0441 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Google Sheets API<\/strong>: \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b<\/li>\n\n\n\n<li><strong>AWS S3<\/strong>: \u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 Excel-\u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435<\/li>\n\n\n\n<li><strong>Google Cloud Storage<\/strong>: \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430<\/li>\n\n\n\n<li><strong>\u0412\u043d\u0435\u0448\u043d\u0438\u0435 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0435 API<\/strong>: \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0432 \u0432\u0430\u043b\u044e\u0442 \u0434\u043b\u044f \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439<\/li>\n\n\n\n<li><strong>\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f<\/strong>: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u044b\u0445 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u043e\u0432 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c<\/li>\n<\/ol>\n\n\n\n<p>\u0422\u0430\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0447\u043d\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c<\/strong>: \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043b\u044e\u0431\u044b\u0445 \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445<\/li>\n\n\n\n<li><strong>\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c<\/strong>: \u0414\u0430\u043d\u043d\u044b\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438\u0437 \u043b\u044e\u0431\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043c\u0438\u0440\u0430<\/li>\n\n\n\n<li><strong>\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c<\/strong>: \u0428\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043e\u0431\u043b\u0430\u043a\u0430<\/li>\n\n\n\n<li><strong>\u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c<\/strong>: \u041e\u043f\u043b\u0430\u0442\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b<\/li>\n<\/ul>\n\n\n\n<p>\u0414\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u0441 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 \u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u044e\u0440\u0438\u0441\u0434\u0438\u043a\u0446\u0438\u044f\u0445, \u0442\u0430\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0447\u043d\u0430\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u0436\u043d\u043e\u0439.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u0427\u0435\u043a-\u043b\u0438\u0441\u0442 \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f Go \u0432 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0435<\/h3>\n\n\n\n<p>\u041d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430, \u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u0447\u0435\u043a-\u043b\u0438\u0441\u0442 \u0434\u043b\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f Go \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438, \u0431\u044e\u0434\u0436\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432. \u042d\u0442\u043e\u0442 \u0447\u0435\u043a-\u043b\u0438\u0441\u0442 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u043c \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u044f\u0437\u044b\u043a\u0430.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 \u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h4>\n\n\n\n<p><strong>[ ] \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0431\u0438\u0437\u043d\u0435\u0441-\u0437\u0430\u0434\u0430\u0447<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u0427\u0435\u0442\u043a\u043e\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0446\u0435\u043b\u0435\u0439 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f Go (\u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u0447\u0435\u0442\u043d\u043e\u0441\u0442\u0438, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432)<\/li>\n\n\n\n<li>\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0443\u0437\u043a\u0438\u0445 \u043c\u0435\u0441\u0442 \u0432 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u0445 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438<\/li>\n\n\n\n<li>\u041e\u0446\u0435\u043d\u043a\u0430 \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u043a \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/li>\n\n\n\n<li>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0438\u0445 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0439 \u043e\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/li>\n<\/ul>\n\n\n\n<p><strong>[ ] \u0410\u043d\u0430\u043b\u0438\u0437 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0439<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u0418\u043d\u0432\u0435\u043d\u0442\u0430\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (Excel, \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, ERP-\u0441\u0438\u0441\u0442\u0435\u043c\u044b)<\/li>\n\n\n\n<li>\u041e\u0446\u0435\u043d\u043a\u0430 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/li>\n\n\n\n<li>\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0439 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438<\/li>\n\n\n\n<li>\u0410\u043d\u0430\u043b\u0438\u0437 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u043a \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044e \u043d\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u0430\u043a\u0442\u0430\u043c<\/li>\n<\/ul>\n\n\n\n<p><strong>[ ] \u0412\u044b\u0431\u043e\u0440 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u041e\u0446\u0435\u043d\u043a\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Excel (Excelize vs tealeg\/xlsx)<\/li>\n\n\n\n<li>\u0412\u044b\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 (Grafana, Chart.js, D3.js)<\/li>\n\n\n\n<li>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/li>\n\n\n\n<li>\u0412\u044b\u0431\u043e\u0440 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 (AWS, GCP, Azure)<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432<\/h4>\n\n\n\n<p><strong>[ ] \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u041f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/li>\n\n\n\n<li>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u043d\u0438\u0446 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438<\/li>\n\n\n\n<li>\u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u0438 \u0438 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438<\/li>\n\n\n\n<li>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430<\/li>\n<\/ul>\n\n\n\n<p><strong>[ ] \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 Excel\/LibreOffice \u0434\u0430\u043d\u043d\u044b\u0445<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 (\u043f\u043e\u0442\u043e\u043a\u043e\u0432\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430)<\/li>\n\n\n\n<li>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u043e\u0440\u043c\u0443\u043b \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/li>\n\n\n\n<li>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0435<\/li>\n\n\n\n<li>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a<\/li>\n<\/ul>\n\n\n\n<p><strong>[ ] \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 (NPV, IRR, ROI)<\/li>\n\n\n\n<li>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432<\/li>\n\n\n\n<li>\u041e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439<\/li>\n\n\n\n<li>\u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432<\/li>\n<\/ul>\n\n\n\n<p><strong>[ ] \u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f API-\u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432<\/li>\n\n\n\n<li>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/li>\n\n\n\n<li>\u041e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 API<\/li>\n\n\n\n<li>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0445 \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0448\u0438\u0431\u043e\u043a<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e<\/h4>\n\n\n\n<p><strong>[ ] \u041a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 unit-\u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432<\/li>\n\n\n\n<li>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Excel<\/li>\n\n\n\n<li>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/li>\n\n\n\n<li>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u0440\u0430\u0435\u0432\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 (\u043f\u0443\u0441\u0442\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043e\u0448\u0438\u0431\u043a\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432)<\/li>\n<\/ul>\n\n\n\n<p><strong>[ ] \u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0441 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c\u0438 \u044d\u0442\u0430\u043b\u043e\u043d\u0430\u043c\u0438<\/li>\n\n\n\n<li>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/li>\n\n\n\n<li>\u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u0441 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438<\/li>\n\n\n\n<li>\u0410\u0443\u0434\u0438\u0442 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u043c \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u043c<\/li>\n<\/ul>\n\n\n\n<p><strong>[ ] \u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u044b\u0445 Excel-\u0444\u0430\u0439\u043b\u043e\u0432<\/li>\n\n\n\n<li>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 API<\/li>\n\n\n\n<li>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u0438 \u043f\u0440\u0430\u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439<\/li>\n\n\n\n<li>\u0410\u0443\u0434\u0438\u0442 \u0436\u0443\u0440\u043d\u0430\u043b\u043e\u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0438 \u043b\u043e\u0433\u043e\u0432<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">\u0412\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430<\/h4>\n\n\n\n<p><strong>[ ] \u041f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0438\u043b\u043e\u0442\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u0435\u043f\u0430\u0440\u0442\u0430\u043c\u0435\u043d\u0442\u0430<\/li>\n\n\n\n<li>\u0421\u0431\u043e\u0440 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438 \u043e\u0442 \u043f\u0435\u0440\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439<\/li>\n\n\n\n<li>\u0418\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f<\/li>\n\n\n\n<li>\u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443<\/li>\n<\/ul>\n\n\n\n<p><strong>[ ] \u041e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u0432<\/li>\n\n\n\n<li>\u041f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0442\u0440\u0435\u043d\u0438\u043d\u0433\u043e\u0432 <\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u0412 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u043c\u0438\u0440\u0435 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u043c \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438. \u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Python \u0438 R, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0441\u0432\u043e\u044e \u043c\u043e\u0449\u044c, \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043c\u0430\u043c\u0438 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u042f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Go emerges \u043a\u0430\u043a \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0445 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u0438. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"\u041a\u0430\u043a \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u044c \u044f\u0437\u044b\u043a Go \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445 Excel \u0438 LibreOffice: \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430, \u0431\u044e\u0434\u0436\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432","jetpack_seo_html_title":"\u041a\u0430\u043a \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u044c \u044f\u0437\u044b\u043a Go \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445 Excel \u0438 LibreOffice","jetpack_seo_noindex":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[6],"tags":[],"class_list":["post-2492","post","type-post","status-publish","format-standard","hentry","category-6"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/gerdlezhev.ru\/index.php?rest_route=\/wp\/v2\/posts\/2492","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gerdlezhev.ru\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gerdlezhev.ru\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gerdlezhev.ru\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gerdlezhev.ru\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2492"}],"version-history":[{"count":1,"href":"https:\/\/gerdlezhev.ru\/index.php?rest_route=\/wp\/v2\/posts\/2492\/revisions"}],"predecessor-version":[{"id":2493,"href":"https:\/\/gerdlezhev.ru\/index.php?rest_route=\/wp\/v2\/posts\/2492\/revisions\/2493"}],"wp:attachment":[{"href":"https:\/\/gerdlezhev.ru\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2492"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gerdlezhev.ru\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2492"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gerdlezhev.ru\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2492"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}