Расширения конфигурации 1С изнутри: что платформа делает с вашим кодом и данными
Содержание
Расширение конфигурации в 1С — это отдельный «слой» метаданных и кода, который платформа накладывает на основную конфигурацию при запуске каждого сеанса. Типовая конфигурация при этом не меняется и остаётся на полной поддержке: обновления ставятся как обычно, а доработки живут отдельно. Механизм появился в платформе 8.3.6 и с тех пор стал основным способом дорабатывать типовые решения.
Главное, что нужно держать в голове: расширение не «вшивается» в конфигурацию. Оно хранится в информационной базе отдельно, а соединение с основным кодом происходит в памяти, в момент старта сеанса. Отсюда вытекают и особенности настройки, и правила запуска, и большинство ошибок.
Как расширение отделено от основной конфигурации и как сливается с ней
В расширении есть два вида объектов:
- 📥 Заимствованные — ссылки на объекты основной конфигурации (документ, справочник, общий модуль, форма). Заимствовать объект нужно, чтобы что-то в нём поменять или дополнить.
- 🆕 Собственные — объекты, которых в основной конфигурации нет: новые обработки, отчёты, справочники, общие модули, роли.
Заимствованный объект — это не копия. В расширении хранится только то, что вы реально изменили: добавленный реквизит, новый элемент формы, обработчик события. Всё остальное платформа берёт из основной конфигурации.
Префикс имён
У каждого расширения есть префикс (по умолчанию вида Расш1_). Платформа подставляет его в имена новых процедур, реквизитов и объектов. Это защита от конфликта имён: если в следующем релизе типовой конфигурации появится реквизит с таким же именем, как ваш, префикс их разведёт.
Задайте осмысленный префикс сразу при создании — например, ОрКомп_ или Пр_. Переименовывать объекты потом долго, а в коде префикс становится визуальной меткой: «это наша доработка».
Назначение расширения
Свойство «Назначение» определяет порядок применения, когда расширений несколько:
| Назначение | Для чего | Порядок применения |
|---|---|---|
| Исправление | Срочные исправления ошибок типовой | Первым |
| Адаптация | Доработки под учёт конкретной компании | Вторым |
| Дополнение | Новая функциональность, внешние сервисы | Последним |
Внутри одного назначения расширения применяются в порядке их списка. Это важно, когда два расширения перехватывают один и тот же метод.
Когда срабатывает код расширения: жизненный цикл
Последовательность при запуске сеанса такая:
- Пользователь входит в базу.
- Платформа читает список расширений, у которых включён флаг «Активно».
- Для каждого проверяется применимость: существуют ли заимствованные объекты, не изменились ли контролируемые свойства и методы.
- Применимые расширения накладываются на конфигурацию в порядке назначения. Неприменимые пропускаются, пользователь видит предупреждение.
- Дальше сеанс работает с «собранной» конфигурацией.
Изменения в расширении подхватываются только новыми сеансами. Пользователи, которые уже работают, продолжат видеть старую версию до перезапуска программы.
Аннотации методов
Код расширения встраивается в основной через аннотации над процедурой или функцией:
| Аннотация | Когда выполняется ваш код | Типичный случай |
|---|---|---|
&Перед("Имя") | До оригинального метода | Проверка, заполнение реквизитов перед записью |
&После("Имя") | После оригинального метода | Дополнительные движения, доп. колонки в отчёте |
&Вместо("Имя") | Вместо оригинала; оригинал вызывается через ПродолжитьВызов() | Замена логики целиком или по условию |
&ИзменениеИКонтроль("Имя") | Копия метода с вставками и удалениями | Точечная правка внутри длинной процедуры |
Пример дополнения проверки при записи документа:
&После("ПередЗаписью")
Процедура Пр_ПередЗаписьюПосле(Отказ, РежимЗаписи, РежимПроведения)
Если Не Отказ И РежимЗаписи = РежимЗаписиДокумента.Проведение
И Не ЗначениеЗаполнено(Комментарий) Тогда
ОбщегоНазначения.СообщитьПользователю("Заполните комментарий перед проведением.", , "Комментарий", "Объект", Отказ);
КонецЕсли;
КонецПроцедуры
ОбщегоНазначения.СообщитьПользователю — процедура БСП, она есть в БП 3.0, ЗУП 3.1, УТ 11. Параметр Отказ передаётся по ссылке, поэтому установка его в Истина останавливает запись.
Пример с &Вместо, где оригинал вызывается только по условию:
&Вместо("ЦенаПоУмолчанию")
Функция Пр_ЦенаПоУмолчанию(Номенклатура, Дата)
Если Номенклатура.Пр_ЦенаФиксирована Тогда
Возврат Номенклатура.Пр_ФиксированнаяЦена;
КонецЕсли;
Возврат ПродолжитьВызов(Номенклатура, Дата);
КонецФункции
Имя ЦенаПоУмолчанию здесь условное — подставьте реальный метод своего модуля. Логика показательна: если забыть ПродолжитьВызов(), оригинальный код не выполнится вообще, даже в обычных случаях.
Изменение и контроль
&ИзменениеИКонтроль копирует тело оригинального метода в расширение. Свои строки вы оборачиваете в #Вставка … #КонецВставки, а лишние — в #Удаление … #КонецУдаления:
&ИзменениеИКонтроль("ЗаполнитьПоОснованию")
Процедура Пр_ЗаполнитьПоОснованию(Основание)
// ... оригинальный код без изменений ...
#Вставка
Ответственный = Пользователи.ТекущийПользователь();
#КонецВставки
КонецПроцедуры
Платформа сверяет копию с оригиналом. Если после обновления типовой тело метода поменялось, расширение становится неприменимым — и это полезно: вы узнаете о конфликте сразу, а не через месяц по кривым данным.
Что можно поменять в метаданных и формах
Метаданные
В заимствованный объект можно:
- ➕ добавить реквизиты и табличные части (в актуальных версиях платформы);
- ➕ добавить формы, команды, макеты;
- 🔧 переопределить обработчики событий модуля объекта, менеджера, формы;
- 🔒 поставить свойства на контроль — тогда расширение перестанет применяться, если эти свойства изменятся в основной конфигурации.
Собственные справочники, документы и регистры в расширении хранят данные в базе так же, как типовые.
Данные собственных объектов и добавленных реквизитов принадлежат расширению. Если удалить расширение, удалятся и эти данные. Перед удалением выгрузите базу в .dt.
Формы и интерфейс
Заимствованная форма открывается в редакторе целиком. Вы добавляете элементы, группы, реквизиты формы, команды. В свойствах события формы у расширения есть выбор типа вызова — перед, после или вместо типового обработчика.
Новые элементы удобнее размещать в собственных группах. Если положить поле в типовую группу, при её перестройке в новом релизе поле может уехать или пропасть.
Расширение может также добавлять команды в разделы и подсистемы, новые печатные формы и отчёты. Для печатных форм в БСП есть стандартная схема подключения через модуль менеджера — она заметно надёжнее, чем перехват кнопки «Печать» на форме.
Отладка расширения и поиск причин сбоев
Расширение отлаживается тем же отладчиком, что и основная конфигурация.
- В конфигураторе откройте
Конфигурация → Расширения конфигурации, затем дерево нужного расширения. - Внесите изменения и выполните
Обновить конфигурацию базы данных(F7) — без этого изменения не попадут в базу. - Поставьте точку останова в модуле расширения.
- Запустите отладку (F5) — в открывшемся сеансе расширение уже применено.
Если перехватываете метод через &Перед или &После, поставьте точку останова и в оригинальном методе. Так видно, в каком порядке идут вызовы и не перехватывает ли тот же метод другое расширение.
Приёмы диагностики
- 🔌 Отключение флага «Активно». Самый быстрый способ понять, виновато ли расширение. Выключили, перезапустили сеанс, повторили действие.
- 🧾 Стек ошибки. В подробном тексте ошибки указан модуль; модули расширения отличаются в нём от модулей основной конфигурации.
- 🧪 Проверка применимости до обновления типовой: в конфигураторе для расширения есть команда проверки применимости к текущей основной конфигурации. Запускайте её на тестовой копии сразу после установки нового релиза.
- 📋 Список расширений из кода.
РасширенияКонфигурации.Получить()возвращает массив подключённых расширений — удобно для сервисной обработки, которая показывает, что реально применено в сеансе.
Загрузка, публикация и обновление расширений
Есть два пути доставки расширения в рабочую базу.
Через режим «Предприятие»
В БП 3.0, ЗУП 3.1, УТ 11 и других конфигурациях на БСП:
- Откройте
Администрирование → Печатные формы, отчеты и обработки → Расширения. - Нажмите «Добавить из файла» и выберите файл
.cfe. - Подтвердите предупреждение о безопасности.
- Перезапустите программу.
Для новой версии того же расширения используйте обновление из файла на существующей строке, а не добавление второй копии. Иначе получится два расширения с одинаковыми объектами, и второе окажется неприменимым.
Через конфигуратор и командную строку
В конфигураторе расширение сохраняют в файл .cfe и загружают из него через меню «Конфигурация» при открытом дереве расширения. Для автоматической поставки (CI, скрипты обновления) подходит пакетный режим:
"C:\Program Files\1cv8\8.3.24.1586\bin\1cv8.exe" DESIGNER /S "srv1c\buh" /N "Админ" /P "пароль" ^
/LoadCfg "D:\deploy\Pr.cfe" -Extension "Пр" /UpdateDBCfg -Extension "Пр" /Out "D:\deploy\log.txt"
Путь к платформе подставьте свой. Ключ -Extension указывает, что команда относится к расширению, а не к основной конфигурации.
Монопольный доступ для загрузки обычного расширения не нужен: пользователи продолжают работать, новая версия применится при их следующем входе. Исключение — расширения, которые меняют структуру хранения данных: там обновление может потребовать, чтобы с затрагиваемыми таблицами никто не работал.
Порядок при обновлении типовой
- Сделайте копию рабочей базы.
- Обновите на копии основную конфигурацию.
- Проверьте применимость каждого расширения.
- Исправьте неприменимые, выпустите новые
.cfe. - Только после этого обновляйте рабочую базу и сразу загружайте исправленные расширения.
Ограничения и безопасность расширений
Чего расширение не умеет
- ❌ удалять или переименовывать объекты основной конфигурации;
- ❌ менять тип существующего реквизита типовой;
- ❌ удалять типовые реквизиты, табличные части, формы — только скрывать на форме или обходить в коде;
- ❌ гарантировать работу после обновления: контроль лишь сообщает о конфликте, но не решает его.
Если доработка требует чего-то из этого списка, остаётся только снятие с поддержки — со всеми последствиями для обновлений.
Безопасный режим и защита от опасных действий
У расширения есть свойство «Безопасный режим». Расширение, загруженное из режима «Предприятие», по умолчанию работает в безопасном режиме. В нём запрещены:
- 📁 работа с файловой системой;
- 🧩 COM-объекты и внешние компоненты;
- 🌐 часть сетевых операций;
- 🔓 привилегированный режим.
Для тонкой настройки есть профили безопасности в консоли кластера: они разрешают конкретные действия (например, доступ к одному каталогу), не снимая защиту целиком.
При загрузке .cfe платформа показывает предупреждение о защите от опасных действий. Не отключайте его глобально у пользователей: оно предупреждает, что код из файла получит доступ к данным базы.
Права пользователей
Собственные объекты расширения недоступны никому, пока на них не выданы права. Для этого в расширении создают роль и назначают её пользователям или включают в группы доступа. Управлять самими расширениями (добавлять, удалять, отключать) должен только администратор — права на администрирование расширений не стоит раздавать рядовым пользователям.
Когда расширение — не лучшее решение
Расширение подходит не для любой доработки. Перед стартом проверьте три вещи.
- 🧮 Нужен ли вообще код. Новый отчёт для одного бухгалтера или разовая загрузка данных проще делаются внешним отчётом или обработкой. Расширение оправдано, когда меняется поведение типовых объектов: проведение, формы, проверки.
- 🧱 Не упрётесь ли в ограничения. Если задача требует поменять тип реквизита или переделать структуру регистра, расширение не поможет. Это стоит выяснить до того, как написан первый модуль.
- 👥 Кто будет сопровождать. Каждое обновление типовой требует проверки применимости. Если некому этим заниматься, лучше одно аккуратное расширение, чем пять разрозненных от разных подрядчиков.
Типичный сценарий: в базе несколько расширений от разных исполнителей, два из них перехватывают проведение реализации. После очередного релиза одно становится неприменимым, второе продолжает работать — и движения идут без части доработок. Проверка применимости на копии базы выявляет это до обновления рабочей.
Ошибки, которые чаще всего ломают расширения
- 🔁 Две версии одного расширения в списке. Загрузили новый
.cfeкак новое расширение, а не обновили старое. Итог — дубли объектов и неприменимость одного из них. - 🕳️
&ВместобезПродолжитьВызов(). Оригинальная логика отключается для всех случаев, а не только для вашего условия. - 📦 Поле в типовой группе формы. После обновления конфигурации поле исчезает или оказывается в другом месте.
- 🗑️ Удаление расширения с данными без выгрузки. Значения добавленных реквизитов теряются безвозвратно.
- 🧷 Слишком широкий контроль. На контроль поставлены свойства, которые обновляются почти в каждом релизе, — расширение «отваливается» после каждого обновления.
- ⏳ Ожидание мгновенного эффекта. Пользователь не перезапустил программу и сообщает, что «доработка не работает».