Расширение конфигурации 1С 8.3 своими руками: от пустого файла до работающей доработки

· 9 мин

Содержание

Расширение в 1С 8.3 пишут в Конфигураторе: Конфигурация → Расширения конфигурации → Добавить. Затем нужные объекты основной конфигурации заимствуют в расширение, а их поведение меняют процедурами с аннотациями &Перед, &После, &Вместо или &ИзменениеИКонтроль. Основная конфигурация остаётся на поддержке, и типовое обновление ставится без сравнения-объединения.

Механизм появился в платформе 8.3.6 и с тех пор сильно вырос: сейчас в расширении можно добавлять свои справочники, документы, регистры, реквизиты к типовым объектам, менять формы и перехватывать почти любой метод. Ниже — порядок работы, который используют 1С-программисты, с примерами кода и подводными камнями.

1. Подготовка: копия базы, Конфигуратор и создание расширения

Писать расширение сразу в рабочей базе не стоит. Порядок такой:

  1. 📦 Выгрузите копию рабочей базы в .dt (Администрирование → Выгрузить информационную базу в Конфигураторе) и разверните её как отдельную тестовую базу.
  2. 🔧 Проверьте номер платформы: для &ИзменениеИКонтроль, своих регистров и реквизитов в заимствованных объектах берите актуальную 8.3.2x — на ранних релизах 8.3 этих возможностей ещё не было.
  3. 🖥️ Откройте тестовую базу в Конфигураторе и откройте основную конфигурацию (Конфигурация → Открыть конфигурацию).

Теперь создаём само расширение:

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

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

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

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

2. Метаданные расширения: свои объекты и заимствованные

В дереве расширения два типа объектов, и путать их нельзя.

  • 🟢 Собственные — справочники, документы, регистры, обработки, общие модули, которые вы создаёте с нуля. Их имена начинаются с префикса: ск_ЖурналПриемки.
  • 🔵 Заимствованные — копии-ссылки на объекты основной конфигурации. Они нужны, чтобы изменить типовой объект: добавить реквизит , перехватить событие, поправить форму.

Как заимствовать объект:

  1. В окне основной конфигурации найдите объект, например документ ПоступлениеТоваровУслуг.
  2. Щёлкните по нему правой кнопкой и выберите Добавить в расширение.
  3. Укажите нужное расширение, если их несколько.

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

Что можно добавить к заимствованному объекту:

  • ➕ собственные реквизиты и табличные части (с префиксом в имени);
  • ➕ собственные формы и макеты, например новую печатную форму;
  • ➕ команды;
  • ✏️ изменённые обработчики событий модуля объекта и модуля менеджера.

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

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

3. Как писать код в расширении: аннотации и перехват методов

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

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

Пример: запрещаем проводить поступление без номера входящего документа.

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

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

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

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

Пример с &Вместо и условным вызовом оригинала:

&Вместо("ПриЗаписи")
Процедура ск_ПриЗаписиВместо(Отказ)

    Если ДополнительныеСвойства.Свойство("ск_БезПроверок") Тогда
        Возврат;
    КонецЕсли;

    ПродолжитьВызов(Отказ);

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

Не используйте &Вместо без вызова ПродолжитьВызов() там, где хватит &Перед или &После. Полностью заменённый метод не получает исправлений из обновлений типовой: фирма поправит ошибку в оригинале, а у вас продолжит работать старая логика.

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

&ИзменениеИКонтроль("ЗаполнитьПоОстаткам")
Процедура ск_ЗаполнитьПоОстаткам(Склад)
    // ... типовой код ...
    #Вставка
    Запрос.УстановитьПараметр("ТолькоАктивные", Истина);
    #КонецВставки
    #Удаление
    Запрос.УстановитьПараметр("ТолькоАктивные", Ложь);
    #КонецУдаления
    // ... типовой код ...
КонецПроцедуры

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

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

4. Доработка форм и интерфейса в расширении

Формы меняются по той же схеме: заимствование плюс свои элементы.

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

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

&НаСервере
Процедура ск_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)

    Элементы.ск_НомерПриемки.ТолькоПросмотр = Не Пользователи.ЭтоПолноправныйПользователь();

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

В примере используется функция из типовой БСП. Если в вашей конфигурации её нет, замените проверку на свою.

Что ещё делают через расширения в интерфейсе:

  • 🖨️ новые печатные формы — макет в заимствованном объекте и регистрация команды печати;
  • 📊 свои отчёты и обработки с размещением в нужном разделе (через свойство подсистем);
  • 🧭 новые подсистемы — отдельный раздел в панели разделов;
  • 🔐 свои роли — права на собственные объекты расширения выдаются только через роли расширения.

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

5. Свои данные в расширении: справочники, реквизиты и регистры

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

Типичная задача — дописать движения типового документа в свой регистр накопления:

  1. Создайте в расширении регистр ск_ПриемкаПоКачеству с измерениями и ресурсами.
  2. Заимствуйте документ ПоступлениеТоваровУслуг и укажите его в регистраторах своего регистра.
  3. В модуле объекта документа добавьте обработчик:
&После("ОбработкаПроведения")
Процедура ск_ОбработкаПроведенияПосле(Отказ, РежимПроведения)

    Если Отказ Тогда
        Возврат;
    КонецЕсли;

    Движения.ск_ПриемкаПоКачеству.Записывать = Истина;

    Для Каждого СтрокаТЧ Из Товары Цикл
        Движение = Движения.ск_ПриемкаПоКачеству.Добавить();
        Движение.Период = Дата;
        Движение.Номенклатура = СтрокаТЧ.Номенклатура;
        Движение.Количество = СтрокаТЧ.Количество;
    КонецЦикла;

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

Табличную часть Товары и её реквизиты тоже нужно заимствовать, иначе обращение к ним в расширении не скомпилируется.

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

6. Отладка, сохранение в .cfe и обновление расширения

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

Сохранение в файл. Откройте меню Конфигурация с активным окном дерева расширения и выберите команду сохранения в файл (её название может немного отличаться от релиза к релизу). Получится файл .cfe — именно его передают на рабочую базу.

Загрузка в рабочую базу — два пути:

СпособГдеКогда удобен
Через КонфигураторКонфигурация → Расширения конфигурации, выбрать расширение, загрузить из файла, затем Обновить конфигурацию базы данныхРасширение меняет структуру данных, нужен контроль
Через пользовательский режимАдминистрирование → Печатные формы, отчеты и обработки → Расширения в типовых конфигурациях на БСПБыстрая установка без Конфигуратора

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

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

  1. Обновите основную конфигурацию в тестовой базе.
  2. Откройте расширение. Платформа проверит применимость: пропавшие заимствованные объекты, изменённые методы под &ИзменениеИКонтроль, несовпадающие контролируемые свойства.
  3. Исправьте расхождения, сохраните новый .cfe и только потом обновляйте рабочую базу.
Перед выкладкой расширения в рабочую базу
Выполнено: 0 / 6

7. Типичные ошибки, когда пишут первое расширение

  • ❌ Свой реквизит без префикса. Через год в типовой появится реквизит с тем же именем, и расширение перестанет применяться. Префикс нужен и у процедур в общих модулях.
  • ❌ Заимствовали форму «на всякий случай». Каждая заимствованная форма сверяется с основной при обновлении. Лишние заимствования дают ложные ошибки применимости.
  • ❌ Серверный вызов из клиентского обработчика без директивы. В модуле формы расширения действуют те же правила, что и в типовом: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста ставятся явно.
  • ❌ Глобальная переменная или экспортная процедура с типовым именем. Имена методов расширения не должны совпадать с методами основной конфигурации, если это не перехват.
  • ❌ Правки прямо в рабочей базе через Конфигуратор. Пока вы отлаживаете, пользователи получают полуготовый код. Готовьте .cfe в копии и выкладывайте целиком.

8. Частые вопросы о расширениях 1С

Можно ли через расширение изменить запрос внутри типового отчёта?
Да. Заимствуйте модуль отчёта или общий модуль, где формируется текст запроса, и перехватите метод через &ИзменениеИКонтроль. Если текст запроса хранится в схеме компоновки, заимствуйте отчёт и его макет схемы.
Слетит ли расширение при обновлении типовой конфигурации?
Само расширение не удаляется. Но если изменился заимствованный объект или метод под контролем, оно не применится, и платформа сообщит об ошибке при запуске.
Сколько расширений можно подключить к одной базе?
Жёсткого лимита для практических задач нет. На деле сложнее поддерживать порядок: когда два расширения перехватывают один и тот же метод, важна их очерёдность по назначению.
Работают ли расширения в облачной 1С:Фреш?
Да, в сервисе их подключают через пользовательский режим. Обычно там требуется безопасный режим, поэтому код с файлами и внешними компонентами может не пройти.
Чем расширение отличается от внешней обработки?
Внешняя обработка — отдельный файл, который не меняет поведение конфигурации. Расширение встраивается в неё: перехватывает события, добавляет реквизиты, формы и данные.