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