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