Как исправить ошибку «Не обнаружено ссылок на функцию» при перехвате метода в расширении 1С 8.3?

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

При разработке расширений конфигураций 1С:Предприятие 8.3 разработчики часто сталкиваются с ситуацией, когда требуется переопределить логику типового документа или справочника через аннотацию &Вместо. Однако при синтаксическом контроле или проверке конфигурации платформа может выдать предупреждение вида: «Не обнаружено ссылок на функцию: "ИмяФункции"» в модуле менеджера или модуле объекта расширения. Разберем причины такого поведения платформы и детально рассмотрим способы решения проблемы.

Причина возникновения предупреждения при проверке

Проанализируем механику работы платформы 1С при статической проверке кода. Сообщение «Не обнаружено ссылок на функцию...» формируется встроенным инструментом статической проверки конфигурации (механизм поиска неиспользуемых процедур и функций). Платформа анализирует явные вызовы методов внутри текста модуля.

Если функция в расширении объявлена без ключевого слова Экспорт и внутри самого расширения к ней нет прямых обращений по имени, статический анализатор считает эту функцию неиспользуемым («мертвым») кодом. Платформа при синтаксическом анализе не связывает декларацию директивы &Вместо("ТиповоеИмяФункции") с прямым вызовом метода, из-за чего и генерируется ошибка контроля.

При этом в режиме «1С:Предприятие» при выполнении кода платформа корректно подменяет типовой метод на метод из расширения даже без директивы Экспорт, однако сообщение при проверке мешает нормальной валидации конфигурации.

Способ 1. Добавление директивы Экспорт к методу расширения

Самый простой и быстрый способ избавиться от предупреждения синтаксического контроля — сделать объявляемую в расширении функцию экспортной. Когда метод помечен как Экспорт, анализатор платформы считает его частью публичного программного интерфейса модуля менеджера и перестает требовать наличия внутренних ссылок на него.

Посмотрим на пример перехвата функции модуля менеджера документа ПереоценкаВалютныхСредств с добавлением ключевого слова Экспорт:


&Вместо("ТекстЗапросаКурсовыеРазницыДенежныеДокументы")
Функция Расш1_ТекстЗапросаКурсовыеРазницыДенежныеДокументы() Экспорт
    
    // Формируем собственный текст запроса для переоценки
    ТекстЗапроса = 
    "ВЫБРАТЬ
    |    КурсыВалют.Период КАК Период,
    |    КурсыВалют.Валюта КАК Валюта,
    |    КурсыВалют.Курс КАК Курс,
    |    КурсыВалют.Кратность КАК Кратность
    |ИЗ
    |    РегистрСведений.КурсыВалют.СрезПоследних(&Период, ) КАК КурсыВалют";
    
    Возврат ТекстЗапроса;
    
КонецФункции

Разберем по шагам, как применить данное решение:

  1. Откроем модуль менеджера нужного объекта в расширении конфигурации.
  2. Найдем функцию, на которую ругается синтаксический контроль.
  3. В заголовке метода перед телом функции добавим ключевое слово Экспорт.
  4. Повторно запустим проверку конфигурации или синтаксический контроль (горячие клавиши Ctrl + F7) — ошибка исчезнет.
  5. Запустим сеанс в режиме отладки и убедимся, что точка останова внутри метода расширения успешно срабатывает.

Важно: объявление метода экспортным делает его доступным для вызова из других модулей конфигурации через менеджер объекта (Документы.ПереоценкаВалютныхСредств.Расш1_ТекстЗапроса...). Если критически важно соблюсти строгую инкапсуляцию, обратите внимание на альтернативные варианты ниже.

Способ 2. Вызов типовой логики через ПродолжитьВызов()

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

Рассмотрим пример реализации:


&Вместо("ТекстЗапросаКурсовыеРазницыДенежныеДокументы")
Функция Расш1_ТекстЗапросаКурсовыеРазницыДенежныеДокументы() Экспорт
    
    // Получаем оригинальный текст запроса из типовой конфигурации
    ТекстЗапроса = ПродолжитьВызов();
    
    // Дополняем текст запроса своими условиями или полями
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ГДЕ", "ГДЕ НЕ Документ.ПометкаУдаления И");
    
    Возврат ТекстЗапроса;
    
КонецФункции

Способ 3. Отключение правила в проверке конфигурации

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

  1. В главном меню конфигуратора перейдем в раздел Конфигурация → Проверка конфигурации....
  2. В открывшемся окне найдем группу проверок логической целостности.
  3. Снимем флажок с опции «Поиск неиспользуемых процедур и функций».
  4. Нажмем кнопку Выполнить.

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

Способ 4. Использование аннотации &ИзменениеИКонтроль (для платформы 8.3.15 и выше)

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

Посмотрим на пример оформления через &ИзменениеИКонтроль:


&ИзменениеИКонтроль("ТекстЗапросаКурсовыеРазницыДенежныеДокументы")
Функция Расш1_ТекстЗапросаКурсовыеРазницыДенежныеДокументы()
    
    #Вставка
    // Наш измененный текст запроса
    Возврат "ВЫБРАТЬ Первые 1 1 ИЗ Справочник.Валюты КАК Валюты";
    #КонецВставки
    
    #Удаление
    // Типовой код, который будет проигнорирован
    // Возврат "ВЫБРАТЬ ...";
    #КонецУдаления
    
КонецФункции

Таким образом, при перехвате неэкспортных методов модуля менеджера в ранних версиях платформы достаточно добавить модификатор Экспорт к методу расширения либо скорректировать параметры статической проверки конфигурации.

← На главную