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

29.08.19

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
ПодборШрифтаЯчейки_sample.epf
.epf 14,02Kb
6
6 Скачать (1 SM) Купить за 1 850 руб.
Параметры шрифтов
.txt 210,04Kb
6
6 Скачать (3 SM) Купить за 2 450 руб.

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

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

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

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

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

Если нужно вывести 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 Платные (руб)

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

6000 руб.

16.01.2015    63003    44    59    

82

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

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

2400 руб.

29.06.2020    18871    26    6    

41

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

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

1500 руб.

06.10.2020    10243    7    7    

10

Работа с интерфейсом Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Это инструкция по дизайну форм в среде 1С. Гайд охватывает рекомендации и стандарты для оптимизации пользовательского интерфейса. В гайде содержатся указания по использованию элементов интерфейса, включая как основные, так и продвинутые аспекты. Предоставляются также примеры и антипримеры для наглядного понимания принципов дизайна

20.08.2024    16966    mrXoxot    43    

121

Работа с интерфейсом Программист Платформа 1С v8.3 Бесплатно (free)

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

27.05.2024    7489    smielka    37    

100

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

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

27.12.2023    14846    921    elcoan    47    

117

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

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

2 стартмани

10.04.2023    11930    162    acces969    31    

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

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

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

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

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

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