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

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

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

Проанализируем типичный пример ошибки

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


&НаСервереБезКонтекста
Процедура ПеренестиВПредопределеннуюГруппуНаСервере()
    КудаПеренести = Справочники.Номенклатура.ПрочиеТовары; 
    Выборка = Справочники.Номенклатура.Выбрать(); 
    Пока Выборка.Следующий() Цикл
        Если Не Выборка.Ссылка = КудаПеренести Тогда 
            ПолученныйОбъект = Выборка.ПолучитьОбъект(); 
            ПолученныйОбъект.Родитель = КудаПеренести;
            ПолученныйОбъект.Записать();
        КонецЕсли;
    КонецЦикла
    КонецФункции
КонецПроцедуры

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

Основные причины появления ошибки

Разберем основные сценарии, при которых платформа 1С сообщает о том, что ожидается окончание процедуры или функции:

  1. Строгое соответствие открывающих и закрывающих конструкций. В 1С любая Процедура должна завершаться только через КонецПроцедуры. Любая Функция должна закрываться через КонецФункции. Перекрестное использование этих слов приведет к ошибке компиляции.
  2. Каскадные ошибки из-за незакрытых внутренних блоков кода. Если мы открыли блок условия Если ... Тогда или блок цикла Пока ... Цикл, но забыли написать КонецЕсли или КонецЦикла, парсер дойдет до конца модуля и не найдет логического завершения блока. В результате он укажет, что структура нарушена, и выдаст ошибку о том, что ожидается конец процедуры.
  3. Запрет на вложенность процедур и функций. В отличие от таких языков программирования, как Pascal или JavaScript (где существуют замыкания и вложенные функции), в 1С нельзя объявлять одну процедуру внутри другой. Все методы должны располагаться строго на верхнем уровне модуля. Если мы забыли закрыть предыдущую функцию и начали писать новую, конфигуратор воспримет это как попытку вложенности и откажется компилировать код.

Разница в логике работы Процедуры и Функции

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

Конструкция Функция всегда должна вычислять какой-либо результат и возвращать его в вызывающий код с помощью оператора Возврат Значение;. В то же время Процедура выполняет действие, но ничего не возвращает. В процедуре можно использовать оператор Возврат; (без передачи параметра), но только для досрочного прекращения выполнения алгоритма. Попытка вернуть значение из процедуры вызовет дополнительную синтаксическую ошибку.

Практические советы: как найти и исправить ошибку

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

  1. Используем автоформатирование (Shift + Alt + F). Это самый надежный встроенный инструмент в конфигураторе 1С. Выделите весь текст модуля (Ctrl + A) и нажмите комбинацию клавиш Shift + Alt + F. Код выстроится "лесенкой" с правильными отступами. Если какой-то блок Если или Цикл не закрыт, весь последующий код сместится вправо. Место, где нарушается визуальная структура отступов, обычно и скрывает пропущенное или лишнее ключевое слово.
  2. Проводим синтаксический контроль (Ctrl + F7). Перед тем как запускать базу в режиме "Предприятие", всегда выполняйте проверку модулей на синтаксис. Окно служебных сообщений покажет номер строки, где парсер обнаружил несоответствие. Перейдите к этой строке и проверьте несколько строк выше нее на предмет лишних закрывающих операторов или незакрытых циклов. Если перед запуском базы после редактирования кода вам также требуется выполнить её техническое обслуживание, можно настроить автоматическое тестирование и архивирование баз 1С в фоновом режиме.
  3. Проверяем директивы компиляции. Обратите внимание, что директивы вроде &НаКлиенте или &НаСервере должны стоять строго перед объявлением метода. Между директивой и словом Процедура не должно быть лишнего кода или других процедур.

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


&НаСервереБезКонтекста
Процедура ПеренестиВПредопределеннуюГруппуНаСервере()
    
    КудаПеренести = Справочники.Номенклатура.ПрочиеТовары; 
    Выборка = Справочники.Номенклатура.Выбрать(); 
    
    Пока Выборка.Следующий() Цикл
        Если Выборка.Ссылка <> КудаПеренести Тогда 
            ПолученныйОбъект = Выборка.ПолучитьОбъект(); 
            ПолученныйОбъект.Родитель = КудаПеренести;
            ПолученныйОбъект.Записать();
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

В исправленном варианте мы удалили лишнее слово КонецФункции и заменили конструкцию Не Выборка.Ссылка = КудаПеренести на более корректную и читаемую Выборка.Ссылка <> КудаПеренести. Применяя автоформатирование и внимательно следя за парными операторами, вы навсегда забудете о проблеме незакрытых процедур в 1С.

← На главную