Механизм расширений в платформе 1С:Предприятие 8.3 — это мощный инструмент, позволяющий дорабатывать типовые конфигурации без снятия их с поддержки. Однако разработчики часто сталкиваются с ситуацией, когда код в расширении общего модуля (особенно при перехвате методов с помощью аннотации &Вместо) упорно отказывается выполняться. При этом, на первый взгляд, все сделано правильно: модуль добавлен в расширение, свойства выставлены, галочка безопасного режима снята.
В этой статье мы подробно разберем, почему может не работать расширение общего модуля, проанализируем неочевидные технические нюансы работы платформы и составим пошаговый чек-лист для исправления ситуации.
Очень часто разработчики забывают, что добавление расширения в конфигураторе и написание кода — это лишь половина дела. Расширение должно быть физически подключено и активно непосредственно в режиме пользователя. Выясним, как проверить этот статус.
Для конфигураций, разработанных на базе Библиотеки стандартных подсистем (БСП), управление расширениями выполняется через специальный интерфейс:
Для баз данных, где БСП не используется или используется старая версия, проверить активность расширения можно через стандартный системный диалог платформы. Для этого перейдем в главное меню: Сервис — Параметры — Управление расширениями конфигурации. Убедимся, что напротив нашего расширения установлена галочка активности, а в колонке состояния отсутствует информация об ошибках подключения.
Проанализируем важнейший параметр, который часто упускают из виду — режим совместимости. Платформа 1С накладывает жесткие правила на взаимодействие основной конфигурации и расширения в разрезе версий.
Рассмотрим два критических правила настройки совместимости:
&Вместо появился в платформе начиная с версии 8.3.9. Если режим совместимости конфигурации и расширения установлен ниже этого значения, платформа физически не сможет обработать данную конструкцию.Чтобы исправить это, откроем свойства корневого объекта конфигурации и свойства расширения в конфигураторе, найдем свойство Режим совместимости и приведем его в соответствие. Лучшее решение — установить в расширении точно такой же режим совместимости, какой задан для основной конфигурации.
Когда мы используем аннотацию &Вместо("ИмяПроцедуры"), платформа осуществляет поиск оригинального метода в основном модуле по его имени и сигнатуре. Если сигнатура метода в расширении отличается хотя бы на один символ, перехват не сработает.
Рассмотрим подробнее требования к сигнатуре расширяющего метода:
Отказ, в расширении недопустимо написать отказ или ПараметрОтказ.Знач (передача параметра по значению), оно обязательно должно присутствовать и в расширяющем методе.Экспорт.Посмотрим на пример неправильного перехвата. Предположим, оригинальный метод в общем модуле выглядит так:
Процедура РассчитатьПараметрыЗаказа(ТекущийДокумент, Знач Корректировка, ОписаниеОшибки = "") Экспорт
// Исходная логика платформы
КонецПроцедуры
Если в модуле расширения написать следующий код, он не будет выполняться:
&Вместо("РассчитатьПараметрыЗаказа")
Процедура Расш1_РассчитатьПараметрыЗаказа(ТекущийДокумент, Корректировка, ОписаниеОшибки)
// Данный код не сработает: пропущено "Знач", "Экспорт" и значение по умолчанию
КонецПроцедуры
Правильный вариант перехвата этого метода должен выглядеть следующим образом:
&Вместо("РассчитатьПараметрыЗаказа")
Процедура Расш1_РассчитатьПараметрыЗаказа(ТекущийДокумент, Знач Корректировка, ОписаниеОшибки = "") Экспорт
// Выполняем предварительные действия
// Если нужно вызвать оригинальный метод:
ПродолжитьВызов(ТекущийДокумент, Корректировка, ОписаниеОшибки);
// Выполняем последующие действия
КонецПроцедуры
Даже если в конфигураторе в свойствах расширения снят флаг Безопасный режим, имя профиля безопасности, это не гарантирует автоматическое отключение ограничений на стороне сервера 1С.
В современных конфигурациях под управлением БСП механизмы безопасности платформы переопределяются логикой программного кода. При запуске сеанса БСП анализирует зарегистрированные расширения и принудительно накладывает на них ограничения безопасного режима, если они не были согласованы администратором в пользовательском интерфейсе.
Разберем по шагам, как правильно отключить безопасный режим для расширения в интерфейсе БСП:
Если ваш общий модуль имеет флаги выполнения Сервер и Внешнее соединение, то вызовы этого модуля могут инициироваться сторонними программами через COM-соединение (например, при обмене данными через V83.COMConnector).
По умолчанию платформа 1С:Предприятие в целях безопасности и стабильности не применяет расширения конфигурации к COM-сессиям. В результате, когда внешняя система вызывает метод общего модуля, управление передается оригинальному коду основной конфигурации, полностью игнорируя ваши доработки с аннотацией &Вместо.
Чтобы расширение применялось во внешнем соединении, необходимо в строке подключения (ConnectionString), используемой внешней базой, явно передать параметр запуска расширений. Пример строки подключения:
Srvr="ИмяСервера";Ref="ИмяБазы";РежимЗапускаРасширений=ЗапускатьАктивные;
Без этого параметра перехват методов в режиме внешнего соединения работать не будет.
Поскольку общий модуль выполняется на стороне сервера, его скомпилированный код кэшируется рабочими процессами сервера приложений 1С (процессами rphost). Часто возникает ситуация, когда разработчик вносит изменения в расширение, нажимает кнопку «Обновить конфигурацию базы данных» (F7), но сервер продолжает использовать старую закэшированную версию модуля из основной конфигурации.
Особенно остро эта проблема проявляется, если перехватываемый код вызывается внутри фоновых или регламентных заданий. Фоновые задания запускаются в отдельных изолированных серверных сеансах, которые могут инициализироваться до того, как кэш расширений будет обновлен.
Выясним, как гарантированно применить изменения серверного кода расширения:
/ClearCache в строке запуска или вручную удалите папки кэша из каталогов %AppData%\1C\1Cv8 и %LocalAppData%\1C\1Cv8.Если ваше расширение к общему модулю всё еще не работает, быстро пробегитесь по следующим пунктам:
Знач, значения по умолчанию, регистр букв)?Экспорт в объявлении метода расширения, если оригинальный метод является экспортным?Проанализировав все указанные моменты и последовательно выполнив проверку по нашему руководству, вы гарантированно сможете запустить расширение общего модуля и обеспечить корректную работу измененной бизнес-логики вашей системы.