До и после — на реальной структуре
До: как смета приходит
Лист Excel как есть: преамбула, шапка в две строки с объединениями, разделы на всю ширину, промежуточные итоги, цена «1 095,50» текстом, подпункт со сдвигом колонок.
| A | B | C | D | E | F | G | H | |
|---|---|---|---|---|---|---|---|---|
| 1 | ЛОКАЛЬНАЯ СМЕТА № 02-01 | |||||||
| 2 | на ремонт офисного помещения, 120 м2 | |||||||
| 3 | Основание: | дефектная ведомость от 12.09.2026 | ||||||
| 4 | Сметная стоимость: | 347,9 тыс. руб. | ||||||
| 5 | ||||||||
| 6 | № п/п | Обоснование | Наименование работ и затрат | Ед. изм. | Кол-во | Стоимость, руб. | Примечание | |
| 7 | на единицу | всего | ||||||
| 8 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | Раздел 1. Демонтажные работы | |||||||
| 10 | 1 | ФЕРр57-2-1 | Разборка покрытий полов из линолеума | м2 | 120 | 42,50 | 5 100 | |
| 11 | 2 | ФЕРр63-5-1 | Демонтаж перегородок из ГКЛ | м2 | 36 | 118 | 4 248 | |
| 12 | 3 | ФЕРр53-21-1 | Снятие обоев со стен | м2 | 210 | 21,40 | 4 494 | |
| 13 | Итого по разделу 1 | 13 842 | ||||||
| 14 | ||||||||
| 15 | Раздел 2. Отделочные работы | |||||||
| 16 | 4 | ФЕР15-04-005-03 | Окраска стен водоэмульсионными составами | м2 | 210 | 96,20 | 20 202 | |
| 17 | 5 | ФЕР11-01-036-02 | Устройство покрытий из ламината | м2 | 120 | 486 | 58 320 | |
| 18 | 6 | ФЕР15-01-047-15 | Устройство подвесного потолка | м2 | 120 | 1 095,50 | 131 460,00 | |
| 19 | 6.1 | в т.ч. каркас потолка с комплектующими | м2 | 120 | 38 400 | |||
| 20 | Итого по разделу 2 | 209 982 | ||||||
| 21 | ||||||||
| 22 | Итого прямые затраты | 223 824 | ||||||
| 23 | Накладные расходы 15% | 33 573,60 | ||||||
| 24 | НДС 22% | 56 627,47 | ||||||
| 25 | ВСЕГО по смете | 314 025,07 | ||||||
После: что уходит в базу
Каждая позиция привязана к разделу, числа стали числами, итоги отсеяны. Знак ✚ — строка была кривой, парсер её починил и назвал правку.
| раздел | № | шифр | наименование | ед. | кол-во | цена | сумма |
|---|---|---|---|---|---|---|---|
| Р1. Демонтажные работы | 1 | ФЕРр57-2-1 | Разборка покрытий полов из линолеума | м2 | 120 | 42,50 | 5 100 |
| Р1. Демонтажные работы | 2 | ФЕРр63-5-1 | Демонтаж перегородок из ГКЛ | м2 | 36 | 118 | 4 248 |
| Р1. Демонтажные работы | 3 | ФЕРр53-21-1 | Снятие обоев со стен | м2 | 210 | 21,40 | 4 494 |
| Р2. Отделочные работы | 4 | ФЕР15-04-005-03 | Окраска стен водоэмульсионными составами | м2 | 210 | 96,20 | 20 202 |
| Р2. Отделочные работы | 5 | ФЕР11-01-036-02 | Устройство покрытий из ламината | м2 | 120 | 486 | 58 320 |
| Р2. Отделочные работы | 6 | ФЕР15-01-047-15 | Устройство подвесного потолка | м2 | 120 | 1 095,50 | 131 460 |
| Р2. Отделочные работы | 6.1 | в т.ч. каркас потолка с комплектующими ✚ | 120 | 120 |
Отчёт разбора — без молчаливых потерь
| Шапка | найдена в строке 7, занимает строк: 2, уверенность 100% |
|---|---|
| Колонки | № п/п → колонка 1, шифр/обоснование → колонка 2, наименование → колонка 3, ед. изм. → колонка 4, количество → колонка 5, цена за ед. → колонка 6, сумма → колонка 7 |
| Разделы | Раздел 1. Демонтажные работы; Раздел 2. Отделочные работы |
| Промежуточные итоги | 6 строк («Итого по разделу 1», «Итого по разделу 2», «Итого прямые затраты»…) — в базу не попали, отложены для сверки |
| Арифметика | количество × цена = сумма: сошлось 6, не сошлось 0, неприменимо 1 |
| Починено | строка 19 — строка со сдвигом колонок — наименование взято из соседней ячейки |
| Не распознано | ничего: каждая строка либо в базе, либо названа |
Проверено на настоящих сметах
Локальная смета на ремонт (ФЕР/ФЕРр), .xls
Настоящая смета из открытого источника: 194 строки, шапка на 22-й строке, разделы, «Итоги по разделу» с разбивкой по ФОТ и индексами. Формат 2002 года — старый .xls.
Смета доходов и расходов ТСЖ, .xls
Совсем другая структура: статьи 1.1–3.1.8, суммы в год и в месяц, подпункты вписаны со сдвигом на колонку — парсер чинит сдвиг и называет правку.
Синтетическая смета со всеми граблями
Файл выше: шапка в две строки, разделы объединённой ячейкой, пустые строки, числа текстом, сдвиг колонок, НДС и накладные. Правильные ответы известны заранее — на них парсер и проверяется.
Что под капотом
Шапку ищет сам — хоть на 22-й строке
Строки листа прочёсываются на синонимы: «Кол.», «Кол-во», «Объём» — это количество; «Стоимость, руб. → всего» — это сумма. Шапка в 2–3 строки с объединениями склеивается, строка нумерации «1 2 3…» распознаётся. Нет шапки — колонки угадываются по содержимому, и отчёт честно ставит уверенность 0.
Итог — не позиция
«Итого по разделу», «ВСЕГО», «в том числе», НДС, накладные, ФОТ в базу не попадают — иначе смета задвоится. Они собираются отдельно и сверяются с суммой позиций, а по каждой строке проверяется: количество × цена = сумма.
Кривые строки чинятся, и правка называется
Подпункт, вписанный на колонку правее; сумма не в своей колонке; «1 234,56» текстом — всё это разбирается. Но ни одна правка не делается молча: в отчёте написано, в какой строке и что именно пришлось чинить.
Файлы никуда не уходят
Парсер — обычный Python-скрипт без сети: openpyxl и xlrd, работает на вашей машине или на вашем сервере. На этой странице — заранее посчитанный прогон, ваши сметы сюда загрузить нельзя, и это сделано нарочно.
Деталь, которая решает всё
Отчёт «что не распозналось» важнее самой таблицы
Любой конвертер красиво работает на смете, под которую его писали. Вопрос в другом: что он делает с чужой? Обычный ответ — молча пропускает строки, и через месяц в базе не хватает трети позиций, а виноватых нет.
Здесь каждая строка исходника кончается в одном из четырёх мест: позиция в базе, раздел, промежуточный итог или список «не распознано» с причиной. Сколько строк вошло и сколько выпало — видно сразу, до загрузки в вашу систему.
Пришлите свою смету
Пришлите одну–две сметы, как они приходят вам (можно вычистить названия и цены) — вернём чистую таблицу и отчёт разбора по каждой строке. На этом же ядре собирается микросервис с API: файл на входе — JSON на выходе, под вашу учётную систему или SaaS.
Разовая нормализация пачки файлов — от 5 000 ₽, микросервис под ключ — 1–2 дня, от 15 000 ₽.
Прислать смету