Форматированная строка 1С — значение типа ФорматированнаяСтрока: текст, у отдельных кусков которого свой шрифт, цвет текста или фона, картинка или гиперссылка. Тип есть в платформе 1С 8.3 начиная с версии 8.3.1. Его понимают декорация-надпись, поле надписи, расширенная подсказка, диалоги ПоказатьВопрос() и ПоказатьПредупреждение(), а с 8.3.24 — ещё и ячейки табличного документа.
Где такая строка нужна чаще всего:
Ниже — готовые процедуры для каждого случая и разбор ошибок, на которых спотыкаются чаще всего.
У конструктора два варианта. Первый оформляет один кусок: Новый ФорматированнаяСтрока(Содержимое, Шрифт, ЦветТекста, ЦветФона, Ссылка). Второй склеивает части: Новый ФорматированнаяСтрока(Часть1, Часть2, …) или Новый ФорматированнаяСтрока(МассивЧастей). Частью может быть строка, другая форматированная строка или картинка, но только из БиблиотекаКартинок: общая картинка конфигурации или картинка платформы.
| Параметр | Тип | Что задаёт |
|---|---|---|
| Содержимое | Строка, ФорматированнаяСтрока, Картинка, Массив | текст или набор частей |
| Шрифт | Шрифт | Новый Шрифт(, , Истина) — полужирный на основе шрифта стиля |
| ЦветТекста | Цвет | WebЦвета.Красный, Новый Цвет(178, 34, 34) |
| ЦветФона | Цвет | заливка под текстом, как маркером |
| Ссылка | Строка | непустая строка делает кусок гиперссылкой |
Значения типа неизменяемые: перекрасить кусок готовой строки нельзя, её собирают заново. Удобнее копить части в массиве и в конце создать одну строку. Тип сериализуется, поэтому строку, собранную на сервере, можно передать на клиент или хранить в реквизите формы.
| Куда передать | Свойство или метод | Примечание |
|---|---|---|
| Декорация вида «Надпись» | Элементы.Имя.Заголовок | основной случай |
| Подсказка под полем | РасширеннаяПодсказка.Заголовок | вместе с ОтображениеПодсказки.ОтображатьСнизу |
| Поле надписи | реквизит формы типа ФорматированнаяСтрока | так сделано в форме поиска дублей БСП |
| Диалоги | ПоказатьВопрос(), ПоказатьПредупреждение() | текст вопроса или предупреждения |
| Выпадающий список | СписокВыбора.Добавить() | оформление видно только в выпадающем списке поля ввода |
| Табличный документ | Текст ячейки и рисунка, колонтитулы | ячейки и рисунки — с 8.3.24, колонтитулы — с 8.3.15 |
| СообщениеПользователю | — | Текст — только строка |
Пример — форма обработки загрузки из файла. На форме декорация-надпись ДекорацияИтог и поле ПутьКФайлу; в палитре свойств декорации, в разделе событий, назначьте обработчик ОбработкаНавигационнойСсылки. Строку собираем на сервере. В реальной обработке ПоказатьИтогЗагрузки() вызывают после загрузки, а не при открытии формы.
// Модуль формы обработки загрузки. На форме: декорация-надпись ДекорацияИтог
// с обработчиком события ОбработкаНавигационнойСсылки и поле ввода ПутьКФайлу.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Для примера - итог условной загрузки: 125 строк, ошибки в трех из них
НомераСтрокСОшибками = СтрРазделить("12,40,41", ",");
ПоказатьИтогЗагрузки(125, НомераСтрокСОшибками);
// Расширенная подсказка - тоже декорация, ей подходит форматированная строка
Элементы.ПутьКФайлу.РасширеннаяПодсказка.Заголовок = Новый ФорматированнаяСтрока(
"Файл ",
Новый ФорматированнаяСтрока("CSV в кодировке UTF-8", Новый Шрифт(, , Истина)),
", разделитель колонок - точка с запятой");
Элементы.ПутьКФайлу.ОтображениеПодсказки = ОтображениеПодсказки.ОтображатьСнизу;
КонецПроцедуры
&НаСервере
Процедура ПоказатьИтогЗагрузки(Загружено, НомераСтрокСОшибками)
ЖирныйШрифт = Новый Шрифт(, , Истина); // имя и размер берутся из стиля
Ошибок = НомераСтрокСОшибками.Количество();
Части = Новый Массив;
// Значок-светофор: картинки платформы 8.3.16+ или любая общая картинка
Если Ошибок = 0 Тогда
Части.Добавить(БиблиотекаКартинок.ОформлениеКругЗеленый);
Иначе
Части.Добавить(БиблиотекаКартинок.ОформлениеКругКрасный);
КонецЕсли;
Части.Добавить(" Загружено строк: ");
Части.Добавить(Новый ФорматированнаяСтрока(Формат(Загружено, "ЧН=0"), ЖирныйШрифт));
Если Ошибок > 0 Тогда
Части.Добавить(", с ошибками: ");
Части.Добавить(Новый ФорматированнаяСтрока(Формат(Ошибок, "ЧН=0"), ЖирныйШрифт, WebЦвета.Красный));
Части.Добавить(". ");
// Служебная ссылка: начинается с #, данные зашиты прямо в адрес
Части.Добавить(Новый ФорматированнаяСтрока("Показать ошибки", , , ,
"#Ошибки:" + СтрСоединить(НомераСтрокСОшибками, ",")));
КонецЕсли;
// Внешний адрес: по щелчку платформа откроет его сама
Части.Добавить(Символы.ПС);
Части.Добавить(Новый ФорматированнаяСтрока("Требования к файлу", , , ,
"https://example.ru/help/import"));
Элементы.ДекорацияИтог.Заголовок = Новый ФорматированнаяСтрока(Части);
КонецПроцедуры
&НаКлиенте
Процедура ДекорацияИтогОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
Префикс = "#Ошибки:";
Если СтрНачинаетсяС(НавигационнаяСсылкаФорматированнойСтроки, Префикс) Тогда
// Своя команда: платформе переходить по такой "ссылке" не нужно
СтандартнаяОбработка = Ложь;
Номера = Сред(НавигационнаяСсылкаФорматированнойСтроки, СтрДлина(Префикс) + 1);
ПоказатьОшибкиЗагрузки(СтрЗаменить(Номера, ",", ", "));
КонецЕсли;
// https:// и e1cib/ остаются стандартной обработке
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьОшибкиЗагрузки(СписокСтрок)
// ПоказатьПредупреждение и ПоказатьВопрос тоже принимают форматированную строку
Текст = Новый ФорматированнаяСтрока(
"Ошибки в строках файла: ",
Новый ФорматированнаяСтрока(СписокСтрок, Новый Шрифт(, , Истина), WebЦвета.Красный),
Символы.ПС + "Исправьте их и загрузите файл повторно.");
ПоказатьПредупреждение(, Текст);
КонецПроцедуры
Статичный текст можно оформить и без кода: откройте редактирование свойства «Заголовок» декорации и переключите тип строки на «Форматированная строка» — жирный, цвет и ссылки задаются кнопками панели. В XML-выгрузке такой заголовок хранится как <Title formatted="true"> с внутренней разметкой вида <link адрес>текст</>. Код нужен, когда текст зависит от данных.
Когда надпись нужна не всегда — скажем, только если у документа есть связанные документы, — декорацию создают из кода, а обработчик подключают методом УстановитьДействие(). Он, как и Элементы.Добавить(), работает только на сервере. Саму форматированную строку программно собирают так же, как в первом листинге. Ссылку на объект возвращает ПолучитьНавигационнуюСсылку(): адрес вида e1cib/data/… платформа откроет сама, обработчик нужен только служебной ссылке «Скрыть список».
// Модуль формы документа: ссылки на связанные документы в надписи,
// которая создается из кода. МассивДокументов - ссылки, полученные запросом,
// например Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка").
&НаСервере
Процедура ВывестиСвязанныеДокументы(МассивДокументов)
Декорация = Элементы.Найти("ДекорацияСвязанные");
Если Декорация = Неопределено Тогда
Декорация = Элементы.Добавить("ДекорацияСвязанные", Тип("ДекорацияФормы"));
Декорация.Вид = ВидДекорацииФормы.Надпись;
Декорация.АвтоМаксимальнаяШирина = Ложь;
Декорация.РастягиватьПоГоризонтали = Истина;
// Имя события русское, обработчик должен быть в модуле формы
Декорация.УстановитьДействие("ОбработкаНавигационнойСсылки",
"Подключаемый_ДекорацияСвязанныеОбработкаНавигационнойСсылки");
КонецЕсли;
Если МассивДокументов.Количество() = 0 Тогда
Декорация.Заголовок = Новый ФорматированнаяСтрока("Связанных документов нет", , WebЦвета.Серый);
Возврат;
КонецЕсли;
Части = Новый Массив;
Части.Добавить(Новый ФорматированнаяСтрока("Связанные документы:", Новый Шрифт(, , Истина)));
Для Каждого Документ Из МассивДокументов Цикл
Части.Добавить(Символы.ПС);
// Адрес вида e1cib/data/...: документ откроется без нашего кода
Части.Добавить(Новый ФорматированнаяСтрока(Строка(Документ), , , ,
ПолучитьНавигационнуюСсылку(Документ)));
КонецЦикла;
Части.Добавить(Символы.ПС);
Части.Добавить(Новый ФорматированнаяСтрока("Скрыть список", , , , "#Скрыть"));
Декорация.Заголовок = Новый ФорматированнаяСтрока(Части);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ДекорацияСвязанныеОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
Если НавигационнаяСсылкаФорматированнойСтроки = "#Скрыть" Тогда
СтандартнаяОбработка = Ложь;
Элемент.Видимость = Ложь;
КонецЕсли;
КонецПроцедуры
Длинный текст, который к тому же переводится через НСтр(), собирать по кускам неудобно. В БСП есть функции, которые строят форматированную строку по шаблону с HTML-подобными тегами. В УТ 11.4 (БСП 3.1.5) и КА 2.5 (БСП 3.1.10) это СтроковыеФункции.ФорматированнаяСтрока() на сервере и СтроковыеФункцииКлиент.ФорматированнаяСтрока() на клиенте: шаблон и до пяти параметров %1–%5. Старая СтроковыеФункцииКлиентСервер.ФорматированнаяСтрока() там помечена «Устарела»: она понимает только жирный текст и ссылку и параметров не принимает. Если в конфигурации с БСП нет модулей СтроковыеФункции и СтроковыеФункцииКлиент, библиотека старая и есть только эта функция.
| Тег | СтроковыеФункции и …Клиент | СтроковыеФункцииКлиентСервер |
|---|---|---|
<b>текст</b> | шрифт стиля ВажнаяНадписьШрифт | полужирный шрифт |
<a href="адрес">текст</a> | да, пробелы вокруг «=» не важны | только в виде <a href = "адрес"> |
<img src="ИмяКартинки"> | картинка из БиблиотекаКартинок | нет |
<span style="color: …; background-color: …; font: …"> | имена элементов стиля конфигурации | нет |
%1–%5 | да | нет, нужен ПодставитьПараметрыВСтроку() |
Вложенные теги не поддерживаются: закрывающий тег сбрасывает всё оформление сразу, а не только своё. Модуль СтроковыеФункции серверный и без флага «Вызов сервера», из клиентского кода его не вызвать — подробнее о флагах в статье про общие модули.
// Шаблоны БСП 3.1: на сервере - СтроковыеФункции, на клиенте - СтроковыеФункцииКлиент.
// На форме декорации ДекорацияДолг и ДекорацияПодсказка.
&НаСервере
Процедура ПоказатьДолгКонтрагента(Контрагент, СуммаДолга)
// style - имена элементов стиля конфигурации, src - имя картинки из библиотеки
Шаблон = НСтр("ru = '<img src=""ОформлениеКругКрасный""> Долг <b>%1</b>: <span style=""color: РезультатПроблемаЦвет"">%2 руб.</span> <a href=""#АктСверки"">Сформировать акт сверки</a>'");
Элементы.ДекорацияДолг.Заголовок = СтроковыеФункции.ФорматированнаяСтрока(Шаблон,
ТекстДляШаблона(Строка(Контрагент)),
Формат(СуммаДолга, "ЧДЦ=2; ЧН=0"));
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьПодсказкуСклада(ИмяСклада)
// Например, из обработчика СкладПриИзменении: сервер не вызывается
Элементы.ДекорацияПодсказка.Заголовок = СтроковыеФункцииКлиент.ФорматированнаяСтрока(
НСтр("ru = 'Товар резервируется на складе <b>%1</b>. <a href=""#СменитьСклад"">Сменить склад</a>'"),
ТекстДляШаблона(ИмяСклада));
КонецПроцедуры
&НаСервере
Процедура ПоказатьДолгСтараяБСП(СуммаДолга)
// Устаревшая функция: только <b> и <a href = "...">, пробелы вокруг "=" обязательны,
// параметров нет - подставляем их заранее
Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Долг: <b>%1 руб.</b> <a href = ""#АктСверки"">Акт сверки</a>'"),
Формат(СуммаДолга, "ЧДЦ=2; ЧН=0"));
Элементы.ДекорацияДолг.Заголовок = СтроковыеФункцииКлиентСервер.ФорматированнаяСтрока(Текст);
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ТекстДляШаблона(Знач Текст)
// Параметры подставляются в шаблон до разбора тегов:
// "<" из наименования ("Кабель <USB-C>") функция БСП приняла бы за тег
Возврат СтрЗаменить(Текст, "<", "<");
КонецФункции
Ссылки #АктСверки и #СменитьСклад разбирают в ОбработкаНавигационнойСсылки так же, как в первом листинге.
С 8.3.24 свойство Текст у ячеек и рисунков табличного документа принимает форматированную строку, а у поля табличного документа появилось событие ОбработкаНавигационнойСсылки. В печатной форме можно выделить жирным одно слово внутри фразы, не разбивая её на ячейки.
// Модуль формы: команда ПоказатьОбразецПечати. Платформа 8.3.24 и новее.
&НаСервереБезКонтекста
Функция ОбразецПечатнойФормы(Номер, СуммаПрописью)
ТабДок = Новый ТабличныйДокумент;
ТабДок.Область("C1").ШиринаКолонки = 90;
ОбластьЗаголовка = ТабДок.Область("R1C1");
ОбластьЗаголовка.Текст = "Счет на оплату № " + Номер;
ОбластьЗаголовка.Шрифт = Новый Шрифт(, 14, Истина);
// Одна ячейка, но жирным - только сумма прописью, срок оплаты - темно-красным
ОбластьИтога = ТабДок.Область("R3C1");
ОбластьИтога.Текст = Новый ФорматированнаяСтрока(
"Всего к оплате: ",
Новый ФорматированнаяСтрока(СуммаПрописью, Новый Шрифт(, , Истина)),
Новый ФорматированнаяСтрока(". Оплатить до конца месяца.", , WebЦвета.ТемноКрасный));
ОбластьИтога.РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Переносить;
Возврат ТабДок;
КонецФункции
&НаКлиенте
Процедура ПоказатьОбразецПечати(Команда)
ТабДок = ОбразецПечатнойФормы("17", "Двенадцать тысяч рублей 00 копеек");
ТабДок.Показать("Образец печатной формы");
КонецПроцедуры
С макетами два пути. С 8.3.24 ячейку с заполнением «Шаблон» можно переключить в редакторе макета на форматированную строку: оформление подставленного значения задаёт начало параметра — открывающая скобка «[». С 8.3.27 оформление сохраняется и при установке параметра области из кода:
// Модуль объекта обработки. В макете ПФ_MXL_Счет - область Итого
// с параметром СуммаПрописью. Платформа 8.3.27, режим совместимости не ниже 8.3.27.
Функция ИтогСчетаПоМакету(СуммаПрописью) Экспорт
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("ПФ_MXL_Счет");
ОбластьИтого = Макет.ПолучитьОбласть("Итого");
// Оформление параметра сохранится в ячейке; в режиме совместимости
// 8.3.26 и ниже значение будет выведено обычным текстом
ОбластьИтого.Параметры.СуммаПрописью = Новый ФорматированнаяСтрока(СуммаПрописью,
Новый Шрифт(, , Истина));
ТабДок.Вывести(ОбластьИтого);
Возврат ТабДок;
КонецФункции
При сохранении в файл действуют ограничения из описания изменений 8.3.24. В docx и HTML оформление выгружается полностью. В xlsx, ods и PDF не попадают картинки и ссылки внутри строки и цвет фона, а при выгрузке в XLS теряется и цвет шрифта. Мобильная платформа форматированный текст в ячейках не поддерживает.
С 8.3.15 в платформе есть СтрНайтиИВыделитьОформлением(Строка, Подстрока). Она ищет по началу слов, подсвечивает найденное стандартным оформлением и возвращает Неопределено, если не нашлось хотя бы одно слово. Если нужно любое вхождение и свой цвет, подойдёт функция ниже.
// Подсветка всех вхождений без учета регистра: результаты поиска, подбор.
// В общем модуле с флагами "Клиент" и "Сервер" директива не нужна.
&НаКлиентеНаСервереБезКонтекста
Функция ВыделитьВхождения(Знач Текст, Знач Искомое)
Если ПустаяСтрока(Текст) Или ПустаяСтрока(Искомое) Тогда
Возврат Новый ФорматированнаяСтрока(Текст);
КонецЕсли;
ЖирныйШрифт = Новый Шрифт(, , Истина);
ЦветМаркера = Новый Цвет(255, 236, 157);
ТекстВРег = ВРег(Текст);
ИскомоеВРег = ВРег(Искомое);
ДлинаТекста = СтрДлина(Текст);
ДлинаИскомого = СтрДлина(Искомое);
Части = Новый Массив;
Начало = 1;
// СтрНайти с начальной позицией за концом строки вызывает ошибку
Пока Начало <= ДлинаТекста Цикл
Позиция = СтрНайти(ТекстВРег, ИскомоеВРег, , Начало);
Если Позиция = 0 Тогда
Прервать;
КонецЕсли;
Если Позиция > Начало Тогда
Части.Добавить(Сред(Текст, Начало, Позиция - Начало));
КонецЕсли;
// Фрагмент берем из исходного текста, чтобы сохранить регистр букв
Части.Добавить(Новый ФорматированнаяСтрока(Сред(Текст, Позиция, ДлинаИскомого),
ЖирныйШрифт, , ЦветМаркера));
Начало = Позиция + ДлинаИскомого;
КонецЦикла;
Если Начало <= ДлинаТекста Тогда
Части.Добавить(Сред(Текст, Начало));
КонецЕсли;
Возврат Новый ФорматированнаяСтрока(Части);
КонецФункции
&НаКлиенте
Процедура ПодсветитьНайденное(Наименование, СтрокаПоиска)
Если ПустаяСтрока(СтрокаПоиска) Тогда
Элементы.ДекорацияВхождения.Заголовок = Наименование;
Элементы.ДекорацияПоСловам.Заголовок = Наименование;
Возврат;
КонецЕсли;
// Своя функция: любое вхождение, свой цвет
Элементы.ДекорацияВхождения.Заголовок = ВыделитьВхождения(Наименование, СтрокаПоиска);
// Функция платформы 8.3.15+: по началу слов; Неопределено, если не нашлось хотя бы одно слово
Выделено = СтрНайтиИВыделитьОформлением(Наименование, СтрРазделить(СтрокаПоиска, " ", Ложь));
Элементы.ДекорацияПоСловам.Заголовок = ?(Выделено = Неопределено, Наименование, Выделено);
КонецПроцедуры
Новый Шрифт(, , Истина) — третий параметр «Полужирный». Имя и размер не заданы и берутся из стиля, поэтому надпись не выбивается из интерфейса.Части.Добавить(БиблиотекаКартинок.ОформлениеКругЗеленый) — картинка кладётся в массив частей как есть. Значки «ОформлениеКруг…» есть в платформе с 8.3.16."#Ошибки:" + СтрСоединить(…) в пятом параметре — служебная ссылка с данными внутри. Обработчик получает адрес целиком и сам его разбирает, отдельный реквизит формы не нужен.СтандартнаяОбработка = Ложь — только для своих команд. Ссылки https:// и e1cib/ оставьте платформе: в типовых формах БСП у подсказок с такими ссылками обработчика нет вовсе.УстановитьДействие("ОбработкаНавигационнойСсылки", …) — имя события русское, а процедура с параметрами (Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) должна быть в модуле формы.ТекстДляШаблона() — БСП подставляет параметры до разбора тегов, поэтому «<» в наименовании заменяем на <, а функция БСП вернёт его обратно уже как текст.Пока Начало <= ДлинаТекста — защита СтрНайти(): начальная позиция за концом строки вызывает ошибку.ЦветаСтиля и ШрифтыСтиля в тонком и веб-клиенте недоступны. На клиенте берите WebЦвета и Новый Цвет(), собирайте строку на сервере или вызывайте ОбщегоНазначенияКлиент.ЦветСтиля("Имя") из БСП.Высота) и отключите АвтоМаксимальнаяВысота.СтроковыеФункцииКлиентСервер.ФорматированнаяСтрока() узнаёт ссылку только в виде <a href = " — с пробелами вокруг «=».<.style="color: red". В атрибуте пишут имя элемента стиля конфигурации — РезультатПроблемаЦвет, ГиперссылкаЦвет, — а не CSS-цвет. Имя ищется в структуре элементов стиля, и чужое имя даёт ошибку выполнения.СтрНайти() получила начальную позицию больше длины строки — так бывает, когда совпадение стоит в самом конце.БиблиотекаКартинок; картинку из двоичных данных показывайте отдельной декорацией-картинкой.Тип и событие ОбработкаНавигационнойСсылки у надписей появились в 8.3.1. С 8.3.15 строку принимают колонтитулы табличного документа и есть СтрНайтиИВыделитьОформлением(), с 8.3.24 — ячейки и рисунки, с 8.3.27 оформление сохраняют параметры макета.
Нет: свойство Текст у СообщениеПользователю — только строка. Если оформление важно, покажите ПоказатьПредупреждение() с форматированной строкой или выведите надпись на форме.
Передайте форматированную строку вторым параметром: Элементы.Склад.СписокВыбора.Добавить(Значение, Новый ФорматированнаяСтрока("Основной", Новый Шрифт(, , Истина))). По синтаксис-помощнику оформление учитывается только в выпадающем списке поля ввода управляемой формы.
Через ФорматированныйДокумент: УстановитьФорматированнуюСтроку(ФС), затем ПолучитьHTML(ТекстHTML, Вложения): в первый параметр придёт текст HTML, во второй — структура вложенных картинок. Обратный путь — УстановитьHTML() (только на сервере) и ПолучитьФорматированнуюСтроку(); выравнивание, отступы и межстрочный интервал при этом теряются.
Нет, значения типа неизменяемые. Храните исходные данные — числа, признаки, ссылки — и пересобирайте строку целиком. Поэтому в листингах сборка вынесена в процедуры, которые можно вызвать повторно.
Если надпись со статусом, долгом или ссылками нужно встроить в типовую форму документа, да ещё расширением, не снимая конфигурацию с поддержки, проще поручить это программисту. Опишите, что и где должно отображаться, и разместите задание — оценка бесплатная, ответ в течение рабочего дня. Для печатных форм есть отдельная услуга — доработка печатных форм 1С.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.