Расширение конфигурации 1С изнутри: перехват кода, обновления и отладка

· 9 мин

Содержание

Расширение конфигурации 1С — это отдельный слой доработок, который платформа накладывает на типовую конфигурацию при запуске базы. Сама конфигурация не меняется, поэтому её не нужно снимать с поддержки, а обновления ставятся штатно. Расширения работают в платформе 8.3, начиная с версии 8.3.6, и хранятся в информационной базе в виде файла .cfe.

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

Чем расширение отличается от внешней обработки и правки конфигурации

Новички часто путают три способа доработки. Разница — в том, куда попадает код и что происходит при обновлении.

СпособГде хранитсяЧто может менятьЧто при обновлении типовой
Внешняя обработка или отчёт (.epf, .erf)Отдельный файл или справочник дополнительных обработокНичего в поведении типовых объектов; работает рядом с нимиНе затрагивается, но может сломаться, если изменились имена реквизитов
Расширение (.cfe)Информационная база, отдельно от основной конфигурацииФормы, модули, команды, роли; добавляет свои объекты и реквизитыТиповая обновляется штатно, расширение проверяется на применимость
Прямая правка конфигурацииСама конфигурацияВсёНужно снимать с поддержки и обновлять через сравнение и объединение

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

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

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

Как устроено заимствование и перехват событий в расширениях 1С

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

Заимствование объектов

Чтобы доработать объект, в дереве основной конфигурации вызовите на нём контекстное меню и выберите Добавить в расширение. В расширение попадёт объект без модулей и реквизитов. Затем так же заимствуете нужную форму, модуль или отдельный реквизит.

Флажок контроля у свойства значит: «если в типовой это свойство поменяют, расширение должно об этом узнать». Например, вы рассчитываете, что реквизит Контрагент имеет тип СправочникСсылка.Контрагенты. Ставите контроль — и после обновления, где тип изменили, платформа откажется применять расширение, а не выдаст ошибку посреди проведения.

Аннотации перехвата

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

  • 🔹 &Перед("ИмяМетода") — ваш код выполняется до типового. Подходит для дополнительных проверок.
  • 🔹 &После("ИмяМетода") — ваш код выполняется после типового. Так добавляют поля на форму, дозаполняют реквизиты.
  • 🔹 &Вместо("ИмяМетода") — типовой метод не вызывается, работает только ваш код. Вызвать оригинал можно через ПродолжитьВызов().
  • 🔹 &ИзменениеИКонтроль("ИмяМетода") — копия текста типового метода с вашими вставками. Появилась в платформе 8.3.16.

Пример проверки перед записью документа (модуль объекта заимствованного документа, префикс Расш1_):

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

Изменение и контроль: точечная правка внутри метода

&ИзменениеИКонтроль решает старую проблему &Вместо. Раньше, чтобы поменять одну строку в середине длинной процедуры, приходилось копировать её целиком и молча терять все исправления, которые фирма 1С внесёт в оригинал.

Теперь вы копируете метод и отмечаете свои изменения инструкциями #Вставка … #КонецВставки и #Удаление … #КонецУдаления. Платформа сравнивает остальной текст с оригиналом. Если после обновления типовой текст метода изменился, расширение не применится, и вы сразу увидите, что правку надо перенести.

Условный пример: в типовой функции скидок нужно добавить промежуточную ступень.

&ИзменениеИКонтроль("СтавкаСкидки")
Функция Расш1_СтавкаСкидки(СуммаЗаказа)
    Если СуммаЗаказа > 100000 Тогда
        Возврат 5;
    КонецЕсли;
    #Вставка
    Если СуммаЗаказа > 50000 Тогда
        Возврат 3;
    КонецЕсли;
    #КонецВставки
    Возврат 0;
КонецФункции
АннотацияКогда братьРиск
&Перед, &ПослеДобавить действие до или после типовогоМинимальный, переживает почти любые обновления
&ИзменениеИКонтрольПоменять логику внутри методаРасширение отключается при изменении оригинала — это и есть защита
&ВместоПолностью заменить поведениеВысокий: исправления фирмы 1С в этом методе до вас не дойдут

Создание расширения конфигурации и подключение к базе

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

Создание в Конфигураторе

  1. Откройте Конфигуратор и выполните Конфигурация → Открыть конфигурацию.
  2. Перейдите в Конфигурация → Расширения конфигурации и нажмите кнопку добавления.
  3. Задайте имя, синоним и префикс, например Расш1_. Префикс автоматически подставляется к именам новых объектов и процедур.
  4. Выберите назначение: Исправление, Адаптация или Дополнение. От назначения зависит порядок применения нескольких расширений.
  5. Откройте дерево расширения, заимствуйте нужные объекты и напишите код.
  6. Обновите конфигурацию базы данных — для расширения это отдельная команда в его окне.
  7. Сохраните расширение в файл .cfe, чтобы перенести в другую базу.

Подключение готового файла .cfe

В конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) это делается без Конфигуратора: Администрирование → Печатные формы, отчеты и обработки → Расширения. Нажмите добавление из файла, укажите .cfe и перезапустите программу.

Во всех конфигурациях работает универсальный способ: Функции для технического специалиста → Стандартные → Управление расширениями конфигурации. Если пункта «Функции для технического специалиста» нет в меню, включите его в параметрах программы.

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

Перед подключением чужого расширения
Выполнено: 0 / 5

Обновление типовой конфигурации, когда установлены расширения

Главное преимущество расширений — типовая остаётся на поддержке. Обновление ставится как обычно: через Администрирование → Интернет-поддержка и сервисы → Обновление версии программы или в Конфигураторе файлом .cfu.

После обновления платформа при запуске проверяет каждое расширение на применимость. Возможны три исхода:

  • ✅ Расширение применилось. Заимствованные объекты и контролируемые свойства не поменялись. Ничего делать не нужно.
  • ⚠️ Расширение не применилось. Программа сообщает, что расширение не может быть применено, и указывает объект. Основная база при этом работает, просто без доработки.
  • ❌ Ошибка при работе. Чаще всего у расширения без контроля свойств, где код обращается к реквизиту, которого больше нет.

Как перенести доработку на новый релиз

  1. Откройте расширение в Конфигураторе.
  2. Запустите проверку применимости расширений — платформа покажет список конфликтов.
  3. Для заимствованных объектов обновите свойства из основной конфигурации.
  4. Для методов с &ИзменениеИКонтроль сравните свой текст с новым оригиналом и перенесите вставки.
  5. Обновите конфигурацию базы данных расширения и сохраните новую версию .cfe.

💡 Ставьте обновление сначала в копию базы . Если расширение там не применилось, у вас есть время его поправить, а пользователи работают в рабочей базе со старым релизом.

Расширения с данными

С платформы 8.3.11 расширение может хранить свои данные: новые справочники, документы, регистры и реквизиты у заимствованных объектов. Такое расширение меняет структуру базы.

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

Отладка расширений и поиск ошибок

Модули расширения отлаживаются так же, как модули основной конфигурации. Точки останова ставятся в Конфигураторе или в EDT прямо в коде расширения, отладчик останавливается на них в процедурах с любой аннотацией.

Порядок диагностики, когда «после установки расширения что-то сломалось»:

  1. Отключите расширение. Снимите флажок «Активно» в списке расширений и перезапустите сеанс. Ошибка пропала — источник в расширении.
  2. Найдите метод. Включите отладку, воспроизведите ошибку и посмотрите стек вызовов: в нём видны и типовые процедуры, и процедуры с префиксом расширения.
  3. Проверьте режим совместимости. Если он у расширения выше, чем у конфигурации, расширение не загрузится.
  4. Проверьте безопасный режим. Ошибка о запрете операции в безопасном режиме значит, что код пытается работать с файлами или внешними ресурсами.
  5. Посмотрите журнал регистрации. Ошибки применения расширений и исключения в их коде попадают туда.
Диагностика: выберите симптом

Ограничения расширений и правила безопасной разработки

Расширение мощное, но не всесильное.

Чего расширение не умеет

  • 🚫 Удалять объекты и реквизиты основной конфигурации.
  • 🚫 Менять тип существующего типового реквизита.
  • 🚫 Переписывать часть модуля вне методов: доработка всегда привязана к конкретной процедуре или функции.
  • 🚫 Перехватывать локальную переменную или кусок кода без копии метода — для этого есть только &ИзменениеИКонтроль.

Практика, которая экономит время при обновлениях

  • 📌 Одна задача — одно расширение. Пять мелких доработок в одном .cfe придётся чинить вместе, даже если сломалась одна.
  • 📌 Сначала &Перед и &После, потом &ИзменениеИКонтроль, и только в крайнем случае &Вместо.
  • 📌 Ставьте контроль на свойства, от которых зависит ваш код: тип реквизита, состав табличной части.
  • 📌 Уникальный префикс у каждого расширения. Два расширения с одинаковым префиксом рискуют получить конфликт имён.
  • 📌 Режим совместимости расширения выставляйте равным режиму основной конфигурации.
  • 📌 Храните исходники .cfe с номером версии или в хранилище. Расширение в базе — не резервная копия.

Частые ошибки при работе с расширениями

  • ❌ Снимают конфигурацию с поддержки «на всякий случай». Для расширений это не нужно, а обратно вернуть поддержку без сравнения объединения сложно.
  • ❌ Пишут всё через &Вместо. Через год типовой метод исправили, а в базе продолжает работать старая копия кода с ошибкой.
  • ❌ Удаляют расширение с данными, чтобы «переустановить». Вместе с ним пропадают добавленные реквизиты и записи справочников.
  • ❌ Загружают .cfe, но не обновляют конфигурацию базы данных. Файл в базе есть, доработка не работает.

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

Сколько расширений можно подключить к одной базе?
Жёсткого ограничения на количество нет. На практике десяток расширений работает нормально, но каждое добавляет время на проверку применимости при запуске.
Работают ли расширения в 1С:Фреш и других облачных сервисах?
Да, в сервисах на модели разделения данных расширения подключаются для своей области данных. Но провайдер может ограничивать загрузку расширений без безопасного режима.
Можно ли менять печатную форму через расширение?
Да. Заимствуете макет или процедуру формирования печатной формы и вносите изменения. Это частый способ доработать типовой бланк без снятия с поддержки.
Сохраняются ли расширения при выгрузке базы в .dt?
Да. Расширения хранятся в информационной базе и переносятся вместе с ней. Но держите и отдельные файлы .cfe: так расширение проще поставить в другую базу.
Нужна ли отдельная лицензия для расширений?
Нет. Расширения — механизм платформы, они не требуют дополнительных лицензий сверх тех, что нужны для работы с базой.