Как в СКД создать дополнительные поля на основе анализа текста в комментарии

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

В процессе разработки отчетов на системе компоновки данных (СКД) часто возникает задача классификации данных на основе текстовых полей, которые заполняются пользователями вручную. Типичный пример — поле Комментарий в документе РеализацияТоваровУслуг. Нам необходимо проанализировать содержимое этого поля и, если в нем встречается определенная подстрока (например, "ABC-123"), вывести в отчет соответствующие значения "Поле1" и "Поле2".

В этой статье мы подробно разберем несколько способов решения этой задачи: через язык запросов, через вычисляемые поля СКД и с использованием внешних наборов данных для более сложных случаев.

Способ 1. Использование оператора ПОДОБНО в языке запросов

Самый эффективный способ — реализовать логику непосредственно в запросе СКД. Для поиска подстроки в языке запросов 1С предусмотрен оператор ПОДОБНО (аналог SQL-оператора LIKE). Основным инструментом здесь выступает символ процента %, который заменяет любую последовательность символов.

Рассмотрим по шагам, как составить конструкцию ВЫБОР КОГДА для нашего случая. Проанализируем ситуацию, когда нам нужно выделить цех на основе кода в комментарии:


ВЫБРАТЬ
    РеализацияТоваровУслуг.Ссылка КАК Ссылка,
    ВЫБОР
        КОГДА РеализацияТоваровУслуг.Комментарий ПОДОБНО "%ABC-123%"
            ТОГДА "ABC-123"
        КОГДА РеализацияТоваровУслуг.Комментарий ПОДОБНО "%ABC-321%"
            ТОГДА "ABC-321"
        ИНАЧЕ "Прочее"
    КОНЕЦ КАК Поле1,
    ВЫБОР
        КОГДА РеализацияТоваровУслуг.Комментарий ПОДОБНО "%ABC-123%"
            ТОГДА "Цех пива"
        КОГДА РеализацияТоваровУслуг.Комментарий ПОДОБНО "%ABC-321%"
            ТОГДА "Цех водки"
        ИНАЧЕ "Не определено"
    КОНЕЦ КАК Поле2
ИЗ
    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

Важные нюансы работы с ПОДОБНО:

  1. Расположение процентов: Конструкция "%Текст%" означает, что подстрока будет найдена в любом месте комментария (в начале, в середине или в конце). Если вы точно знаете, что код всегда идет в начале комментария, лучше использовать "ABC-123%" — это значительно ускорит работу запроса на больших базах данных.
  2. Регистрозависимость: В зависимости от настроек вашей СУБД (MS SQL Server или PostgreSQL), поиск может быть чувствителен к регистру. Чтобы отчет работал стабильно, рекомендуем приводить поле к верхнему регистру с помощью функции ВРЕГ: ВРЕГ(РеализацияТоваровУслуг.Комментарий) ПОДОБНО "%ABC-123%".
  3. Поля неограниченной длины: Поле Комментарий часто имеет неограниченную длину. В некоторых случаях это может привести к ошибкам в запросе. Чтобы избежать этого, используйте функцию ВЫРАЗИТЬ: ВЫРАЗИТЬ(РеализацияТоваровУслуг.Комментарий КАК СТРОКА(250)).

Способ 2. Функции языка выражений СКД (Вычисляемые поля)

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

Рассмотрим алгоритм настройки:

  1. Перейдите на закладку «Вычисляемые поля».
  2. Добавьте новое поле, например НазваниеЦеха.
  3. В колонке «Выражение» напишите логическое условие:

Выбор 
    Когда Найти(Комментарий, "ABC-123") > 0 Тогда "Цех пива" 
    Когда Найти(Комментарий, "ABC-321") > 0 Тогда "Цех водки" 
    Иначе "Другой цех" 
Конец

Преимущество этого метода в том, что он работает быстрее при разработке (не нужно переписывать запрос), но на огромных объемах данных (миллионы строк) он может уступать в производительности первому способу.

Способ 3. Использование специальных символов и масок

Иногда требуется найти строку по более сложной маске. Оператор ПОДОБНО поддерживает специальные символы, которые полезно знать:

Если в вашем тексте комментария встречаются сами символы % или _, и вам нужно найти именно их, используйте ключевое слово СПЕЦСИМВОЛ (ESCAPE):


ГДЕ Комментарий ПОДОБНО "%10#%%" СПЕЦСИМВОЛ "#"

Этот запрос найдет строки, содержащие текст "10%".

Способ 4. Внешний набор данных для больших таблиц сопоставления

Проанализируем ситуацию, когда у вас в Excel-таблице не 2 цеха, а 200. Прописывать 200 строк ВЫБОР КОГДА в запросе — плохая практика, которую трудно поддерживать. В этом случае правильнее будет загрузить таблицу из Excel в Таблицу Значений и передать ее в СКД как внешний набор данных.

Выясним причину, почему это лучше: вы сможете связать основной запрос и таблицу из Excel в самой СКД на закладке «Связи наборов данных». Однако, стандартная связь в СКД работает только по равенству. Если нужно именно условие "содержит", придется применить небольшую хитрость в коде 1С перед выводом отчета: программно обработать данные и добавить результат поиска в таблицу перед передачей в компоновщик.

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

Посмотрим на техническую сторону вопроса индексации. При поиске по строке СУБД использует индексы только в том случае, если поиск идет по началу строки. Как только вы ставите символ % в начале шаблона ("%ABC%"), система вынуждена выполнять полное сканирование таблицы (Full Table Scan). Если ваша таблица документов содержит сотни тысяч записей, такой отчет может "повесить" сервер.

Как оптимизировать:

Подводя итог, для разового мелкого отчета связка ВЫБОР КОГДА ... ПОДОБНО является оптимальным и быстрым решением. Для масштабных систем лучше использовать вынос логики классификации в отдельные реквизиты объектов.

← На главную