Контекст
К нам обратилась казахстанская компания, которая занимается поставкой продуктов питания в школы и детские сады. Бизнес у них предсказуемый и завязан на государственных закупках, поэтому почти каждый рабочий день они подают заявки на портале goszakup.gov.kz. Объёмы серьёзные, маржа в этом сегменте небольшая, и каждый выигранный лот действительно важен. А каждый проигранный, особенно проигранный не по цене или качеству, а по скорости подачи, больно бьет по карману.
На goszakup.gov.kz действует принцип очерёдности. Кто первым успел корректно подать заявку до момента закрытия лота, тот и попадает в участники. Кто первый встал, того и тапки, проще говоря. Если конкурент управился быстрее на пару минут, ваша заявка может вообще не дойти до рассмотрения.
Как выглядела боль до бота
Представьте картину. Сотрудник компании садится за компьютер к восьми утра, потому что лоты обычно открываются в девять, и лучше быть в боевой готовности заранее. Рядом стоит второй компьютер и второй сотрудник, потому что лотов бывает много и один человек физически не успевает пройти весь цикл подачи на каждый из них.
Девять часов утра наступает, лоты не открываются. Сотрудники нервничают и обновляют страницу каждые несколько секунд, потому что любая задержка может стоить им контракта. В 9:07 лоты наконец открываются, и начинается самое интересное. Нужно выбрать лот, перейти по всем шагам формы, загрузить документы, подписать каждый из них через NCALayer, причём для каждого документа отдельно ввести пароль сертификата ЭЦП, а потом опубликовать заявку. Для одной заявки опытный сотрудник справлялся примерно за пять минут быстрой работы. Все это с учетом того, что сотрудник не ошибется и будет летать мышкой по экрану с реально большой скоростью и использовать все горячие клавиши
Однажды выясняется, что кто-то на соседнем месте подаёт заявки подозрительно быстро, причём подаёт их не по одной, а оптом и за время, за которое вы только успеваете завершить одну. С этим пониманием заказчик и пришёл к нам.
Цитата заказчика после запуска бота
Пожалуй, эта реплика лучше всего описывает реальность рынка, на котором работает заказчик.
Лоты должны были открыться в 9:00, а открылись где-то в 9:05. Тут 12 лотов. Я их отработал к 9:08:54. При этом я ни одного поля не вводил вручную, даже пароль вставлял. Всё делал максимально быстро. И тут эти 12 кантора отрабатывает за 57 секунд.
Двенадцать лотов за пятьдесят семь секунд против двенадцати лотов за четыре минуты энергичной ручной работы без единой остановки. Разница примерно в четыре раза. И в условиях очерёдности эта разница означает, что «эта кантора» забирает все двенадцать лотов, а остальные участникам не достается ничего.
Почему клиент не выбрал готовое решение
На казахстанском рынке есть сервисы, которые работают вокруг госзакупа. Они хорошо помогают находить подходящие лоты. Сервисы следят за открытыми данными портала, фильтруют тендеры по ключевым словам и присылают уведомления. Это полезно на этапе поиска, но в момент, когда лот открывается и надо подать заявку, абсолютно бесполезно.
Сервиса, который брал бы на себя именно эту часть, в Казахстане мы не нашли. Поэтому решение пришлось собирать с нуля, под конкретную задачу и под конкретный процесс goszakup.gov.kz.
Что мы сделали
Наша команда собрала десктопное приложение, которое работает под Windows и macOS и берёт на себя весь цикл ручных действий, которые раньше выполняла команда заказчика во время подачи заявки. Приложение запущено на компьютере пользователя, использует те же самые данные авторизации и тот же сертификат ЭЦП, которыми пользуется живой сотрудник, и выполняет ровно те же действия, что и человек, если бы он работал без задержек. Разница только в скорости и в том, что человеку больше не нужно ничего делать руками после того, как он нажал кнопку «Добавить и запустить».
Интерфейс бота мы специально сделали максимально простым, потому что он рассчитан на работу в условиях утреннего стресса и сжатых сроков. Сотрудник открывает приложение, на вкладке «Заявки» вводит номер объявления и при необходимости перечень конкретных лотов, выбирает интервал проверки и нажимает кнопку. Дальше бот всё делает сам.
Скриншот интерфейса

На скриншоте видно основное окно приложения. Две заявки уже отработаны и помечены статусом «Готово». Для каждой виден подробный тайминг: логин, работа с NCALayer через модуль Kalkan, ожидание открытия лота, сборка заявки, подписание документов и публикация.
Обратите внимание на итоговые времена в правом нижнем углу каждой карточки. Первая заявка прошла весь цикл за двадцать пять секунд, вторая за тридцать. При этом большую часть времени бот не работал, а ждал, потому что поля «Ожидание 48464.17s» и «49144.29s» означают, что приложение было запущено накануне вечером и около тринадцати часов спокойно ждало утреннего открытия лотов. Сотруднику не нужно было ни вставать раньше, ни обновлять страницу вручную, ни волноваться из-за того, что он пропустит момент открытия заявки.
Этапы работы бота
В правой части каждой карточки на скриншоте видна цепочка из шести этапов, через которые бот проходит для каждой заявки. Мы намеренно показываем все этапы и тайминги по ним, чтобы сотрудник мог в любой момент понять, что именно происходит, и при необходимости развернуть подробные логи.
Логин. Бот авторизуется на портале под учётной записью заказчика. У сотрудника эта операция занимает несколько секунд, у бота она происходит мгновенно при первой заявке и потом переиспользует уже активную сессию для следующих, поэтому на второй и последующих заявках этот этап занимает миллисекунды.
Kalkan. Это шаг, на котором приложение устанавливает связь с NCALayer и подгружает сертификат ЭЦП. Главная боль ручного процесса заключается именно в этом модуле, потому что вручную пароль от сертификата приходится вводить буквально для каждого подписываемого документа. Бот делает это один раз и дальше работает с сертификатом самостоятельно.
Ожидание. На этом этапе приложение ждёт, пока лот реально откроется. На скриншоте видны значения порядка тринадцати часов, это бот сидел всю ночь и ждал утра. Реальный момент открытия может отличаться от объявленного на несколько минут или даже часов, и бот стартует именно по факту открытия, а не по времени, которое указано на сайте.
Заявка. Сборка тела заявки, заполнение всех необходимых полей формы, подготовка приложений. У сотрудника это занимало несколько минут перехода между экранами, у бота это примерно шесть-семь секунд.
Документы. Самое больное место ручного процесса. Если у заявки тридцать сопровождающих документов, человеку нужно тридцать раз подписать через NCALayer, и для каждого документа отдельно ввести пароль. Бот делает всё пакетом, без участия человека и без многократных промптов, и тратит на это около десяти-пятнадцати секунд.
Публикация. Финальная отправка собранной и подписанной заявки. Несколько секунд.
В сумме на двух заявках на скриншоте получились двадцать пять и тридцать секунд итогового времени, и в обоих случаях большую часть времени заняли именно документы.
Технологии
Если коротко, то приложение собрано на Electron и TypeScript. Это даёт одну кодовую базу под Windows и macOS, понятный интерфейс, который выгляди одинаково на разных операционных системах, и удобный режим обновлений. С NCALayer бот общается через стандартный WebSocket-протокол, который описан в открытой документации Национального удостоверяющего центра РК. Поведение интерфейса и логика подачи опираются на анализ того, как работает сам портал, и воспроизводят последовательность действий пользователя.
Юридически приложение работает в рамках законодательства о государственных закупках. Оно ничего не нарушает на стороне портала, потому что использует тот же сертификат ЭЦП, тот же кабинет пользователя и выполняет те же шаги, что и живой сотрудник заказчика. Разница только в скорости и в том, что часть рутинных действий снята с человека.
Что было сложного
Большую часть из чуть более месяца, который ушёл на проект, заняли не сборка интерфейса и не работа с Electron, а аккуратное воспроизведение поведения портала и стабильная работа с NCALayer.
Несколько примеров того, чем мы занимались эту половину времени. Лоты могут открываться не в назначенный момент, а на минуты позже, поэтому пришлось строить ожидание с такой логикой проверки, чтобы бот, с одной стороны, ловил момент открытия достаточно точно, а с другой, не превращал портал в источник лишней нагрузки. Сессия пользователя на портале живёт ограниченное время и может слетать, поэтому пришлось обрабатывать переавторизацию и не терять очередь заявок. Подписание документов через Kalkan и NCALayer может разрываться по тысяче причин, начиная от того, что пользователь случайно закрыл иконку в трее, и заканчивая обновлением самого NCALayer, поэтому в боте появилась подробная диагностика этапов с раскрываемыми логами по каждой заявке.
В итоге примерно две трети проекта это работа над теми сценариями, в которых что-то может пойти не так.
Результат
Картина после внедрения бота получилась следующей. Сотрудники заказчика больше не сидят с раннего утра в готовности и не дежурят сменами у компьютера, потому что бота можно запустить вечером и спокойно идти заниматься своими делами. Подача одной заявки, на которую раньше уходило около пяти минут энергичной ручной работы, теперь занимает порядка тридцати секунд от момента реального открытия лота до момента, когда заявка опубликована.
Из неочевидных, но важных эффектов. Исчезла ситуация, когда заявка не публикуется из-за того, что человек устал и где-то ошибся в форме или забыл подписать один документ из тридцати. Бот выполняет одни и те же действия одинаково, и количество ошибок при подаче упало практически до нуля. Снялся вопрос «а кто сегодня дежурит на госзакупе, если основной сотрудник заболел или уехал». Бот, к счастью, не болеет и не уезжает.
И главное, заказчик теперь оказывается в очередности подачи на тех же позициях, на которых раньше были его быстрые конкуренты.
Кому ещё актуально похожее решение
Если ваша компания регулярно подаёт заявки на goszakup.gov.kz и при этом конкуренция в ваших нишах идёт по скорости подачи, то такое же приложение, скорее всего, имеет смысл и для вас. Особенно если у вас одновременно открываются по несколько лотов в один и тот же момент, а у каждой заявки сопровождающих документов десятки штук, и сотрудник физически не успевает их все подписать руками.
Та же логика применима не только к госзакупу. Любой процесс, в котором сотрудник изо дня в день повторяет одну и ту же последовательность действий в браузере, подписывает одни и те же документы и проигрывает время из-за того, что что-то нужно делать вручную, можно свести к подобному десктопному или серверному решению.
Итог
Этот проект для нас интересен прежде всего тем, что он наглядно показывает разницу между «сделать сайт» и «сделать продукт». В нём почти нет видимой части, на которую можно показать пальцем и сказать «вот за что вы заплатили». Зато есть месяц работы над сценариями, в которых что-то может пойти не так, и в результате есть приложение, которое стабильно выполняет ту работу, которую раньше делал человек, и делает её в десятки раз быстрее.
Если у вас есть процесс, который выглядит рутинным, требует много ручных шагов и при этом критичен для бизнеса, напишите нам. Разберёмся с задачей вместе и предложим понятное решение.
Связанные материалы
- Разработка веб-сервисов — если задача шире, чем десктопное приложение
- Разработка сайтов под ключ — для бизнеса, у которого помимо автоматизации нужен полноценный сайт
- Подключение и настройка CRM-системы — если хочется автоматизировать ещё и работу с клиентами






