Как исправить ошибку «Ожидается определение процедуры/функции #КонецЕсли» в расширении после обновления 1С:Бухгалтерии?

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

При обновлении типовых конфигураций, таких как 1С:Бухгалтерия предприятия 3.0, разработчики часто сталкиваются с ситуацией, когда стабильно работавшее ранее расширение внезапно начинает выдавать синтаксические ошибки. Одна из самых коварных — Ожидается определение процедуры/функции #КонецЕсли. Особенность этой ошибки заключается в том, что она может указывать на строку кода, которой физически нет в вашем расширении, или возникать в документах, которые вы даже не редактировали. Рассмотрим подробно причины возникновения этой коллизии и разберем по шагам методы её устранения.

Анализ ситуации: почему возникает синтаксический коллапс?

Проанализируем типичную ситуацию. Имеется конфигурация БП Корп 3.0 на платформе версии 8.3.20.1914. После штатного обновления расширение переведено в актуальный режим совместимости (например, 8.3.17), но при попытке открыть проводки документа ПоступлениеТоваровУслуг (ПТиУ) система выдает ошибку инициализации модуля менеджера. Выясним причину, почему это происходит даже в тех случаях, когда все директивы в расширении вроде бы прописаны корректно.

Механизм расширений в 1С работает путем динамической «склейки» кода основного модуля и кода расширения. Если в основном модуле процедура обернута в инструкции препроцессора, например:


#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Процедура ИсполнитьНаСервере()
    // Код типовой конфигурации
КонецПроцедуры
#КонецЕсли

А в вашем расширении вы используете аннотацию &Вместо или &ИзменитьИКонтролировать, платформа пытается внедрить ваш фрагмент внутрь этой логической структуры. Если в процессе обновления в основной конфигурации изменилось расположение этих директив или добавились новые области (#Область), парность инструкций #Если и #КонецЕсли нарушается именно в результирующем («собранном») модуле. Именно поэтому конфигуратор указывает на мифическую строку 697, которой может не быть в вашем текстовом редакторе.

Причина №1: Конфликт метода «ИзменитьИКонтролировать»

Разберем подробнее наиболее частую причину. При использовании механизма &ИзменитьИКонтролировать разработчик копирует фрагмент кода из основной конфигурации. Если внутри этого фрагмента были открыты директивы препроцессора, которые закрываются за пределами редактируемого блока, компилятор теряет «пару».

Что нужно проверить:

  1. Откройте модуль менеджера документа ПоступлениеТоваровУслуг в расширении.
  2. Проверьте, не попал ли текст #КонецЕсли внутрь вашей процедуры или, наоборот, не остался ли #Если «висеть» без закрывающей инструкции.
  3. Обратите внимание на невидимые символы. Иногда при копировании текста между окнами конфигуратора залетают «неразрывные пробелы» (символ с кодом 160). Если такой пробел встанет между символом # и словом КонецЕсли, платформа не распознает директиву.

Причина №2: Влияние платформенного кэша

Иногда ошибка является фантомной и связана с тем, что платформа хранит скомпилированные образы расширений. Рассмотрим ситуацию: вы внесли правку, но ошибка не исчезла. Это происходит из-за так называемой «ленивой» компиляции в версиях 8.3.18–8.3.22.

Чтобы заставить систему полностью перестроить кэш модуля, выполните следующие действия:

  1. Снимите флаг «Использовать» в списке расширений.
  2. Примените изменения (обновите конфигурацию базы данных).
  3. Включите флаг обратно.
  4. Если это не помогло, удалите расширение (предварительно сохранив его в файл .cfe), перезапустите службу 1C:Enterprise Server (для клиент-серверного варианта) и добавьте расширение заново.

Причина №3: Почему ошибка ПТиУ мешает другим документам?

Выясним, почему ошибка в модуле менеджера ПоступлениеТоваровУслуг блокирует просмотр проводок в других типах документов (например, в «Реализации» или «Авансовом отчете»). В современных версиях БСП многие общие команды и механизмы прослеживаемости обращаются к менеджеру ПТиУ для получения метаданных или параметров печати. Если модуль менеджера ПТиУ содержит синтаксическую ошибку, он не может быть инициализирован в момент обращения любого общего модуля, что «роняет» всю цепочку вызовов.

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

Если визуальный осмотр модуля в конфигураторе не дает результатов, применим метод «глубокого сканирования». Посмотрим, как это сделать:

  1. Перейдите в меню Конфигурация — Выгрузить конфигурацию в файлы (для вашего расширения).
  2. Откройте полученную папку в продвинутом текстовом редакторе (например, VS Code или Notepad++).
  3. Выполните поиск по строке #Если и #КонецЕсли.
  4. Проверьте их количество. Оно должно быть строго одинаковым в рамках одного файла модуля.
  5. Убедитесь, что после #КонецЕсли нет лишних символов переноса страницы или странных кодировок (BOM).

Пример правильного оформления блока в расширении

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


&Вместо("СформироватьДвижения")
Процедура Расш1_СформироватьДвижения(Отказ, ПараметрыПроведения)
    #Если Сервер Тогда
        // Здесь ваш доработанный код
        ПродолжитьВызов(Отказ, ПараметрыПроведения);
    #КонецЕсли
КонецПроцедуры

Важно: если вы используете &Вместо, старайтесь минимизировать использование директив препроцессора внутри самой процедуры, если только они не жизненно необходимы для разделения контекста исполнения.

Заключение

Если после всех манипуляций ошибка сохраняется, попробуйте временное решение, к которому прибегают в критических ситуациях: перенесите изменения из расширения непосредственно в основную конфигурацию (если она снята с поддержки) или создайте новое чистое расширение и перенесите в него код по одной процедуре, проверяя работоспособность после каждого шага. Это позволит локализовать конкретный «битый» фрагмент кода.

← На главную