Как в 1С обрезать длинный текст и добавить многоточие с помощью запроса?

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

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

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

Решение с помощью языка запросов 1С

Хотя автор задачи надеялся на решение без программирования, самый правильный и производительный способ реализовать такую логику — это использовать запрос. Это позволяет переложить всю работу по обработке строк на систему управления базами данных (СУБД), что гораздо быстрее, чем обрабатывать каждую строку в цикле средствами языка 1С. Рассмотрим по шагам, как построить такой запрос.

Для решения нам понадобятся три ключевых элемента языка запросов:

  1. Функция ДЛИНАСТРОКИ() — она возвращает количество символов в строке. С ее помощью мы проверим, нужно ли вообще обрезать наш текст.
  2. Функция ПОДСТРОКА(Строка, НачальнаяПозиция, Длина) — эта функция вырезает из исходной строки фрагмент заданной длины, начиная с указанной позиции. Мы будем использовать ее, чтобы получить первые 50 символов.
  3. Конструкция ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ — это условный оператор в языке запросов, аналог "Если...Тогда...Иначе" в обычном коде. Он позволяет выполнять разные действия в зависимости от условия.

Теперь соберем все вместе. Логика нашего запроса будет следующей: "ВЫБРАТЬ поле, но... КОГДА длина строки в этом поле > 50, ТОГДА взять подстроку из первых 50 символов и прибавить к ней ' ...', ИНАЧЕ (если длина не больше 50) просто взять исходную строку КОНЕЦ".

Посмотрим на итоговый код запроса. Предположим, что наше поле называется ПрочаяИнформация, а находится оно в таблице ТвояТаблица.


ВЫБРАТЬ
    ВЫБОР
        КОГДА ДЛИНАСТРОКИ(ТвояТаблица.ПрочаяИнформация) > 50
            ТОГДА ПОДСТРОКА(ТвояТаблица.ПрочаяИнформация, 1, 50) + " ..."
        ИНАЧЕ ТвояТаблица.ПрочаяИнформация
    КОНЕЦ КАК ПредставлениеПрочейИнформации
ИЗ
    ТвояТаблица КАК ТвояТаблица

Разберем этот код подробнее:

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

Продвинутая задача: как обрезать текст, не разрывая слова?

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

Алгоритм "умной" обрезки выглядит так:

  1. Берем подстроку из первых, скажем, 51 символа.
  2. Ищем в этой подстроке последний символ пробела.
  3. Если пробел найден, обрезаем строку по нему и добавляем многоточие.
  4. Если в первых 50 символах пробелов нет (например, это одно длинное слово или ссылка), то обрезаем "жестко" по 50-му символу.

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

Важный совет: правильное хранение контактной информации

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

Почему это плохо?

Как делать правильно?

В современных конфигурациях 1С для этого существует стандартный механизм — подсистема "Контактная информация" из Библиотеки стандартных подсистем (БСП). Она используется во всех типовых решениях (Бухгалтерия, Управление торговлей, ERP и др.).

Преимущества использования БСП:

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

← На главную