При работе с динамическими списками в управляемых формах 1С:Предприятие разработчики иногда сталкиваются со спорадическими синтаксическими ошибками. Одна из самых неявных ситуаций — появление всплывающего сообщения об ошибке синтаксиса с фрагментом «Когда,» при открытии формы списка документов или справочника. В этой статье мы подробно проанализируем причины этой проблемы, выясним, почему ее не удается перехватить стандартными средствами отладки, и разберем способы исправления.
Рассмотрим характерную ситуацию: при попытке открыть форму списка документов платформа выдает синтаксическую ошибку, ссылаясь на символ запятой сразу после слова КОГДА. При этом поведение системы отличается следующими особенностями:
Когда, в модулях, макетах и текстах запросов не отыскивает ошибочный фрагмент.Проанализируем механизмы работы платформы 1С при формировании динамических списков. Динамический список не просто выполняет фиксированный запрос, указанный в его свойствах. Платформа автоматически достраивает текст запроса на уровне ядра (С++), подставляя выбираемые поля, отборы, условия оформления и сортировки.
Конфликт возникает в том случае, если в метаданных объекта (или в его табличной части) создан реквизит с именем КОГДА. Слово КОГДА является зарезервированным ключевым словом языка запросов 1С, которое используется в условных конструкциях:
ВЫБОР
КОГДА Условие ТОГДА Значение1
ИНАЧЕ Значение2
КОНЕЦ
Когда платформа формирует автоматический запрос для динамического списка, она выбирает поля объекта по их именам. Если имя реквизита — КОГДА, при генерации списка полей через запятую платформа может сформировать фрагмент вида:
ВЫБРАТЬ
Таблица.Кто КАК Кто,
Таблица.Когда,
Таблица.Ссылка КАК Ссылка
ИЗ
Документ.ИмяДокумента.ТабличнаяЧасть КАК Таблица
Синтаксический анализатор языка запросов 1С встречает ключевое слово КОГДА и ожидает после него логическое выражение (условие), однако вместо этого сразу получает запятую ,. В результате генерируется исключение синтаксиса запроса.
Поскольку формирование и проверка этого запроса происходят во внутреннем коде платформы, встроенный отладчик BSL не может перехватить точку ошибки, а точка останова в процедуре ПриСозданииНаСервере не срабатывает.
Разберем основные варианты устранения проблемы в зависимости от возможности изменения структуры метаданных.
Самый надежный подход — избегать использования ключевых слов языка запросов (КОГДА, ГДЕ, ВЫБОР, ТОГДА, КОНЕЦ, И, ИЛИ) в качестве идентификаторов реквизитов объектов и табличных частей.
КОГДА в любое корректное имя, например ДатаСобытия, МоментВремени или ДатаЗаписи.Если переименовать реквизит в метаданных невозможно (например, конфигурация находится на поддержке без возможности изменения структуры), следует перевести динамический список в режим произвольного запроса:
ВЫБРАТЬ
ДокументТаблица.Ссылка КАК Ссылка,
ДокументТаблица.ПолеКто КАК Кто,
ДокументТаблица.Когда КАК ДатаКогда
ИЗ
Документ.ИмяДокумента КАК ДокументТаблица
При явном указании псевдонима через ключевое слово КАК платформа перестает интерпретировать имя поля ДокументТаблица.Когда как начало конструкции ВЫБОР КОГДА.
Для локализации синтаксических ошибок, которые происходят на уровне ядра платформы и не отлавливаются штатным отладчиком, рекомендуется настроить Технологический журнал. В файле конфигурации logcfg.xml достаточно включить сбор событий исключений EXCP и исполнения запросов QEXEC:
<config xmlns="http://v8.1c.ru/v8/logcfg">
<log history="1" location="C:\1C_Logs">
<event>
<eq property="Name" value="EXCP"/>
</event>
<event>
<eq property="Name" value="QEXEC"/>
</event>
<property name="all"/>
</log>
</config>
В сформированных текстовых логах Технологического журнала будет записан полный сгенерированный текст запроса с указанием точного места синтаксического сбоя, что позволяет оперативно обнаружить проблемное имя реквизита.