Все началось с этого сообщения об ошибке: https://sourceforge.net/tracker/?func=detail&aid=2466414&group_id=198368&atid=965196
Также автор этого сообщения прислал исходный xls-файл и mxl-файлы – результаты конвертирования исходного файла при масштабе шрифтов в Windows в 90% и 100%.
Итак, исходный xls-файл при масштабе 100%:
Если сохранить этот файл старой версией Йокселя при масштабах 90%, 100% и 125% («крупный» шрифт), то получим три разных файла, каждый из которых выглядит в точности как исходный файл, если просматривать эти mxl-файлы при тех масштабах шрифтов, при которых происходила конвертация. Если же просматривать эти файлы в других масштабах шрифтов, то начинаются безобразия. Вот три файла, сохраненные в при разных масштабах шрифтов и открытые в 1С при масштабе 100%:
Как можно видеть, ширина колонок во всех трех файлах различна. В частности, для файла «90%" колонки шире на 10% и даже больше ширины колонок файла «125%".
В чем же дело? Давайте посмотрим, как исходный xls-файл выглядит в Excel, но при различных масштабах шрифтов в Windows:
А теперь возьмем mxl-файл, сохраненный при масштабе 100% и посмотрим как он будет выглядеть в 1С при различных масштабах шрифтов:
В чем же разница? Во-первых, что у нас происходит с шириной колонок? В 1С в полном соответствии с изменениями масштаба мы наблюдаем и изменения ширины колонок: при масштабе 90% колонки на 10% уже, а при масштабе 125% – на 25% процентов шире. А вот в Excel ширина колонок меняется очень странным образом. Почему это происходит, или, вернее, с какой целью это сделано? Чтобы понять, в чем дело, достаточно сравнить взаимное положение текста ячеек и границ ячеек. В 1С ширина колонок меняется пропорциональна масштабу шрифтов, однако при этом серьезно расползается текст. В частности при масштабе 90% тестовая строка уже не вмещается в две колонки, как это происходит при масштабе 100%. А вот в Excel взаимное расположение текста и границ ячеек остается постоянным и не зависит от масштаба шрифтов. Т.е. Excel стремится обеспечить одинаковый вид документа в любом масштабе шрифтов.
Каким образом Excel это делает? Ответ заключается в способе, которым в Excel задается ширина колонок. А именно, ширина колонок для пользователя задается в виде количества (возможно, дробного) стандартных символов. «Внутри», в файле xls, ширина хранится в виде 1/256 от ширины стандартного символа. Почему же для хранения ширины используются дробные части ширины шрифта, а не ширина в логических единицах – например, твипах? Проблема в крайне низком разрешении экрана. Т.е. в очень малом количестве точек на дюйм. Преположим, мы заказываем шрифт Arial 10 пунктов. У полученного шрифта ширина символа, предположим, будет равна 7 пикселам. Пусть в твипах это будет 105 единиц. А теперь установим масштаб шрифтов в 90%. Какой должна стать ширина символа? Уменьшиться на 10% – т.е. на 0.7 пиксела и стать равной 6.3 пиксела. Но Windows не умеет отображать шрифты с дробной шириной в пикселах. Поэтому, Windows сделает нам либо шрифт шириной 6 пикселов, либо ширина вообще не изменится и останется равной 7 пикселам. Что при этом будет происходить с логической шириной символа? Ширина не может остаться равной 105 твипам. Ведь 105 твипов в новом масштабе это 6.3 пиксела. А шрифт имеет совсем другой размер. Поэтому логическая ширина символа будет либо меньше, либо больше. Еще раз посмотрите на отображение документа в Excel при разных масштабах. Легко видеть, что ширина колонок для 90% и для 100% одна и та же. Это как раз и вызвано тем, что Windows не смогла уменьшить на 10% ширину стандартного шрифта и эта ширина осталась той же самой. Excel подстроился под ширину шрифта и ширина колонок не изменилась.
Однако, стоп! Ведь в 1С ширина колонок точно так же задается в виде количества стандартных символов! Почему же 1С ведет себя так паршиво? Программисты 1С очень многое скопировали из Excel (скорее всего, Excel 95 или 97). Они взяли внешний вид колонок, выделенных областей, строки формул и многого другого. Точно так же было и со способом задания ширины колонок. Увидев, что в Excel ширина колонок задается в виде количества стандартных символов, программисты 1С исправно передрали этот способ и у себя. Однако, этот передер происходил без понимания смысла данного поведения Excel. В результате, 1С потеряло главное, ради чего все и затевалось – одинаковый вид документа при разных масштабах шрифта. Дело в том, что 1С стандартный символ ВСЕГДА, при любом масштабе шрифта, независимо ни от чего, имеет постоянную ширину – 105 твипов. Кстати, что такое 105 твипов? 105 твипов – это ширина символа '0' шрифта Arial размером 10 пунктов при масштабе шрифтов 100%. Вот, даже стандартный шрифт они содрали у Excel :) Естественно, Йоксель как передиратель у 1С сохранил подобное же поведение.
В новой версии Йокселя ширина колонки теперь понимается аналогично Excel. Только в связи с тяжелым наследием, оставшимся от 1С, происходит это по другому. А именно ширина колонки задается в некоторых логических единицах. Единица равна 1/105 от ширины символа '0' шрифта Arial размером 10 пунктов. При масштабе 100% ширина колонок в точности равна ширине в твипах. Т.к. ширина задается в единицах, зависимых от шрифта, то колонки теперь лучше подстраиваются под текст ячеек при различных масштабах шрифта в Windows. Правда, к сожалению, идентичности на 100% во всех масштабах не получится, т.к. шрифты разных размеров будут в разных масштабах изменяться несогласованно – кто-то меньше, кто-то больше – так уж работает GDI Windows. Для идентичности нужно так называемое субпиксельное позиционирование и возможность отрисовывать шрифты с дробными размерами в пикселах. Windows это не умеет (хотя не уверен насчет наиболее новых версий). Однако существуют некоторые библиотеки, которые такие возможности предоставляют. Вероятно, в будущем можно будет перейти на какую-нибудь из них. (Тут не все так просто).
Теперь вернемся к исходному сообщению об ошибке. Вообще говоря, данная проблема не имеет удовлетворительного решения. У Excel ширина задается в единицах, зависимых от шрифта, а в 1С ширина задается в единицах измерения длины – фиксированных логических координатах. Сохраняя документ при, например, масштабе 90%, нет возможности узнать ширину эталонного символа при масштабе 100%. Однако, что-то с этой проблемой надо делать, поэтому было принято следующее половинчатое решение. Наиболее ходовыми опорными шрифтами для документов Excel являются Arial 10 пунктов (с таким шрифтом создаются все новые документы Excel по умолчанию) и Arial 8 пунктов (такие документы создают 1С и Йоксель). Ширину эталонных символов для этих шрифтов в масштабе 100% мы знаем. Поэтому, если документ был создан именно с одним из этих шрифтов, то мы легко можем создать mxl-документ, который при масштабе 100% будет отображаться как в Excel. Именно такое поведение и было реализовано. Для других возможных опорных шрифтов рассчитывается переходный коэффициент: делится ширина символа шрифта документа на ширину символа Arial 10 пунктов. Эта методика неточна – в зависимости от масштаба шрифтов коэффициент может плавать и mxl-документы будут получаться разными. Однако, это лучше, чем ничего...
При использовании в документе стандартных шрифтов («Arial» 10 и 8 пунктов) колонки mxl-документов, получаемых при любых масштабах шрифтов, будут иметь одинаковую ширину. Вот результат сохранения исходного xls-файла при различных масштабах. Полученные документы открыты в 1С при масштабе шрифтов 100%:
Ссылок на эту страницу нет