Сетка сегодня и первый уровень вложенности

Все пять документов открыты в браузере на экране «Проверить и исправить», на вкладке «После выравнивания», на всех восьми страницах. Записано, где сетка врёт, и добавлен первый уровень вложенности: внутри каждой найденной ячейки ищется своя мини-таблица, а её границы показываются на скане пунктиром другого цвета.

Повторная проверка на рабочей ссылке — 2 сентября

Документы прогнаны заново — не в черновике, а на рабочей ссылке приложения, через тот же экран, которым пользуется человек. Цифры ниже сняты именно там.

ДокументСтр.ЯчеекЛиний сетки Ячеек без обводкиЛиния режет чужую ячейку Сдвиг линии от границы ячейкиЯчеек со своей мини-таблицей
Пример 2 — перекошенный188 3400 нет3
Пример 2 — перекошенный244 1700 нет1
Пример 3148 2700 нет1
Пример 41118 5300 нет0
Пример 11–2 прогон не завершился — приложение перестало отвечать
Пример 51–2 прогон не завершился — приложение перестало отвечать

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

Что мешает закрыть проверку до конца

Приложение разбирает один документ пять–девять минут и держит очередь из одного места. Когда документы пошли одновременно, оно перестало отвечать и не поднялось само — поэтому «Пример 1» и «Пример 5», самые тяжёлые (по две страницы каждый), на рабочей ссылке пока не проверены. Это не про сетку: сетка на четырёх проверенных страницах ведёт себя правильно. Это про то, что приложению не хватает запаса, чтобы вытянуть проверку целиком.

Первый замер — до правок сетки

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

ДокументСтр.ЯчеекЛиний сетки Линия режет ячейку насквозьЯчеек задето Ячеек без обводкиСдвиг линии от границы ячейки
Пример 1129362 322400,02 точки экрана
Пример 1236140 0000,02
Пример 2 — перекошенный110344 0000,01
Пример 2 — перекошенный24417 0000,02
Пример 314827 0000,01
Пример 4111853 443100,02
Пример 5130851 0000,02
Пример 525435 0000,01

Три вывода. Сетка не съезжает: линия расходится с границей ячейки не больше чем на 0,02 точки экрана — это её толщина, глазом не видно. Линии не разваливаются: ячеек, у которых не обведён хотя бы один край, нет ни на одной странице. Главная беда — лишние линии: граница столбца рисуется во всю высоту таблицы, поэтому там, где рядом стоят таблицы разной разбивки, линия проходит сквозь чужую ячейку. На первой странице «Примера 1» так задето 24 ячейки, на «Примере 4» — 31. На остальных шести страницах такого нет.

Первый уровень вложенности — что теперь видно

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

ДокументСтр.Ячеек со своей мини-таблицейЛиний внутри них
Пример 11 и 200
Пример 2 — перекошенный133
Пример 2 — перекошенный212
Пример 3112
Пример 4100
Пример 51 и 200

Все линии второго уровня лежат внутри своей ячейки и внутри листа — проверено в браузере, а не по коду. Правило строгое: линия рисуется только там, где на скане действительно есть сплошная линейка с чистой бумагой рядом. Сквозь строку текста линия не проводится, даже если буквы закрашивают ячейку от края до края: лучше не показать спорную линию, чем нарисовать её там, где на бланке ничего нет. Поэтому в «Примерах 1, 4, 5» вложенности пока не нашлось — это следующий шаг работы, а не отсутствие результата.

Вложенность теперь без предела в один уровень

Раньше внутрь ячейки заглядывали ровно один раз. Теперь правило работает по кругу: нашли внутри ячейки линейки — режем ячейку по ним и в каждом получившемся куске ищем тем же способом заново. И так пока линии находятся. Второй, третий, четвёртый уровень разбираются одинаково — отдельного правила «на второй уровень» больше нет.

Чтобы поиск не ушёл в бесконечность, стоят четыре ограничителя: кусок, который уже разбирали, второй раз не берётся (это же защита от «ячейки внутри самой себя»); кусок обязан быть меньше того, из которого вырезан; глубже восьми уровней не спускаемся; на одну ячейку таблицы приходится не больше четырёхсот кусков.

На экране проверки уровень видно по цвету: разбивка внутри ячейки — зелёная, следующий уровень — оранжевый, дальше — фиолетовый. В подписи над картинкой, когда уровней больше одного, пишется, до какой глубины дошла вложенность.

ДокументСтр.Областей с разбивкойСамый глубокий уровень
Пример 11 и 20—
Пример 2 — перекошенный131
Пример 2 — перекошенный211
Пример 3111
Пример 410—
Пример 51 и 20—

Честно про глубину: в пяти документах заказчика глубже первого уровня линий нет — там, где разбивка внутри ячейки нашлась, внутри её кусков собственных линеек уже не нарисовано. Поэтому на снимках ниже видно ровно один уровень, и это не сбой поиска, а то, что есть на бланках. Что многоуровневый разбор работает, проверено двумя способами: на нарисованном листе с тремя уровнями разбора находятся все три, каждый следующий лежит внутри предыдущего; и на настоящей странице «Примера 2», где в одну ячейку дорисовали три линейки одна внутри другой, — разбор нашёл три уровня подряд. Оба листа для проверки в набор примеров не входят.

Как это выглядит

«Пример 2», перекошенный скан: обычная сетка и вложенные линии внутри ячеек.
Экран проверки: сетка и вложенные линии на перекошенном скане
«Пример 3»: две ячейки со своей разбивкой внутри.
Экран проверки: вложенные линии на примере 3
«Пример 4»: здесь видно, как граница столбца тянется через чужие ячейки — это и есть то, что предстоит чинить.
Экран проверки: лишние линии на примере 4
После доработки, «Пример 2» на вкладке «После выравнивания»: три вложенные ячейки, линии внутри своих рамок.
Экран проверки после доработки: вложенные ячейки на примере 2
После доработки, «Пример 3»: разбивка внутри ячейки на месте, лишнего не появилось.
Экран проверки после доработки: вложенная ячейка на примере 3

Живая проверка 2 сентября 2026 года

Все замеры ниже сняты на рабочей ссылке приложения, в браузере: пример открыт, нажата кнопка разбора, включена вкладка «После выравнивания», линии сетки сверены с границами ячеек.

ДокументСтр.ЯчеекЛиний сетки Линий внутри ячеекЯчеек задето лишней линией Ячеек без обводкиСдвиг линии
Пример 314829 2000,01 точки экрана
Пример 4111853 03100,02 точки экрана

Что видно глазами. Пример 3: сетка ложится по границам ячеек, лишних линий нет, ни одна ячейка не осталась без обводки, и внутри ячейки видна её собственная разбивка — две линии первого уровня вложенности. Пример 4: сетка тоже стоит на месте (расхождение с границей ячейки — толщина самой линии), но границы столбцов тянутся во всю высоту таблицы и проходят сквозь 31 чужую ячейку — это главное, что осталось починить. Ошибок на странице нет ни на одном из двух.

Чего не успели. Примеры 1, 2 и 5 на живой ссылке в этот раз не домерены: сервис разбирает одну страницу по 3–7 минут, а на тяжёлых документах перестаёт отвечать и перезапускается — разбор обрывается. Пример 4 прошёл только со второй попытки. Это отдельная беда, её надо закладывать в следующий шаг: пока разбор на живой ссылке падает на больших документах, сверять по ним сетку нечем. Прошлые числа по всем восьми страницам — в таблице выше, они сняты на такой же версии, но не на живой ссылке.

Снимки живой проверки

«Пример 3» на рабочей ссылке: сетка по границам ячеек и разбивка внутри ячейки.
Экран проверки, пример 3
«Пример 4» на рабочей ссылке: видно, как граница столбца идёт сквозь чужие ячейки.
Экран проверки, пример 4

Что дальше

Щелчок по ячейке на скане по-прежнему подсвечивает значение справа, перетаскивания изображения нет, ошибок на странице нет ни на одном примере.