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

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

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

Анализ исходной проблемы и типичных ошибок

Рассмотрим фрагмент кода, вызвавший ошибку в модуле документа при формировании движений по регистрам:


Процедура ОбработкаПроведения(Отказ, Режим)
    //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
    // регистр ОстаткиМатериалов Приход
    Процедура ОбработкаПроведения(Отказ, Режим)
    Движения.ОстаткиМатериалов.Записывать = Истина;
    Движения.СтоимостьМатериалов.Записывать = Истина;
    Для Каждого ТекСтрокаМатериалы Из Материалы Цикл
        //регистр ОстаткиМатериалов Приход
        Движение = Движения.ОстаткиМатериалов.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
        Движение.Период = Дата;
        Движение.Материал = ТекСтрокаМатериалы.Материал;
        Движение.Склад=Склад;
        Движение.Количество = ТекСтрокаМатериалы.Количество:
        //регистр СтоимостьМатериалов Приход
        Движение = Движения.СтоимостьМатериалов.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
        Движение.Период = Дата;
        Движение.Материал = ТекСтрокаМатериалы.Материал;
        Движение.Стоимость=ТекСтрокаМатериалы.Сумма;
    КонецЦикла;
КонецПроцедуры;
    //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

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

  1. Вложенное объявление процедуры (дублирование заголовка). В языке 1С:Предприятие 8 процедуры и функции объявляются только на верхнем уровне модуля. Вложенные методы и замыкания платформой не поддерживаются. В примере заголовок Процедура ОбработкаПроведения(Отказ, Режим) повторяется дважды: сначала вручную, а затем внутри тела сгенерированного конструктором блока. Компилятор ожидает завершения первого метода оператором КонецПроцедуры, но вместо этого встречает новое ключевое слово Процедура.
  2. Синтаксическая опечатка в конце строки присваивания. В строке установки количества материалов вместо точки с запятой ошибочно указано двоеточие: Движение.Количество = ТекСтрокаМатериалы.Количество:. Это вызовет следующую синтаксическую ошибку после устранения проблемы со структурой процедур.

Пошаговое исправление кода

Разберем процесс исправления по шагам:

  1. Удалим дублирующуюся строку объявления процедуры в начале модуля.
  2. Исправим двоеточие на точку с запятой в строке заполнения реквизита Количество.
  3. Выровняем форматирование для наглядности структуры кода.

Посмотрим на корректный итоговый вариант обработчика проведения:


//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Процедура ОбработкаПроведения(Отказ, Режим)

    Движения.ОстаткиМатериалов.Записывать = Истина;
    Движения.СтоимостьМатериалов.Записывать = Истина;

    Для Каждого ТекСтрокаМатериалы Из Материалы Цикл
        // регистр ОстаткиМатериалов Приход
        Движение = Движения.ОстаткиМатериалов.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
        Движение.Период = Дата;
        Движение.Материал = ТекСтрокаМатериалы.Материал;
        Движение.Склад = Склад;
        Движение.Количество = ТекСтрокаМатериалы.Количество;

        // регистр СтоимостьМатериалов Приход
        Движение = Движения.СтоимостьМатериалов.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
        Движение.Период = Дата;
        Движение.Материал = ТекСтрокаМатериалы.Материал;
        Движение.Стоимость = ТекСтрокаМатериалы.Сумма;
    КонецЦикла;

КонецПроцедуры
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

Другие частые причины появления этой ошибки

Рассмотрим подробнее другие распространенные ситуации, приводящие к сообщению «Ожидается ключевое слово "КонецПроцедуры"»:

  1. Незакрытые управляющие конструкции. Если внутри процедуры открыто условие Если ... Тогда, цикл Для ... Цикл, блок Попытка ... Исключение или инструкция препроцессора #Если ... Тогда, и для них пропущены соответствующие закрывающие операторы (КонецЕсли, КонецЦикла, КонецПопытки, #КонецЕсли), компилятор считает все последующие строки частью незакрытого вложенного блока. В результате оператор КонецПроцедуры воспринимается транслятором как преждевременный.
  2. Смешение русской и латинской раскладки. Написание ключевых слов похожими символами латиницы (например, латинская «С» в слове КонецЕсли или КонецПроцедуры) приводит к тому, что платформа не распознает закрывающий оператор.
  3. Расположение исполняемого кода вне процедур. В модулях 1С исполняемый код вне процедур и функций допускается только в самом конце модуля (инициализационная часть). Если после таких строк попытаться объявить новую процедуру, возникнет ошибка структуры модуля.

Инструменты встроенного редактора для быстрой диагностики

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

  1. Синтаксический контроль (Ctrl + F7). Выполняет проверку активного модуля и отображает в окне сообщений точные номера строк с описанием ошибок. Проверка всей конфигурации выполняется комбинацией Ctrl + Shift + F7.
  2. Переход к парной конструкции (Ctrl + ] и Ctrl + [). Установим курсор на ключевое слово Процедура, Если, Цикл или скобку и нажмем Ctrl + ]. Платформа мгновенно переместит курсор к парному закрывающему оператору. Если перехода не происходит или курсор перемещается не туда — вложенный блок нарушен.
  3. Автоматическое форматирование кода (Alt + Shift + F). Выделим текст модуля и применим форматирование. Если отступы вложенных блоков начинают бесконтрольно «уезжать» вправо и не возвращаются к базовому уровню, это наглядно показывает строку с пропущенным оператором закрытия.

Полезная рекомендация: если код, созданный конструктором движений, в дальнейшем редактируется вручную, рекомендуется удалять комментарии //{{__КОНСТРУКТОР_... и //}}__КОНСТРУКТОР_.... Это предотвратит случайную перезапись пользовательских изменений при повторном запуске конструктора.

← На главную