При написании или редактировании модулей в конфигураторе 1С:Предприятие разработчики нередко сталкиваются с ошибкой синтаксического контроля: «Ожидается ключевое слово "КонецПроцедуры"» (или аналогично для функций). Давайте детально разберем причины возникновения этой ситуации, проанализируем пример кода с ошибкой и выясним, как быстро находить и устранять подобные сбои.
Рассмотрим фрагмент кода, вызвавший ошибку в модуле документа при формировании движений по регистрам:
Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
// регистр ОстаткиМатериалов Приход
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.ОстаткиМатериалов.Записывать = Истина;
Движения.СтоимостьМатериалов.Записывать = Истина;
Для Каждого ТекСтрокаМатериалы Из Материалы Цикл
//регистр ОстаткиМатериалов Приход
Движение = Движения.ОстаткиМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Материал = ТекСтрокаМатериалы.Материал;
Движение.Склад=Склад;
Движение.Количество = ТекСтрокаМатериалы.Количество:
//регистр СтоимостьМатериалов Приход
Движение = Движения.СтоимостьМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Материал = ТекСтрокаМатериалы.Материал;
Движение.Стоимость=ТекСтрокаМатериалы.Сумма;
КонецЦикла;
КонецПроцедуры;
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
Внимательно проанализируем приведенный код и выделим две критические ошибки:
Процедура ОбработкаПроведения(Отказ, Режим) повторяется дважды: сначала вручную, а затем внутри тела сгенерированного конструктором блока. Компилятор ожидает завершения первого метода оператором КонецПроцедуры, но вместо этого встречает новое ключевое слово Процедура.Движение.Количество = ТекСтрокаМатериалы.Количество:. Это вызовет следующую синтаксическую ошибку после устранения проблемы со структурой процедур.Разберем процесс исправления по шагам:
Количество.Посмотрим на корректный итоговый вариант обработчика проведения:
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.ОстаткиМатериалов.Записывать = Истина;
Движения.СтоимостьМатериалов.Записывать = Истина;
Для Каждого ТекСтрокаМатериалы Из Материалы Цикл
// регистр ОстаткиМатериалов Приход
Движение = Движения.ОстаткиМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Материал = ТекСтрокаМатериалы.Материал;
Движение.Склад = Склад;
Движение.Количество = ТекСтрокаМатериалы.Количество;
// регистр СтоимостьМатериалов Приход
Движение = Движения.СтоимостьМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Материал = ТекСтрокаМатериалы.Материал;
Движение.Стоимость = ТекСтрокаМатериалы.Сумма;
КонецЦикла;
КонецПроцедуры
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
Рассмотрим подробнее другие распространенные ситуации, приводящие к сообщению «Ожидается ключевое слово "КонецПроцедуры"»:
Если ... Тогда, цикл Для ... Цикл, блок Попытка ... Исключение или инструкция препроцессора #Если ... Тогда, и для них пропущены соответствующие закрывающие операторы (КонецЕсли, КонецЦикла, КонецПопытки, #КонецЕсли), компилятор считает все последующие строки частью незакрытого вложенного блока. В результате оператор КонецПроцедуры воспринимается транслятором как преждевременный.КонецЕсли или КонецПроцедуры) приводит к тому, что платформа не распознает закрывающий оператор.Для ускорения поиска синтаксических ошибок в конфигураторе используем встроенные горячие клавиши и механизмы:
Ctrl + F7). Выполняет проверку активного модуля и отображает в окне сообщений точные номера строк с описанием ошибок. Проверка всей конфигурации выполняется комбинацией Ctrl + Shift + F7.Ctrl + ] и Ctrl + [). Установим курсор на ключевое слово Процедура, Если, Цикл или скобку и нажмем Ctrl + ]. Платформа мгновенно переместит курсор к парному закрывающему оператору. Если перехода не происходит или курсор перемещается не туда — вложенный блок нарушен.Alt + Shift + F). Выделим текст модуля и применим форматирование. Если отступы вложенных блоков начинают бесконтрольно «уезжать» вправо и не возвращаются к базовому уровню, это наглядно показывает строку с пропущенным оператором закрытия.Полезная рекомендация: если код, созданный конструктором движений, в дальнейшем редактируется вручную, рекомендуется удалять комментарии //{{__КОНСТРУКТОР_... и //}}__КОНСТРУКТОР_.... Это предотвратит случайную перезапись пользовательских изменений при повторном запуске конструктора.