Расширение конфигурации 1С изнутри: перехват кода, обновления и отладка
Содержание
Расширение конфигурации
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_. Префикс автоматически подставляется к именам новых объектов и процедур. - Выберите назначение:
Исправление,АдаптацияилиДополнение. От назначения зависит порядок применения нескольких расширений. - Откройте дерево расширения, заимствуйте нужные объекты и напишите код.
- Обновите конфигурацию базы данных — для расширения это отдельная команда в его окне.
- Сохраните расширение в файл
.cfe, чтобы перенести в другую базу.
Подключение готового файла .cfe
В конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) это делается без Конфигуратора: Администрирование → Печатные формы, отчеты и обработки → Расширения. Нажмите добавление из файла, укажите .cfe и перезапустите программу.
Во всех конфигурациях работает универсальный способ: Функции для технического специалиста → Стандартные → Управление расширениями конфигурации. Если пункта «Функции для технического специалиста» нет в меню, включите его в параметрах программы.
При загрузке на расширении стоят флажки «Безопасный режим» и «Защита от опасных действий». Не снимайте их у расширения, которое получили от стороннего разработчика и не проверили. Без безопасного режима код расширения может работать с файлами, внешними компонентами и COM-объектами на сервере.
Обновление типовой конфигурации, когда установлены расширения
Главное преимущество расширений — типовая остаётся на поддержке. Обновление ставится как обычно: через Администрирование → Интернет-поддержка и сервисы → Обновление версии программы или в Конфигураторе файлом .cfu.
После обновления платформа при запуске проверяет каждое расширение на применимость. Возможны три исхода:
- ✅ Расширение применилось. Заимствованные объекты и контролируемые свойства не поменялись. Ничего делать не нужно.
- ⚠️ Расширение не применилось. Программа сообщает, что расширение не может быть применено, и указывает объект. Основная база при этом работает, просто без доработки.
- ❌ Ошибка при работе. Чаще всего у расширения без контроля свойств, где код обращается к реквизиту, которого больше нет.
Как перенести доработку на новый релиз
- Откройте расширение в Конфигураторе.
- Запустите проверку применимости расширений — платформа покажет список конфликтов.
- Для заимствованных объектов обновите свойства из основной конфигурации.
- Для методов с
&ИзменениеИКонтрольсравните свой текст с новым оригиналом и перенесите вставки. - Обновите конфигурацию базы данных расширения и сохраните новую версию
.cfe.
💡 Ставьте обновление сначала в копию базы . Если расширение там не применилось, у вас есть время его поправить, а пользователи работают в рабочей базе со старым релизом.
Расширения с данными
С платформы 8.3.11 расширение может хранить свои данные: новые справочники, документы, регистры и реквизиты у заимствованных объектов. Такое расширение меняет структуру базы.
Удаление расширения с данными удаляет и сами данные. Перед отключением выгрузите нужное или сделайте резервную копию.
Отладка расширений и поиск ошибок
Модули расширения отлаживаются так же, как модули основной конфигурации. Точки останова ставятся в Конфигураторе или в EDT прямо в коде расширения, отладчик останавливается на них в процедурах с любой аннотацией.
Порядок диагностики, когда «после установки расширения что-то сломалось»:
- Отключите расширение. Снимите флажок «Активно» в списке расширений и перезапустите сеанс. Ошибка пропала — источник в расширении.
- Найдите метод. Включите отладку, воспроизведите ошибку и посмотрите стек вызовов: в нём видны и типовые процедуры, и процедуры с префиксом расширения.
- Проверьте режим совместимости. Если он у расширения выше, чем у конфигурации, расширение не загрузится.
- Проверьте безопасный режим. Ошибка о запрете операции в безопасном режиме значит, что код пытается работать с файлами или внешними ресурсами.
- Посмотрите журнал регистрации. Ошибки применения расширений и исключения в их коде попадают туда.
Ограничения расширений и правила безопасной разработки
Расширение мощное, но не всесильное.
Чего расширение не умеет
- 🚫 Удалять объекты и реквизиты основной конфигурации.
- 🚫 Менять тип существующего типового реквизита.
- 🚫 Переписывать часть модуля вне методов: доработка всегда привязана к конкретной процедуре или функции.
- 🚫 Перехватывать локальную переменную или кусок кода без копии метода — для этого есть только
&ИзменениеИКонтроль.
Практика, которая экономит время при обновлениях
- 📌 Одна задача — одно расширение. Пять мелких доработок в одном
.cfeпридётся чинить вместе, даже если сломалась одна. - 📌 Сначала
&Переди&После, потом&ИзменениеИКонтроль, и только в крайнем случае&Вместо. - 📌 Ставьте контроль на свойства, от которых зависит ваш код: тип реквизита, состав табличной части.
- 📌 Уникальный префикс у каждого расширения. Два расширения с одинаковым префиксом рискуют получить конфликт имён.
- 📌 Режим совместимости расширения выставляйте равным режиму основной конфигурации.
- 📌 Храните исходники
.cfeс номером версии или в хранилище. Расширение в базе — не резервная копия.
Частые ошибки при работе с расширениями
- ❌ Снимают конфигурацию с поддержки «на всякий случай». Для расширений это не нужно, а обратно вернуть поддержку без сравнения объединения сложно.
- ❌ Пишут всё через
&Вместо. Через год типовой метод исправили, а в базе продолжает работать старая копия кода с ошибкой. - ❌ Удаляют расширение с данными, чтобы «переустановить». Вместе с ним пропадают добавленные реквизиты и записи справочников.
- ❌ Загружают
.cfe, но не обновляют конфигурацию базы данных. Файл в базе есть, доработка не работает.
Частые вопросы
Сколько расширений можно подключить к одной базе?
Работают ли расширения в 1С:Фреш и других облачных сервисах?
Можно ли менять печатную форму через расширение?
Сохраняются ли расширения при выгрузке базы в .dt?
.cfe: так расширение проще поставить в другую базу.