В процессе разработки отчетов на системе компоновки данных (СКД) часто возникает задача классификации данных на основе текстовых полей, которые заполняются пользователями вручную. Типичный пример — поле Комментарий в документе РеализацияТоваровУслуг. Нам необходимо проанализировать содержимое этого поля и, если в нем встречается определенная подстрока (например, "ABC-123"), вывести в отчет соответствующие значения "Поле1" и "Поле2".
В этой статье мы подробно разберем несколько способов решения этой задачи: через язык запросов, через вычисляемые поля СКД и с использованием внешних наборов данных для более сложных случаев.
Самый эффективный способ — реализовать логику непосредственно в запросе СКД. Для поиска подстроки в языке запросов 1С предусмотрен оператор ПОДОБНО (аналог SQL-оператора LIKE). Основным инструментом здесь выступает символ процента %, который заменяет любую последовательность символов.
Рассмотрим по шагам, как составить конструкцию ВЫБОР КОГДА для нашего случая. Проанализируем ситуацию, когда нам нужно выделить цех на основе кода в комментарии:
ВЫБРАТЬ
РеализацияТоваровУслуг.Ссылка КАК Ссылка,
ВЫБОР
КОГДА РеализацияТоваровУслуг.Комментарий ПОДОБНО "%ABC-123%"
ТОГДА "ABC-123"
КОГДА РеализацияТоваровУслуг.Комментарий ПОДОБНО "%ABC-321%"
ТОГДА "ABC-321"
ИНАЧЕ "Прочее"
КОНЕЦ КАК Поле1,
ВЫБОР
КОГДА РеализацияТоваровУслуг.Комментарий ПОДОБНО "%ABC-123%"
ТОГДА "Цех пива"
КОГДА РеализацияТоваровУслуг.Комментарий ПОДОБНО "%ABC-321%"
ТОГДА "Цех водки"
ИНАЧЕ "Не определено"
КОНЕЦ КАК Поле2
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
Важные нюансы работы с ПОДОБНО:
"%Текст%" означает, что подстрока будет найдена в любом месте комментария (в начале, в середине или в конце). Если вы точно знаете, что код всегда идет в начале комментария, лучше использовать "ABC-123%" — это значительно ускорит работу запроса на больших базах данных.ВРЕГ: ВРЕГ(РеализацияТоваровУслуг.Комментарий) ПОДОБНО "%ABC-123%".Комментарий часто имеет неограниченную длину. В некоторых случаях это может привести к ошибкам в запросе. Чтобы избежать этого, используйте функцию ВЫРАЗИТЬ: ВЫРАЗИТЬ(РеализацияТоваровУслуг.Комментарий КАК СТРОКА(250)).Если вы не хотите усложнять текст запроса или логика сопоставления должна применяться уже к результатам компоновки, можно воспользоваться вкладкой «Вычисляемые поля» в конструкторе СКД. Здесь доступна функция Найти(), которая возвращает позицию вхождения искомой строки.
Рассмотрим алгоритм настройки:
НазваниеЦеха.
Выбор
Когда Найти(Комментарий, "ABC-123") > 0 Тогда "Цех пива"
Когда Найти(Комментарий, "ABC-321") > 0 Тогда "Цех водки"
Иначе "Другой цех"
Конец
Преимущество этого метода в том, что он работает быстрее при разработке (не нужно переписывать запрос), но на огромных объемах данных (миллионы строк) он может уступать в производительности первому способу.
Иногда требуется найти строку по более сложной маске. Оператор ПОДОБНО поддерживает специальные символы, которые полезно знать:
_ (нижнее подчеркивание) — заменяет ровно один произвольный символ. Полезно, если структура кода жестко задана, например "ABC-_23" найдет и 123, и 223.[ ] (квадратные скобки) — позволяют искать любой одиночный символ из набора. Например, "ABC-[12]%" найдет комментарии, начинающиеся на ABC-1 или ABC-2.[^ ] — исключение символов.Если в вашем тексте комментария встречаются сами символы % или _, и вам нужно найти именно их, используйте ключевое слово СПЕЦСИМВОЛ (ESCAPE):
ГДЕ Комментарий ПОДОБНО "%10#%%" СПЕЦСИМВОЛ "#"
Этот запрос найдет строки, содержащие текст "10%".
Проанализируем ситуацию, когда у вас в Excel-таблице не 2 цеха, а 200. Прописывать 200 строк ВЫБОР КОГДА в запросе — плохая практика, которую трудно поддерживать. В этом случае правильнее будет загрузить таблицу из Excel в Таблицу Значений и передать ее в СКД как внешний набор данных.
Выясним причину, почему это лучше: вы сможете связать основной запрос и таблицу из Excel в самой СКД на закладке «Связи наборов данных». Однако, стандартная связь в СКД работает только по равенству. Если нужно именно условие "содержит", придется применить небольшую хитрость в коде 1С перед выводом отчета: программно обработать данные и добавить результат поиска в таблицу перед передачей в компоновщик.
Посмотрим на техническую сторону вопроса индексации. При поиске по строке СУБД использует индексы только в том случае, если поиск идет по началу строки. Как только вы ставите символ % в начале шаблона ("%ABC%"), система вынуждена выполнять полное сканирование таблицы (Full Table Scan). Если ваша таблица документов содержит сотни тысяч записей, такой отчет может "повесить" сервер.
Как оптимизировать:
ПОДОБНО "ABC-123%".Подводя итог, для разового мелкого отчета связка ВЫБОР КОГДА ... ПОДОБНО является оптимальным и быстрым решением. Для масштабных систем лучше использовать вынос логики классификации в отдельные реквизиты объектов.