Поміститься текст в осередку (з прикладами використання Авторозмір шрифту, перенесення рядків)

Періодично виникає питання: чи поміститься текст в осередку табличного документа? Хоч виникає він рідко, але все-таки виникає. У цій статті розповідається як можна отримати відповідь на це питання.

На просторах інтернету я зустрічав різні рішення, але всі вони носили "імовірнісний" характер і будувалися на визначенні середнього розміру символу (або максимального розміру), обчисленням довжини рядка, кількістю рядків, використовуючи всілякі емпіричні коефіцієнти, і все одно не могли гарантувати, що текст поміститься в клітинку.

Єдине рішення, близьке до задачі, яке я знайшов: Автоматичний підбір розміру шрифту в об'єкті РісунокТаблічногоДокумента. Але воно для розміщення тексту в РісунокТаблічногоДокумента, а не в область як в даній статті. Воно вимагає попередньої підготовки, але нічого простіше саме для РісункаТаблічногоДокумента на даний момент мені невідомо (спробу спрощення см нижче).

Сам я цю проблему часто обходив тими чи іншими шляхами. І це всіх задовольняло: і мене, і замовників. Мабуть, через те, що зустрічається вона рідко:

1. В цінниках. Найменування товару зазвичай центрують по висоті, і при дуже довгому найменуванні його початок і кінець мають ризик не поміститися в відведений йому місце (а в цінниках зазвичай відключають автовисоту). З цього положення два виходи:

а) Вибирати той чи інший шаблон цінника. Чи не реалізовано в прикладах.

б) Підганяти розмір тексту під цінник. Реалізовано в прикладах:

Поміститься текст в осередку (з прикладами використання Авторозмір шрифту, перенесення рядків)

2. І коли найменування потрібно написати на кілька рядків:

У типових це реалізовано так:

мені ж більше до душі виводити його так (з автоматичним перенесенням слів):

Намучавшись за два вечори, прийшов, сподіваюся, до простого рішення:

1. Запам'ятовуємо початковий розмір осередку в мм.

2. Призначаємо осередку властивість АвтоВистота = Істина

3. Вставляємо текст і знову дивимося висоту комірки.

4. Якщо висота осередку змінилася в більшу сторону - значить, текст не поміщається.

Висоту осередки в мм будемо вимірювати за допомогою вставки в комірку рисунка і вимірюванням його розмірів.

Функція отримання висоти комірки:

Функція для визначення вміститься чи текст в осередок:

Для можливості використання цього методу необхідно дотримуватися таких умов:

1. Необхідно якось назвати область.

2. Заповнення області = Текст, а не Параметр або Шаблон. В принципі, можна використовувати і те й інше, але код ставати мудровані. У всякому разі, я нічого простого не придумав. І так як життя це ускладнює не сильно не став заморочуватися з-за цього.

3. Розміщення тексту = Перенесення. Ось це потрібно обов'язково! Розміщення тексту програмно поставити можна, але ефект від зміни, наскільки я зрозумів, з'являється тільки після відображення табличного документа з цієї осередком.

У файлах ви знайдете:

1. Приклад з підбором розміру шрифту з використанням функцій зі статті.

2. Оптимізований по швидкодії приклад підбору розміру шрифту з невеликою модифікацією коду (але підбір розміру шрифту - не оптимальні. Нижче є якась спроба його вичіліть а не зменшувати кожен раз на 1).

3. Висновок довгих рядків в кілька осередків.

4. Підбір розміру шрифту в елементі "Малюнок табличного документа".

Малюнок табличного документа (Напис):

Скажу відразу, на великих текстах, працює жахливо довго.

1. або чекати якийсь час і потім дивитися розміри, наприклад так: ПодключітьОбработчікОжіданія ( "ІзмерітьРазмери", 0.1, Істина)

2. або "змусити" цю заразу відображатися примусово.

Перший - робочий. Однак код з ним виходить складний. І на кожну іттерацію - мінімум по 0.1 секунди. У підсумку це дуже довго. Але працює (вроверял на поле таблчного документа).

А ось другий. За допомогою застосування маленької хитрості - все шикарно працює. А хитрість в тому, що є у ТаблічногоДокумента метод Показати (). Хороший він тим, що як раз після його виконання, розміри напису вже стають реальними, підігнаними під розмір тексту. Але поганий він тим, що окривают вікно, яке програмно або не закриєш, або я просто не знаю як.

Думав, я думав. А точніше, екперементіровать, я експериментував. І ось до чого дійшов:

Код приводити в людський вигляд мені лінь. Якщо що, то є файл в прикладах.

Хочу відзначити пару цікавих моментів:

1. Обчислення висоти напису при її фіксованою шириною.

2. Спроба оптимізувати алгоритм пошуку шрифту.

7. Miffka (mikhailv) 09.04.12 15:26 Зараз в темі

Знадобилося у пресі специфікації на "розлініяної" таблиці.

Поки впроваджував, наткнувся на те, що 1С (рел. 8.2.13.219) при крайніх значеннях заповнення в осередку (коли текст трохи не вміщується і переноситься на інший рядок) неправильно відпрацьовує висоту (через картинку). При налагодженні видно, що текст переніс, а висота картинки повертається такий же, як і без переносу.
Вирішив проблему додатковою перевіркою з додаванням одного символу:

// Функція для визначення вміститься чи текст в осередок:
Функція ТекстУмещаетсяВЯчейке (пОбласть, пТабДок, пТекст)

ВисотаДо = ВисотаОбластіВмм (пОбласть, пТабДок);

// Скопіюємо область в новий табличний документ.
// І там уже будемо грати з її властивостями.
ВремТабДок = Новий ТаблічнийДокумент;
ВремТабДок.Вивесті (пТабДок);
ВремОбласть = ВремТабДок.Область (пОбласть.Імя);

ВремОбласть.АвтоВисотаСтрокі = Істина;
ВремОбласть.ВисотаСтрокі = 0;

ВремОбласть.Текст = пТекст;
ВисотаПосле = ВисотаОбластіВмм (ВремОбласть, ВремТабДок);

Якщо ВисотаДо> = ВисотаПосле Тоді
// Спробуємо відловити уміщених "на межі": додамо символ
ВремОбласть.Текст = пТекст + "Щ";
ВисотаПослеСімв = ВисотаОбластіВмм (ВремОбласть, ВремТабДок);
Якщо ВисотаДо> = ВисотаПослеСімв Тоді
Повернення (Істина);
інакше
Повернення (Брехня);
КонецЕсли;
інакше
Повернення (Брехня);
КонецЕсли;

Також на базі цієї функції написав ПолучітьМассівУмещающіхсяСтрок (пОбласть, пТабДок, пТекст), в якій текст розбивається на кілька вміщується в зазначену осередок рядків.