При работе с языком запросов 1С:Предприятие разработчики иногда сталкиваются с ситуацией, когда запрос, содержащий точку с запятой внутри строкового литерала (например, при поиске по шаблону ГДЕ Наименование ПОДОБНО "%;%"), вызывает синтаксическую ошибку в консоли запросов. Рассмотрим подробнее, почему возникает эта проблема и как ее правильно решить.
В языке запросов 1С символ точки с запятой ; является системным разделителем запросов в составе пакетного запроса. При этом платформа 1С:Предприятие штатно воспринимает точку с запятой внутри кавычек как обычный символ строки и не требует специального экранирования (экранируются в 1С только сам символ двойных кавычек путем их удвоения).
Проблема кроется в работе некоторых внешних обработок (консолей запросов). Перед передачей запроса на исполнение движку платформы консоль разбивает текст на отдельные запросы пакета по символу ;. Если в консоли используется упрощенный алгоритм разбора, который не учитывает контекст кавычек, обработка ошибочно режет текст запроса прямо внутри строки "%;%". В результате на выполнение передаются фрагменты с нарушенным синтаксисом.
Проанализируем наиболее надежный и стандартизированный способ решения — вынос строки с точкой с запятой в параметр запроса. В этом случае символ ; находится в значении параметра, а не в тексте запроса, что полностью исключает ошибки парсинга в любых консолях.
Разберем по шагам написание такого запроса:
&ШаблонПоиска:
ВЫБРАТЬ
Контрагенты.Ссылка КАК Ссылка,
Контрагенты.Наименование КАК Наименование
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.Наименование ПОДОБНО &ШаблонПоиска
УстановитьПараметр()) зададим значение параметра &ШаблонПоиска равным строке "%;%".Сформировать корректное выражение можно с помощью встроенного Конструктора запросов. При формировании условий через интерфейс конструктора платформа корректно обрабатывает строковые выражения, что снижает риск сбоев при передаче текста обработки движку запросов.
Рассмотрим вариант решения проблемы путем обновления инструментария разработчика. Если консоль запросов разбивает текст по точкам с запятой без учета кавычек, рекомендуется перейти на более актуальную или альтернативную консоль запросов.
Современные консоли разработчика оснащены полноценным лексическим анализатором кода. Они корректно игнорируют разделители пакета внутри строковых литералов, благодаря чему запросы вида ВЫБРАТЬ "%;%" КАК Поле или условия ПОДОБНО "%;%" выполняются без ошибок.