К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как из расширения обратиться к основной конфигурации 1С

Как из расширения 1С обратиться к объектам основной конфигурации: заимствование, вызов процедур и функций, ограничения, типовые ошибки и проверка результата.

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

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

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

Как устроено взаимодействие расширения и основной конфигурации

Расширение подключается к информационной базе и выполняется в том же контексте, что и основная конфигурация. Это значит, что из кода расширения доступны все объекты метаданных основной конфигурации: справочники, документы, регистры, общие модули, перечисления. Менеджеры объектов вызываются стандартно — Справочники.Номенклатура, Документы.РеализацияТоваровУслуг и так далее.

Заимствование (добавление объекта в расширение через контекстное меню «Добавить в расширение») требуется в двух случаях: когда нужно изменить объект (добавить реквизит, переопределить обработчик, расширить форму) и когда нужно контролировать совместимость — платформа проверит, что заимствованный объект существует в основной конфигурации. Для простого вызова кода заимствование не обязательно, но рекомендуется: при обновлении основной конфигурации вы сразу увидите ошибку, если объект переименуют.

Вызов процедур и функций общих модулей основной конфигурации

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

Цена = Ценообразование.ПолучитьЦенуНоменклатуры(Номенклатура, ТипЦен, Дата);

Ключевое ограничение: доступны только экспортные процедуры и функции — те, что объявлены с ключевым словом Экспорт в основной конфигурации. Неэкспортные (внутренние) методы модуля из расширения недоступны. Если нужная логика не экспортирована, варианты такие: найти публичный программный интерфейс (в типовых конфигурациях это модули с постфиксом или областью «ПрограммныйИнтерфейс»), скопировать логику в свой модуль расширения или перехватить вызывающий её экспортный метод.

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

Работа с объектами метаданных: справочники, документы, регистры

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

Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");

ДокОбъект = Документы.РеализацияТоваровУслуг.СоздатьДокумент();

ДокОбъект.Контрагент = Контрагент;

ДокОбъект.Записать();

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

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

Перехват методов модулей: аннотации &Вместо, &Перед, &После

Когда нужно не просто вызвать код основной конфигурации, а изменить его поведение, используется перехват методов. Для этого общий модуль (или модуль объекта, менеджера) заимствуется в расширение, а в нём объявляется метод с аннотацией:

&Вместо("РассчитатьСуммуДокумента")

Функция Расш1_РассчитатьСуммуДокумента(ДокументОбъект)

// свой код до или вместо типового

Результат = ПродолжитьВызов(ДокументОбъект);

Возврат Результат * 1.05;

КонецФункции

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

Выбор аннотации перехвата

&Перед / &После

Подходят для дополнения логики без изменения типовой. Минимальный риск конфликтов при обновлении конфигурации.

&Вместо

Полная замена метода. Гибко, но при обновлении типовой вы не получите изменений оригинала, пока не пересмотрите перехват.

&ИзменениеИКонтроль

Точечные правки внутри типового метода с контролем заимствованного кода. Требует аккуратного сопоставления после каждого обновления.

Расширение форм и обращение к их элементам

Форма основной конфигурации заимствуется в расширение, после чего в её модуле можно перехватывать события (ПриСозданииНаСервере, ПриОткрытии, обработчики команд и элементов) теми же аннотациями. Внутри перехваченного обработчика доступны все реквизиты и элементы типовой формы через ЭтаФорма, Элементы, Объект.

&НаСервере

&После("ПриСозданииНаСервере")

Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Элементы.Контрагент.ПодсказкаВвода = "Выберите контрагента";

КонецПроцедуры

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

Порядок действий при обращении к основной конфигурации
  1. 1
    Определите, что нужно: вызвать метод, прочитать данные или изменить поведение типового кода.
  2. 2
    Для вызова метода проверьте, что он экспортный и доступен в нужном контексте (клиент/сервер).
  3. 3
    Для изменения объекта заимствуйте его в расширение через «Добавить в расширение».
  4. 4
    Для перехвата логики добавьте метод с аннотацией &Перед, &После или &Вместо.
  5. 5
    Примените расширение и проверьте работу в пользовательском режиме.
  6. 6
    После обновления основной конфигурации выполните проверку применимости расширения.

Ограничения и типичные ошибки

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

Частая ошибка — обращение к объекту, который в целевой конфигурации отсутствует или называется иначе (например, расширение писалось под ERP, а применяется в УТ). Перед вызовом спорных объектов используйте проверку через Метаданные.НайтиПоПолномуИмени() или оценивайте состав метаданных. Другая типовая проблема — безопасный режим: если расширение подключено в безопасном режиме, часть операций (внешние компоненты, файловые операции) будет недоступна, хотя обращение к метаданным основной конфигурации работает.

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

Типичные ошибки
01
Вызов неэкспортной процедуры основной конфигурации — ошибка компиляции модуля расширения.
02
Использование &Вместо без ПродолжитьВызов там, где типовая логика всё же нужна — теряется штатное поведение и накапливаются расхождения при обновлениях.
03
Игнорирование контекста сервер/клиент — вызов серверного модуля с клиента приводит к ошибке выполнения.
04
Жёсткая правка заимствованной формы вместо программного добавления элементов — конфликты при обновлении типовой конфигурации.
05
Отсутствие проверки применимости расширения после обновления — неработающая база или неявные сбои.

Проверка результата и применимости расширения

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

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

Контрольные точки

Как проверить результат

Применимость расширения
Норма

Проверка в конфигураторе завершается без ошибок, расширение активно в списке

Тревожный признак

Сообщения о несоответствии заимствованных объектов, расширение отключается

Работа перехвата
Норма

В журнале регистрации есть отметка из вашего обработчика, результат функции соответствует ожиданию

Тревожный признак

Выполняется только типовой код или возникает ошибка вызова метода

Поведение после обновления
Норма

Все сценарии, затронутые расширением, работают как до обновления

Тревожный признак

Ошибки при открытии форм, падение проверки применимости

Итог

Что важно запомнить

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

Частые вопросы

Можно ли из расширения вызвать неэкспортную процедуру общего модуля?

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

Нужно ли заимствовать объект, если я только читаю его данные запросом?

Нет. Для запросов и обращений через менеджеры объектов заимствование не требуется. Оно нужно для изменения состава объекта, перехвата его модулей и форм, а также для контроля существования объекта при обновлениях.

Что произойдёт с расширением при обновлении основной конфигурации?

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

Можно ли из одного расширения обратиться к другому расширению?

Штатного механизма прямого обращения между расширениями нет: каждое расширение видит основную конфигурацию, но не другие расширения. Общую логику выносят в основную конфигурацию (если она дорабатывается) или дублируют в каждом расширении.

Почему перехват &Вместо не вызывается?

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

Можно ли добавить в расширение свой общий модуль и вызывать из него типовые модули?

Да, это рекомендуемая практика: собственные общие модули расширения свободно обращаются к экспортным методам основной конфигурации. Так вы концентрируете всю логику интеграции в одном месте и упрощаете сопровождение при обновлениях.