Почему не работает расширение общего модуля в 1С 8.3 и как это исправить

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

Механизм расширений в платформе 1С:Предприятие 8.3 — это мощный инструмент, позволяющий дорабатывать типовые конфигурации без снятия их с поддержки. Однако разработчики часто сталкиваются с ситуацией, когда код в расширении общего модуля (особенно при перехвате методов с помощью аннотации &Вместо) упорно отказывается выполняться. При этом, на первый взгляд, все сделано правильно: модуль добавлен в расширение, свойства выставлены, галочка безопасного режима снята.

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

1. Проверка активности расширения в режиме «1С:Предприятие»

Очень часто разработчики забывают, что добавление расширения в конфигураторе и написание кода — это лишь половина дела. Расширение должно быть физически подключено и активно непосредственно в режиме пользователя. Выясним, как проверить этот статус.

Для конфигураций, разработанных на базе Библиотеки стандартных подсистем (БСП), управление расширениями выполняется через специальный интерфейс:

  1. Откроем программу в режиме «1С:Предприятие» под правами администратора.
  2. Перейдем в раздел НСИ и администрирование, далее выберем пункт Печатные формы, отчеты и обработки.
  3. Найдем ссылку Расширения. В открывшемся списке должно присутствовать наше расширение.
  4. Обратим внимание на флаг Активно. Если этот флажок снят, платформа полностью игнорирует весь код и объекты данного расширения. Установим его.

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

2. Настройка режима совместимости

Проанализируем важнейший параметр, который часто упускают из виду — режим совместимости. Платформа 1С накладывает жесткие правила на взаимодействие основной конфигурации и расширения в разрезе версий.

Рассмотрим два критических правила настройки совместимости:

  1. Режим совместимости расширения не должен быть выше режима совместимости основной конфигурации. Если у вашей основной базы стоит режим совместимости «Версия 8.3.14», а в созданном расширении по умолчанию установилась «Версия 8.3.15» (или вообще отключена совместимость), платформа откажется применять это расширение при запуске сеанса.
  2. Минимальные требования для использования аннотаций. Полноценный механизм перехвата методов с аннотацией &Вместо появился в платформе начиная с версии 8.3.9. Если режим совместимости конфигурации и расширения установлен ниже этого значения, платформа физически не сможет обработать данную конструкцию.

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

3. Ошибки в сигнатуре метода при использовании директивы &Вместо

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

Рассмотрим подробнее требования к сигнатуре расширяющего метода:

Посмотрим на пример неправильного перехвата. Предположим, оригинальный метод в общем модуле выглядит так:


Процедура РассчитатьПараметрыЗаказа(ТекущийДокумент, Знач Корректировка, ОписаниеОшибки = "") Экспорт
    // Исходная логика платформы
КонецПроцедуры

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


&Вместо("РассчитатьПараметрыЗаказа")
Процедура Расш1_РассчитатьПараметрыЗаказа(ТекущийДокумент, Корректировка, ОписаниеОшибки)
    // Данный код не сработает: пропущено "Знач", "Экспорт" и значение по умолчанию
КонецПроцедуры

Правильный вариант перехвата этого метода должен выглядеть следующим образом:


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

4. Влияние безопасного режима и механизмов БСП

Даже если в конфигураторе в свойствах расширения снят флаг Безопасный режим, имя профиля безопасности, это не гарантирует автоматическое отключение ограничений на стороне сервера 1С.

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

Разберем по шагам, как правильно отключить безопасный режим для расширения в интерфейсе БСП:

  1. Откроем список расширений в режиме «1С:Предприятие» (через раздел администрирования).
  2. Выделим наше расширение в списке и нажмем кнопку изменения или откроем его карточку.
  3. Убедимся, что снят флаг Безопасный режим (или установлен флаг, разрешающий выполнение небезопасных операций, в зависимости от версии БСП).
  4. Если система запрашивает подтверждение полномочий или профилей безопасности, предоставим их (потребуются права администратора операционной системы или кластера 1С).
  5. Перезапустим сеанс работы программы.

5. Особенности выполнения кода во внешнем соединении (COM-подключение)

Если ваш общий модуль имеет флаги выполнения Сервер и Внешнее соединение, то вызовы этого модуля могут инициироваться сторонними программами через COM-соединение (например, при обмене данными через V83.COMConnector).

По умолчанию платформа 1С:Предприятие в целях безопасности и стабильности не применяет расширения конфигурации к COM-сессиям. В результате, когда внешняя система вызывает метод общего модуля, управление передается оригинальному коду основной конфигурации, полностью игнорируя ваши доработки с аннотацией &Вместо.

Чтобы расширение применялось во внешнем соединении, необходимо в строке подключения (ConnectionString), используемой внешней базой, явно передать параметр запуска расширений. Пример строки подключения:

Srvr="ИмяСервера";Ref="ИмяБазы";РежимЗапускаРасширений=ЗапускатьАктивные;

Без этого параметра перехват методов в режиме внешнего соединения работать не будет.

6. Проблемы с серверным кэшем и фоновыми заданиями

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

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

Выясним, как гарантированно применить изменения серверного кода расширения:

  1. Выполните перезапуск службы сервера «1С:Предприятие» (для клиент-серверного варианта). Это самый надежный способ очистить весь оперативный кэш модулей.
  2. В файловом варианте работы закройте абсолютно все активные сеансы пользователей (включая конфигуратор), после чего зайдите в базу заново.
  3. Для очистки локального кэша на компьютере разработчика запустите базу с параметром /ClearCache в строке запуска или вручную удалите папки кэша из каталогов %AppData%\1C\1Cv8 и %LocalAppData%\1C\1Cv8.

7. Чек-лист для быстрой самопроверки

Если ваше расширение к общему модулю всё еще не работает, быстро пробегитесь по следующим пунктам:

Проанализировав все указанные моменты и последовательно выполнив проверку по нашему руководству, вы гарантированно сможете запустить расширение общего модуля и обеспечить корректную работу измененной бизнес-логики вашей системы.

← На главную