Расширение конфигурации 1С 8.3 своими руками: от пустого файла до работающей доработки
Содержание
Расширение в 1С 8.3 пишут в Конфигураторе: Конфигурация → Расширения конфигурации → Добавить. Затем нужные объекты основной конфигурации заимствуют в расширение, а их поведение меняют процедурами с аннотациями &Перед, &После, &Вместо или &ИзменениеИКонтроль. Основная конфигурация остаётся на поддержке, и типовое обновление ставится без сравнения-объединения.
Механизм появился в платформе 8.3.6 и с тех пор сильно вырос: сейчас в расширении можно добавлять свои справочники, документы, регистры, реквизиты к типовым объектам, менять формы и перехватывать почти любой метод. Ниже — порядок работы, который используют 1С-программисты, с примерами кода и подводными камнями.
1. Подготовка: копия базы, Конфигуратор и создание расширения
Писать расширение сразу в рабочей базе не стоит. Порядок такой:
- 📦 Выгрузите копию рабочей базы в
.dt(Администрирование → Выгрузить информационную базув Конфигураторе) и разверните её как отдельную тестовую базу. - 🔧 Проверьте номер платформы: для
&ИзменениеИКонтроль, своих регистров и реквизитов в заимствованных объектах берите актуальную 8.3.2x — на ранних релизах 8.3 этих возможностей ещё не было. - 🖥️ Откройте тестовую базу в Конфигураторе и откройте основную конфигурацию (
Конфигурация → Открыть конфигурацию).
Теперь создаём само расширение:
- Выберите
Конфигурация → Расширения конфигурации. - В открывшемся окне нажмите
Добавить. - Заполните три поля: Имя, Префикс и Назначение.
- Нажмите
ОК. В списке появится строка с расширением; двойной щелчок откроет его дерево метаданных в отдельном окне.
| Поле | Что указать | Зачем |
|---|---|---|
| Имя | Латиницей или кириллицей без пробелов, например ДоработкиСклада | Идентификатор расширения в базе |
| Префикс | Короткий, например ск_ | Добавляется к именам всех ваших объектов и процедур, чтобы не было конфликтов с типовыми |
| Назначение | Исправление, Адаптация или Дополнение | Определяет порядок применения, если в базе несколько расширений |
Назначение выбирайте по смыслу. Исправление — для срочных патчей ошибок типовой. Адаптация — под обычные доработки конкретной организации. Дополнение — для тиражных модулей сторонних разработчиков. Расширения применяются в порядке: исправления, затем адаптации, затем дополнения.
Префикс по умолчанию — Расш1_. Поменяйте его сразу: когда расширений в базе три-четыре, Расш1_ и Расш2_ уже ничего не говорят.
В свойствах расширения сразу проверьте Режим совместимости. Он не должен быть выше режима совместимости основной конфигурации, иначе расширение не применится.
2. Метаданные расширения: свои объекты и заимствованные
В дереве расширения два типа объектов, и путать их нельзя.
- 🟢 Собственные — справочники, документы, регистры, обработки, общие модули, которые вы создаёте с нуля. Их имена начинаются с префикса:
ск_ЖурналПриемки. - 🔵 Заимствованные — копии-ссылки на объекты основной конфигурации. Они нужны, чтобы изменить типовой объект: добавить реквизит , перехватить событие, поправить форму.
Как заимствовать объект:
- В окне основной конфигурации найдите объект, например документ
ПоступлениеТоваровУслуг. - Щёлкните по нему правой кнопкой и выберите
Добавить в расширение. - Укажите нужное расширение, если их несколько.
Объект появится в дереве расширения с особым значком. Заимствуется не весь объект целиком, а «оболочка»: вы видите его имя и можете добавлять своё. Реквизиты, табличные части и формы, которые хотите менять, заимствуйте так же — правой кнопкой по ним.
Что можно добавить к заимствованному объекту:
- ➕ собственные реквизиты и табличные части (с префиксом в имени);
- ➕ собственные формы и макеты, например новую печатную форму;
- ➕ команды;
- ✏️ изменённые обработчики событий модуля объекта и модуля менеджера.
Заимствование привязывает расширение к структуре основной конфигурации. Если после обновления типовой заимствованный реквизит переименуют или удалят, расширение перестанет применяться. Заимствуйте только то, что действительно меняете.
Для свойств заимствованного объекта есть режим контроля: можно указать, что расширение рассчитывает на определённое значение свойства основной конфигурации. Если после обновления значение изменится, платформа сообщит об этом при применении.
3. Как писать код в расширении: аннотации и перехват методов
Весь смысл расширения — изменить поведение типового кода, не трогая его. Для этого заимствуйте модуль (модуль объекта, менеджера или общий модуль) и пишите в нём процедуры с аннотациями.
| Аннотация | Когда вызывается ваш код | Типичное применение |
|---|---|---|
&Перед("Метод") | До типового метода | Проверки, подготовка данных |
&После("Метод") | После типового метода | Дополнительные движения, заполнение реквизитов |
&Вместо("Метод") | Вместо типового; оригинал можно вызвать через ПродолжитьВызов() | Полная замена логики или условный обход |
&ИзменениеИКонтроль("Метод") | Ваша копия метода с помеченными вставками и удалениями | Правка нескольких строк в середине длинной процедуры |
Пример: запрещаем проводить поступление без номера входящего документа.
&Перед("ОбработкаПроверкиЗаполнения")
Процедура ск_ОбработкаПроверкиЗаполненияПеред(Отказ, ПроверяемыеРеквизиты)
Если Не ЗначениеЗаполнено(НомерВходящегоДокумента) Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Укажите номер входящего документа";
Сообщение.Поле = "НомерВходящегоДокумента";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Имя процедуры в расширении любое, привязку задаёт строка в аннотации. Удобнее, когда имя содержит префикс и тип вызова — так модуль легко читать.
Пример с &Вместо и условным вызовом оригинала:
&Вместо("ПриЗаписи")
Процедура ск_ПриЗаписиВместо(Отказ)
Если ДополнительныеСвойства.Свойство("ск_БезПроверок") Тогда
Возврат;
КонецЕсли;
ПродолжитьВызов(Отказ);
КонецПроцедуры
Не используйте &Вместо без вызова ПродолжитьВызов() там, где хватит &Перед или &После. Полностью заменённый метод не получает исправлений из обновлений типовой: фирма поправит ошибку в оригинале, а у вас продолжит работать старая логика.
&ИзменениеИКонтроль — лучший выбор, когда нужно изменить пару строк внутри большой процедуры. В расширение копируется весь текст метода, а свои правки вы обрамляете директивами:
&ИзменениеИКонтроль("ЗаполнитьПоОстаткам")
Процедура ск_ЗаполнитьПоОстаткам(Склад)
// ... типовой код ...
#Вставка
Запрос.УстановитьПараметр("ТолькоАктивные", Истина);
#КонецВставки
#Удаление
Запрос.УстановитьПараметр("ТолькоАктивные", Ложь);
#КонецУдаления
// ... типовой код ...
КонецПроцедуры
Главный плюс — контроль: если при обновлении типовой текст оригинального метода изменится, расширение не применится и платформа покажет расхождение. Вы узнаете о проблеме сразу, а не от пользователей.
Собственный код, который не перехватывает типовой, кладите в свои общие модули с префиксом: ск_ОбщегоНазначения. Свою подписку на событие тоже можно создать в расширении, указав источниками заимствованные объекты.
4. Доработка форм и интерфейса в расширении
Формы меняются по той же схеме: заимствование плюс свои элементы.
- В основной конфигурации раскройте объект, найдите нужную форму и выберите
Добавить в расширение. - Откройте заимствованную форму в расширении. Редактор покажет типовые элементы — их можно перемещать, скрывать и менять свойства.
- Добавьте свои элементы: перетащите реквизит объекта (в том числе реквизит, добавленный расширением) из вкладки
Реквизитыв дерево элементов. - Для своей кнопки создайте команду формы, задайте ей действие и перетащите на командную панель.
Обработчик события формы задаётся в палитре свойств элемента или самой формы. У заимствованной формы рядом с событием есть выбор типа вызова — перед, после или вместо типового обработчика. Платформа создаст процедуру в модуле формы расширения:
&НаСервере
Процедура ск_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
Элементы.ск_НомерПриемки.ТолькоПросмотр = Не Пользователи.ЭтоПолноправныйПользователь();
КонецПроцедуры
В примере используется функция из типовой БСП. Если в вашей конфигурации её нет, замените проверку на свою.
Что ещё делают через расширения в интерфейсе:
- 🖨️ новые печатные формы — макет в заимствованном объекте и регистрация команды печати;
- 📊 свои отчёты и обработки с размещением в нужном разделе (через свойство подсистем);
- 🧭 новые подсистемы — отдельный раздел в панели разделов;
- 🔐 свои роли — права на собственные объекты расширения выдаются только через роли расширения.
Если собственный справочник расширения не виден пользователю, первым делом проверьте роль. Надёжный путь — создать роль в самом расширении, отметить права на свои объекты и назначить её пользователям или включить в профиль групп доступа.
5. Свои данные в расширении: справочники, реквизиты и регистры
Когда расширение добавляет реквизиты, табличные части или собственные таблицы, оно меняет структуру базы. При подключении такого расширения платформа создаёт в базе новые таблицы и поля — по сути, это реструктуризация, как при обновлении конфигурации. Делайте её, когда пользователей в базе нет.
Типичная задача — дописать движения типового документа в свой регистр накопления:
- Создайте в расширении регистр
ск_ПриемкаПоКачествус измерениями и ресурсами. - Заимствуйте документ
ПоступлениеТоваровУслуги укажите его в регистраторах своего регистра. - В модуле объекта документа добавьте обработчик:
&После("ОбработкаПроведения")
Процедура ск_ОбработкаПроведенияПосле(Отказ, РежимПроведения)
Если Отказ Тогда
Возврат;
КонецЕсли;
Движения.ск_ПриемкаПоКачеству.Записывать = Истина;
Для Каждого СтрокаТЧ Из Товары Цикл
Движение = Движения.ск_ПриемкаПоКачеству.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = СтрокаТЧ.Номенклатура;
Движение.Количество = СтрокаТЧ.Количество;
КонецЦикла;
КонецПроцедуры
Табличную часть Товары и её реквизиты тоже нужно заимствовать, иначе обращение к ним в расширении не скомпилируется.
Если расширение с данными отключить или удалить, его таблицы и значения добавленных реквизитов будут удалены из базы. Перед удалением такого расширения выгрузите нужные данные или сделайте копию базы.
6. Отладка, сохранение в .cfe и обновление расширения
Отладка работает так же, как для основной конфигурации. Ставьте точки останова в модулях расширения и запускайте Отладка → Начать отладку. Если точка не срабатывает, проверьте, что расширение обновлено в базе (F7, Обновить конфигурацию базы данных), и что в предприятии оно включено.
Сохранение в файл. Откройте меню Конфигурация с активным окном дерева расширения и выберите команду сохранения в файл (её название может немного отличаться от релиза к релизу). Получится файл .cfe — именно его передают на рабочую базу.
Загрузка в рабочую базу — два пути:
| Способ | Где | Когда удобен |
|---|---|---|
| Через Конфигуратор | Конфигурация → Расширения конфигурации, выбрать расширение, загрузить из файла, затем Обновить конфигурацию базы данных | Расширение меняет структуру данных, нужен контроль |
| Через пользовательский режим | Администрирование → Печатные формы, отчеты и обработки → Расширения в типовых конфигурациях на БСП | Быстрая установка без Конфигуратора |
В пользовательском режиме у расширения есть флаги Безопасный режим и Защита от опасных действий. Безопасный режим запрещает коду обращаться к файлам, COM-объектам и внешним ресурсам. Если ваше расширение работает с файлами или веб-сервисами, безопасный режим придётся выключить — и тогда проверять код особенно тщательно.
После обновления типовой порядок такой:
- Обновите основную конфигурацию в тестовой базе.
- Откройте расширение. Платформа проверит применимость: пропавшие заимствованные объекты, изменённые методы под
&ИзменениеИКонтроль, несовпадающие контролируемые свойства. - Исправьте расхождения, сохраните новый
.cfeи только потом обновляйте рабочую базу.
7. Типичные ошибки, когда пишут первое расширение
- ❌ Свой реквизит без префикса. Через год в типовой появится реквизит с тем же именем, и расширение перестанет применяться. Префикс нужен и у процедур в общих модулях.
- ❌ Заимствовали форму «на всякий случай». Каждая заимствованная форма сверяется с основной при обновлении. Лишние заимствования дают ложные ошибки применимости.
- ❌ Серверный вызов из клиентского обработчика без директивы. В модуле формы расширения действуют те же правила, что и в типовом:
&НаКлиенте,&НаСервере,&НаСервереБезКонтекстаставятся явно. - ❌ Глобальная переменная или экспортная процедура с типовым именем. Имена методов расширения не должны совпадать с методами основной конфигурации, если это не перехват.
- ❌ Правки прямо в рабочей базе через Конфигуратор. Пока вы отлаживаете, пользователи получают полуготовый код. Готовьте
.cfeв копии и выкладывайте целиком.
8. Частые вопросы о расширениях 1С
Можно ли через расширение изменить запрос внутри типового отчёта?
&ИзменениеИКонтроль. Если текст запроса хранится в схеме компоновки, заимствуйте отчёт и его макет схемы.