Как исправить синтаксические ошибки «ПОМЕСТИТЬ» и «ИЗ» в запросе 1С?

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

При написании пакетов запросов в платформе 1С:Предприятие разработчики часто сталкиваются с ошибками синтаксического анализатора. Одной из наиболее распространенных причин возникновения ошибок с текстом «Синтаксическая ошибка "ПОМЕСТИТЬ"» или «Синтаксическая ошибка "ИЗ"» являются лишние запятые в конце списка выбираемых полей перед служебными ключевыми словами.

Разберем подробнее, почему возникают подобные сбои, как правильно исправить текст запроса и какие дополнительные скрытые ошибки и ограничения следует учитывать при работе с временными таблицами.

Причины возникновения синтаксических ошибок

Рассмотрим структуру запроса, в котором проявляются данные ошибки:


ВЫБРАТЬ
    ДанныеИзВнешнейБазы.Код,
    ДанныеИзВнешнейБазы.Ссылка,
    ДанныеИзВнешнейБазы.ТарифнаяСтавка,
    ДанныеИзВнешнейБазы.РайонныйКоэффициент,
    ДанныеИзВнешнейБазы.СевернаяНадбавка,
ПОМЕСТИТЬ ВТ_ДанныеИзВнешнейБазы
ИЗ
    &ДанныеИзВнешнейБазы КАК ДанныеИзВнешнейБазы
;

ВЫБРАТЬ
    ЕСТЬNULL(ВТ_ДанныеИзВнешнейБазы.Код, "") КАК КодВнешнейБазы,
    ...
    ЕСТЬNULL(Локации.СевернаяНадбавка, "") КАК СевернаяНадбавкаТекущейБазы,
ИЗ
    Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций

Проанализируем приведенный код и выделим две ключевые проблемы:

  1. Лишняя запятая перед ПОМЕСТИТЬ: В первом запросе после поля ДанныеИзВнешнейБазы.СевернаяНадбавка стоит запятая. Синтаксический анализатор 1С ожидает следующее выбираемое поле или выражение, но вместо него встречается предложение ПОМЕСТИТЬ. Из-за этого платформа выдает ошибку: Синтаксическая ошибка "ПОМЕСТИТЬ".
  2. Лишняя запятая перед ИЗ: Во втором запросе пакета после выражения ЕСТЬNULL(Локации.СевернаяНадбавка, "") КАК СевернаяНадбавкаТекущейБазы также установлена запятая. Парсер ожидает продолжения списка реквизитов, однако сразу идет ключевое слово ИЗ, что приводит к ошибке: Синтаксическая ошибка "ИЗ".

Исправление ошибок и оптимизация запроса

Для устранения описанных синтаксических ошибок необходимо удалить запятые в конце списков выбираемых полей в обеих частях пакетного запроса.

Однако при детальном анализе данного фрагмента запроса можно обнаружить еще несколько критических ошибок и узких мест, которые вызовут сбои при выполнении:

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

Исправленный и исправно работающий вариант запроса

С учетом исправления синтаксических ошибок и приведения типов правильный текст запроса будет выглядеть следующим образом:


ВЫБРАТЬ
    ДанныеИзВнешнейБазы.Код КАК Код,
    ДанныеИзВнешнейБазы.Ссылка КАК Ссылка,
    ДанныеИзВнешнейБазы.ТарифнаяСтавка КАК ТарифнаяСтавка,
    ДанныеИзВнешнейБазы.РайонныйКоэффициент КАК РайонныйКоэффициент,
    ДанныеИзВнешнейБазы.СевернаяНадбавка КАК СевернаяНадбавка
ПОМЕСТИТЬ ВТ_ДанныеИзВнешнейБазы
ИЗ
    &ДанныеИзВнешнейБазы КАК ДанныеИзВнешнейБазы
ИНДЕКСИРОВАТЬ ПО
    Код
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЕСТЬNULL(ВТ_ДанныеИзВнешнейБазы.Код, "") КАК КодВнешнейБазы,
    ЕСТЬNULL(ВТ_ДанныеИзВнешнейБазы.Ссылка, "") КАК НаименованиеВнешнейБазы,
    ЕСТЬNULL(ВТ_ДанныеИзВнешнейБазы.ТарифнаяСтавка, 0) КАК ТарифнаяСтавкаВнешнейБазы,
    ЕСТЬNULL(ВТ_ДанныеИзВнешнейБазы.РайонныйКоэффициент, 0) КАК РайонныйКоэффициентВнешнейБазы,
    ЕСТЬNULL(ВТ_ДанныеИзВнешнейБазы.СевернаяНадбавка, 0) КАК СевернаяНадбавкаВнешнейБазы,
    ЕСТЬNULL(СотрудникиОрганизаций.Код, "") КАК КодТекущейБазы,
    ЕСТЬNULL(СотрудникиОрганизаций.Ссылка, ЗНАЧЕНИЕ(Справочник.СотрудникиОрганизаций.ПустаяСсылка)) КАК СсылкаТекущейБазы,
    ЕСТЬNULL(СотрудникиОрганизаций.ТарифнаяСтавка, 0) КАК ТарифнаяСтавкаТекущейБазы
ИЗ
    Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
        ПОЛНОЕ СОЕДИНЕНИЕ ВТ_ДанныеИзВнешнейБазы КАК ВТ_ДанныеИзВнешнейБазы
        ПО СотрудникиОрганизаций.Код = ВТ_ДанныеИзВнешнейБазы.Код

Важные требования к передаче Таблицы Значений в параметры

При передаче таблицы значений во внешний параметр &ДанныеИзВнешнейБазы необходимо соблюдать важное правило платформы 1С: каждая колонка передаваемой таблицы должна иметь строго заданное описание типов (ОписаниеТипов). Если колонка не типизирована, при попытке помещения таблицы во временную таблицу ВТ_ДанныеИзВнешнейБазы платформа сгенерирует ошибку времени выполнения.

← На главную