Как обрезать текст по количеству слов для вывода в макет 1С?

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

При формировании печатных форм и табличных документов часто возникает необходимость обрезать слишком длинное наименование или описание, оставив только первые N слов (например, первые 2 или 3 слова). Рассмотрим, почему эту задачу нельзя решить только средствами макета, и разберем практические способы обработки строк на встроенном языке 1С.

Ограничения платформы 1С при работе со строками

Прежде чем переходить к написанию кода, проанализируем имеющиеся ограничения платформы:

  1. Отсутствие стандартного маскирования по словам: Встроенная функция Формат() и свойства макета предназначены для форматирования чисел, дат и фиксированной длины строк, но не умеют считать слова.
  2. Ограничения свойств ячейки: Свойство ячейки РазмещениеТекста (варианты Переносить, Забивать, Авто) отвечает за визуальное отображение текста в границах таблицы, но не удаляет лишние слова из самой строки данных.
  3. Ограничения языка запросов: В запросах 1С нет регулярных выражений и функций для динамического разделения строки на массив по пробелам. Поэтому обрезку текста эффективнее проводить во встроенном языке (BSL) перед заполнением параметров макета.

Способ 1: Использование функций СтрРазделить и СтрСоединить

Разберем наиболее наглядный и верный подход. Алгоритм заключается в том, чтобы разбить исходную строку на массив слов по разделителю (пробелу), взять первые элементы и объединить их обратно в строку.

Рассмотрим пример функции:


Функция ПолучитьПервыеСлова(ИсходныйТекст, КоличествоСлов)
    
    // Разбиваем строку на массив слов по пробелу
    МассивСлов = СтрРазделить(ИсходныйТекст, " ", Ложь);
    
    // Если в строке меньше или столько же слов, сколько нужно — возвращаем исходную строку
    Если МассивСлов.Количество() <= КоличествоСлов Тогда
        Возврат ИсходныйТекст;
    КонецЕсли;
    
    // Формируем новый массив с нужным количеством элементов
    РезультатМассив = Новый Массив;
    Для Индекс = 0 По КоличествоСлов - 1 Цикл
        РезультатМассив.Добавить(МассивСлов[Индекс]);
    КонецЦикла;
    
    // Объединяем выбранные слова обратно через пробел
    Возврат СтрСоединить(РезультатМассив, " ");
    
КонецФункции

Способ 2: Поиск позиции N-го пробела через СтрНайти

Если требуется оптимизировать производительность и избежать создания лишних массивов, можно воспользоваться поиском позиции разделителя. Функция СтрНайти позволяет указать параметр НомерВхождения, с помощью которого можно сразу найти позицию N-го пробела в строке.

Посмотрим на реализацию данного метода:


Функция ОбрезатьТекстПоПробелу(ИсходныйТекст, КоличествоСлов)
    
    // Находим позицию пробела, следующего за нужным словом
    ПозицияПробела = СтрНайти(ИсходныйТекст, " ", ,, КоличествоСлов);
    
    // Если позиция найдена, берем левую часть строки
    Если ПозицияПробела > 0 Тогда
        Возврат Лев(ИсходныйТекст, ПозицияПробела - 1);
    Иначе
        // Пробелов меньше, чем требуемое количество слов
        Возврат ИсходныйТекст;
    КонецЕсли;
    
КонецФункции

Способ 3: Использование функций БСП

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

Проанализируем пример кода с БСП:


МассивСлов = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИсходныйТекст, " ");
Если МассивСлов.Количество() > НужноеКоличество Тогда
    // Обработка массива и сборка итоговой строки
КонецЕсли;

Динамический выбор количества слов в зависимости от условий

Выясним, как обработать ситуацию, когда для разных строк требуется разное количество выводимых слов (например, в одном случае нужно оставить 2 слова, а в другом — 3 слова).

Для этого логику условия выносят на уровень заполнения параметров макета:


// Пример динамической обработки перед выводом в ТабличныйДокумент
Для Каждого СтрИзДанных Из ТаблицаВыгрузки Цикл
    
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    
    Если СтрИзДанных.ТипТекста = Перечисления.ТипыТекста.Короткий Тогда
        КоличествоСлов = 2;
    Иначе
        КоличествоСлов = 3;
    КонецЕсли;
    
    ОбластьСтрока.Параметры.ТекстШапки = ПолучитьПервыеСлова(СтрИзДанных.Наименование, КоличествоСлов);
    ТабДок.Вывести(ОбластьСтрока);
    
КонецЦикла;

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

← На главную