При написании пакетов запросов в платформе 1С:Предприятие разработчики часто сталкиваются с ошибками синтаксического анализатора. Одной из наиболее распространенных причин возникновения ошибок с текстом «Синтаксическая ошибка "ПОМЕСТИТЬ"» или «Синтаксическая ошибка "ИЗ"» являются лишние запятые в конце списка выбираемых полей перед служебными ключевыми словами.
Разберем подробнее, почему возникают подобные сбои, как правильно исправить текст запроса и какие дополнительные скрытые ошибки и ограничения следует учитывать при работе с временными таблицами.
Рассмотрим структуру запроса, в котором проявляются данные ошибки:
ВЫБРАТЬ
ДанныеИзВнешнейБазы.Код,
ДанныеИзВнешнейБазы.Ссылка,
ДанныеИзВнешнейБазы.ТарифнаяСтавка,
ДанныеИзВнешнейБазы.РайонныйКоэффициент,
ДанныеИзВнешнейБазы.СевернаяНадбавка,
ПОМЕСТИТЬ ВТ_ДанныеИзВнешнейБазы
ИЗ
&ДанныеИзВнешнейБазы КАК ДанныеИзВнешнейБазы
;
ВЫБРАТЬ
ЕСТЬNULL(ВТ_ДанныеИзВнешнейБазы.Код, "") КАК КодВнешнейБазы,
...
ЕСТЬNULL(Локации.СевернаяНадбавка, "") КАК СевернаяНадбавкаТекущейБазы,
ИЗ
Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
Проанализируем приведенный код и выделим две ключевые проблемы:
ПОМЕСТИТЬ: В первом запросе после поля ДанныеИзВнешнейБазы.СевернаяНадбавка стоит запятая. Синтаксический анализатор 1С ожидает следующее выбираемое поле или выражение, но вместо него встречается предложение ПОМЕСТИТЬ. Из-за этого платформа выдает ошибку: Синтаксическая ошибка "ПОМЕСТИТЬ".ИЗ: Во втором запросе пакета после выражения ЕСТЬNULL(Локации.СевернаяНадбавка, "") КАК СевернаяНадбавкаТекущейБазы также установлена запятая. Парсер ожидает продолжения списка реквизитов, однако сразу идет ключевое слово ИЗ, что приводит к ошибке: Синтаксическая ошибка "ИЗ".Для устранения описанных синтаксических ошибок необходимо удалить запятые в конце списков выбираемых полей в обеих частях пакетного запроса.
Однако при детальном анализе данного фрагмента запроса можно обнаружить еще несколько критических ошибок и узких мест, которые вызовут сбои при выполнении:
Локации.РайонныйКоэффициент ошибочно задан псевдоним ТарифнаяСтавкаТекущейБазы, который уже назначен строкой выше для СотрудникиОрганизаций.ТарифнаяСтавка. Запрос завершится с ошибкой дублирования псевдонимов.Локации.РайонныйКоэффициент и Локации.СевернаяНадбавка, однако таблица Локации не указана и не присоединена в секции ИЗ.ЕСТЬNULL: Для числовых полей (ТарифнаяСтавка, РайонныйКоэффициент, СевернаяНадбавка) при значении NULL подставляется пустая строка "". Это приводит к составному типу данных в колонке результата, что вызовет ошибки при дальнейших расчетах. Для чисел следует подставлять 0, а для ссылок — ЗНАЧЕНИЕ(Справочник.СотрудникиОрганизаций.ПустаяСсылка).ВТ_ДанныеИзВнешнейБазы выполняется по полю Код. При большом объеме данных отсутствие индекса существенно снизит производительность. Рекомендуется использовать конструкцию ИНДЕКСИРОВАТЬ ПО Код.С учетом исправления синтаксических ошибок и приведения типов правильный текст запроса будет выглядеть следующим образом:
ВЫБРАТЬ
ДанныеИзВнешнейБазы.Код КАК Код,
ДанныеИзВнешнейБазы.Ссылка КАК Ссылка,
ДанныеИзВнешнейБазы.ТарифнаяСтавка КАК ТарифнаяСтавка,
ДанныеИзВнешнейБазы.РайонныйКоэффициент КАК РайонныйКоэффициент,
ДанныеИзВнешнейБазы.СевернаяНадбавка КАК СевернаяНадбавка
ПОМЕСТИТЬ ВТ_ДанныеИзВнешнейБазы
ИЗ
&ДанныеИзВнешнейБазы КАК ДанныеИзВнешнейБазы
ИНДЕКСИРОВАТЬ ПО
Код
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ЕСТЬNULL(ВТ_ДанныеИзВнешнейБазы.Код, "") КАК КодВнешнейБазы,
ЕСТЬNULL(ВТ_ДанныеИзВнешнейБазы.Ссылка, "") КАК НаименованиеВнешнейБазы,
ЕСТЬNULL(ВТ_ДанныеИзВнешнейБазы.ТарифнаяСтавка, 0) КАК ТарифнаяСтавкаВнешнейБазы,
ЕСТЬNULL(ВТ_ДанныеИзВнешнейБазы.РайонныйКоэффициент, 0) КАК РайонныйКоэффициентВнешнейБазы,
ЕСТЬNULL(ВТ_ДанныеИзВнешнейБазы.СевернаяНадбавка, 0) КАК СевернаяНадбавкаВнешнейБазы,
ЕСТЬNULL(СотрудникиОрганизаций.Код, "") КАК КодТекущейБазы,
ЕСТЬNULL(СотрудникиОрганизаций.Ссылка, ЗНАЧЕНИЕ(Справочник.СотрудникиОрганизаций.ПустаяСсылка)) КАК СсылкаТекущейБазы,
ЕСТЬNULL(СотрудникиОрганизаций.ТарифнаяСтавка, 0) КАК ТарифнаяСтавкаТекущейБазы
ИЗ
Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
ПОЛНОЕ СОЕДИНЕНИЕ ВТ_ДанныеИзВнешнейБазы КАК ВТ_ДанныеИзВнешнейБазы
ПО СотрудникиОрганизаций.Код = ВТ_ДанныеИзВнешнейБазы.Код
При передаче таблицы значений во внешний параметр &ДанныеИзВнешнейБазы необходимо соблюдать важное правило платформы 1С: каждая колонка передаваемой таблицы должна иметь строго заданное описание типов (ОписаниеТипов). Если колонка не типизирована, при попытке помещения таблицы во временную таблицу ВТ_ДанныеИзВнешнейБазы платформа сгенерирует ошибку времени выполнения.