При доработке типового отчета Прайс-лист в современных конфигурациях на базе 1С:ERP 2 (таких как «Управление торговлей 11» или «Комплексная автоматизация 2») разработчики часто сталкиваются с неожиданной синтаксической ошибкой. Ошибка выглядит примерно так: (107,63) Синтаксическая ошибка ")" И НастройкаГруппировкиОбщейНастройки.ЭтоДействующийПараметр >. Самое странное здесь то, что ошибка проявляется не в момент написания запроса в конструкторе, а при попытке сформировать отчет в пользовательском режиме, особенно если отчет был вынесен во внешний файл (.erf).
В этой статье мы подробно разберем, почему возникает эта проблема, как работает механизм динамической подстановки запросов в 1С и что нужно сделать, чтобы отчет заработал корректно.
Для начала проанализируем, как типовая система формирует текст запроса для прайс-листа. В модуле объекта отчета в процедуре ПриКомпоновкеРезультата происходит сложная программная обработка. Система не просто берет текст из схемы компоновки данных (СКД), а модифицирует его «на лету» в зависимости от настроек склада, ассортимента и товарных ограничений.
Ключевым моментом здесь является обращение к менеджеру регистра сведений ТоварныеОграничения. Код выглядит следующим образом:
ТекстЗапроса = РегистрыСведений.ТоварныеОграничения.ПодставитьСоединение(ТекстЗапроса, "ПодстановкаТоварногоОграничения", Поля);
Метод ПодставитьСоединение выполняет поиск в тексте запроса специального технического маркера — параметра &ПодстановкаТоварногоОграничения. Этот маркер служит «закладкой», вместо которой система должна вставить конструкцию ЛЕВОЕ СОЕДИНЕНИЕ с таблицей ограничений или дополнительные условия фильтрации. Проблема заключается в том, что алгоритм парсинга в этом методе крайне чувствителен к оформлению текста.
Рассмотрим ситуацию по шагам. Когда мы открываем схему компоновки данных и заходим в Конструктор запроса, платформа 1С стремится привести текст запроса к каноническому виду. Если наш параметр &ПодстановкаТоварногоОграничения находится внутри логического блока (например, в секции ГДЕ или в условиях соединения), конструктор часто автоматически заключает его в скобки для обеспечения приоритета операций.
В результате в тексте запроса вместо чистого маркера:
&ПодстановкаТоварногоОграничения
появляется конструкция:
(&ПодстановкаТоварногоОграничения)
Когда управление передается в метод ПодставитьСоединение, упрощенный алгоритм замены текста не учитывает наличие этих скобок. Он заменяет внутреннюю часть (сам параметр), но оставляет внешние скобки. В итоге формируется некорректный SQL-запрос, где закрывающая скобка остается «лишней» или обрывает логическое выражение, что и приводит к ошибке Синтаксическая ошибка ")".
Для исправления ошибки нам необходимо выполнить ручную корректировку текста запроса в СКД, минуя автоматические «улучшения» конструктора. Рассмотрим алгоритм действий:
Ctrl+F и найдите в тексте строку ПодстановкаТоварногоОграничения.(&ПодстановкаТоварногоОграничения), аккуратно удалите открывающую и закрывающую скобки вручную.... И &ПодстановкаТоварногоОграничения И ....Нужно учитывать одну важную особенность: Конструктор запроса 1С агрессивен. Если после ручного удаления скобок вы снова откроете этот запрос через визуальный конструктор и нажмете «ОК», платформа с высокой долей вероятности вернет скобки на место.
Поэтому при разработке придерживайтесь следующего правила: любые изменения в логику запроса вносите через конструктор, но самым последним действием перед сохранением отчета всегда должна быть проверка текста запроса вручную. Если скобки появились — удалите их в текстовом редакторе СКД и сразу сохраняйте файл.
Проанализируем дополнительные способы решения, если ручное удаление скобок по каким-то причинам не помогает или конструктор слишком настойчив:
( &ПодстановкаТоварногоОграничения ). Иногда это позволяет алгоритму замены отработать корректно, не ломая синтаксис окружающего кода.Мы разобрали ситуацию, в которой тривиальная правка типового отчета превращается в сложный поиск синтаксических ошибок. Причина кроется во взаимодействии жесткого алгоритма текстовой замены в коде конфигурации РегистрыСведений.ТоварныеОграничения и механизмов оптимизации текста в СКД. Помните, что при работе с типовыми отчетами 1С:УТ 11 и ERP ручная проверка итогового текста запроса — это необходимый этап, гарантирующий стабильную работу вашего кода.