решение из ленты заказов

Excel-сметы — в единую базу

Каждый подрядчик присылает смету по-своему: шапка на двадцать второй строке, объединённые ячейки, «Итого по разделу» вперемешку с позициями, числа записаны текстом с пробелами. Руками такое сводят днями. Парсер сам находит колонки, отделяет позиции от итогов, сверяет арифметику — и отдаёт чистую таблицу CSV/JSON с отчётом, что распознано, а что нет.

До и после — на реальной структуре

До: как смета приходит

Лист Excel как есть: преамбула, шапка в две строки с объединениями, разделы на всю ширину, промежуточные итоги, цена «1 095,50» текстом, подпункт со сдвигом колонок.

ABCDEFGH
1ЛОКАЛЬНАЯ СМЕТА № 02-01
2на ремонт офисного помещения, 120 м2
3Основание:дефектная ведомость от 12.09.2026
4Сметная стоимость:347,9 тыс. руб.
5
6№ п/пОбоснованиеНаименование работ и затратЕд. изм.Кол-воСтоимость, руб.Примечание
7на единицувсего
812345678
9Раздел 1. Демонтажные работы
101ФЕРр57-2-1Разборка покрытий полов из линолеумам212042,505 100
112ФЕРр63-5-1Демонтаж перегородок из ГКЛм2361184 248
123ФЕРр53-21-1Снятие обоев со стенм221021,404 494
13Итого по разделу 113 842
14
15Раздел 2. Отделочные работы
164ФЕР15-04-005-03Окраска стен водоэмульсионными составамим221096,2020 202
175ФЕР11-01-036-02Устройство покрытий из ламинатам212048658 320
186ФЕР15-01-047-15Устройство подвесного потолкам21201 095,50131 460,00
196.1в т.ч. каркас потолка с комплектующимим212038 400
20Итого по разделу 2209 982
21
22Итого прямые затраты223 824
23Накладные расходы 15%33 573,60
24НДС 22%56 627,47
25ВСЕГО по смете314 025,07
↓  один прогон парсера  ↓

После: что уходит в базу

Каждая позиция привязана к разделу, числа стали числами, итоги отсеяны. Знак ✚ — строка была кривой, парсер её починил и назвал правку.

7позиций в базе
2раздела
6итогов отсеяно
6/6арифметика сошлась
1строка починена
0потеряно молча
раздел№шифрнаименованиеед.кол-воценасумма
Р1. Демонтажные работы1ФЕРр57-2-1Разборка покрытий полов из линолеумам212042,505 100
Р1. Демонтажные работы2ФЕРр63-5-1Демонтаж перегородок из ГКЛм2361184 248
Р1. Демонтажные работы3ФЕРр53-21-1Снятие обоев со стенм221021,404 494
Р2. Отделочные работы4ФЕР15-04-005-03Окраска стен водоэмульсионными составамим221096,2020 202
Р2. Отделочные работы5ФЕР11-01-036-02Устройство покрытий из ламинатам212048658 320
Р2. Отделочные работы6ФЕР15-01-047-15Устройство подвесного потолкам21201 095,50131 460
Р2. Отделочные работы6.1в т.ч. каркас потолка с комплектующими ✚120120

Отчёт разбора — без молчаливых потерь

Шапканайдена в строке 7, занимает строк: 2, уверенность 100%
Колонки№ п/п → колонка 1, шифр/обоснование → колонка 2, наименование → колонка 3, ед. изм. → колонка 4, количество → колонка 5, цена за ед. → колонка 6, сумма → колонка 7
РазделыРаздел 1. Демонтажные работы; Раздел 2. Отделочные работы
Промежуточные итоги6 строк («Итого по разделу 1», «Итого по разделу 2», «Итого прямые затраты»…) — в базу не попали, отложены для сверки
Арифметикаколичество × цена = сумма: сошлось 6, не сошлось 0, неприменимо 1
Починенострока 19 — строка со сдвигом колонок — наименование взято из соседней ячейки
Не распознаноничего: каждая строка либо в базе, либо названа

Проверено на настоящих сметах

📄

Локальная смета на ремонт (ФЕР/ФЕРр), .xls

Настоящая смета из открытого источника: 194 строки, шапка на 22-й строке, разделы, «Итоги по разделу» с разбивкой по ФОТ и индексами. Формат 2002 года — старый .xls.

71 позиций17 разделов 83 итогов отсеяно38 строк арифметика сошлась 33 строк починено
📄

Смета доходов и расходов ТСЖ, .xls

Совсем другая структура: статьи 1.1–3.1.8, суммы в год и в месяц, подпункты вписаны со сдвигом на колонку — парсер чинит сдвиг и называет правку.

59 позиций2 разделов 5 итогов отсеяно0 строк арифметика сошлась 14 строк починено
🧪

Синтетическая смета со всеми граблями

Файл выше: шапка в две строки, разделы объединённой ячейкой, пустые строки, числа текстом, сдвиг колонок, НДС и накладные. Правильные ответы известны заранее — на них парсер и проверяется.

20 тестовXLS + XLSXCSV + JSON на выходе

Что под капотом

🔎

Шапку ищет сам — хоть на 22-й строке

Строки листа прочёсываются на синонимы: «Кол.», «Кол-во», «Объём» — это количество; «Стоимость, руб. → всего» — это сумма. Шапка в 2–3 строки с объединениями склеивается, строка нумерации «1 2 3…» распознаётся. Нет шапки — колонки угадываются по содержимому, и отчёт честно ставит уверенность 0.

🧮

Итог — не позиция

«Итого по разделу», «ВСЕГО», «в том числе», НДС, накладные, ФОТ в базу не попадают — иначе смета задвоится. Они собираются отдельно и сверяются с суммой позиций, а по каждой строке проверяется: количество × цена = сумма.

🛠️

Кривые строки чинятся, и правка называется

Подпункт, вписанный на колонку правее; сумма не в своей колонке; «1 234,56» текстом — всё это разбирается. Но ни одна правка не делается молча: в отчёте написано, в какой строке и что именно пришлось чинить.

🔒

Файлы никуда не уходят

Парсер — обычный Python-скрипт без сети: openpyxl и xlrd, работает на вашей машине или на вашем сервере. На этой странице — заранее посчитанный прогон, ваши сметы сюда загрузить нельзя, и это сделано нарочно.

Деталь, которая решает всё

Отчёт «что не распозналось» важнее самой таблицы

Любой конвертер красиво работает на смете, под которую его писали. Вопрос в другом: что он делает с чужой? Обычный ответ — молча пропускает строки, и через месяц в базе не хватает трети позиций, а виноватых нет.

Здесь каждая строка исходника кончается в одном из четырёх мест: позиция в базе, раздел, промежуточный итог или список «не распознано» с причиной. Сколько строк вошло и сколько выпало — видно сразу, до загрузки в вашу систему.

Пришлите свою смету

Пришлите одну–две сметы, как они приходят вам (можно вычистить названия и цены) — вернём чистую таблицу и отчёт разбора по каждой строке. На этом же ядре собирается микросервис с API: файл на входе — JSON на выходе, под вашу учётную систему или SaaS.

Разовая нормализация пачки файлов — от 5 000 ₽, микросервис под ключ — 1–2 дня, от 15 000 ₽.

Прислать смету