Как читать XLSX-спецификацию тендера со сложной шапкой
Как разобрать XLSX-спецификацию тендера с многоуровневой шапкой и объединёнными ячейками: где характеристики товара, а где требования заказчика.

ИИ-ассистент для тендеров под ваши задачи — обсудим на бесплатной консультации
XLSX-спецификация тендера с двухэтажной шапкой и объединёнными ячейками ломает любой парсер: непонятно, где характеристика товара, а где требование заказчика. Эта статья показывает, как разобрать таблицу характеристик так, чтобы машина читала её без ошибок, и как отделить параметры самого товара от условий, которые добавил заказчик сверх КТРУ.
Почему XLSX-спецификация тендера не парсится с первого раза
Заказчик собирает спецификацию в Excel вручную. Он объединяет ячейки, чтобы шапка выглядела аккуратно, дробит требование на две строки, вставляет пустые строки-разделители между лотами. Для человека таблица читается. Для парсера — нет.
Три типовые проблемы:
- Многоуровневая шапка спецификации. Верхний ряд — группа («Технические характеристики»), нижний — конкретные колонки («Параметр», «Значение», «Ед. изм.»). Парсер видит два ряда заголовков и не знает, какой из них настоящий.
- Объединённые ячейки ТЗ. Одна ячейка растянута на 4 строки — например, наименование товара для четырёх его параметров. В XML файла значение лежит только в левой верхней ячейке диапазона, остальные пустые.
- Смешение уровней. В одной таблице соседствуют параметры товара (диаметр, мощность, класс точности) и требования заказчика (срок поставки, гарантия, страна происхождения). Без разметки они выглядят одинаково.
Главная ошибка — парсить спецификацию как плоскую таблицу «строка-колонка». Сначала восстановите структуру шапки и развёрните объединённые ячейки, и только потом читайте значения.
Как устроена многоуровневая шапка спецификации
Шапка спецификации почти всегда сводится к двум-трём уровням. Понимание уровней решает половину задачи.
Типовая структура двухэтажной шапки:
| Уровень | Что содержит | Пример |
|---|---|---|
| Группа (верхний ряд) | Смысловой блок, объединяет несколько колонок | «Требуемые характеристики», «Условия поставки» |
| Колонка (нижний ряд) | Конкретное поле | «Наименование показателя», «Значение», «Ед. изм.» |
| Подколонка (редко) | Разбивка значения | «Min», «Max» |
Чтобы собрать плоский заголовок, склейте уровни сверху вниз через разделитель. Колонка «Значение» внутри группы «Требуемые характеристики» становится Требуемые характеристики / Значение. Так каждая колонка получает уникальное имя, и дальше с таблицей работают как с обычной.
Порядок разбора шапки:
- Найдите ряд, где начинаются данные (первая строка с конкретным товаром, а не с заголовком).
- Всё, что выше, — шапка. Обычно это 1–3 ряда.
- Для каждой колонки склейте значения всех рядов шапки сверху вниз, пропуская пустые.
- Получите единый список заголовков колонок — теперь он машиночитаемый.
Как развернуть объединённые ячейки ТЗ
Объединённые ячейки — вторая по частоте причина битого парсинга. В формате XLSX объединённый диапазон хранит значение только в одной ячейке (anchor), остальные физически пусты. Если читать «как есть», три строки из четырёх потеряют наименование товара.
Решение — forward-fill: протянуть значение anchor-ячейки на весь диапазон объединения.
- Считайте список объединённых диапазонов из структуры файла (в openpyxl это свойство
merged_cells.ranges). - Для каждого диапазона возьмите значение левой верхней ячейки.
- Запишите это значение во все ячейки диапазона.
- Снимите объединение — таблица станет прямоугольной, без «дыр».
После forward-fill каждая строка самодостаточна: в ней есть и наименование товара, и его параметр, и значение. Такую таблицу уже можно фильтровать, группировать и сверять.
Forward-fill работает только по факту объединения ячеек. Не «дотягивайте» значение в пустые ячейки, которые заказчик оставил пустыми намеренно, — так вы припишете товару чужую характеристику.
Где характеристика товара, а где требование заказчика
Это ключевой вопрос для поставщика с большой номенклатурой. От ответа зависит, по каким полям сверять предложение, а какие выполнять как условия контракта.
Характеристика товара описывает сам предмет: что именно поставляется. Её значение проверяют по КТРУ и техническим стандартам. Требование заказчика описывает условия сделки вокруг товара.
Как разделить на практике:
- Параметр товара — физическая или функциональная величина: размер, мощность, материал, класс точности, объём. По таким полям идёт сопоставление вашего артикула с позицией лота.
- Требование заказчика — срок поставки, гарантийный срок, страна происхождения, упаковка, наличие сертификата. Их не «подбирают» под товар, их принимают или отклоняют.
- Признаки в тексте. Параметры товара часто берутся из КТРУ и снабжены единицей измерения. Дополнительные характеристики, которые заказчик добавил сверх каталога, по правилам ведения КТРУ (Постановление Правительства РФ № 145) требуют обоснования — иногда оно прямо указано в соседней колонке или примечании.
По части 1 статьи 33 Закона № 44-ФЗ заказчик описывает объект закупки через характеристики, а по части 2 — указывает максимальные и (или) минимальные значения показателей и значения, которые не меняются. Это и есть формальный маркер: колонка с «min/max» или «неизменяемое значение» относится к параметрам товара, по которым вас будут оценивать.
Подробнее о разборе требований мы писали в материале Как читать техническое задание тендера и о привязке к каталогу — в Что такое КТРУ и как с ним работать поставщику.
Чек-лист: разобрать таблицу характеристик без ошибок
Перед тем как загружать спецификацию в учётную систему или сверять с прайсом, пройдите по списку:
- Определили строку начала данных и отделили шапку от тела таблицы.
- Склеили многоуровневую шапку в плоские уникальные заголовки колонок.
- Развернули объединённые ячейки через forward-fill, не тронув намеренно пустые поля.
- Удалили строки-разделители и итоговые строки («Итого», «Всего по лоту»).
- Привязали каждую строку к коду позиции КТРУ или ОКПД-2, если он есть.
- Разметили колонки: где параметр товара, где требование заказчика.
- Выделили поля с min/max и неизменяемыми значениями — по ним пойдёт сверка.
Связка кода ОКПД-2 с позицией спецификации — отдельный навык. О нём — в статье ОКПД-2 в закупках: как не ошибиться с кодом.
Когда ручной разбор перестаёт работать
Один лот на 15 позиций разбирают руками за полчаса. Тендер на 400 позиций с двухэтажной шапкой и объединёнными ячейками — это рабочий день на одну спецификацию, и к вечеру растёт риск пропустить параметр.
На большой номенклатуре задачу закрывает автоматический парсер документации. Он восстанавливает структуру шапки, разворачивает объединённые ячейки, нормализует единицы измерения и приводит таблицу к машиночитаемому виду без ручной правки.
TenderScan разбирает XLSX-спецификацию из ЕИС и сверяет характеристики каждой позиции лота с вашим каталогом по КТРУ: показывает, что подходит, что отклонять, и где заказчик добавил требование сверх каталога. На потоке тендеров это снимает с тендерного отдела рутину парсинга и ускоряет решение «участвуем или нет».
Часто задаваемые вопросы
Чем характеристика товара отличается от требования заказчика в спецификации?
Характеристика описывает сам товар — размер, мощность, материал, класс точности. По ней сверяют ваш артикул с позицией лота. Требование заказчика описывает условия сделки: срок поставки, гарантию, страну происхождения, упаковку. Его принимают или отклоняют, под товар не подбирают.
Как развернуть объединённые ячейки в спецификации XLSX?
Используйте forward-fill: возьмите значение левой верхней ячейки объединённого диапазона и протяните его на весь диапазон, затем снимите объединение. В openpyxl список диапазонов лежит в merged_cells.ranges. Важно не заполнять ячейки, которые заказчик оставил пустыми намеренно.
Что такое многоуровневая шапка и как её распарсить?
Это шапка из двух-трёх рядов: верхний — смысловая группа, нижний — конкретные колонки. Чтобы получить машиночитаемые заголовки, склейте значения рядов шапки сверху вниз через разделитель, пропуская пустые ячейки. Каждая колонка получит уникальное имя.
Можно ли менять значения параметров из спецификации в своей заявке?
По части 2 статьи 33 Закона № 44-ФЗ заказчик отдельно указывает максимальные, минимальные и неизменяемые значения. Неизменяемые значения менять нельзя — их предлагают как есть. Для диапазонных вы указываете конкретное число в пределах min/max. Поэтому при разборе таблицы важно сразу размечать тип каждого показателя.
Почему заказчик добавляет характеристики сверх КТРУ?
Каталог не всегда покрывает все нужные параметры. Заказчик вправе добавить характеристику сверх позиции КТРУ, но по правилам ведения каталога (Постановление Правительства РФ № 145) он обязан обосновать её необходимость. Если в спецификации есть колонка с обоснованием — это маркер дополнительной характеристики, и на неё стоит смотреть внимательнее.
ИИ-ассистент под ваши тендеры
Бесплатный аудит и консультация: разберём ваши тендерные процессы, найдём узкие места и что можно автоматизировать, а дальше — готовый ИИ-ассистент или разработка под вас. Без обязательств.