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