При разработке отчетов или обработок на платформе 1С:Предприятие часто возникает задача отфильтровать или подсчитать данные по текстовому признаку в наименовании объекта. Давайте разберемся, как реализовать такой поиск с помощью языка запросов, какие ошибки при этом совершаются и какой подход является профессиональным.
Для поиска вхождений подстроки в поле типа строка (например, в поле Наименование) в языке запросов 1С используется оператор ПОДОБНО. Этот оператор позволяет задавать шаблоны поиска с использованием спецсимволов.
Рассмотрим основной синтаксис:
ВЫБРАТЬ
Сотрудники.Ссылка
ИЗ
Справочник.Сотрудники КАК Сотрудники
ГДЕ
Сотрудники.Наименование ПОДОБНО "%(осн)%"
Символ % (процент) в данном шаблоне означает последовательность любых символов произвольной длины. Если мы ставим % с обеих сторон от искомого текста, система найдет все записи, в которых эта подстрока встречается в любой части наименования.
Важно помнить основные спецсимволы шаблонов 1С:
% — любая последовательность символов._ — любой одиночный символ.[...] — любой символ из перечисленных в скобках или диапазон (например, [а-я]).[^...] — любой символ, кроме перечисленных в скобках.Частая ошибка начинающих разработчиков — попытка выполнить отбор по полю Представление. Важно уяснить: поле Представление в запросе — это не всегда физически хранящиеся данные. В ряде случаев оно вычисляется динамически «на лету» в момент формирования выборки на основе настроек конфигурации.
Если вы видите в интерфейсе программы строку «Иванов И.И. (осн.)», это не означает, что текст «(осн.)» физически записан в реквизите Наименование элемента справочника. Скорее всего, система формирует его автоматически. Запрос к базе данных всегда работает с физическими таблицами, поэтому отбор по Представление в таких случаях не вернет результатов.
Если вам нужно не просто отобрать записи, а произвести подсчет, используйте конструкцию ВЫБОР КОГДА внутри функции агрегирования СУММА. Это позволит получить количество строк, удовлетворяющих условию.
Давайте посмотрим, как это выглядит в коде:
ВЫБРАТЬ
СУММА(ВЫБОР
КОГДА Сотрудник.Наименование ПОДОБНО "%(осн)%" ТОГДА 1
ИНАЧЕ 0
КОНЕЦ) КАК КоличествоОсновных
ИЗ
РегистрНакопления.ДанныеТабельногоУчетаРабочегоВремениСотрудников.Обороты КАК Данные
Использование анализа текстовых строк (парсинг наименований) считается «плохой практикой» в программировании на 1С. Такой код становится крайне хрупким: если пользователь изменит формат наименования, весь ваш отчет перестанет работать.
В типовых конфигурациях, таких как 1С:Зарплата и Управление Персоналом, статус сотрудника или вид его занятости всегда хранятся в специализированных регистрах или реквизитах. Вместо того чтобы «вычислять» основное место работы по скобочкам в названии, мы рекомендуем:
Сотрудники и найти там реквизиты, отвечающие за вид занятости или состояние сотрудника.КадровыеДанныеСотрудников, где хранится актуальная информация о статусе работника.ВидЗанятости), которые гарантированно содержат нужные состояния.Применяя такие методы, вы делаете свое решение устойчивым к изменениям, профессиональным и легким в поддержке. Всегда старайтесь опираться на структуру данных конфигурации, а не на визуальное отображение текста для пользователя.