Доработка типовой 1С без снятия с поддержки: создаём, обновляем и переносим расширение
Содержание
Расширение конфигурации в 1С 8.3 делается в Конфигураторе через меню Конфигурация → Расширения конфигурации → Добавить. Дальше нужные объекты типовой конфигурации заимствуются в расширение, а их поведение меняется перехватом методов: аннотациями &Перед, &После, &Вместо и &ИзменениеИКонтроль. Основная конфигурация при этом остаётся на поддержке и обновляется как обычно.
Механизм появился в платформе 8.3.6 и с тех пор сильно вырос. Всё, что описано ниже, относится к платформе в целом и работает в любой конфигурации: БП 3.0, ЗУП 3.1, УТ 11, ERP. Примеры кода проверены на синтаксисе платформы 8.3.2x.
Что проверить перед созданием расширения
Расширение не требует снимать базу с поддержки, но кое-что подготовить нужно.
- 🧪 Тестовая копия базы. Разрабатывайте на копии, выгруженной в
.dtили скопированной с сервера. В рабочую базу переносите готовый файл. - 🔑 Права. Создавать и подключать расширения может пользователь с ролью «Полные права» или «Администратор системы».
- 🔢 Версия платформы. Возможности зависят от номера: новые справочники, документы и реквизиты в расширении доступны с 8.3.11, аннотация
&ИзменениеИКонтроль— с 8.3.16. Чем свежее платформа, тем меньше ограничений. - 📐 Режим совместимости. Посмотрите его в свойствах корня основной конфигурации. Расширение создаётся с тем же режимом, и при смене режима в типовой его придётся поднимать.
- 📝 Список задач. Запишите, какие объекты и методы вы будете менять. Чем меньше заимствований, тем легче переживать обновления.
Перед началом решите, что именно нужно: поменять типовое поведение (это расширение) или добавить отдельный инструмент (часто хватает внешней обработки или отчёта). Внешний файл проще передать и проще удалить.
Когда расширение не подходит
Расширение не всемогуще. Нельзя удалить типовой объект или реквизит, переименовать его, поменять тип существующего реквизита. Нельзя заимствовать всё подряд без последствий: каждая лишняя заимствованная форма потом конфликтует с обновлениями. Если доработка переписывает половину документа, честнее обсудить снятие с поддержки или отказ от доработки.
Создаём расширение в Конфигураторе: шаг за шагом
Шаг 1. Добавить расширение
- Откройте базу в режиме Конфигуратора.
- Выберите
Конфигурация → Расширения конфигурации. - В открывшемся списке нажмите
Добавить. - Заполните имя (латиница или кириллица без пробелов), синоним и префикс.
Префикс по умолчанию выглядит как Расширение1_. Замените его на короткий и узнаваемый, например Мф_ или Расш1_. Платформа подставляет префикс к именам новых объектов и методов, и по нему сразу видно, где код типовой, а где ваш.
Шаг 2. Выбрать назначение
Назначение определяет порядок применения, если расширений несколько.
| Назначение | Для чего | Применяется |
|---|---|---|
| Исправление | Срочные заплатки ошибок типовой | Первым |
| Адаптация | Доработки под учёт конкретной компании | Вторым |
| Дополнение | Новые возможности поверх типовой | Последним |
Для одной доработки под себя обычно выбирают «Адаптация».
Шаг 3. Открыть дерево расширения
Дважды щёлкните по строке расширения в списке. Откроется отдельное дерево метаданных, похожее на основную конфигурацию, только почти пустое. Сохранение изменений в нём — F7 или команда Обновить конфигурацию базы данных, как и в основной конфигурации.
Шаг 4. Настроить свойства в списке расширений
В списке расширений у каждой строки есть флажки:
- ✅ Активно — снятый флажок отключает расширение без удаления.
- 🛡️ Безопасный режим — код расширения не сможет работать с файлами, внешними компонентами и другими привилегированными операциями. Для своих расширений флажок обычно снимают, для чужих оставляют.
- ⚠️ Защита от опасных действий — пользователь получит предупреждение при попытке расширения выполнить потенциально опасную операцию.
Заимствуем объекты и перехватываем методы
Расширение не видит типовые объекты, пока вы их не заимствуете.
Как заимствовать объект
- В дереве основной конфигурации найдите нужный объект, например документ «Реализация товаров и услуг».
- Щёлкните по нему правой кнопкой и выберите
Добавить в расширение. - Выберите ваше расширение, если их несколько.
В дереве расширения объект появится с особым значком. Заимствуется сам объект, а его формы, макеты и модули — только когда они нужны. Например, форму документа заимствуют отдельно тем же пунктом контекстного меню.
Свои реквизиты и объекты
В заимствованный справочник или документ можно добавить новый реквизит, табличную часть, форму, команду или макет. Новые объекты (справочники, регистры, обработки) создаются в расширении обычным способом через контекстное меню ветки. Имя автоматически получит префикс.
Если расширение добавляет реквизиты или объекты с данными, его отключение или удаление может привести к потере этих данных. Держите это в голове, когда «временно» выключаете расширение в рабочей базе.
Перехват методов модулей
Самый частый сценарий — изменить поведение типовой процедуры. Удобный путь: откройте модуль объекта в основной конфигурации, поставьте курсор на процедуру, в контекстном меню выберите Добавить в расширение и укажите тип вызова. Платформа сама создаст заготовку в модуле расширения.
| Аннотация | Что происходит | Когда использовать |
|---|---|---|
&Перед | Ваш код выполняется до типового | Проверки, подготовка данных |
&После | Ваш код выполняется после типового | Дозаполнение, дополнительные отказы |
&Вместо | Типовой код не выполняется, пока вы не вызовете ПродолжитьВызов() | Полная замена логики |
&ИзменениеИКонтроль | Копия типового метода с вставками и удалениями | Точечная правка внутри длинного метода |
Пример: запретить запись документа без комментария. В модуле заимствованного документа:
&После("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если Отказ Тогда
Возврат;
КонецЕсли;
Если Не ЗначениеЗаполнено(Комментарий) Тогда
Отказ = Истина;
Сообщить("Заполните комментарий перед записью документа.");
КонецЕсли;
КонецПроцедуры
С &ИзменениеИКонтроль в расширение копируется весь текст метода. Свои строки обрамляются #Вставка и #КонецВставки, удаляемые — #Удаление и #КонецУдаления. Главный плюс: если в новом релизе типовой метод поменяется, платформа сообщит, что расширение больше не совпадает с оригиналом, и не применит его молча.
&Вместо без ПродолжитьВызов() полностью отключает типовую логику. После обновления конфигурации вы не получите исправлений фирмы-разработчика в этом методе. Используйте его только там, где без замены не обойтись.
Перехват событий формы
В заимствованной форме откройте палитру свойств формы или элемента, перейдите к событиям и добавьте обработчик. Рядом с ним выбирается вид вызова: перед типовым, после него или вместо. Новые элементы формы, добавленные в расширении, отображаются в дереве элементов вместе с типовыми, и их можно перетаскивать на нужное место.
Подписки на события внутри расширения
Подписка нужна, когда одну и ту же реакцию надо повесить сразу на несколько объектов: например, проверять заполнение поля во всех документах продаж.
Как создать подписку
- Заимствуйте все объекты-источники (документы, справочники), на которые должна реагировать подписка.
- В расширении создайте общий модуль с флажком
Сервер, напримерРасш1_ПроверкиДокументов. - В ветке
Общие → Подписки на событиярасширения добавьте новую подписку. - В свойстве «Источник» отметьте типы объектов, в свойстве «Событие» выберите, например,
ПередЗаписью. - В «Обработчике» укажите экспортную процедуру из общего модуля.
Обработчик для события ПередЗаписью у документа:
Процедура Расш1_ПроверкаКомментарияПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
Если Отказ Или Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
Если РежимЗаписи = РежимЗаписиДокумента.Проведение
И Не ЗначениеЗаполнено(Источник.Комментарий) Тогда
Отказ = Истина;
Сообщить("Документ без комментария не проводится.");
КонецЕсли;
КонецПроцедуры
Проверка ОбменДанными.Загрузка нужна, чтобы подписка не мешала обмену и загрузке данных.
Типовые подписки
Существующую подписку типовой конфигурации можно заимствовать, но её источник менять не стоит. Если нужно изменить поведение её обработчика, заимствуйте общий модуль, в котором он лежит, и перехватите процедуру через &Перед, &После или &Вместо, как в предыдущем разделе.
Обновление расширения и типовой конфигурации
Вы поменяли расширение
После правок нажмите F7 в дереве расширения. Если менялся только код, изменения подхватят новые сеансы пользователей: текущим нужно перезайти. Если расширение добавляет реквизиты или объекты, платформа выполнит реструктуризацию данных. Такое обновление лучше проводить вне рабочего времени.
Вышел новый релиз типовой
Расширение не мешает обновлять основную конфигурацию, но после обновления его надо проверить:
- Обновите основную конфигурацию обычным способом.
- Откройте список расширений и для каждого выполните проверку применимости (команда в меню
Конфигурацияокна расширений). - Посмотрите в окне сообщений, какие заимствованные объекты или методы изменились или пропали.
- Для методов с
&ИзменениеИКонтрольсравните новую версию типового метода со своей копией и перенесите вставки. - Запустите базу в режиме Предприятия и проверьте сценарии, которые затрагивает расширение.
Контролируемые свойства
У заимствованного объекта часть свойств помечается как контролируемая. Если такое свойство поменялось в основной конфигурации, расширение не применится, а платформа покажет, какое свойство разошлось. Это защита: лучше получить сообщение на старте, чем тихую ошибку при проведении.
Как меньше страдать при каждом релизе
- ✂️ Заимствуйте только то, что реально меняете. Лишняя заимствованная форма — лишний повод для конфликта.
- 🧩 Предпочитайте
&Переди&После: они переживают почти любые изменения внутри типового метода. - 🏷️ Новые элементы на формах добавляйте своими группами, а не вклинивайте между типовыми полями.
- 🗂️ Храните в комментарии к каждому перехвату, зачем он сделан и на каком релизе проверен. Через год это сэкономит время на разбор.
Перенос расширения в другую базу
Через файл .cfe
- В списке расширений выделите нужное.
- Выберите
Конфигурация → Сохранить в файли получите файл.cfe. - В целевой базе в том же окне выберите
Конфигурация → Загрузить из файла. - Нажмите
Обновить конфигурацию базы данных.
Загрузка .cfe и обновление конфигурации базы данных — два отдельных шага. Пока не выполнен второй, расширение в базе не работает .
В имени файла удобно держать версию расширения и релиз типовой, на котором его проверяли, например Расш1_v12_БП_3.0.x.cfe. Тогда при переносе сразу видно, подойдёт ли файл к целевой базе. Версию самого расширения задайте в свойствах его корня, поле «Версия».
Без Конфигуратора
Расширение можно подключить и в пользовательском режиме:
- в конфигурациях на БСП (БП 3.0, ЗУП 3.1, УТ 11):
Администрирование → Печатные формы, отчеты и обработки → Расширения, кнопка добавления из файла; - в любой конфигурации:
Все функции → Стандартные → Управление расширениями конфигурации.
Так удобно ставить расширение в облачную базу или клиенту, у которого нет доступа к Конфигуратору.
Что учесть при переносе
- 🔁 Релиз типовой в целевой базе должен совпадать с тем, на котором делали расширение, или быть совместимым по заимствованным объектам.
- 📦 При выгрузке базы в
.dtрасширения попадают в файл вместе с основной конфигурацией. - 🌐 В распределённой базе обратите внимание на флажок передачи расширения в подчинённые узлы в свойствах расширения.
Ошибки, на которые чаще всего натыкаются
Ещё одна частая беда — несколько расширений перехватывают один и тот же метод. Они срабатывают в порядке назначения (исправление, адаптация, дополнение), и &Вместо в одном может выключить логику другого. Ведите у себя реестр: какое расширение какие методы трогает.
Частые вопросы
Можно ли вести расширение в хранилище конфигурации?
Сколько расширений можно подключить к одной базе?
Как удалить расширение?
Можно ли изменить печатную форму через расширение?
Как отлаживать код расширения?
F5 поднимает базу с подключёнными расширениями.