При обновлении типовых конфигураций, таких как 1С:Бухгалтерия предприятия 3.0, разработчики часто сталкиваются с ситуацией, когда стабильно работавшее ранее расширение внезапно начинает выдавать синтаксические ошибки. Одна из самых коварных — Ожидается определение процедуры/функции #КонецЕсли. Особенность этой ошибки заключается в том, что она может указывать на строку кода, которой физически нет в вашем расширении, или возникать в документах, которые вы даже не редактировали. Рассмотрим подробно причины возникновения этой коллизии и разберем по шагам методы её устранения.
Проанализируем типичную ситуацию. Имеется конфигурация БП Корп 3.0 на платформе версии 8.3.20.1914. После штатного обновления расширение переведено в актуальный режим совместимости (например, 8.3.17), но при попытке открыть проводки документа ПоступлениеТоваровУслуг (ПТиУ) система выдает ошибку инициализации модуля менеджера. Выясним причину, почему это происходит даже в тех случаях, когда все директивы в расширении вроде бы прописаны корректно.
Механизм расширений в 1С работает путем динамической «склейки» кода основного модуля и кода расширения. Если в основном модуле процедура обернута в инструкции препроцессора, например:
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Процедура ИсполнитьНаСервере()
// Код типовой конфигурации
КонецПроцедуры
#КонецЕсли
А в вашем расширении вы используете аннотацию &Вместо или &ИзменитьИКонтролировать, платформа пытается внедрить ваш фрагмент внутрь этой логической структуры. Если в процессе обновления в основной конфигурации изменилось расположение этих директив или добавились новые области (#Область), парность инструкций #Если и #КонецЕсли нарушается именно в результирующем («собранном») модуле. Именно поэтому конфигуратор указывает на мифическую строку 697, которой может не быть в вашем текстовом редакторе.
Разберем подробнее наиболее частую причину. При использовании механизма &ИзменитьИКонтролировать разработчик копирует фрагмент кода из основной конфигурации. Если внутри этого фрагмента были открыты директивы препроцессора, которые закрываются за пределами редактируемого блока, компилятор теряет «пару».
Что нужно проверить:
ПоступлениеТоваровУслуг в расширении.#КонецЕсли внутрь вашей процедуры или, наоборот, не остался ли #Если «висеть» без закрывающей инструкции.# и словом КонецЕсли, платформа не распознает директиву.Иногда ошибка является фантомной и связана с тем, что платформа хранит скомпилированные образы расширений. Рассмотрим ситуацию: вы внесли правку, но ошибка не исчезла. Это происходит из-за так называемой «ленивой» компиляции в версиях 8.3.18–8.3.22.
Чтобы заставить систему полностью перестроить кэш модуля, выполните следующие действия:
.cfe), перезапустите службу 1C:Enterprise Server (для клиент-серверного варианта) и добавьте расширение заново.Выясним, почему ошибка в модуле менеджера ПоступлениеТоваровУслуг блокирует просмотр проводок в других типах документов (например, в «Реализации» или «Авансовом отчете»). В современных версиях БСП многие общие команды и механизмы прослеживаемости обращаются к менеджеру ПТиУ для получения метаданных или параметров печати. Если модуль менеджера ПТиУ содержит синтаксическую ошибку, он не может быть инициализирован в момент обращения любого общего модуля, что «роняет» всю цепочку вызовов.
Если визуальный осмотр модуля в конфигураторе не дает результатов, применим метод «глубокого сканирования». Посмотрим, как это сделать:
#Если и #КонецЕсли.#КонецЕсли нет лишних символов переноса страницы или странных кодировок (BOM).Рассмотрим пример, как правильно оформить заплатку в модуле менеджера, чтобы избежать подобных ошибок:
&Вместо("СформироватьДвижения")
Процедура Расш1_СформироватьДвижения(Отказ, ПараметрыПроведения)
#Если Сервер Тогда
// Здесь ваш доработанный код
ПродолжитьВызов(Отказ, ПараметрыПроведения);
#КонецЕсли
КонецПроцедуры
Важно: если вы используете &Вместо, старайтесь минимизировать использование директив препроцессора внутри самой процедуры, если только они не жизненно необходимы для разделения контекста исполнения.
Если после всех манипуляций ошибка сохраняется, попробуйте временное решение, к которому прибегают в критических ситуациях: перенесите изменения из расширения непосредственно в основную конфигурацию (если она снята с поддержки) или создайте новое чистое расширение и перенесите в него код по одной процедуре, проверяя работоспособность после каждого шага. Это позволит локализовать конкретный «битый» фрагмент кода.