При разработке расширений конфигураций 1С:Предприятие 8.3 разработчики часто сталкиваются с ситуацией, когда требуется переопределить логику типового документа или справочника через аннотацию &Вместо. Однако при синтаксическом контроле или проверке конфигурации платформа может выдать предупреждение вида: «Не обнаружено ссылок на функцию: "ИмяФункции"» в модуле менеджера или модуле объекта расширения. Разберем причины такого поведения платформы и детально рассмотрим способы решения проблемы.
Проанализируем механику работы платформы 1С при статической проверке кода. Сообщение «Не обнаружено ссылок на функцию...» формируется встроенным инструментом статической проверки конфигурации (механизм поиска неиспользуемых процедур и функций). Платформа анализирует явные вызовы методов внутри текста модуля.
Если функция в расширении объявлена без ключевого слова Экспорт и внутри самого расширения к ней нет прямых обращений по имени, статический анализатор считает эту функцию неиспользуемым («мертвым») кодом. Платформа при синтаксическом анализе не связывает декларацию директивы &Вместо("ТиповоеИмяФункции") с прямым вызовом метода, из-за чего и генерируется ошибка контроля.
При этом в режиме «1С:Предприятие» при выполнении кода платформа корректно подменяет типовой метод на метод из расширения даже без директивы Экспорт, однако сообщение при проверке мешает нормальной валидации конфигурации.
Самый простой и быстрый способ избавиться от предупреждения синтаксического контроля — сделать объявляемую в расширении функцию экспортной. Когда метод помечен как Экспорт, анализатор платформы считает его частью публичного программного интерфейса модуля менеджера и перестает требовать наличия внутренних ссылок на него.
Посмотрим на пример перехвата функции модуля менеджера документа ПереоценкаВалютныхСредств с добавлением ключевого слова Экспорт:
&Вместо("ТекстЗапросаКурсовыеРазницыДенежныеДокументы")
Функция Расш1_ТекстЗапросаКурсовыеРазницыДенежныеДокументы() Экспорт
// Формируем собственный текст запроса для переоценки
ТекстЗапроса =
"ВЫБРАТЬ
| КурсыВалют.Период КАК Период,
| КурсыВалют.Валюта КАК Валюта,
| КурсыВалют.Курс КАК Курс,
| КурсыВалют.Кратность КАК Кратность
|ИЗ
| РегистрСведений.КурсыВалют.СрезПоследних(&Период, ) КАК КурсыВалют";
Возврат ТекстЗапроса;
КонецФункции
Разберем по шагам, как применить данное решение:
Экспорт.Важно: объявление метода экспортным делает его доступным для вызова из других модулей конфигурации через менеджер объекта (Документы.ПереоценкаВалютныхСредств.Расш1_ТекстЗапроса...). Если критически важно соблюсти строгую инкапсуляцию, обратите внимание на альтернативные варианты ниже.
Если цель доработки заключается не в полной замене алгоритма, а лишь в дополнении или модификации результата типовой функции, используем метод ПродолжитьВызов(). В этом случае мы получаем результат стандартной логики и при необходимости корректируем его.
Рассмотрим пример реализации:
&Вместо("ТекстЗапросаКурсовыеРазницыДенежныеДокументы")
Функция Расш1_ТекстЗапросаКурсовыеРазницыДенежныеДокументы() Экспорт
// Получаем оригинальный текст запроса из типовой конфигурации
ТекстЗапроса = ПродолжитьВызов();
// Дополняем текст запроса своими условиями или полями
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ГДЕ", "ГДЕ НЕ Документ.ПометкаУдаления И");
Возврат ТекстЗапроса;
КонецФункции
Если по стандартам разработки предприятия запрещено добавлять ключевое слово Экспорт к служебным методам, которые в основной конфигурации являются локальными, предупреждение можно отключить в настройках проверки:
В этом случае платформа не будет анализировать наличие ссылок на неэкспортные методы, и процесс проверки пройдет без ложных предупреждений.
Если версия платформы и режим совместимости конфигурации позволяют (8.3.15 и новее), рекомендуется отказаться от полного переопределения через &Вместо в пользу директивы &ИзменениеИКонтроль. Это защитит алгоритм от скрытых ошибок при обновлении типовой конфигурации вендора и полностью исключит проблему статического поиска ссылок.
Посмотрим на пример оформления через &ИзменениеИКонтроль:
&ИзменениеИКонтроль("ТекстЗапросаКурсовыеРазницыДенежныеДокументы")
Функция Расш1_ТекстЗапросаКурсовыеРазницыДенежныеДокументы()
#Вставка
// Наш измененный текст запроса
Возврат "ВЫБРАТЬ Первые 1 1 ИЗ Справочник.Валюты КАК Валюты";
#КонецВставки
#Удаление
// Типовой код, который будет проигнорирован
// Возврат "ВЫБРАТЬ ...";
#КонецУдаления
КонецФункции
Таким образом, при перехвате неэкспортных методов модуля менеджера в ранних версиях платформы достаточно добавить модификатор Экспорт к методу расширения либо скорректировать параметры статической проверки конфигурации.