Имя: Пароль:
1C
 
Автоматическое изменение размера шрифта в поле отчета
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
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс