Размещение текста в ячейке табличного документа

29.08.19

Разработка - Работа с интерфейсом

Набор процедур и функций для подбора такого максимального размера шрифта ячейки табличного документа, при котором текст целиком помещается в ячейке. Последний раз обработка успешно протестирована на релизе 1С:Предприятие 8.3, учебная версия (8.3.8.1933).

Скачать файлы

Наименование Файл Версия Размер
ПодборШрифтаЯчейки_sample.epf
.epf 14,02Kb
3
.epf 14,02Kb 3 Скачать
Параметры шрифтов
.txt 210,04Kb
3
.txt 210,04Kb 3 Скачать

Есть фиксированный макет, разработанный для печати этикетки фиксированного размера. Текст, который выводится в этот макет, может иметь различную, плохо прогнозируемую длину.

Если мы выберем маленький размер шрифта для короткого текста, возникнет резонное замечание – а зачем тут столько пустого места?

Если выберем шрифт больше и попадется длинный текст – возникает вопрос еще более резонный: а что тут напечатано? Часть текста пропала...

Задача озвучивалась не раз. И наверняка много раз решена. Например, Поместится ли текст в ячейке? (с примерами использования: авторазмер шрифта, перенос строк)

Но, увы, этот способ очень медленный.

Если нужно вывести 1-3 простых ценника – это идеальный вариант. Если большой набор этикеток выводит Ответственный или Важный менеджер и это займет у него 30 минут – тоже не вопрос: он "работает". Но если работник с ТСД нажимает кнопку ОК и больше минуты не получает отклика – этот способ совершенно неприемлем.

 

Не смотря на простоту постановки, задача оказалась весьма сложной.

Конечно, есть вообще уникально-элементарное решение:

Если СтрДлина(Текст) < 20
	Ячейка.Шрифт = Новый Шрифт(Ячейка.Шрифт,,СтолькоТо20)
ИначеЕсли СтрДлина(Текст) < 30
	Ячейка.Шрифт = Новый Шрифт(Ячейка.Шрифт,,СтолькоТо30)
ИначеЕсли
...

Но это все нужно писать под каждый макет, под каждую ячейку отдельно. Это работает кое-как. И это крайне утомительно, скучно и грустно...

 

Поэтому пришлось искать свое, рабочее решение.

Самый простой способ (который и приводится в примере) – это построить таблицу ширин символов и высот строк для каждого размера шрифта.

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

И вот наступил момент, когда стало понятно: время, потраченное на решение задачи, превышает удовольствие от ее решения (иногда эти величины соизмеримы. Особенно когда тратишь на это свое свободное время).

Следующим этапом был вывод:

– если не ставить задачу так строго, то в каком-то очень практичном приближении задачу решить все-таки можно.

Причем, тут нет никакой эмпирики. Все очень строго. Но требует статичного массива информации. (Кто постарше - помните "Таблицы Брадиса"?)

 

В результате появилась достаточно простая схема: каждый символ имеет некую ширину, которую можно определить. Каждая строка имеет определенную высоту, не зависящую от набора символов в ней. Размер ячейки определяется как: Ширина = (сумма ширин символов строки) + (поля по ширине); Высота = (высота одной строки)*(количество строк) + (вертикальные поля).

Все эти величины удалось определить различными способами (в том числе помог подсмотренный в упомянутой статье метод с рисунком).

К публикации прилагается тестовый фрагмент таблицы размеров шрифта Arial (обычный, курсив, полужирный, полужирный курсив) от 8 до 48.

Ширины расчитаны для букв латиницы, кириллицы (в т.ч. украинских Ї, Ґ), цифр и основоного набора символов.

 

Далее – просто ремесло.

Набор предложенных функций реализует следующий механизм:

1. Как и в стандартной схеме мы

1.1. создаем/получаем табличный документ

1.2. получаем/создаем макет

1.3. наполняем макет информацией (заполняем значения параметров и проч.)

1.4. выводим/присоединяем область макета в конечный документ

 

2. Стандартные методы табличного документа "Вывести" и "Присоединить" заменяются функциями "ВывестиИПодогнатьТекст" и "ПрисоединитьИПодогнатьТекст".

В качестве параметров передаются:

ТабДокПриемник - документ, в который собственно осуществляется вывод

ТабДокИсточник - область макета с заполненными параметрами (или другой табличный документ),

Ячейки - строка с именами или адресами ячеек, для которых необходимо подобрать размер шрифта

Минимальный допустимый размер шрифта

УдалятьПробелыПереноса - (см.далее)

 

Обязательными являются только два первых параметра.

Если не указаны имена ячеек – подгоняется текст во всех ячейках источника, имеющих "ТипЗаполнения" "Параметр" или "Шаблон".

Если не указан минимальный размер – будет взят минимальный размер, присутствующий в таблице ширин (он же будет использован, если в параметре передано меньшее значение)

УдалятьПробелыПереноса. Кому-то этот параметр покажется смешным и бесполезным. Но я не смог его проигнорировать (тем более что реализуется его назначение в рамках основной задачи очень просто). Суть в следующем.

Например, мы выводим в ячейку несколько однотипных значений (например, цифровых артикулов). По ширине в строках вмещается одинаковое их количество. Если в ячейке установлены размещение текста "Переносить" и Горизонтальное выравнивание Центр, то получится, что последняя строка несколько смещается вправо (см. Рис). Если же заменить пробелы, по которым происходят переносы строк, символами ПС – картинка выглядит гораздо приятнее.

 

В качестве максимального (с него начинается расчет) принимается размер, указанный разработчиком/дизайнером в макете.

В алгоритме принципиально не учитываются стандартные вертикальные поля и, где это возможно – горизонтальные.

Если возникнет желание их учитывать – в коде есть необходимые комментарии (сами значения в таблице ширин присутствуют).

Ячейки с типом размещения текста "Забивать" и "Обрезать" - не рассматриваются.

Таблицу ширин можно загружать из файла или из справочника. В модуле обработки необходимо внести изменения в шаблоне функции загрузки таблицы ширин.

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

Предложение загрузить файл ширин выводится при открытии обработки. Но это можно зделать и позже по кнопке "Прочитать параметры шрифтов". Также на форме есть две кнопки: Тест1 (подгоняет произвольный текст в ячейку таб.документа на форме) и  Тест2 (выводит несколько примеров на основании макета в табличный документ).

 

Вот, по сути, и все.

 

В прилагаемой обработке показан упрощенный алгоритм (для облегчения понимания).

В рабочей версии присутствует дополнительный функционал:

* коэффициент высоты (позволяет принудительно управлять размером вертикальных полей)

* интерполяция размера (если в таблице ширин отсутствует необходимый размер)

Не уверен, что этот функционал необходим. Это я добавлял уже под собственные задачи.

 

Пробуйте. Могут возникнуть неточности при других версиях шрифта и специфических драйверах принтеров.

Шлите скриншоты, если что-то не так.

 

Съешь еще этих мягких французских булок, да выпей чаю. 1234567890

v8 Табличный документ Печать

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработка предназначена для редактирования картинок в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Также обработка может быть использована из встроенного языка как объект для редактирования картинок. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Данная обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    61698    43    59    

80

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

Работа с интерфейсом Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    54314    16    21    

42

Управление дашбордами

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    16623    21    4    

35

Новогоднее оформление для 1С

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    10563    745    elcoan    45    

106

Конструктор HTML, CSS и javascript

Инструментарий разработчика Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Подходит для создания web-страниц для замены управляемых форм 1С, красивых отчетов, интерфейса мобильного приложения на платформе 1С и для простых страниц веб-сайтов.

2 стартмани

10.04.2023    9484    150    acces969    31    

115

Модель состояния для MVC

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    3577    kalyaka    2    

27

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12010    1    5    

10
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. ixijixi 1761 30.08.19 08:31 Сейчас в теме
Я храню ее в глобальной переменной и загружаю при первом вызове процедуры подбора (хотя и не уверен, что это хорошо. подскажите, гуру).

Я не гуру, но думаю, что лучше использовать для этих целей модуль с повторным использованием возвращаемых значений
user847462; +1 Ответить
2. user847462 13 30.08.19 11:01 Сейчас в теме
(1)
Я не гуру, но думаю, что лучше использовать для этих целей модуль с повторным использованием возвращаемых значений

Спасибо за совет.
Конечно, все зависит от конкретного прикладного применения. Но, в моем случае, печать обычно происходит пакетно. Имеет ли смысл хранить постоянно значительный массив данных в глобальной переменной или целесообразнее получать его только на время процесса печати?
Нужно будет проработать этот.вопрос. Попробую провести замеры частоты вызовов.
3. Азверин 3 17.02.22 09:51 Сейчас в теме
Скажите, а если перенос текста разделяет слово на две части, ваше решение поможет?
Например,
"пишу текст про трактор
иста и перенос криво вы
шел".

А хочется иногда красиво:
"пишу текст про
тракториста и перенос
криво вышел".
4. user847462 13 22.02.22 17:11 Сейчас в теме
(3)
Алгоритм пытается заполнить область ячейки по-максимуму. Поэтому если высота ячейки позволяет, и попадется длинное слово, не помещающееся по ширине - то оно перенесется. Т.е. для высокой и узкой ячейки.
Для Вашего примера это будет выглядеть примерно так:
"пишу
текст про
трактори
ста и
перенос
криво
вышел"

Можно дописать алгоритм (например, добавить параметр запрета переноса длинных слов).
Но что если попадется очень длинное слово? Тогда можем получить картину, когда ячейка наполовину пустая, но зато в ней неперенесенное слово с минимальным шрифтом.
Мне кажется, проще такие частные случаи решать иначе. Например, ограничить максимальный размер шрифта в макете и длинное слово не перенесется.
Прикрепленные файлы:
Азверин; +1 Ответить
5. Азверин 3 24.02.22 08:46 Сейчас в теме
(4) Спасибо за реакцию и пример на мой комментарий.
Да, ваше предложение имеет место быть.

Забыл отписаться - у нас в наименовании присутствовал неразрывный пробел (символы.НПП).
Из-за этого на этикетке слова были обрезаны. Так что вопрос решился сам по себе.
Оставьте свое сообщение