Работа с расширениями в 1С 8.3: создание, перехват методов, отладка и обновления

· 10 мин

Содержание

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

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

Что такое расширение конфигурации и какие задачи оно решает

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

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

Типичные задачи, которые закрывают расширениями:

  • 🖨️ своя печатная форма или изменённый макет типовой;
  • 📝 новый реквизит в документе или справочнике и поле на форме;
  • ⚙️ дополнительная проверка при проведении документа;
  • 🔧 исправление ошибки типовой до выхода официального релиза;
  • 📊 новый отчёт, обработка, регистр или справочник со своими данными;
  • 🔌 интеграция с внешней системой: HTTP-сервис, регламентное задание.

У расширения есть свойство Назначение. Оно бывает трёх видов, и от него зависит порядок применения:

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

Расширения применяются в порядке: сначала исправления, потом адаптации, потом дополнения. На практике собственные доработки обычно оформляют как «Адаптацию».

Как создать расширение в Конфигураторе: по шагам

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

Шаг 1. Создаём пустое расширение

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

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

Шаг 2. Открываем дерево расширения

В списке расширений выделите новую строку и откройте её двойным щелчком. Откроется второе дерево — уже не основной конфигурации, а расширения. Сначала оно почти пустое.

Шаг 3. Заимствуем объекты

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

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

Шаг 4. Вносим изменения и обновляем базу

После правок выполните Конфигурация → Обновить конфигурацию базы данных в окне расширения (или F7, когда активно дерево расширения). Если расширение добавляет свои объекты с данными, платформа реструктурирует таблицы.

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

Шаг 5. Сохраняем расширение в файл

В окне Расширения конфигурации выделите расширение и откройте меню Конфигурация на панели окна: там есть команды сохранения в файл и загрузки из файла. Сохранение даст файл .cfe. Его можно передать в другую базу и загрузить там тем же меню. Загрузка .cfe и обновление базы — снова два отдельных шага.

Что можно поменять в расширении, а что нет

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

Что добавлять разрешено

  • ➕ новые объекты: справочники, документы, регистры, отчёты, обработки, общие модули, HTTP-сервисы, регламентные задания;
  • ➕ новые реквизиты и табличные части в заимствованных справочниках и документах;
  • ➕ новые элементы на заимствованных формах, свои команды и обработчики событий;
  • ➕ новые макеты, в том числе замена типовых макетов печатных форм;
  • ➕ права в заимствованных ролях на свои объекты и новые роли.

Как перехватывают код типовой

Изменение модулей строится на аннотациях. Вы пишете в модуле заимствованного объекта процедуру со своим именем и ставите перед ней аннотацию с именем типовой процедуры:

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

Пример: запретить проведение реализации без договора. В модуле объекта заимствованного документа РеализацияТоваровУслуг:

&Перед("ОбработкаПроверкиЗаполнения")
Процедура мой_ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

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

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

Аннотация &ИзменениеИКонтроль полезна ещё одним: если в новом релизе поставщик изменит текст исходной процедуры, расширение перестанет применяться и платформа сообщит об этом. Вы не пропустите изменение типовой логики.

Ограничения

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

Перечень возможностей растёт от версии к версии платформы. Если нужный объект не заимствуется, проверьте номер платформы: часть возможностей доступна только начиная с определённой версии 8.3.

Как подключать и отключать расширения в рабочей базе

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

Через Конфигуратор. В списке Конфигурация → Расширения конфигурации нажмите Добавить, откройте дерево нового расширения и загрузите .cfe из файла. Затем — обновление конфигурации базы данных.

В пользовательском режиме (конфигурации на БСП):

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

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

У каждого расширения есть два важных флажка:

  • 🔒 Безопасный режим — код расширения не может работать с файлами, внешними компонентами, COM-объектами и запускать программы;
  • 🛡️ Защита от опасных действий — пользователь получит предупреждение, если расширение попытается выполнить потенциально опасную операцию.

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

Как отключить расширение

Если после подключения что-то пошло не так, снимите флажок Активно в списке расширений (в Конфигураторе или пользовательском режиме) и перезапустите сеанс. Объекты расширения перестанут действовать, программа вернётся к типовому поведению.

Отключение и удаление — разные вещи. Если расширение хранит свои данные (справочники, документы, регистры), при удалении эти данные будут потеряны. Перед удалением такого расширения сделайте резервную копию базы.

Отладка расширения и разбор ошибок

Отладка расширения ничем не отличается от отладки основной конфигурации. Точки останова ставят прямо в модулях расширения, запуск — Отладка → Начать отладку (F5) из Конфигуратора. Главное условие: расширение должно быть активно и база обновлена, иначе отладчик будет показывать старый код.

Полезные приёмы при отладке:

  • 🔍 ставьте точку и в своей процедуре, и в типовой — так видно, в каком порядке они вызываются;
  • 🔍 при &Вместо проверьте, вызывается ли ПродолжитьВызов(), если типовой код всё-таки нужен;
  • 🔍 если перехват не срабатывает, сверьте имя в аннотации с именем процедуры типовой посимвольно и проверьте директиву компиляции (&НаСервере, &НаКлиенте) — она должна совпадать.
Диагностика: выберите симптом

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

Ради этого расширения и придумали: типовая остаётся на полной поддержке, обновление ставится штатно. Но «поставил и забыл» не получится. После каждого релиза нужно убедиться, что расширение по-прежнему применимо.

Порядок, который работает:

  1. Сделайте резервную копию базы.
  2. Обновите основную конфигурацию обычным способом.
  3. Запустите программу. Если расширение конфликтует с новым релизом, платформа сообщит об этом при запуске, а расширение не применится.
  4. При ошибке откройте расширение в Конфигураторе, найдите объекты, которые перестали совпадать, и обновите их.
  5. Обновите конфигурацию базы данных для расширения и проверьте ключевые сценарии.

Чаще всего расширение ломается в трёх случаях:

  • 🔄 поставщик переименовал или удалил процедуру, которую вы перехватываете;
  • 🔄 изменился текст процедуры, взятой через &ИзменениеИКонтроль;
  • 🔄 элемент формы, к которому привязан ваш элемент, переместили или переименовали.

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

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

Как писать расширения, которые переживут обновления

Несколько правил, которые экономят время на каждом релизе:

  • ✅ Одна задача — одно расширение. Печатные формы отдельно, проверки проведения отдельно. Так проще найти виновника и отключить его без потери остального.
  • ✅ Минимум заимствований. Каждый заимствованный объект — потенциальная точка конфликта. Берите только то, что реально меняете.
  • ✅ &Перед и &После вместо &Вместо. Полная замена типовой процедуры ломается при любом её изменении и отключает исправления поставщика.
  • ✅ Свой код в своих общих модулях. В перехватчике оставьте одну строку вызова, логику вынесите в модуль расширения с префиксом.
  • ✅ Осмысленный префикс и версия. Заполняйте свойство версии расширения — так видно, какая сборка стоит в базе.
  • ✅ Расширения в хранилище. Расширение можно подключить к хранилищу конфигурации отдельно от основной, это удобно при командной разработке.
Перед подключением расширения в рабочую базу
Выполнено: 0 / 6

Когда расширение — не лучший выбор

Расширение решает многое, но не всё. Иногда проще и надёжнее другой инструмент.

ЗадачаЧем решитьПочему не расширение
Новая печатная форма без изменения логикиВнешняя печатная форма (.epf)Подключается за минуту, не требует обновления базы
Разовый отчёт или обработкаВнешний отчёт или обработкаНе нужно заимствовать объекты
Дополнительное поле в карточке без кодаДополнительные реквизиты и сведения в типовойНастраивается пользователем, без программиста
Глубокая переделка структуры: смена типов, удаление объектовИзменение основной конфигурацииРасширение этого не умеет
Небольшая правка, которую поставщик скоро исправитПодождать релиз или «Исправление» от поставщикаСвоя правка устареет через месяц

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

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

Можно ли перенести расширение в базу с другим релизом типовой?
Можно, если заимствованные объекты и перехваченные процедуры в том релизе есть и совпадают. Иначе расширение не применится, и его придётся поправить под релиз.
Работают ли расширения в 1С:Фреш и других облаках?
Да, но порядок подключения определяет провайдер сервиса, а код расширения там работает в безопасном режиме.
Сколько расширений можно подключить к одной базе?
Жёсткого лимита для практических задач нет. Но чем их больше, тем выше риск, что два расширения перехватят одну процедуру. Держите их число разумным.
Сохраняются ли данные расширения при его отключении?
При снятии флажка «Активно» данные остаются в базе и снова доступны после включения. При удалении расширения его данные удаляются.
Нужна ли лицензия на сервер или отдельный ключ для расширений?
Нет. Расширения — штатный механизм платформы 1С:Предприятие 8.3, отдельного лицензирования не требуют.