Вывод части текста жирным в табличном документе

Иногда бывает необходимо выделить часть текста в ячейке табличного документа жирным шрифтом, например ФИО или контрагента, но стандартными методами 1С этого не поддерживают. Весть текст в ячейке содержит единое оформление. Может, когда-нибудь форматированная строка станет доступна и для табличного документа… Ну, а пока приходится делать «костыли» для реализации данного функционала.

Проблема была решена использованием измененного шрифта (шрифт и демо обработка для управляемых форм во вложении). Часть ненужных символов в кириллице была заменена на жирные. Сам шрифт Liberation Serif является бесплатным (GNU GPLv2). Ниже приведен код из приложенной обработки для вывода части текста жирным. Тестировалось на платформе 1С:Предприятие 8.3 (8.3.10.2561) в конфигурации 1С:ERP Управление предприятием 2 (2.4.1.189).


&НаСервере
Функция ВывестиТабДокНаСервере()
ТабДок=Новый ТабличныйДокумент;
Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет");
Область=Макет.ПолучитьОбласть("Шапка");
Область.Параметры.Текст="Демонстрация части текста "+СделатьЖирным("жирным")+" в табличном документе";
ТабДок.Вывести(Область);
Возврат ТабДок;
КонецФункции

&НаСервере
Функция СделатьЖирным(ИсходнаяСтрока)
СтрокаПодмены="ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿāĂĄąĆćĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġ";
СтрокаПоиска="АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдужзийклмнопрстнфхцчшщъыьэюяё!#$%&()*+,-./0123456789:;<=>№";
НоваяСтрока="";
Для  х=1 по СтрДлина(ИсходнаяСтрока) Цикл
ТекСимвол=Сред(ИсходнаяСтрока,х,1);
Если СтрНайти(СтрокаПоиска,ТекСимвол)>0 Тогда
НоваяСтрока=НоваяСтрока+Сред(СтрокаПодмены,СтрНайти(СтрокаПоиска,ТекСимвол),1);
Иначе
НоваяСтрока=НоваяСтрока+ТекСимвол;
КонецЕсли;
КонецЦикла;
Возврат НоваяСтрока;
КонецФункции

&НаКлиенте
Процедура ВывестиТабДок(Команда)
ВывестиТабДокНаСервере().Показать("Демо");
КонецПроцедуры

Правда, у этого метода есть и недостаток (помимо необходимостьи установки шрифта на клиенте и/или сервере). 1С в табличном документе не выравнивает шрифты по ширине, кроме нескольких стандартных (Arial, Tahoma, New York Times…). Надеюсь, этот недостаток будет в ближайшее время все же исправлен разработчиком.

18 Comments

  1. DJDUH

    Костиль по-проще — это «Текст» но тогда нужно играть в тетрис блд)

    Reply
  2. davealone

    Лучше уж на ячейки разбить и оформление поменять. Ну или макет в Word.

    Если я захочу потом выделить жирный текст и погуглить его?

    Reply
  3. kiruha

    Плюс за интересную идею, но как только кому то пошлют накладную…

    Reply
  4. h00k

    (0)

    New York Times

    Что за чудо шрифт такой?!

    Reply
  5. &rew

    (4) О, это такой же как знаменитый шрифт Komsomolskaya pravda, только наклонен чуть в сторону запада.

    Reply
  6. Alien_job

    (1) Можете пояснить? непонятно что за «Текст», блд)

    Reply
  7. DJDUH

    (6)ну шейпами. Фигурами с текстом

    Reply
  8. nvv1970
    &НаСервере

    Макет = РеквизитФормыВЗначение(«Объект»).ПолучитьМакет(«Макет»)

    Где-то умер один хороший 1с-ник.

    И, да,… нужно БОЛЬШЕ контекстных вызовов!

    Reply
  9. artemusII

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

    Reply
  10. fomix

    (8) Это упрёк или так… занудство? Что тут крамольного «Макет = РеквизитФормыВЗначение(«Объект»).ПолучитьМакет(«Макет»)»?!

    Reply
  11. nvv1970

    (10) Если вы все еще считаете, что бесполезное создание объекта — это норма, тогда упрек.

    РеквизитФормыВЗначение(«Объект») это стало почти рудиментом и используется совместимости с «обычноформенными» программистами. В программировании уже почти не встречается, только в очень особых случаях.

    Здесь: почему бы макет не получить из менеджера и БЕЗ контекстного вызова?

    Контекстные вызовы — основная проблема производительности УФ.

    АП: И туда же, в копилку антипроизводительности, передача ТабличногоДокумента с сервера на клиент. Уж не знаю, почему 1с не оптимизировала это действие на уровне платформы, да еще и в типовых так же делает. Но большой таблдок может передаваться пару минут (даже на одном хосте), а если через временное хранилище — пролазит даже по сетке за секунду.

    Reply
  12. fomix

    (11) [IS-QUOTE] >> Здесь: почему бы макет не получить из менеджера и БЕЗ контекстного вызова? <<

    Из менеджера конечно можно, а если это внешняя печатная форма или обработка, тогда как?! Ваше решение?

    >>И туда же, в копилку антипроизводительности, передача ТабличногоДокумента с сервера на клиент<<

    Аналогично. Ваше решение для ВПФ…

    Reply
  13. SuperSpade

    (9)Каких именно вам не хватает разделителей. И для чего?

    Вам важно какую-то строку или знак выделить? Он особенный? На нём важно сконцентрировать внимание? При чтении кода именно он должен бросаться в глаза?

    Reply
  14. igee12

    (9), вам наверное тут разделителей и пробелов не хватает? :))))

    СтрокаПодмены=»ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿāĂĄąĆćĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġ»;

    СтрокаПоиска=»АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдужзийклмн­опрстнфхцчшщъыьэюяё!#$%&()*+,-./0123456789:;<=>№»;

    Reply
  15. Nickon

    Идея классная! Как раз для реализации своих «проблем» понадобилась. Попробую заточить под себя.

    Reply
  16. researcher01

    Есть две ошибки в строке (как минимум):

    СтрокаПоиска=»АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдужзийклмн­опрстнфхцчшщъыьэюяё!#$%&()*+,-./0123456789:;<=>№»;

    я заменил на:

    СтрокаПоиска=»АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмн­опрстуфхцчшщъыьэюяё!#$%&()*+,-./0123456789:;<=>№»;

    Reply
  17. researcher01

    Но все равно автору огромное спасибо!

    Reply
  18. aybek

    Спасибо автору, я тут смотрю некоторые против кода и тд. Мое личное мнение если есть замена текущему решению то показать его и уже потом можно сказать чем лучше новое решение и чем хуже старое а если нету чем заменить решение лучше не трогать текущее решение.

    Reply

Leave a Comment

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