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