В этой статье разберем частую задачу для начинающих разработчиков: как вывести в отчете или в списке только часть длинной текстовой строки, а в конце добавить многоточие, если строка была обрезана. Проанализируем, как это сделать наиболее эффективно с помощью языка запросов 1С, а также коснемся более продвинутых техник и лучших практик хранения данных.
Исходная задача звучит так: есть поле с текстом, например, "Прочая информация". Если длина этого текста превышает 50 символов, нужно отобразить только первые 50, добавив в конце " ...". Если текст короче или равен 50 символам, он должен отображаться полностью.
Хотя автор задачи надеялся на решение без программирования, самый правильный и производительный способ реализовать такую логику — это использовать запрос. Это позволяет переложить всю работу по обработке строк на систему управления базами данных (СУБД), что гораздо быстрее, чем обрабатывать каждую строку в цикле средствами языка 1С. Рассмотрим по шагам, как построить такой запрос.
Для решения нам понадобятся три ключевых элемента языка запросов:
ДЛИНАСТРОКИ() — она возвращает количество символов в строке. С ее помощью мы проверим, нужно ли вообще обрезать наш текст.ПОДСТРОКА(Строка, НачальнаяПозиция, Длина) — эта функция вырезает из исходной строки фрагмент заданной длины, начиная с указанной позиции. Мы будем использовать ее, чтобы получить первые 50 символов.ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ — это условный оператор в языке запросов, аналог "Если...Тогда...Иначе" в обычном коде. Он позволяет выполнять разные действия в зависимости от условия.Теперь соберем все вместе. Логика нашего запроса будет следующей: "ВЫБРАТЬ поле, но... КОГДА длина строки в этом поле > 50, ТОГДА взять подстроку из первых 50 символов и прибавить к ней ' ...', ИНАЧЕ (если длина не больше 50) просто взять исходную строку КОНЕЦ".
Посмотрим на итоговый код запроса. Предположим, что наше поле называется ПрочаяИнформация, а находится оно в таблице ТвояТаблица.
ВЫБРАТЬ
ВЫБОР
КОГДА ДЛИНАСТРОКИ(ТвояТаблица.ПрочаяИнформация) > 50
ТОГДА ПОДСТРОКА(ТвояТаблица.ПрочаяИнформация, 1, 50) + " ..."
ИНАЧЕ ТвояТаблица.ПрочаяИнформация
КОНЕЦ КАК ПредставлениеПрочейИнформации
ИЗ
ТвояТаблица КАК ТвояТаблица
Разберем этот код подробнее:
ВЫБОР ... КОНЕЦ КАК ПредставлениеПрочейИнформации: Мы создаем новое вычисляемое поле с псевдонимом ПредставлениеПрочейИнформации. Именно это поле вы будете использовать для вывода в отчете или в динамическом списке.КОГДА ДЛИНАСТРОКИ(ТвояТаблица.ПрочаяИнформация) > 50: Это наше условие. Проверяем, превышает ли длина строки 50 символов.ТОГДА ПОДСТРОКА(ТвояТаблица.ПрочаяИнформация, 1, 50) + " ...": Это действие, если условие истинно. Мы берем первые 50 символов функцией ПОДСТРОКА и с помощью оператора + (конкатенация строк) добавляем в конец пробел и многоточие. В итоге, согласно задаче, может получиться строка длиной до 54 символов.ИНАЧЕ ТвояТаблица.ПрочаяИнформация: Это действие выполняется, если условие ложно. Мы просто возвращаем исходное значение поля без изменений.Этот код можно использовать в конструкторе запросов, в качестве источника данных для отчета в Системе компоновки данных (СКД) или для динамического списка на форме. В СКД такое выражение можно написать прямо в вычисляемом поле на соответствующей закладке.
Наше базовое решение работает, но у него есть эстетический недостаток: оно может обрезать слово на полуслове, например: "Для получения дополнительной информац...". Это выглядит не очень аккуратно. Чтобы этого избежать, можно усложнить логику.
Алгоритм "умной" обрезки выглядит так:
Важный момент: реализовать такую логику в запросе 1С стандартными средствами практически невозможно. Для этого потребуется писать отдельную функцию на встроенном языке 1С, например, в общем модуле, и вызывать ее для форматирования текста уже после получения данных из базы. Это более сложный путь, который выходит за рамки первоначальной задачи, но о нем полезно знать для создания более качественных пользовательских интерфейсов.
В ходе обсуждения задачи был дан самый ценный совет, особенно для начинающих разработчиков. Проблема хранения телефонов, адресов и другой контактной информации в одном общем текстовом поле "Прочая информация" — это плохая практика проектирования баз данных.
Почему это плохо?
Как делать правильно?
В современных конфигурациях 1С для этого существует стандартный механизм — подсистема "Контактная информация" из Библиотеки стандартных подсистем (БСП). Она используется во всех типовых решениях (Бухгалтерия, Управление торговлей, ERP и др.).
Преимущества использования БСП:
Таким образом, хотя задача по обрезке строки является отличным упражнением, в реальных проектах всегда стремитесь к правильной организации данных. Если вы столкнулись с необходимостью обрезать строку с контактами, возможно, первым шагом должен быть не запрос, а рефакторинг структуры хранения этой информации.