Почему в динамическом списке 1С возникает ошибка синтаксиса при вызове ключевого слова «КОГДА» и как ее исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с динамическими списками в управляемых формах 1С:Предприятие разработчики иногда сталкиваются со спорадическими синтаксическими ошибками. Одна из самых неявных ситуаций — появление всплывающего сообщения об ошибке синтаксиса с фрагментом «Когда,» при открытии формы списка документов или справочника. В этой статье мы подробно проанализируем причины этой проблемы, выясним, почему ее не удается перехватить стандартными средствами отладки, и разберем способы исправления.

Симптомы проблемы и трудности диагностики

Рассмотрим характерную ситуацию: при попытке открыть форму списка документов платформа выдает синтаксическую ошибку, ссылаясь на символ запятой сразу после слова КОГДА. При этом поведение системы отличается следующими особенностями:

  1. Ошибка возникает не всегда: список документов может открываться штатно до тех пор, пока не будут задействованы определенные отборы, сгруппированные поля или вывод дополнительных колонок.
  2. Поиск по конфигурации не дает результатов: глобальный поиск текста Когда, в модулях, макетах и текстах запросов не отыскивает ошибочный фрагмент.
  3. Стек вызовов пуст: при включенном режиме «Остановка по ошибке» отладчик 1С не останавливается на исполняемой строке кода, а стек вызовов в момент появления предупреждения остается абсолютно пустым.
  4. Синтаксический контроль молчит: стандартная проверка конфигурации в Конфигураторе не показывает никаких ошибок или предупреждений.

Разбор причины возникновения синтаксической ошибки

Проанализируем механизмы работы платформы 1С при формировании динамических списков. Динамический список не просто выполняет фиксированный запрос, указанный в его свойствах. Платформа автоматически достраивает текст запроса на уровне ядра (С++), подставляя выбираемые поля, отборы, условия оформления и сортировки.

Конфликт возникает в том случае, если в метаданных объекта (или в его табличной части) создан реквизит с именем КОГДА. Слово КОГДА является зарезервированным ключевым словом языка запросов 1С, которое используется в условных конструкциях:


ВЫБОР
	КОГДА Условие ТОГДА Значение1
	ИНАЧЕ Значение2
КОНЕЦ

Когда платформа формирует автоматический запрос для динамического списка, она выбирает поля объекта по их именам. Если имя реквизита — КОГДА, при генерации списка полей через запятую платформа может сформировать фрагмент вида:


ВЫБРАТЬ
	Таблица.Кто КАК Кто,
	Таблица.Когда,
	Таблица.Ссылка КАК Ссылка
ИЗ
	Документ.ИмяДокумента.ТабличнаяЧасть КАК Таблица

Синтаксический анализатор языка запросов 1С встречает ключевое слово КОГДА и ожидает после него логическое выражение (условие), однако вместо этого сразу получает запятую ,. В результате генерируется исключение синтаксиса запроса.

Поскольку формирование и проверка этого запроса происходят во внутреннем коде платформы, встроенный отладчик BSL не может перехватить точку ошибки, а точка останова в процедуре ПриСозданииНаСервере не срабатывает.

Способы решения и исправления ошибки

Разберем основные варианты устранения проблемы в зависимости от возможности изменения структуры метаданных.

Вариант 1. Переименование реквизита в метаданных (Рекомендуемый)

Самый надежный подход — избегать использования ключевых слов языка запросов (КОГДА, ГДЕ, ВЫБОР, ТОГДА, КОНЕЦ, И, ИЛИ) в качестве идентификаторов реквизитов объектов и табличных частей.

  1. Перейдите в дерево метаданных Конфигуратора.
  2. Найдите соответствующий объект или его табличную часть.
  3. Переименуйте реквизит КОГДА в любое корректное имя, например ДатаСобытия, МоментВремени или ДатаЗаписи.
  4. Обновите конфигурацию базы данных.

Вариант 2. Явное назначение псевдонима в произвольном запросе динамического списка

Если переименовать реквизит в метаданных невозможно (например, конфигурация находится на поддержке без возможности изменения структуры), следует перевести динамический список в режим произвольного запроса:

  1. Откройте форму списка в Конфигураторе и выберите динамический список в реквизитах формы.
  2. В палитре свойств установите флаг Произвольный запрос.
  3. Откройте настройку списка и отредактируйте текст запроса, явно задав псевдоним для реквизита:

ВЫБРАТЬ
	ДокументТаблица.Ссылка КАК Ссылка,
	ДокументТаблица.ПолеКто КАК Кто,
	ДокументТаблица.Когда КАК ДатаКогда
ИЗ
	Документ.ИмяДокумента КАК ДокументТаблица

При явном указании псевдонима через ключевое слово КАК платформа перестает интерпретировать имя поля ДокументТаблица.Когда как начало конструкции ВЫБОР КОГДА.

Как выявлять подобные ошибки с помощью Технологического журнала

Для локализации синтаксических ошибок, которые происходят на уровне ядра платформы и не отлавливаются штатным отладчиком, рекомендуется настроить Технологический журнал. В файле конфигурации 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>

В сформированных текстовых логах Технологического журнала будет записан полный сгенерированный текст запроса с указанием точного места синтаксического сбоя, что позволяет оперативно обнаружить проблемное имя реквизита.

← На главную