Работа со строковыми данными в платформе 1С:Предприятие является одной из самых частых задач для разработчика. Часто возникает необходимость ограничить длину текстового поля, чтобы оно поместилось в печатную форму, соответствовало регламенту обмена или просто выглядело эстетично в интерфейсе. Понимание того, как сократить строку в 1С, критически важно для написания чистого и производительного кода.

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

Обрезка строки до заданной длины

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

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

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

Рассмотрим пример использования в коде:

ИсходнаяСтрока = "Длинное название номенклатурного элемента";

Сокращенная = Лев(ИсходнаяСтрока, 20);

// Результат: "Длинное название ном"

⚠️ Внимание: При использовании функций усечения (Лев, Прав) слово может быть разорвано посередине. Если важна целостность слов, потребуется дополнительная логика поиска последнего пробела.
💡

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

Удаление лишних пробелов и пустых символов

Часто под "сокращением" строки пользователи подразумевают очистку от лишних пробелов, которые могли появиться в результате ввода данных пользователем или импорта из внешних источников. В языке 1С для этого предусмотрен мощный набор функций семейства Сокр. Они не меняют длину полезного текста, но убирают "мусор" по краям.

Функция СокрЛ удаляет пробелы слева. Это стандартная процедура при обработке данных, введенных вручную, так как пользователи часто случайно ставят пробел перед началом текста. Функция СокрП делает то же самое, но справа. Наиболее универсальной является СокрЛП, которая удаляет пробелы с обеих сторон одновременно.

Важно понимать разницу между усечением длины и сокращением пробелов. Если вы передадите в функцию СокрЛП строку длиной 100 символов, где 50 из них — пробелы в конце, результат будет содержать только полезные 50 символов. Длина строки физически уменьшится.

  • 🧹 СокрЛ — удаляет лидирующие пробелы, оставляя хвост нетронутым.
  • 🧹 СокрП — удаляет завершающие пробелы, полезно для выравнивания.
  • 🧹 СокрЛП — полная очистка от краевых пробелов, самый частый выбор.

Использование этих функций обязательно при сравнении строк. Две строки с одинаковым текстом, но разным количеством пробелов, будут считаться разными при прямом сравнении оператором =.

📊 Какую функцию очистки вы используете чаще?
СокрЛП
СокрЛ
СокрП
Не использую, чищу в SQL

Сравнение методов обработки строк

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

Функция Назначение Влияние на длину Пример результата
Лев(Строка, N) Обрезка справа Уменьшает до N "Привет" (из "Привет Мир")
СокрЛП(Строка) Удаление пробелов Уменьшает на кол-во пробелов "Текст" (из " Текст ")
СтрЗаменить Замена подстроки Меняется динамически "Т-ст" (замена "ек" на "-")
СтрЧислоСтрок Подсчет строк Не меняет строку Возвращает число

При работе с большими массивами данных производительность этих функций может играть роль. Однако для разовых операций или обработки небольших справочников разница во времени выполнения будет незаметна для пользователя. Главное — логическая корректность результата.

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

💡

Функции семейства Сокр удаляют только обычные пробелы. Для удаления табуляции или спецсимволов используйте СтрЗаменить.

Работа со строками в запросах 1С

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

В тексте запроса функции вызываются так же, как и в коде. Однако важно помнить о контексте выполнения. Если вы используете виртуальную таблицу или сложное объединение, убедитесь, что тип поля действительно строковый. Попытка применить функцию к числу или дате приведет к ошибке выполнения.

ВЫБРАТЬ

Номенклатура.Наименование КАК ПолноеИмя,

ЛЕВ(Номенклатура.Наименование, 30) КАК КраткоеИмя

ИЗ

Справочник.Номенклатура КАК Номенклатура

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

Однако чрезмерное использование функций в выборке запроса может затруднить использование индексов. Если условие отбора (в блоке ГДЕ) накладывается на результат функции, индекс по исходному полю может не сработать. В таких случаях лучше отбирать данные как есть, а сокращать их уже после выборки.

⚠️ Внимание: Интерфейс и возможности конструктора запросов могут меняться в новых версиях платформы 1С. Всегда проверяйте доступность функций в вашей конкретной конфигурации.

Продвинутое усечение с сохранением слов

Стандартная функция Лев безжалостно обрывает текст, что часто приводит к нечитаемым фразам вроде "Покупатель опла..." вместо "Покупатель оплатил". Для пользовательских интерфейсов важно сохранять целостность слов. Для этого требуется алгоритмический подход.

Логика такого сокращения следующая: мы обрезаем строку до нужной длины, а затем ищем последний пробел в полученном фрагменте. Все, что после этого пробела, удаляется. Если пробелов нет (одно длинное слово), то обрезаем как есть или добавляем многоточие.

Реализация такой функции требует использования СтрНайти в цикле или с конца строки. Это чуть более ресурсоемкая операция, но она значительно улучшает восприятие информации пользователем. В веб-клиенте такие операции выполняются достаточно быстро.

Пример кода умного сокращения

Функция СокрСтрокуПоСлову(Текст, Длина)

Если СтрДлина(Текст) <= Длина Тогда

Возврат Текст;

КонецЕсли;

Подстрока = Лев(Текст, Длина);

ПозицияПробела = СтрНайти(Подстрока, " ", Поиск.СКонца);

Если ПозицияПробела > 0 Тогда

Возврат Лев(Подстрока, ПозицияПробела - 1) + "...";

Иначе

Возврат Подстрока + "...";

КонецЕсли;

КонецФункции

Типичные ошибки при работе с текстом

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

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

  • Ошибка присваивания: забыли записать результат функции в переменную.
  • Игнорирование Null: передача пустой ссылки в функцию обрезки вызовет исключение.
  • Неверная длина: указание отрицательной длины в функциях усечения.

Всегда проверяйте переменную на пустоту перед выполнением операций. Использование конструкции Если ЗначениеЗаполнено(Строка) Тогда... спасет ваш код от падений при обработке некорректных данных из внешних источников.

☑️ Проверка перед сокращением

Выполнено: 0 / 4

Оптимизация и производительность

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

Если вам нужно просто обрезать строку, всегда используйте встроенные Лев или Прав. Не пытайтесь реализовать это через цикл Для и конкатенацию символов — это будет работать в разы медленнее. Платформа оптимизирована для работы со своими стандартными функциями.

В случае, если логика сокращения очень сложная и требует множества проверок, рассмотрите возможность вынесения этой логики на уровень базы данных (если используется MS SQL или PostgreSQL) через хранимые процедуры, хотя это и усложнит поддержку конфигурации.

Как сократить строку, если она содержит HTML-теги?

Если строка содержит HTML-разметку, простое усечение может нарушить структуру тега (например, обрезать <b>Текс). В этом случае необходимо сначала очистить строку от тегов с помощью регулярных выражений или специальной функции, сократить чистый текст, а затем, при необходимости, вернуть базовую разметку.

Что делать, если нужно сократить строку до байт, а не символов?

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

Можно ли сократить строку в СКД (Схема Компоновки Данных)?

Да, в выражениях СКД доступны все стандартные функции языка 1С, включая Лев, СокрЛП и другие. Вы можете прописать формулу прямо в настройках поля вывода отчета.

Как удалить все пробелы внутри строки, а не только по краям?

Для удаления внутренних пробелов используйте функцию СтрЗаменить(Строка, " ", ""). Она заменит все вхождения пробела на пустую строку, склеив текст в одно слово.

Влияет ли сокращение строки на индексацию поиска?

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