Как реализовать подстановку динамических значений в произвольный текст в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки часто возникает задача формирования динамических сообщений. Пользователь хочет иметь возможность задать произвольный шаблон, например: "Уважаемый {ИмяКлиента}, ваш баланс составляет {Сумма} руб.", а система должна автоматически подставить вместо меток реальные данные из информационной базы. Рассмотрим подробно, как реализовать этот механизм, начиная от простых способов и заканчивая продвинутыми инструментами платформы.

Способ 1. Использование функции СтрЗаменить

Если набор параметров (аргументов) в тексте заранее известен и постоянен, самым простым и надежным способом является использование функции СтрЗаменить. Проанализируем этот подход. Нам не нужно искать позиции вхождения символов вручную, достаточно просто указать, какую подстроку мы ищем и на что хотим ее заменить.

Разберем пример кода, где мы заменяем предопределенные теги в тексте:


ШаблонТекста = "Добрый день, {user_name}. Сумма вашей задолженности: {total} рублей.";
Результат = СтрЗаменить(ШаблонТекста, "{user_name}", Объект.Клиент.Наименование);
Результат = СтрЗаменить(Результат, "{total}", Формат(Объект.СуммаДолга, "ЧДЦ=2"));
Сообщить(Результат);

Преимущества этого метода: простота реализации и высокая скорость работы при небольшом количестве параметров. Недостаток: если тегов много или они добавляются динамически, код становится громоздким из-за множественных вызовов функции.

Способ 2. Поиск вхождений через Найти и Сред

Иногда возникают ситуации, когда мы не знаем точных имен параметров, но знаем, что они всегда заключены в определенные символы (например, в фигурные скобки {}). В этом случае мы можем применить алгоритм последовательного поиска. Рассмотрим, как это работает:

  1. Находим позицию открывающей скобки с помощью Найти.
  2. Находим позицию закрывающей скобки.
  3. Извлекаем текст между ними с помощью функции Сред.
  4. Заменяем найденный фрагмент на значение.

Проанализируем пример такой реализации:


Текст = "Привет, {Имя}! Твой номер: {Номер}";
Пока Найти(Текст, "{") > 0 И Найти(Текст, "}") > 0 Цикл
    ПозНачала = Найти(Текст, "{");
    ПозКонца  = Найти(Текст, "}");
    ДлинаПараметра = ПозКонца - ПозНачала + 1;
    ИмяПараметра = Сред(Текст, ПозНачала, ДлинаПараметра);
    
    // Здесь логика определения значения в зависимости от ИмяПараметра
    Значение = ПолучитьЗначениеПараметра(ИмяПараметра); 
    Текст = СтрЗаменить(Текст, ИмяПараметра, Значение);
КонецЦикла;

Этот метод более гибок, так как позволяет обрабатывать текст с произвольными тегами, которые программа может распознать в теле цикла.

Способ 3. Современный подход с функцией СтрШаблон

Начиная с версии платформы 8.3.6, в 1С появилась замечательная функция СтрШаблон. Она работает аналогично функции printf в языке С или форматированию строк в других языках программирования. Вместо именованных тегов используются маркеры %1, %2 и так далее.

Выясним, в чем удобство этого метода. Посмотрим на пример:


Имя = "Александр";
Долг = 1500;
ТекстСообщения = СтрШаблон("Уважаемый %1, сумма вашего долга: %2 руб.", Имя, Формат(Долг, "ЧГ=0"));

Важный нюанс: СтрШаблон принимает до 10 параметров. Если вам нужно больше, придется использовать другие методы. Этот способ считается наиболее "чистым" с точки зрения кода и рекомендуется для формирования системных сообщений или простых уведомлений.

Способ 4. Правильное форматирование значений

При подстановке данных крайне важно учитывать их тип. Если просто передать число или дату в СтрЗаменить, 1С приведет их к строке по умолчанию, что часто выглядит некрасиво (например, дата с временем 01.01.2023 0:00:00 или число с неразрывными пробелами).

Разберем, как использовать функцию Формат для придания тексту профессионального вида:

Пример интеграции форматирования в шаблон:


Шаблон = "Заказ №%1 от %2 на сумму %3";
Текст = СтрШаблон(Шаблон, Объект.Номер, Формат(Объект.Дата, "ДФ=dd.MM.yyyy"), Формат(Объект.Сумма, "ЧЦ=15; ЧДЦ=2"));

Способ 5. Использование регулярных выражений (VBScript.RegExp)

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

Рассмотрим пример функции, которая находит все теги в фигурных скобках:


RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Истина;
RegExp.Global = Истина;
RegExp.Pattern = "\{([^}]+)\}"; // Ищем текст внутри фигурных скобок

Matches = RegExp.Execute(ИсходныйТекст);
Для Каждого Match Из Matches Цикл
    ПолныйТег = Match.Value;        // Например, "{Сумма}"
    ИмяПараметра = Match.SubMatches(0); // Например, "Сумма"
    
    // Заменяем значение в тексте
    Значение = НайтиЗначениеВСтруктуре(Данные, ИмяПараметра);
    ИсходныйТекст = СтрЗаменить(ИсходныйТекст, ПолныйТег, Значение);
КонецЦикла;

Этот метод незаменим, если вы создаете конструктор рассылок или систему печати произвольных этикеток, где заранее неизвестно, какие поля захочет вывести пользователь.

Рекомендации по реализации интерфейса

Если вы создаете форму, где пользователь сам пишет такой текст, будет хорошим тоном добавить кнопки для вставки доступных параметров. Проанализируем, как это реализовать:

  1. Создайте на форме список доступных полей (например, в виде таблицы или командной панели).
  2. При нажатии на кнопку используйте свойство текстового поля ВыделенныйТекст, чтобы вставить параметр именно туда, где сейчас находится курсор.
  3. Это предотвратит ошибки ручного ввода названий параметров (например, опечатки в слове {user_name}).

Резюме: Для простых задач используйте СтрШаблон. Для замены фиксированного набора слов в пользовательском тексте — СтрЗаменить. Для сложных систем с динамическими наборами параметров — регулярные выражения или механизмы БСП (Библиотеки стандартных подсистем), такие как подсистема "Печать" или "Шаблоны сообщений".

← На главную