Новый портал госзакупок РК: 29,58 млн лотов и три способа их не найти
Представьте, что вы пришли в архив и попросили дела по одному ведомству. Сотрудник кивнул, ушёл и вынес вам всё хранилище целиком — двадцать девять миллионов папок. Не сказав, что вашу просьбу не понял.
Примерно так устроен ответ публичного программного интерфейса Единой платформы закупок, если в названии фильтра ошибиться на одну букву. Система не сообщает об ошибке. Она отдаёт полную базу — с видом успешно выполненного запроса.
Polites News проверил открытые интерфейсы платформы 31 августа 2026 года. Проверка была внешней: только обычные запросы на чтение, никаких попыток обойти защиту или заглянуть в закрытые разделы. Всё описанное ниже читатель может повторить сам — ссылки в тексте ведут на живые адреса.
Опыт, который занимает минуту
Откройте две ссылки подряд. Первая — запрос с фильтром status_id. Вторая — такой же запрос с фильтром status, без окончания «_id».
В самом начале ответа есть поле count — число подходящих записей. На момент проверки первая ссылка показывала около 78 тысяч лотов. Вторая — 29 580 410. То есть всю базу целиком.
Разница между запросами — три символа. Разница между ответами — в триста семьдесят раз. И ничто в ответе не подсказывает, что во втором случае фильтр не сработал.
Редакция проверила шесть таких параметров: status, search, date_from, year, id__gt и заведомо бессмысленный набор букв sdfsdfsdf. Все шесть система приняла молча, вернув полную выборку. Проверка повторена дважды с тем же результатом.
Фильтрация на платформе работает — но под именами, которые нужно угадать. Поиск ведётся параметром q, а привычное для большинства интерфейсов слово search игнорируется. Статус задаётся через status_id, а не через status. Машиночитаемого описания интерфейса, из которого эти имена можно было бы узнать, платформа по стандартным адресам не публикует.
Почему тихая ошибка хуже громкой
Ошибка, которая себя показывает, останавливает работу. Ошибка, которая молчит, работу не останавливает — она незаметно портит результат.
Госзакупки в Казахстане — это данные, на которых строят исследования, депутатские запросы, журналистские расследования и обращения в контрольные органы. Человек, выгрузивший данные с опечаткой в фильтре, получит стройную таблицу и уверенно сделает выводы. Проверить себя ему не на чем: ответ выглядит абсолютно нормально.
Есть и второй поворот той же истории. Если в параметре размера страницы указать недопустимое значение — букву, ноль или отрицательное число — платформа меняет саму структуру ответа. Вместо объекта со счётчиком и навигацией приходит простой список. Программа, рассчитанная на первый формат, получит не сообщение об ошибке, а пустоту.
Что именно закупается — в типовом ответе не указано
Если обратиться к интерфейсу лотов вообще без параметров — как сделал бы любой, кто открывает его впервые, — наименование лота будет присутствовать примерно у 2–3 процентов записей. У остальных поля названия пусты и на русском, и на казахском. Замер повторён трижды.
То есть в типовой выдаче видны номер, сумма, статус, заказчик — но не видно, что, собственно, покупают.
По базе в целом картина неровная. В одних срезах название есть у всех записей, в других — ни у одной. Разброс, зафиксированный редакцией, идёт от 2,5 до 100 процентов.
Мы честно попытались объяснить этот разброс и трижды не смогли. Он не связан с датой: внутри одного августа 2026 года есть участки со стопроцентной заполненностью и с нулевой. Он не связан со статусом лота: внутри статуса «Закупка состоялась» один срез даёт 100 процентов, другой — 3,5. Он не связан и с площадкой-источником: разбивка по трём системам устойчивой картины не даёт.
Поэтому редакция не утверждает, что названий нет у 97 процентов всех 29,58 миллиона лотов. Оценить долю по всей базе снаружи невозможно — по причине, о которой ниже. Установлено ровно то, что измерено: типовой ответ интерфейса состоит преимущественно из записей без предмета закупки. Причину может назвать только оператор, у которого есть доступ к внутренним процессам.
Двадцать тысяч из двадцати девяти миллионов
Платформа не даёт выгрузить всё. Действует жёсткое правило: сумма смещения и размера страницы не может превышать десять тысяч. Редакция проверила это на пяти парах значений — при сумме ровно 10 000 запрос проходит, при 10 001 отклоняется, как бы эта сумма ни была набрана.
Механизма последовательного обхода всей базы интерфейс не предлагает. На практике это значит: десять тысяч записей с начала списка и столько же с конца. Около 0,07 процента массива.
Всё остальное в базе есть. Но чтобы до него добраться, нужно дробить выборку фильтрами — теми самыми, чьи правильные имена нигде не описаны, а неправильные система принимает молча.
Обратная крайность тоже присутствует: один запрос с максимально допустимым размером страницы возвращает около 17 мегабайт данных без сжатия. Глубина выгрузки ограничена жёстко, объём одного ответа — практически нет.
Мелочи, которые складываются в картину
Дальше начинается то, что по отдельности выглядит пустяком.
В коде платформы есть адрес справочника статусов лота, в котором служебная часть пути случайно повторена дважды. Этот адрес не работает — сервер отвечает «не найдено». Соседний, набранный правильно, отвечает нормально. Опечатка дожила до рабочей версии.
Если запросить у интерфейса несуществующий адрес, он вернёт сообщение об ошибке в виде веб-страницы на английском языке — при том что платформа отдаёт содержимое на русском, а штатные ошибки приходят в машинном формате. Программа, ожидающая машинный ответ, споткнётся.
Ссылка на следующую страницу, которую интерфейс сам вкладывает в ответ, выдаётся с протоколом http — незащищённым, — хотя сайт переводит всех на защищённый https. То же в интерфейсе позиций плана. Для браузера это незаметно. Но тот, кто выгружает данные постранично и добросовестно идёт по этим ссылкам, каждый следующий запрос отправляет открытым каналом.
Файла robots.txt, которым сайты объясняют поисковикам правила обхода, на платформе фактически нет — по этому адресу отдаётся обычная страница приложения. Карты сайта тоже нет. Более того, платформа отвечает «всё в порядке» на любой выдуманный адрес: наберите после доменного имени произвольный набор букв, и вместо честного «страница не найдена» откроется оболочка сайта.
Пустая страница весом в пять мегабайт
Главная страница платформы в том виде, в каком её отдаёт сервер, не содержит ни одного слова о закупках. Весь текст появляется позже, когда браузер скачает и запустит программу.
Скачать он должен немало: около 5,1 мегабайта кода, примерно 1,43 мегабайта в сжатом виде, двенадцатью файлами. Самый крупный весит 3,73 мегабайта и называется «тема оформления» — хотя внутри лежит вовсе не оформление, а библиотека построения интерфейсов, библиотека графиков и полный набор переводов на три языка сразу. Разделения на части, которые подгружались бы по мере надобности, нет: всё скачивается на первом экране.
Пока это не загрузится, человек смотрит на пустоту. На быстром городском интернете разница невелика. На слабом мобильном — заметна, и заметна именно там, где государственный сервис нужнее всего.
Если в браузере отключён JavaScript или он не отработал, страница останется пустой совсем: предупреждения на такой случай не предусмотрено. Не предусмотрено и описания страницы для поисковых систем и мессенджеров — ни краткого описания, ни заголовка для предпросмотра ссылки. Поделитесь ссылкой на закупку в чате — собеседник увидит голый адрес.
Отдельная деталь: шрифты интерфейса государственной платформы загружаются с внешнего домена rsms.me, не находящегося под управлением казахстанских государственных органов. Собственных копий шрифтов на платформе не обнаружено. Как эта схема соотносится с требованиями к государственным информационным системам — вопрос, который редакция адресует оператору.
Казахский язык, которого не видит браузер
Интерфейс платформы переключается между русским, казахским и английским. Но в служебном заголовке страницы язык жёстко записан как русский и при переключении не меняется.
Для человека разницы нет. Для программ есть. Программы экранного доступа, которыми пользуются незрячие, ориентируются именно на этот заголовок: получив казахский текст с пометкой «это по-русски», синтезатор речи прочитает его с русской артикуляцией. Поисковые системы полагаются на ту же пометку.
Там же прописан запрет на машинный перевод — для всего документа целиком. Для номеров и кодов такой запрет оправдан. Для содержимого он означает, что пользователь, не владеющий ни одним из трёх языков, останется без встроенного перевода.
Следы спешки
Код, который платформа отдаёт браузеру, открыт для чтения — это обычное свойство любого сайта. В нём заметны признаки того, что выпуск готовился без части стандартных проверок.
В рабочую версию попал адрес тестового контура платформы: он записан в коде и в определённых условиях используется как адрес по умолчанию. Обычно окружения разделяют на этапе сборки, чтобы рабочая версия ничего не знала о тестовой.
В одном и том же условии соседствуют два разных способа сравнения — строгий и нестрогий. На поведение здесь это не влияет, но такую запись автоматически отсекает любой стандартный анализатор кода.
В служебной части главной страницы остались закомментированные строки, одна из которых ссылается на файл в папке исходников — папке, которой в готовой версии не существует. Там же дважды объявлен один и тот же служебный файл.
Ни одна из этих деталей сама по себе на работу платформы не влияет. Вместе они говорят об одном: автоматических проверок, отлавливающих такие вещи до выпуска, в процессе не было. Это оценка редакции, основанная на перечисленных наблюдениях.
О безопасности — с оговорками
Страницы и файлы платформы отдаются без набора защитных служебных заголовков, применение которых считается общепринятой практикой. Любопытно, что ответы самого программного интерфейса часть таких заголовков содержат. То есть настройка выполнена на одном уровне системы и не выполнена на другом.
Здесь редакция считает нужным высказаться предельно определённо. Это наблюдение о настройке, а не сообщение об уязвимости. Никаких проверок на проникновение, попыток обойти авторизацию или получить доступ к чужим данным не проводилось: такие действия выходят за рамки журналистской работы и требуют разрешения владельца системы. Признаков того, что кто-либо воспользовался описанными особенностями, у редакции нет. О каком-либо ущербе редакции не известно. Мы не утверждаем, что данные пользователей платформы находятся под угрозой.
Чего мы не проверяли
Разделы личного кабинета, требующие авторизации и электронной цифровой подписи, не исследовались — там идёт основная работа участников закупок, и она осталась за рамками проверки.
Параметры шифрования соединения не оценивались: использованный канал измерения не позволяет получить по этому пункту достоверные сведения, а публиковать непроверенное редакция не считает возможным.
Нагрузочное тестирование не проводилось. Скорость отклика измерялась не из казахстанской сети, поэтому выводов о ней в материале нет.
И главное: отсутствие в этом тексте сведений о каких-либо уязвимостях не означает вывода об их отсутствии. Редакция их не искала и данных на этот счёт не имеет. Всё изложенное описывает наблюдаемое поведение публичных интерфейсов и не является утверждением о нарушении кем-либо закона или должностных обязанностей.
О какой системе речь и кто за неё отвечает
Единая платформа закупок — цифровая система уполномоченного органа в сфере государственных закупок. Порядок её использования установлен Правилами использования единой платформы закупок, утверждёнными приказом Министра финансов РК от 16 сентября 2024 года № 627.
Платформа сводит в одну точку доступа сведения трёх закупочных площадок — АИИС «Электронные государственные закупки», портала электронных закупок АО «ФНБ «Самрук-Қазына» и Евразийского электронного портала ТОО «MITWORK». Об этом сообщает АО «Центр электронных финансов» (Digital Qarjy). Регистрация открыта с 10 июня 2024 года — сообщение Евразийского электронного портала.
Позиция оператора
Редакция направит запрос в АО «Центр электронных финансов» (Digital Qarjy) и Министерство финансов Республики Казахстан с просьбой прокомментировать перечисленные наблюдения. Позиция ведомства и оператора будет опубликована полностью сразу после поступления.
Если по итогам ответа какие-либо из приведённых сведений потребуют уточнения, материал будет дополнен или исправлен с указанием на внесённые изменения.
Единая платформа закупок создавалась как единая точка доступа к сведениям о закупках, в том числе для общественного мониторинга. Описанные особенности не мешают проводить закупки. Они мешают за ними следить — а это была одна из заявленных целей.
Все наблюдения относятся к состоянию платформы на 31 августа 2026 года и могли измениться после публикации.
Прикреплённые файлы
Другие новости