При разработке сложных отчетов или обработок в платформе 1С:Предприятие 8 разработчики часто сталкиваются с необходимостью выборки данных не по точному совпадению, а по наличию определенной части текста в поле. Стандартный оператор сравнения «=» здесь бессилен, так как он требует полного соответствия значения. Именно в таких ситуациях на сцену выходит мощный инструмент языка запросов — оператор ПОДОБНО. Он позволяет реализовывать логику поиска «содержит», «начинается с» или «заканчивается на», используя специальные символы-маски.

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

Базовый синтаксис оператора ПОДОБНО

Оператор ПОДОБНО в языке запросов 1С выполняет сравнение строкового значения с шаблоном. Шаблон представляет собой строку, содержащую обычные символы и специальные знаки, которые интерпретируются системой особым образом. Синтаксически конструкция выглядит следующим образом: Поле ПОДОБНО "Шаблон". Если значение поля соответствует шаблону с учетом масок, условие считается истинным.

Главным отличием от SQL-диалектов других СУБД является набор используемых спецсимволов. В 1С звездочка * заменяет любую последовательность символов любой длины (включая пустую строку), а знак вопроса ? заменяет ровно один любой символ. Это позволяет гибко настраивать критерии отбора. Например, чтобы найти все товары, в названии которых встречается слово "кабель", достаточно использовать маску "кабель".

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

💡

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

Специальные символы и маски поиска

Эффективность поиска напрямую зависит от правильного комбинирования спецсимволов. Звездочка * является наиболее универсальным инструментом. Она может стоять в начале, в конце или в середине шаблона. Если звездочка стоит в начале ("текст"), система ищет строки, заканчивающиеся на указанную последовательность. Если в конце ("текст"), поиск идет по началу строки.

Знак вопроса ? полезен для случаев, когда количество неизвестных символов строго фиксировано. Например, при поиске артикулов определенной длины или кодов, где известны только некоторые позиции. Комбинация этих символов позволяет создавать сложные фильтры. Допустим, нам нужно найти документы, номер которых начинается на "А", затем идет любой символ, а заканчивается на "01". Шаблон будет выглядеть как "А?01".

Отдельного внимания заслуживает поиск самих спецсимволов. Если в данных реально содержится звездочка или вопрос, их необходимо экранировать. Для этого используется символ тильды ~. Чтобы найти строку "Цена?", шаблон должен быть записан как "Цена~?". Без экранирования система воспримет вопрос как маску для любого символа.

  • 🔍 Звездочка (*) — заменяет любое количество любых символов (0 и более).
  • Вопрос (?) — заменяет ровно один любой символ.
  • 🛡️ Тильда (~) — экранирует спецсимволы, позволяя искать их как обычные знаки.
  • 📦 Квадратные скобки ([]) — задают диапазон или набор допустимых символов для одной позиции.
Как искать тильду в тексте?

Если вам необходимо найти сам символ тильды в строке данных, его также нужно экранировать. Используйте двойную тильду "~~" в шаблоне поиска. Например, шаблон "А~~Б" найдет строку "А~Б".

Примеры использования в коде запроса

Рассмотрим практическое применение оператора в реальном коде. Чаще всего задача «содержит» решается обрамлением искомого слова звездочками с обеих сторон. Ниже приведен пример запроса к регистру сведений или справочнику, где осуществляется фильтрация по наименованию контрагента.

ВЫБРАТЬ

Контрагенты.Ссылка,

Контрагенты.Наименование

ИЗ

Справочник.Контрагенты КАК Контрагенты

ГДЕ

Контрагенты.Наименование ПОДОБНО "ООО"

И Контрагенты.ЭтоГруппа = ЛОЖЬ

В данном примере система выберет всех контрагентов, у которых в названии есть аббревиатура "ООО" в любом месте строки. Если же требуется найти организации, название которых начинается строго с "ИП", шаблон изменится на "ИП*". Для поиска по окончанию, например, всех счетов с номером, заканчивающимся на "005", используется маска "*005".

При формировании динамических запросов в встроенном языке 1С переменные с масками передаются так же, как и обычные строки. Однако стоит быть осторожным при конкатенации строк. Убедитесь, что звездочки добавляются корректно и не теряются при сборке текста запроса программно.

☑️ Проверка шаблона поиска

Выполнено: 0 / 4

Использование диапазонов в квадратных скобках

Менее известный, но мощный функционал оператора ПОДОБНО — использование квадратных скобок для задания множеств символов. Внутри скобок можно перечислить конкретные символы через запятую или задать диапазон через дефис. Это позволяет заменять сложные конструкции с оператором ИЛИ на одну компактную маску.

Например, если необходимо выбрать номенклатуру, артикул которой начинается с букв от "А" до "Г", можно использовать шаблон "[А-Г]". Аналогично работает поиск по набору: шаблон "[ИП,ООО]" найдет строки, начинающиеся либо с "ИП", либо с "ООО". Эта возможность особенно полезна при фильтрации кодов или классификаторов.

Стоит отметить, что внутри квадратных скобок спецсимволы * и ? теряют свое специальное значение и воспринимаются как обычные символы, если только они не являются частью диапазона. Однако для надежности лучше экранировать их тильдой, если есть вероятность их появления в данных.

⚠️ Внимание: Использование диапазонов в квадратных скобках может по-разному работать в зависимости от версии платформы 1С и типа используемой СУБД (файловый вариант, SQL Server, PostgreSQL). Всегда тестируйте такие запросы на целевом сервере.

Производительность и влияние на индексы

Вопрос производительности при использовании оператора ПОДОБНО является одним из самых критичных. Механизм индексации в 1С и underlying СУБД оптимизирован для поиска по началу строки. Если маска начинается со звездочки (например, "*слово"), база данных часто вынуждена выполнять полное сканирование таблицы (Full Table Scan), так как индекс не может быть эффективно использован для поиска подстроки в середине или конце.

Если же шаблон начинается с конкретного символа или последовательности (например, "Слово*"), оптимизатор запросов с высокой вероятностью использует индекс по соответствующему полю. Это обеспечивает мгновенный выборку даже из миллионов записей. Поэтому, проектируя отчеты, старайтесь избегать масок, начинающихся со звездочки, если объем данных велик.

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

Тип шаблона Пример Использование индекса Рекомендация
Начинается с... "АБВ*" Высокое (Быстро) Рекомендуется для больших баз
Содержит... "АБВ" Низкое (Медленно) Использовать с осторожностью
Заканчивается на... "*АБВ" Низкое (Медленно) Избегать на больших объемах
Фиксированная длина "А?В" Среднее Зависит от селективности
💡

Поиск по началу строки ("Текст*") всегда быстрее поиска по содержимому ("Текст"), так как первый вариант позволяет использовать индекс поля, а второй часто требует полного перебора таблицы.

Альтернативные методы поиска подстроки

В некоторых случаях оператор ПОДОБНО может быть избыточен или неудобен. Язык запросов 1С предоставляет функцию СТРНАЙТИ(), которая возвращает позицию вхождения одной строки в другую. Если подстрока найдена, функция вернет число больше нуля, что можно использовать в условии ГДЕ. Синтаксис: СТРНАЙТИ(ГдеИскать, ЧтоИскать) > 0.

Использование СТРНАЙТИ имеет свои преимущества и недостатки. С одной стороны, код становится более читаемым для тех, кто не знаком с масками SQL-подобного стиля. С другой стороны, эта функция также часто приводит к полному сканированию таблицы, так как требует вычисления значения для каждой строки. Выбор между ПОДОБНО и СТРНАЙТИ часто является вопросом личных предпочтений разработчика, если производительность не является критическим фактором.

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

📊 Какой метод поиска вы используете чаще?
Оператор ПОДОБНО
Функция СтрНайти
Полнотекстовый поиск
Точное сравнение (=)

⚠️ Внимание: Интерфейс и возможности отладки запросов могут различаться в разных версиях платформы 1С:Предприятие. Если вы работаете в старой версии (например, 8.2 или ранее), некоторые функции оптимизации могут отсутствовать.

Часто задаваемые вопросы (FAQ)

Можно ли использовать оператор ПОДОБНО для полей типа Число или Дата?

Нет, оператор ПОДОБНО предназначен исключительно для строковых данных. Для полей типа Число, Дата или Булево необходимо использовать стандартные операторы сравнения (=, <, >). Если нужно применить маску к числу, его предварительно необходимо преобразовать в строку функцией СТРОКА(), но это ухудшит производительность.

Как найти строку, которая содержит символ звездочки (*)?

Для поиска самого символа звездочки его необходимо экранировать символом тильды. Шаблон должен выглядеть так: "~*". Если звездочка находится в середине текста, например "5*5", шаблон будет "5~*5". Без тильды система будет искать любую последовательность символов.

Почему запрос с ПОДОБНО работает медленно на большой базе?

Скорее всего, ваша маска начинается со звездочки (например, "*текст"). Это запрещает базе данных использовать индекс по началу строки, вынуждая ее перебирать все записи таблицы. Попробуйте изменить логику поиска или используйте полнотекстовый индекс, если такая возможность предусмотрена в вашей конфигурации.

Работает ли ПОДОБНО с регистром букв?

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