Как исправить синтаксическую ошибку при доработке отчета Прайс-лист в 1С:УТ 11, ERP и КА

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При доработке типового отчета Прайс-лист в современных конфигурациях на базе 1С:ERP 2 (таких как «Управление торговлей 11» или «Комплексная автоматизация 2») разработчики часто сталкиваются с неожиданной синтаксической ошибкой. Ошибка выглядит примерно так: (107,63) Синтаксическая ошибка ")" И НастройкаГруппировкиОбщейНастройки.ЭтоДействующийПараметр >. Самое странное здесь то, что ошибка проявляется не в момент написания запроса в конструкторе, а при попытке сформировать отчет в пользовательском режиме, особенно если отчет был вынесен во внешний файл (.erf).

В этой статье мы подробно разберем, почему возникает эта проблема, как работает механизм динамической подстановки запросов в 1С и что нужно сделать, чтобы отчет заработал корректно.

Выясняем причину: механизм ПодставитьСоединение

Для начала проанализируем, как типовая система формирует текст запроса для прайс-листа. В модуле объекта отчета в процедуре ПриКомпоновкеРезультата происходит сложная программная обработка. Система не просто берет текст из схемы компоновки данных (СКД), а модифицирует его «на лету» в зависимости от настроек склада, ассортимента и товарных ограничений.

Ключевым моментом здесь является обращение к менеджеру регистра сведений ТоварныеОграничения. Код выглядит следующим образом:


ТекстЗапроса = РегистрыСведений.ТоварныеОграничения.ПодставитьСоединение(ТекстЗапроса, "ПодстановкаТоварногоОграничения", Поля);

Метод ПодставитьСоединение выполняет поиск в тексте запроса специального технического маркера — параметра &ПодстановкаТоварногоОграничения. Этот маркер служит «закладкой», вместо которой система должна вставить конструкцию ЛЕВОЕ СОЕДИНЕНИЕ с таблицей ограничений или дополнительные условия фильтрации. Проблема заключается в том, что алгоритм парсинга в этом методе крайне чувствителен к оформлению текста.

Почему возникает синтаксическая ошибка

Рассмотрим ситуацию по шагам. Когда мы открываем схему компоновки данных и заходим в Конструктор запроса, платформа 1С стремится привести текст запроса к каноническому виду. Если наш параметр &ПодстановкаТоварногоОграничения находится внутри логического блока (например, в секции ГДЕ или в условиях соединения), конструктор часто автоматически заключает его в скобки для обеспечения приоритета операций.

В результате в тексте запроса вместо чистого маркера:

&ПодстановкаТоварногоОграничения

появляется конструкция:

(&ПодстановкаТоварногоОграничения)

Когда управление передается в метод ПодставитьСоединение, упрощенный алгоритм замены текста не учитывает наличие этих скобок. Он заменяет внутреннюю часть (сам параметр), но оставляет внешние скобки. В итоге формируется некорректный SQL-запрос, где закрывающая скобка остается «лишней» или обрывает логическое выражение, что и приводит к ошибке Синтаксическая ошибка ")".

Пошаговое решение проблемы

Для исправления ошибки нам необходимо выполнить ручную корректировку текста запроса в СКД, минуя автоматические «улучшения» конструктора. Рассмотрим алгоритм действий:

  1. Откройте вашу внешнюю обработку или отчет в Конфигураторе.
  2. Перейдите на закладку Макеты и откройте основную схему компоновки данных.
  3. Перейдите на закладку Наборы данных и выберите тот набор, в котором содержится запрос (обычно это основной запрос по ценам и остаткам).
  4. Важно: Не нажимайте кнопку «Конструктор запроса». Вместо этого перейдите непосредственно в поле редактирования текста запроса.
  5. Нажмите Ctrl+F и найдите в тексте строку ПодстановкаТоварногоОграничения.
  6. Проверьте, не окружен ли этот параметр скобками. Если вы видите (&ПодстановкаТоварногоОграничения), аккуратно удалите открывающую и закрывающую скобки вручную.
  7. После удаления скобок текст должен выглядеть как обычный параметр: ... И &ПодстановкаТоварногоОграничения И ....
  8. Сохраните схему и сам внешний отчет.

Рецидив ошибки и работа с Конструктором запроса

Нужно учитывать одну важную особенность: Конструктор запроса 1С агрессивен. Если после ручного удаления скобок вы снова откроете этот запрос через визуальный конструктор и нажмете «ОК», платформа с высокой долей вероятности вернет скобки на место.

Поэтому при разработке придерживайтесь следующего правила: любые изменения в логику запроса вносите через конструктор, но самым последним действием перед сохранением отчета всегда должна быть проверка текста запроса вручную. Если скобки появились — удалите их в текстовом редакторе СКД и сразу сохраняйте файл.

Альтернативные способы «обмана» парсера

Проанализируем дополнительные способы решения, если ручное удаление скобок по каким-то причинам не помогает или конструктор слишком настойчив:

Заключение

Мы разобрали ситуацию, в которой тривиальная правка типового отчета превращается в сложный поиск синтаксических ошибок. Причина кроется во взаимодействии жесткого алгоритма текстовой замены в коде конфигурации РегистрыСведений.ТоварныеОграничения и механизмов оптимизации текста в СКД. Помните, что при работе с типовыми отчетами 1С:УТ 11 и ERP ручная проверка итогового текста запроса — это необходимый этап, гарантирующий стабильную работу вашего кода.

← На главную