Avb homepage

Як обчислити висоту рядка таблиці.

У осередків таблиць в 1С є властивість контроль, там можна вибрати "Переносити" і тоді текст, що не міститься по ширині, буде автоматично переноситися на наступні рядки в комірці. Якщо висоту рядка встановити в "Авто", висота рядка автоматично змінюватиметься залежно від висоти введеного тексту. Тобто. рядки у звіті вийдуть самопереносяться і саморозсувні.

Все б добре, але як відомо, метод Висота Рядка() повертає 0, якщо висота рядка встановлена ​​"Авто". Тобто. програмно отримати висоту такого рядка не можна, тому не можна отримати і висоту всієї таблиці в пунктах. А це буває необхідно, наприклад, для вставки перенесення на наступну сторінку, своєчасної вставки "підвалів" сторінок тощо.

Ідея обчислення висоти рядка таблиці заснована на тому, що маючи можливість дізнатися довжину рядка в пунктах ширини стовпця, можна досить точно порахувати скільки разів вона перенесеться. Дехто використовує для цього моноширинний шрифт, але це не скрізь красиво. Щоб мати можливість такого підрахунку для немоноширинного шрифту, необхідно скласти масив ширин символів цього шрифту. Зробив я це приблизно так:

Таб = Створити Об'єкт ("Таблиця"); Для Х = 1 По 255 Цикл Таб.Область (Х, 1). Таб.Область(1, 1, 255, 1).Контроль(4); Таб.Область(1, 1).ШирінаСтовпця(100); Таб.Показати();

Потім вручну скоротив текст у всіх 255 рядках до тієї довжини, коли текст поміщається в одному рядку. Зберіг таблицю у файл.

Таб = Створити Об'єкт ("Таблиця"); Таб.Відкрити("МояТаблиця.mxl"); Сп = СтворитиОб'єкт("СписокЗначень"); Для Х=1 По 255 Цикл Ч = СтрДліна(Таб.Область(Х,1).Текст); Сп.ДодатиЗначення(?(Ч = 0, 0, Окр(100/(Ч + 0.5), 3))); КінецьЦикл; ЗначенняВФайл("Arial8.txt", Сп);

Питання "Що це за 0.5?" виникає? А це ті півсимволи, які середньостатистично ще могли б влізти в задану ширину. Ім'я файлу вибрано таким не випадково, воно містить назву та розмір шрифту в "розсувних" осередках таблиці. Тобто. при використанні іншого шрифту або розміру вам доведеться зробити всю цю роботу ще раз.

Щоб уникнути потенційних помилок, рядки бажано розсувати програмно, тобто. висоту рядка не встановлювати в "Авто". Тому необхідно також дізнатися висоту "однорядкового" рядка для поточного шрифту та збільшення цієї висоти, коли текст розбивається на два рядки. Це я зробив просто, спочатку подивився висоту "однорядкового" рядка (11.25), потім "дворядкового" (21.75), збільшення вийшло - 10.5. Значення 11.25 та 10.5 має сенс додати до нашого списку відповідно 256 та 257 значень.

Тепер ми маємо все необхідне для обчислення висоти рядка.

Функція ОтриматиВисотуРядки(Стор, ШиринаСтовпця, Шрифт) Довжина = 0; Пробіл = 0; Кількість = 1; Для Х = 1 По СтрДліна(Стор) Цикл Код=КодСимв(Серед(Стор, Х, 1)); Якщо Код = 32 Тоді Пробіл = Довжина КінецьЯкщо; Довжина = Довжина + Шрифт.ОтриматиЗначення(Код); Якщо Довжина > ШиринаСтовпця Тоді Довжина = ?(Пробіл = 0, 0, Довжина - Пробіл); Кількість = Кількість + 1; Пробіл = 0; КінецьЯкщо; КінецьЦикл; Повернення Шрифт.ОтриматиЗначення(256) + (Кількість - 1) * Шрифт.ОтриматиЗначення(257); КінецьФункції

Для перевірки зробіть таблицю, у першій колонці якої заповніть текстом довільної довжини 10 рядків. Встановіть контроль у заповнених осередків у "Переносити". Збережіть під назвою "ТестоваяТаблица.mxl".

Процедура Тест() Таб = Створити Об'єкт("Таблиця"); Таб.Відкрити("ТестоваТаблиця.mxl"); ШирінаСтовпця = Таб.Область(1, 1).ШирінаСтовпця(); Шрифт = ЗначенняІзФайлу("arial8.txt"); Для Х = 1 По 10 Цикл ВисотаРядки = ОтриматиВисотуРядки(Таб.Область(Х, 1).Текст, ШиринаСтовпця, Шрифт); Таб.Область(Х, 1).ВисотаРядки(ВисотаРядки); КінецьЦикл; Таб.Показати(); КінецьПроцедури

Таке обчислення виявляється дуже точним, наткнутися на "зайвий" або "не зайвий" рядок виявляється майже нереальним.

Наприкінці, хочу запропонувати всім, хто взяв методику озброєння, організувати обмін файликами ширин символів. Надсилайте мені, буду викладати тут. А для затравки викладу свій тестовий Arial8.txt :))