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

· 9 мин

Содержание

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

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

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

В расширении есть два вида объектов:

  • 📥 Заимствованные — ссылки на объекты основной конфигурации (документ, справочник, общий модуль, форма). Заимствовать объект нужно, чтобы что-то в нём поменять или дополнить.
  • 🆕 Собственные — объекты, которых в основной конфигурации нет: новые обработки, отчёты, справочники, общие модули, роли.

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

Префикс имён

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

Задайте осмысленный префикс сразу при создании — например, ОрКомп_ или Пр_. Переименовывать объекты потом долго, а в коде префикс становится визуальной меткой: «это наша доработка».

Назначение расширения

Свойство «Назначение» определяет порядок применения, когда расширений несколько:

НазначениеДля чегоПорядок применения
ИсправлениеСрочные исправления ошибок типовойПервым
АдаптацияДоработки под учёт конкретной компанииВторым
ДополнениеНовая функциональность, внешние сервисыПоследним

Внутри одного назначения расширения применяются в порядке их списка. Это важно, когда два расширения перехватывают один и тот же метод.

Когда срабатывает код расширения: жизненный цикл

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

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

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

Аннотации методов

Код расширения встраивается в основной через аннотации над процедурой или функцией:

АннотацияКогда выполняется ваш кодТипичный случай
&Перед("Имя")До оригинального методаПроверка, заполнение реквизитов перед записью
&После("Имя")После оригинального методаДополнительные движения, доп. колонки в отчёте
&Вместо("Имя")Вместо оригинала; оригинал вызывается через ПродолжитьВызов()Замена логики целиком или по условию
&ИзменениеИКонтроль("Имя")Копия метода с вставками и удалениямиТочечная правка внутри длинной процедуры

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

&После("ПередЗаписью")
Процедура Пр_ПередЗаписьюПосле(Отказ, РежимЗаписи, РежимПроведения)

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

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

ОбщегоНазначения.СообщитьПользователю — процедура БСП, она есть в БП 3.0, ЗУП 3.1, УТ 11. Параметр Отказ передаётся по ссылке, поэтому установка его в Истина останавливает запись.

Пример с &Вместо, где оригинал вызывается только по условию:

&Вместо("ЦенаПоУмолчанию")
Функция Пр_ЦенаПоУмолчанию(Номенклатура, Дата)

    Если Номенклатура.Пр_ЦенаФиксирована Тогда
        Возврат Номенклатура.Пр_ФиксированнаяЦена;
    КонецЕсли;

    Возврат ПродолжитьВызов(Номенклатура, Дата);

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

Имя ЦенаПоУмолчанию здесь условное — подставьте реальный метод своего модуля. Логика показательна: если забыть ПродолжитьВызов(), оригинальный код не выполнится вообще, даже в обычных случаях.

Изменение и контроль

&ИзменениеИКонтроль копирует тело оригинального метода в расширение. Свои строки вы оборачиваете в #Вставка … #КонецВставки, а лишние — в #Удаление … #КонецУдаления:

&ИзменениеИКонтроль("ЗаполнитьПоОснованию")
Процедура Пр_ЗаполнитьПоОснованию(Основание)

    // ... оригинальный код без изменений ...
    #Вставка
    Ответственный = Пользователи.ТекущийПользователь();
    #КонецВставки

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

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

Что можно поменять в метаданных и формах

Метаданные

В заимствованный объект можно:

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

Собственные справочники, документы и регистры в расширении хранят данные в базе так же, как типовые.

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

Формы и интерфейс

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

Новые элементы удобнее размещать в собственных группах. Если положить поле в типовую группу, при её перестройке в новом релизе поле может уехать или пропасть.

Расширение может также добавлять команды в разделы и подсистемы, новые печатные формы и отчёты. Для печатных форм в БСП есть стандартная схема подключения через модуль менеджера — она заметно надёжнее, чем перехват кнопки «Печать» на форме.

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

Расширение отлаживается тем же отладчиком, что и основная конфигурация.

  1. В конфигураторе откройте Конфигурация → Расширения конфигурации, затем дерево нужного расширения.
  2. Внесите изменения и выполните Обновить конфигурацию базы данных (F7) — без этого изменения не попадут в базу.
  3. Поставьте точку останова в модуле расширения.
  4. Запустите отладку (F5) — в открывшемся сеансе расширение уже применено.

Если перехватываете метод через &Перед или &После, поставьте точку останова и в оригинальном методе. Так видно, в каком порядке идут вызовы и не перехватывает ли тот же метод другое расширение.

Приёмы диагностики

  • 🔌 Отключение флага «Активно». Самый быстрый способ понять, виновато ли расширение. Выключили, перезапустили сеанс, повторили действие.
  • 🧾 Стек ошибки. В подробном тексте ошибки указан модуль; модули расширения отличаются в нём от модулей основной конфигурации.
  • 🧪 Проверка применимости до обновления типовой: в конфигураторе для расширения есть команда проверки применимости к текущей основной конфигурации. Запускайте её на тестовой копии сразу после установки нового релиза.
  • 📋 Список расширений из кода. РасширенияКонфигурации.Получить() возвращает массив подключённых расширений — удобно для сервисной обработки, которая показывает, что реально применено в сеансе.
Диагностика: выберите симптом

Загрузка, публикация и обновление расширений

Есть два пути доставки расширения в рабочую базу.

Через режим «Предприятие»

В БП 3.0, ЗУП 3.1, УТ 11 и других конфигурациях на БСП:

  1. Откройте Администрирование → Печатные формы, отчеты и обработки → Расширения.
  2. Нажмите «Добавить из файла» и выберите файл .cfe.
  3. Подтвердите предупреждение о безопасности.
  4. Перезапустите программу.

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

Через конфигуратор и командную строку

В конфигураторе расширение сохраняют в файл .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 указывает, что команда относится к расширению, а не к основной конфигурации.

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

Порядок при обновлении типовой

  1. Сделайте копию рабочей базы.
  2. Обновите на копии основную конфигурацию.
  3. Проверьте применимость каждого расширения.
  4. Исправьте неприменимые, выпустите новые .cfe.
  5. Только после этого обновляйте рабочую базу и сразу загружайте исправленные расширения.

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

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

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

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

Безопасный режим и защита от опасных действий

У расширения есть свойство «Безопасный режим». Расширение, загруженное из режима «Предприятие», по умолчанию работает в безопасном режиме. В нём запрещены:

  • 📁 работа с файловой системой;
  • 🧩 COM-объекты и внешние компоненты;
  • 🌐 часть сетевых операций;
  • 🔓 привилегированный режим.

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

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

Права пользователей

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

Когда расширение — не лучшее решение

Расширение подходит не для любой доработки. Перед стартом проверьте три вещи.

  • 🧮 Нужен ли вообще код. Новый отчёт для одного бухгалтера или разовая загрузка данных проще делаются внешним отчётом или обработкой. Расширение оправдано, когда меняется поведение типовых объектов: проведение, формы, проверки.
  • 🧱 Не упрётесь ли в ограничения. Если задача требует поменять тип реквизита или переделать структуру регистра, расширение не поможет. Это стоит выяснить до того, как написан первый модуль.
  • 👥 Кто будет сопровождать. Каждое обновление типовой требует проверки применимости. Если некому этим заниматься, лучше одно аккуратное расширение, чем пять разрозненных от разных подрядчиков.

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

Ошибки, которые чаще всего ломают расширения

  • 🔁 Две версии одного расширения в списке. Загрузили новый .cfe как новое расширение, а не обновили старое. Итог — дубли объектов и неприменимость одного из них.
  • 🕳️ &Вместо без ПродолжитьВызов(). Оригинальная логика отключается для всех случаев, а не только для вашего условия.
  • 📦 Поле в типовой группе формы. После обновления конфигурации поле исчезает или оказывается в другом месте.
  • 🗑️ Удаление расширения с данными без выгрузки. Значения добавленных реквизитов теряются безвозвратно.
  • 🧷 Слишком широкий контроль. На контроль поставлены свойства, которые обновляются почти в каждом релизе, — расширение «отваливается» после каждого обновления.
  • ⏳ Ожидание мгновенного эффекта. Пользователь не перезапустил программу и сообщает, что «доработка не работает».

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

Снимается ли конфигурация с поддержки при установке расширения?
Нет. Основная конфигурация остаётся на поддержке, обновления устанавливаются как обычно.
Можно ли подключить несколько расширений одновременно?
Да. Они применяются по назначению (исправление, адаптация, дополнение), а внутри назначения — по порядку в списке.
Работают ли расширения в файловой базе?
Да. Хранятся в самой базе, механизм тот же, что и в клиент-серверном варианте.
Чем расширение отличается от внешней обработки?
Внешняя обработка — отдельный файл, который открывают вручную или подключают как дополнительную. Расширение меняет поведение самих типовых объектов: форм, проведения, отчётов.
Нужно ли выгонять пользователей для установки расширения?
Для обычного расширения — нет. Новая версия заработает у каждого после перезапуска программы.