Одинакова ли в табличном документе реальная ширина колонок с одинаковой номинальной шириной

12.05.20

Разработка - Механизмы платформы 1С

Здравый смысл подсказывает, что способность ячейки табличного документа вмещать текст зависит от её ширины. Поэтому, имея в виду вместимость ячеек, статью можно было бы озаглавить "Одинакова ли ширина колонок табличного документа с одинаковой шириной". Что то не очень? Да. получается тавтология. Приходится вводить дополнительные термины. В рамках данной статьи условимся под реальной шириной понимать именно способность ячеек вмещать строки, а под номинальной шириной - значение свойства "Ширина" колонки табличного документа. Так вот оказывается, что колонки с одинаковой номинальной шириной несколько отличаются друг от друга реальной шириной. То есть строка, которая помещается в ячейку одной колонки, может не поместиться в ячейку другой колонки такой же номинальной ширины.

Как этот факт был обнаружен.

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

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

Ещё одно пояснение - по поводу конечного результата. Нужна была печатная форма некоего документа. Распечатывать его планировалось, предварительно сохраняя табличный документ в формате PDF. Скорее всего, изображение, получаемое при печати табличного документа, - такое же, как и  и при его сохранении в PDF, но на всякий случай замечу, что в рамках данной статьи под печатью понимается именно получение изображения через сохранение табличного документа в PDF.

Вернёмся к основной теме раздела.
Как формировалась печатная форма поясню на примере текста "Однажды, в студёную зимнюю пору".

Сначала в макете подбиралась область для вывода строки "Однажды", и эта область выводилась в результирующий табличный документ.


 

Затем в макете подбиралась область для вывода строки "в студёную", и эта область (только подчёркнутая) присоединялась к результирующему табличному документу.



Затем успешно отрабатывался вывод строки "зимнюю".



А вот на строке " пору" происходило неожиданное: область с подобранной шириной после присоединения к результирующему табличному документу эту  строку уже не вмещала.



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



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

 

Как можно воспроизвести эффект:
 - создём новый табличный документ;
 - у первых 100 колонок устанавливаем ширину 1;
 - у первой строки устанавливаем шрифт "Times New Roman, 12", авто-высоту строки и размещение текста  "переносить";
 - в первой строке делаем два объединения ячеек: в колонках с 1 по 18 и с 22 по 39;
 - в каждом объединении устанавливаем границу "сплошная" со всех сторон, вертикальное положение "Верх" и текст "50 гр.Однажды,".

Получим:

Далее нажимаем "Просмотр", смотрим что получается, нажимаем два раза "увеличить" и сравниваем с тем что было до увеличения:
       

Далее: выходим из просмотра, сохраняем табличный документ в файл PDF, и открываем его через Acrobat Reader. Видим следующее:

Замечаем: cтрока в первой области печатается без переноса текста на следующую строку, во второй области - с переносом. Налицо тот эффект, который был описан в анонсе.

Дополнительно, из сравнения того, как выглядел табличный документ, того, что мы видели при просмотре и того, что видно в PDF'е,  нелишне зафиксировать: 
 - табличный документ выглядит не так, как он будет выглядеть после распечатки (см. примечание по поводу распечатки выше);
 - на предварительный просмотр полагаться на 100% тоже нельзя: при просмотре табличного документа получаемые картинки зависят от масштаба.

Надеюсь подобные мелкие замечания не вызовут пессимизма в душе читателя. Как оказалось в результате решения описанной в предыдущем разделе задачи, успешно предсказывать перенос строк при печати и подбирать подходящие области позволяет использование метода ПроверитьВывод.

Что касается воспроизводимости эксперимента.

Думаю, что результаты, получаемые в описанном эксперименте, могут зависеть от платформы 1С. Поэтому уточняю: версия платформы, на которой я работал - 8.3.15.1830.
Далее. Уверен, что воспроизводимость эксперимента может зависеть и от факторов, лежащих вне платформы 1С. Поэтому учточню: я работал с "Windows 7 Профессинальная", Service Pack 1.

ТабличныйДокумент Ширина текст влезает в ячейку ПроверитьВывод

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4538    dsdred    53    

72

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5295    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6410    dsdred    36    

112

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18475    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12088    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8824    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6279    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15986    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Vortigaunt 96 12.05.20 13:40 Сейчас в теме
Почему для такой задачи был выбран табличный макет? Не проще ли было сгенерить html разметку? Все равно строится из кирпичиков.
Если допустимо использовать Microsoft Word, также можно макет со всеми шрифтами и подчеркиваниями нарисовать в ворде, расставить в нужных местах закладки. Из 1С коннектиться по ОЛЕ к Ворду и заполнять по закладкам данными. Оттуда же сохранять в ПДФ.
2. burmsergey 16 12.05.20 17:35 Сейчас в теме
Почему для такой задачи был выбран табличный макет?

Вспомнил анекдот:
Приезжает король в замок рыцаря—вассала. Вызывает его к себе.
— Почему при моем приближении к замку не салютовали пушки?
— Сир, на это есть пять причин, во—первых: у нас нет пороха...
— Достаточно, сэр!

По поводу выбора табличного документа.

Во-первых: одно из требований к печатной форме было - предоставить её не только в бумажном виде, но и в формате Excel; и возможность сохранять табличный документ в Excel многое значит.

Во-вторых, мой опыт работы с MS Word не идёт ни в какое сравнение с опытом работы с табличными документами. Не готов потратить кучу времени и убедиться, что в Word'е сформировать печатную форму ещё сложнее. Один из моих бывших коллег делал печатные формы на MS Word, но я от него этой идеей не заразился. Сделать в нём текст - смесь из разных шрифтов, как мне думается, несложно, но к итоговой печатной форме было много и других пожеланий. Например, нужно было печатать как основной текст, так и вставки-пояснения мелким шрифтом под некоторыми подчёркнутыми графами, и чтобы при печати впечатанный в подчёркнутые графы текст и пояснения печатались на одной странице. Не пробовал, но мне это представляется сложнее, чем в табличном документе. Кроме того, быстродействие при работе со сторонним приложением будет имхо гораздо ущербнее.
Yashazz; BigB; +2 Ответить
8. AnatolPopov 166 17.05.20 00:38 Сейчас в теме
(2) Насчет анекдота. На самом деле это реальный случай, только произошедший не в поездке короля по замкам, а на войне. Командующий после сражения потребовал объяснений, почему не стреляла батарея. Ну, и услышал ответ: "... Во-первых, у нас не было снарядов..." Где и когда было, затрудняюсь вспомнить. В общем, это исторический анекдот.
3. PerlAmutor 129 13.05.20 07:11 Сейчас в теме
Живу с этим фактом еще с платформы версии 8.3.6. В макете один перенос, при изменении масштаба другой, при печати третий. Но обычно на печать выходит именно тот перенос, который отображается при максимальном увеличении масштаба.
Yashazz; Поручик; +2 Ответить
4. Yashazz 4709 13.05.20 11:28 Сейчас в теме
Автор, буквально на днях я решал такую же задачу, и тоже "кирпичиками" таб.документа. Так что проблематика близко знакома... Респект, плюсую.
5. Yashazz 4709 13.05.20 11:30 Сейчас в теме
Печально только то, что и на 8.3.15 ситуация не улучшилась... Зато "система взаимодействия" развивается семимильными шагами, чо.
6. Dmitryiv 161 15.05.20 11:27 Сейчас в теме
Надеюсь подобные мелкие замечания не вызовут пессимизма в душе читателя. Как оказалось в результате решения описанной в предыдущем разделе задачи, успешно предсказывать перенос строк при печати и подбирать подходящие области позволяет использование метода ПроверитьВывод.


Это хорошо работает при условии, что драйвера принтера работает без ошибок. А то этот метод [ПроверитьВывод] имеет обыкновение крашить приложение если вдруг есть какие-то проблемы с принтером/драйвером принтера. Особенно в терминальном режиме.

Так что использовать осторожно на свой страх и риск.
7. burmsergey 16 15.05.20 17:38 Сейчас в теме
А то этот метод [ПроверитьВывод] имеет обыкновение крашить приложение

Никогда с таким не сталкивался. Может быть потому, что при подборе областей для вывода строк текста и при формировании табличного документа печатной формы использую только драйвер "Microsoft XPS Document Writer".
В статье я писал, что полученный табличный документ сначала сохраняется в PDF, а уже PDF распечатывается через какой-то драйвер принтера. При такой схеме нет связи между ПроверитьВывод и глючным драйвером принтера. Соответственно нет страха, есть чувства уверенности и надёжности.
Оставьте свое сообщение