|
|
|
Автоматическое изменение размера шрифта в поле отчета | ☑ | ||
|---|---|---|---|---|
|
0
alexsergeevatmista
11.12.25
✎
09:21
|
Есть внешний отчет, в виде таблицы. Есть строка "номенклатура". Клиент хочет, чтобы у неё была фиксированная ширина, и, если название номенклатуры не влезает в эту ширину, то делать не перенос, а уменьшение размера шрифта. Я даже не знаю, реально ли это, и, если реально, то с какой стороны подступиться к этой задаче?
|
|||
|
1
Fish
гуру
11.12.25
✎
09:24
|
Теоретически реально постобработкой табдокумента, но, как по мне, слишком геморройно. Я бы послал с такой хотелкой.
|
|||
|
2
Ногаминебить
11.12.25
✎
09:24
|
Сделать 2 строки макета с разным размером шрифта и в зависимости от длины текста в поле выводить одну из них. :)
|
|||
|
3
Fish
гуру
11.12.25
✎
09:25
|
+(1) Прикольно будет, если наименование очень длинное, то шрифт получится нечитаемым :)))
|
|||
|
4
formista2000
11.12.25
✎
09:26
|
А если ОтображатьЗаголовки = Истина и позволить пользователю растягивать нужный слобец?
|
|||
|
5
alexsergeevatmista
11.12.25
✎
09:34
|
(1) А как в теории? Задать имя области в макете поля и как-то менять шрифт в зависимости от того, помещается ли текст в ширину? Тогда нужен какой-то алгоритм, чтобы узнать, что текст помещается. На мой взгляд это довольно нетривиально.
(2) Если честно, звучит немного саркастично :) (4) Это позволено. Шрифт в полях от этого не поменяется. |
|||
|
6
Волшебник
11.12.25
✎
09:36
|
(0) Пошли они нафиг
|
|||
|
7
Kigo_Kigo
11.12.25
✎
09:38
|
Глаза нахер сломаешь такой отчет читать
|
|||
|
8
MWWRuza
гуру
11.12.25
✎
09:48
|
Я нечто подобное в семерке для ценников делал когда-то. Работало, но, как-то не прижилось.
|
|||
|
9
Shurjk
11.12.25
✎
09:49
|
(0) Если отчет на СКД, то можно условным оформлением решить. Но поддерживаю мнение большинства - "пошли они нахер", хотя бы потому, что отчет с разными шрифтами будет крайне похабно выглядеть.
|
|||
|
10
Ногаминебить
11.12.25
✎
10:04
|
(5) Ну в языке запросов есть ДлинаСтроки. Теоретически можно рыть в эту сторону. Вопрос целесообразности оставим за скобками. :)
|
|||
|
11
DiMel_77
11.12.25
✎
10:10
|
(0) Задача довольно сложная, вот пример реализации похожей задачи https://infostart.ru/1c/tools/123769/. В случае если используемый шрифт не моноширинный, то оптимального алгоритма вы не найдете. Только проверять ширину (или высоту) выводимой области.
|
|||
|
12
arsik
гуру
11.12.25
✎
10:12
|
(0) А не проще высоту строки менять. Автоматически указать, он сам нужную высоту подберет
|
|||
|
13
Волшебник
11.12.25
✎
10:13
|
(0) Сделайте моноширинный шрифт, куда выводите реквизит НаименованиеФиксированное
|
|||
|
14
alexsergeevatmista
11.12.25
✎
10:14
|
(12) Как высота строки повлияет на фиксированную ширину строки? Не понял Вашу идею.
|
|||
|
15
arsik
гуру
11.12.25
✎
10:19
|
(14) Ну типа так
PS: Извиняюсь. Перенос не подходит. Прочитал мимо строк (0)
|
|||
|
16
alexsergeevatmista
11.12.25
✎
10:29
|
(13) Попробовал, такой шрифт, конечно, слегка ужимается по ширине, но размер шрифта не меняет. Спасибо.
|
|||
|
17
Злопчинский
11.12.25
✎
14:43
|
решаемо же. вывести строку в макет, где поля заданы так, что помещается ровно она строка. Вывести в макет - если количество страниц = 1 - строка влезла, если количество страниц > 1 - строка не влезла, уменьшить шрифт строки, повторить: вывести строку в макет..."
когда строка влезла в макет на 1 стр - вывести в чистовой макет. все. |
|||
|
18
timurhv
11.12.25
✎
14:48
|
(17) Сколько ждать надо на больших объемах, вроде это все небыстрая операция, по крайней мере на 8.2 с большими данными долго обрабатывалось.
|
|||
|
19
АгентБезопасной Нацио
11.12.25
✎
15:20
|
(18)
Идиотские задачи требуют идиотских решений |
|||
|
20
shuhard
11.12.25
✎
14:58
|
(18) можно закэшировать, т.е. один раз определить приемлемый размер шритфа и хранить вместе с номенклатурой
|
|||
|
21
Злопчинский
11.12.25
✎
15:16
|
(18) Согласен. но тут надо в консерватории что-то менять.
и вряд ли в сабже на большой объем. Обычно это какие-нибудь ценники или формы фиксированные. |
|||
|
22
Злопчинский
11.12.25
✎
15:17
|
(20) и с "ИД" отчета где это применяться должно.
|
|||
|
23
Волшебник
11.12.25
✎
15:20
|
(19) 🔥 это в мемы!
|
|||
|
24
Fedor-1971
11.12.25
✎
15:20
|
(20) Не вариант, т.к. отчётов может быть несколько и с разной шириной колонки
(0) ставим моноширинный шрифт в ячейку, выясняем руками сколько символов лезет в ячейку при разных читаемых размерах шрифта, дальше проверяем длину строки и выставляем нужный размер шрифта Останется проблема "слишком длинной строки"- тут либо обрезать, либо вывести надпись "Не лызе батьку" |
|||
|
25
shuhard
11.12.25
✎
15:22
|
(22)
(24) ID отчёта, ширина поля(если юзер может менять), рекомендованный размер шрифта нет необходимости считать на "лету" |
|||
|
26
Fedor-1971
11.12.25
✎
15:23
|
(25) останется вопрос "Кто будет рулить?"
|
|||
|
27
shuhard
11.12.25
✎
15:25
|
(26) ну а кто тебе индексы полнотекстовые обновляет ?
|
|||
|
28
Fish
гуру
11.12.25
✎
15:33
|
(5) "нужен какой-то алгоритм, чтобы узнать, что текст помещается. " - Как вариант - Автоперенос строки и контроль высоты строки. Если высота строки стандартная - значит, поместился. Если высота больше - значит, не влезло. Другой вариант - моноширинный шрифт и считать длину текста по количеству символов.
Но я и написал, что алгоритм получится слишком геморройным. Проще послать. |
|||
|
29
Мультук
гуру
11.12.25
✎
15:37
|
(0)
Я бы начал с google: windows api font width true type string Закончил бы советом из (1) |
|||
|
30
СвинТуз
11.12.25
✎
18:39
|
(0)
Не всегда можно определить, поместится ли количество символов в указанном поле по ширине. Зависит от шрифта. Он должен быть определенного типа. Times new Roman Cyr, например, не позволяет судить о длине строки на себе по количеству символов. |
|||
|
31
СвинТуз
11.12.25
✎
15:59
|
Моноширинные шрифты.
или как в (29) заметили. |
|||
|
32
СвинТуз
11.12.25
✎
16:03
|
Сам отчет СКД или просто таблица заполняется?
|
|||
|
33
СвинТуз
11.12.25
✎
16:05
|
Если СКД, то или постобработка или условное оформление.
Если классика, при выводе устанавливать размер кегли шрифта. |
|||
|
34
alexsergeevatmista
11.12.25
✎
16:06
|
(32) Скд. Я так понимаю, условное оформление в таком случае только программно делается?
|
|||
|
35
СвинТуз
11.12.25
✎
16:08
|
Можно моноширинный шрифт поставить.
Посчитать максимальную длину строки в колонке. Потом установить длину столбца + Автоформат. |
|||
|
36
СвинТуз
11.12.25
✎
16:12
|
(34)
Если скушает стрДлина(ВашеПоле) в условии, то прям так. Если не скушает, то Выбор когда ДЛИНАСТРОКИ(<Строка>) ... прям в отборе или доп. поле. Учу плохому. Дешево. |
|||
|
37
СвинТуз
11.12.25
✎
16:13
|
Макет поля с курьером
|
|||
|
38
СвинТуз
11.12.25
✎
16:14
|
Извращений много.
Главное хотеть. |
|||
|
39
СвинТуз
11.12.25
✎
16:15
|
Она вроде как даже должна функции глобальных модулей кушать.
|
|||
|
40
СвинТуз
11.12.25
✎
16:17
|
длина строки меряется последовательным набором
символов "12345678901234567890123 ..." |
|||
|
41
Fish
гуру
11.12.25
✎
16:20
|
(35) Тут, имхо, сложнее алгоритм. Допустим, в ширину колонки влезает 10 символов шрифта размером 10. И 12 символов размером 8.
Тогда получим, что при длине наименовании <= 10 - шрифт не меняем. Если длина наименования - от 11 до 12, то размер ставим 8. Если больше - то ещё меньше. И т.д., пока шрифт остаётся читаемым. |
|||
|
42
СвинТуз
11.12.25
✎
16:22
|
(41)
Главное хотеть. |
|||
|
43
СвинТуз
11.12.25
✎
16:23
|
(41)
Если сделать в запросе вычисляемое поле, то все в условном оформлении станет проще. |
|||
|
44
СвинТуз
11.12.25
✎
16:27
|
Можно не мелочиться.
Постобработкой раздвинуть столбец и автоформат выставить. В этом случае размер шрифта не меняется и видимо поведение будет линейное. Размер поля будет константа + коэф*(максимальная длина строки). |
|||
|
45
Fish
гуру
11.12.25
✎
16:37
|
(44) Я так понял, что автору менять ширину колонки нельзя. Это как раз самое простое, я как-то выводил на одну страницу 12 таблиц с разным кол-вом колонок - как раз там менял ширину колонок, чтобы все таблицы получились одинаковой ширины.
|
|||
|
46
СвинТуз
11.12.25
✎
16:39
|
Ну в общем. самое простое.
В условном оформлении есть опция. "Растягивать по горизонтали". Для меня все кончилось )))) Не интересно. |
|||
|
47
СвинТуз
11.12.25
✎
16:58
|
(45)
Менять шрифт (в каких пределах?) в одной таблице и одном столбце можно, а растягивать нельзя потому что на лист не поместится? |
|||
|
48
Fish
гуру
11.12.25
✎
17:12
|
(47) Это надо у ТС спрашивать. В (0) же написано "Клиент хочет, чтобы у неё была фиксированная ширина"
|
|||
|
49
Сти
12.12.25
✎
07:33
|
(40) ну давай сравним длину 12345678901234567890123 и iiiiiiiiiiiiiiiiiiiiiii, используя какие-нибудь Arial или Times New Roman
|
|||
|
50
Мультук
гуру
12.12.25
✎
08:40
|
(49)
Я давно ничего не писал для Windows Api Поэтому спросил deepseek === Есть строка символов, например "Мама мыла раму" Необходимо посчитать его ширину для произвольного trueType шрифта, например Arial 12 Напиши код на языках Си и Питон === Оба решения учитывают особенности шрифтов TrueType, включая кернинг и различную ширину символов. Python-решение проще в настройке, тогда как C-решение дает больше контроля и не требует сторонних библиотек Python. <Код для Python не привожу> C (используя FreeType библиотеку) #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ft2build.h>
#include FT_FREETYPE_H
// Функция для получения ширины текста
int get_text_width(const char* text, const char* font_path, int font_size) {
FT_Library library;
FT_Face face;
FT_GlyphSlot slot;
int width = 0;
int error;
// Инициализируем библиотеку FreeType
error = FT_Init_FreeType(&library);
if (error) {
fprintf(stderr, "Ошибка инициализации FreeType\n");
return -1;
}
// Загружаем шрифт
error = FT_New_Face(library, font_path, 0, &face);
if (error == FT_Err_Unknown_File_Format) {
fprintf(stderr, "Неизвестный формат шрифта: %s\n", font_path);
FT_Done_FreeType(library);
return -1;
} else if (error) {
fprintf(stderr, "Не удалось открыть файл шрифта: %s\n", font_path);
FT_Done_FreeType(library);
return -1;
}
// Устанавливаем размер шрифта
error = FT_Set_Char_Size(face, 0, font_size * 64, 96, 96);
if (error) {
fprintf(stderr, "Не удалось установить размер шрифта\n");
FT_Done_Face(face);
FT_Done_FreeType(library);
return -1;
}
slot = face->glyph;
// Перебираем все символы строки
for (int i = 0; text[i] != '\0'; i++) {
// Получаем индекс глифа для символа
FT_UInt glyph_index = FT_Get_Char_Index(face, text[i]);
if (glyph_index == 0) {
// Если символ не найден в шрифте, используем ширину пробела
width += face->size->metrics.x_ppem / 2;
continue;
}
// Загружаем глиф
error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT);
if (error) {
continue;
}
// Добавляем ширину глифа и кернинг
if (i > 0) {
FT_Vector delta;
FT_Get_Kerning(face,
FT_Get_Char_Index(face, text[i-1]),
glyph_index,
FT_KERNING_DEFAULT,
&delta);
width += delta.x >> 6;
}
width += slot->advance.x >> 6;
}
// Освобождаем ресурсы
FT_Done_Face(face);
FT_Done_FreeType(library);
return width;
}
int main() {
const char* text = "Мама мыла раму";
const char* font_path = "arial.ttf"; // Путь к файлу шрифта
int font_size = 12;
int width = get_text_width(text, font_path, font_size);
if (width >= 0) {
printf("Ширина текста '%s': %d пикселей\n", text, width);
} else {
printf("Не удалось вычислить ширину текста\n");
}
return 0;
}
|
|||
|
51
Fish
гуру
12.12.25
✎
08:44
|
(50) Проверял, работает?
|
|||
|
52
Мультук
гуру
12.12.25
✎
09:15
|
(51)
С какой целью мне это проверять ? Делать за других их работу? У меня такой безумной задачи из (0) нет. Идею я подал еще в (29) |
|||
|
53
СвинТуз
12.12.25
✎
09:18
|
(49)
Тему лучше внимательно читать Times New Roman не подходит на Курьере сравните длину потом приходите, поговорим |
|||
|
54
Сти
12.12.25
✎
14:08
|
(53) в (0) условия на фонт не было, может быть клиент только Mad's Scrawl BRK воспринимает в отчетах или какой-нибудь Goudy Bookletter 1911? С такими-то запросами на ширину колонок и однострочность вывода в ячейке. А ему Courier New! Что за свинтузское отношение к клиенту?
|
|||
|
55
МихаилМ
12.12.25
✎
20:24
|
(0) вот семерошный код https://avb1c.narod.ru/rowheight.html
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |