Расширения конфигурации 1С 8.3: от создания до отладки
Содержание
Чтобы работать с расширением в 1С, откройте Конфигуратор, выберите Конфигурация → Расширения конфигурации, нажмите «Добавить» и откройте конфигурацию расширения. Дальше нужные объекты основной конфигурации переносятся в расширение командой «Добавить в расширение» из контекстного меню. После этого их модули, формы и макеты можно менять, а саму типовую не трогать.
Типичная ситуация: бухгалтеру нужно новое поле в реализации и своя печатная форма акта. Если снять конфигурацию с поддержки, каждое обновление БП превращается в ручное сравнение и объединение. Расширение решает задачу иначе. Типовая остаётся на поддержке и обновляется штатно, а доработка живёт отдельным слоем поверх неё. Механизм есть в платформе с версии 8.3.6, но заметная часть возможностей добавлялась позже. Ниже всё описано для платформы 8.3.2x.
Как устроено расширение и когда оно подходит
Расширение — это отдельная мини-конфигурация, которая при запуске базы накладывается на основную. Платформа собирает их вместе «на лету». В типовой при этом ничего не меняется: её можно обновлять, сравнивать и откатывать как обычно.
В расширении есть два вида объектов:
- 🔹 заимствованные — копии-ссылки на объекты основной конфигурации (документ, справочник, форма, общий модуль). Через них вы вмешиваетесь в типовое поведение;
- 🆕 собственные — новые объекты расширения: отчёты, обработки, справочники, регистры, роли, общие модули.
У каждого расширения есть свойство «Назначение» с тремя значениями:
| Назначение | Для чего | Пример |
|---|---|---|
| Исправление | Быстрая правка ошибки типовой | Обход ошибки в процедуре проведения до выхода релиза |
| Адаптация | Подстройка под процессы компании | Новый реквизит, своя проверка при записи |
| Дополнение | Новая функциональность | Отдельный отчёт, обработка, интеграция |
Назначение влияет на порядок применения, если расширений несколько: сначала исправления, затем адаптации, затем дополнения.
Расширение или другие способы
| Способ | Когда выбирать | Минусы |
|---|---|---|
| Расширение | Нужно менять поведение типовых объектов, формы, добавлять реквизиты | Требует контроля после каждого обновления |
| Внешняя обработка или отчёт | Разовая печатная форма, загрузка, отчёт без вмешательства в типовую логику | Нельзя изменить проведение или форму документа |
| Снятие с поддержки | Глубокая переработка, которую расширение не тянет | Каждое обновление — ручное объединение |
Правило практика: всё, что можно сделать внешней обработкой, делайте внешней обработкой. Всё, что нельзя, — расширением. Снятие с поддержки — последний вариант.
Создание расширения и подключение к базе
Создание в Конфигураторе
- Откройте базу в Конфигураторе и откройте основную конфигурацию (
Конфигурация → Открыть конфигурацию). - Выберите
Конфигурация → Расширения конфигурации. - В открывшемся окне нажмите «Добавить». Задайте имя (латиница или кириллица без пробелов), синоним, назначение и префикс.
- Префикс платформа предлагает сама, например
Расш1_. Лучше заменить его на осмысленный:ак_илиПечАкт_. Префикс добавляется к именам новых объектов и процедур, чтобы они не пересеклись с типовыми. - Выделите расширение и откройте его конфигурацию кнопкой в командной панели окна. Появится отдельное дерево объектов расширения.
Заимствование объектов
Чтобы изменить типовой объект, его заимствуют. Найдите объект в дереве основной конфигурации, вызовите контекстное меню и выберите «Добавить в расширение». Если расширений несколько, платформа спросит, в какое именно.
При заимствовании формы или модуля платформа подтягивает и сам объект-владелец. Заимствуйте только то, что реально меняете: каждый лишний объект — это ещё одна точка, которая может «сломаться» после обновления типовой.
Сохранение и применение
После правок изменения нужно записать в базу:
F7или «Обновить конфигурацию базы данных» в меню открытого расширения;- для переноса в другую базу — сохранить в файл
.cfeчерез менюКонфигурацияоткрытого расширения.
Для пакетных сценариев (обновление нескольких баз скриптом) подходит командная строка:
"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" DESIGNER /F"D:\Bases\BP" /N"Администратор" /P"" ^
/LoadCfg "D:\ext\PechatAkt.cfe" -Extension "ПечатьАкта" ^
/UpdateDBCfg -Extension "ПечатьАкта"
Путь к платформе подставьте свой. Загрузка .cfe и обновление конфигурации
базы данных — два отдельных шага. Если выполнить только первый, расширение в базе не заработает.
Установка в режиме 1С:Предприятие
В типовых на БСП расширение можно подключить без Конфигуратора. В БП 3.0, ЗУП 3.1 и УТ 11 путь одинаковый: Администрирование → Печатные формы, отчеты и обработки → Расширения. Там кнопка «Добавить из файла», флажки активности и безопасного режима.
После подключения расширения пользователям нужно перезапустить сеанс. Расширение применяется при старте, а не «на лету» в открытых окнах.
По умолчанию расширение, установленное из режима предприятия, работает в безопасном режиме. В нём запрещена работа с файлами на диске, COM-объектами и внешними компонентами. Если доработка пишет файлы или вызывает внешние программы, безопасный режим придётся отключить. Делайте это только для расширений, код которых вы проверили.
Доработка форм и интерфейса
Формы — самый частый объект доработок. Заимствуйте нужную форму документа (например, ФормаДокумента) и откройте её в редакторе расширения. Видны все типовые элементы, но изменять можно только свои.
Новый реквизит в документе
- Заимствуйте документ.
- В дереве расширения добавьте ему реквизит с префиксом:
ак_НомерДоговораЗаказчика, тип «Строка». - Заимствуйте форму документа и перетащите новый реквизит из списка реквизитов объекта на форму.
- Обновите конфигурацию базы данных.
Добавление реквизита к заимствованному объекту меняет структуру данных. Обновление в этом случае идёт дольше, чем для расширения с одним кодом.
Обработчики событий формы
В модуле заимствованной формы нельзя просто переписать типовую процедуру. Обработчик события подключается в палитре свойств формы или элемента. У события есть выбор типа вызова: «Перед», «После» или «Вместо». Платформа создаст процедуру с префиксом и вызовет её в нужный момент относительно типового обработчика.
Пример: после открытия формы скрываем поле для пользователей без нужной роли.
&НаСервере
Процедура ак_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
Элементы.ак_НомерДоговораЗаказчика.Видимость = РольДоступна("ак_РаботаСДоговорами");
КонецПроцедуры
Свои элементы на форме называйте с тем же префиксом. Типовые элементы со временем переименовывают, ваши — нет.
Изменение бизнес-логики через аннотации
Код типовых модулей меняется аннотациями над процедурой расширения. Это главный приём работы с расширением.
| Аннотация | Что делает | Когда применять |
|---|---|---|
&Перед("Имя") | Выполняет ваш код до типового | Дополнительная проверка, подготовка данных |
&После("Имя") | Выполняет ваш код после типового | Дополнить результат, записать доп. данные |
&Вместо("Имя") | Полностью заменяет типовую процедуру | Редко, когда типовая логика не подходит целиком |
&ИзменениеИКонтроль("Имя") | Вставляет и удаляет строки внутри типовой процедуры | Точечная правка середины процедуры |
Перед и После
Пример: запрещаем записывать реализацию без номера договора заказчика. Код кладётся в модуль объекта заимствованного документа.
&Перед("ПередЗаписью")
Процедура ак_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если РежимЗаписи = РежимЗаписиДокумента.Проведение
И ПустаяСтрока(ак_НомерДоговораЗаказчика) Тогда
ОбщегоНазначения.СообщитьПользователю("Укажите номер договора заказчика", ЭтотОбъект,
"ак_НомерДоговораЗаказчика", , Отказ);
КонецЕсли;
КонецПроцедуры
ОбщегоНазначения.СообщитьПользователю — процедура БСП, она есть во всех современных типовых. Если Отказ станет Истина, документ не запишется.
Вместо и ПродолжитьВызов
&Вместо отключает типовую процедуру. Чтобы в нужном месте всё-таки вызвать оригинал, используйте ПродолжитьВызов():
&Вместо("ЗаполнитьПоОснованию")
Процедура ак_ЗаполнитьПоОснованию(Основание)
ПродолжитьВызов(Основание);
Комментарий = "Создан на основании: " + Строка(Основание);
КонецПроцедуры
Без вызова ПродолжитьВызов() типовой код не выполнится вообще. После обновления конфигурации вы не узнаете, что фирма 1С исправила в этой процедуре ошибку: ваша замена её «закроет».
ИзменениеИКонтроль
Аннотация появилась в платформе 8.3.16. Вы копируете типовую процедуру целиком и помечаете правки:
&ИзменениеИКонтроль("ПроверитьЗаполнениеШапки")
Процедура ак_ПроверитьЗаполнениеШапки(Отказ)
// ... типовой код без изменений ...
#Вставка
Если Не ЗначениеЗаполнено(ак_НомерДоговораЗаказчика) Тогда
Отказ = Истина;
КонецЕсли;
#КонецВставки
#Удаление
// типовая строка, которую нужно убрать
#КонецУдаления
КонецПроцедуры
Главный плюс — контроль. Если после обновления типовой текст процедуры изменится, расширение перестанет применяться и платформа укажет, где расхождение. С &Вместо такой защиты нет.
Имя процедуры в аннотации здесь условное. Перед доработкой откройте типовой модуль и возьмите точное имя оттуда: в разных конфигурациях и релизах они отличаются.
Свои отчёты и печатные формы в расширении
Новый отчёт
Отчёт на СКД создаётся в расширении как собственный объект, так же как в обычной конфигурации. Чтобы он появился в панели разделов, заимствуйте нужную подсистему (например, «Продажи») и включите в неё отчёт. Без этого отчёт будет доступен только через Все функции.
Печатная форма через расширение
В типовых на БСП печать документа описана в модуле менеджера. Порядок такой:
- Заимствуйте документ и его модуль менеджера.
- Создайте в расширении процедуру с
&После("ДобавитьКомандыПечати")и добавьте свою команду в таблицуКомандыПечати. - Создайте процедуру с
&После("Печать"): если в коллекции печатных форм есть ваш идентификатор, сформируйте табличный документ по своему макету. - Макет положите в документ внутри расширения как собственный.
Если нужно лишь поправить типовой макет (сдвинуть подпись, добавить строку), можно заимствовать сам макет. Учтите: заимствованный макет заменяет типовой целиком. Когда фирма 1С обновит оригинал, ваша копия останется прежней — сравнивайте её с новой версией после каждого релиза.
Для разовой печатной формы, которая не меняет логику документа, проще внешняя печатная форма. Расширение оправдано, когда форма нужна постоянно и всем.
Права на новые объекты
Новые объекты расширения недоступны обычным пользователям, пока на них нет прав. Создайте в расширении роль, отметьте права на свои отчёты, обработки и реквизиты и назначьте её группам доступа. Иначе пользователь получит Нарушение прав доступа! при попытке открыть отчёт.
Отладка и сопровождение после обновлений
Отладка
Точки останова в модулях расширения ставятся так же, как в типовых модулях. Запустите отладку из Конфигуратора (F5), и выполнение остановится в коде расширения. В стеке вызовов видно, в какой момент сработал ваш обработчик относительно типового.
Удобный приём — точка останова одновременно в процедуре &Перед и в типовой процедуре. Так видно порядок вызовов и значения параметров до и после.
Что делать после обновления типовой
После каждого обновления конфигурации:
- Откройте расширение в Конфигураторе и запустите проверку применимости из меню
Конфигурацияоткрытого расширения. - Проверьте процедуры с
&ИзменениеИКонтроль: платформа подсветит расхождения с новым типовым текстом. - Сверьте заимствованные макеты с новыми версиями оригиналов.
- Пройдите основной сценарий в тестовой копии базы: запись, проведение, печать.
Обновление типовой и проверку расширения делайте сначала на копии базы. Если расширение не применилось в рабочей базе, пользователи могут остаться без доработки на весь день.
Порядок в нескольких расширениях
Когда расширений становится пять-десять, начинаются конфликты: два расширения заимствуют одну процедуру, и результат зависит от порядка применения. Держите правило: одно расширение — одна задача. И ведите короткий реестр: имя, назначение, что заимствует, кто автор.
Частые вопросы
Чем расширение лучше доработки снятой с поддержки конфигурации?
Слетит ли расширение при обновлении типовой конфигурации?
Можно ли удалить типовой реквизит или документ расширением?
Как перенести расширение в другую базу?
.cfe в Конфигураторе и загрузите в другую базу через Конфигуратор или список расширений в режиме предприятия. Конфигурации баз должны совпадать по заимствованным объектам.