Доработка типовой 1С без снятия с поддержки: работа с расширениями конфигурации
Содержание
Расширение в 1С 8.3 создают в Конфигураторе через меню Конфигурация → Расширения конфигурации → Добавить. Дальше нужные объекты типовой конфигурации заимствуют (правый клик по объекту → «Добавить в расширение»), а свой код пишут в процедурах с аннотациями &Перед, &После, &Вместо или &ИзменениеИКонтроль. Основная конфигурация остаётся на поддержке и обновляется штатно, а доработка живёт отдельно и подключается поверх неё.
Механизм появился в платформе 8.3.6 и с тех пор сильно вырос. В актуальных версиях 8.3.2x расширением можно добавить свои справочники, документы, регистры, реквизиты к типовым объектам, менять формы, печатные формы, отчёты и роли. Ниже — порядок работы от пустой базы-копии до обновления доработки в рабочей базе.
Подготовка и создание расширения в Конфигураторе
Разрабатывать расширение прямо в рабочей базе можно, но неудобно: любая ошибка сразу видна пользователям. Нормальная схема — копия базы для разработки и уже готовый файл .cfe для рабочей.
Перед стартом проверьте:
- 🧩 Номер версии платформы. Чем он выше, тем больше возможностей у расширений. Для аннотации
&ИзменениеИКонтрольнужна платформа с номером не ниже 8.3.16. - 🗂️ Режим совместимости основной конфигурации: свойство открывается в Конфигураторе правым кликом по корню дерева → «Свойства». У расширения режим совместимости должен быть не выше, чем у конфигурации.
- 👤 Права пользователя. Добавлять и подключать расширения может пользователь с административной ролью.
- 💾 Копия базы для разработки — выгрузка
.dtчерезАдминистрирование → Выгрузить информационную базу.
Создаём объект расширения
- Откройте базу в режиме Конфигуратора и откройте конфигурацию (
Конфигурация → Открыть конфигурацию). - Выберите
Конфигурация → Расширения конфигурации. Откроется список расширений этой базы. - Нажмите «Добавить». Задайте имя (латиница или кириллица без пробелов), синоним и префикс, например
ип_илиРасш1_. - Выберите назначение: «Исправление», «Адаптация» или «Дополнение».
- Откройте дерево нового расширения двойным кликом. Пока в нём пусто: только корень и общие разделы.
Назначение влияет на порядок применения расширений и на то, как платформа оценивает их при обновлении. Короткое правило:
| Назначение | Когда выбирать |
|---|---|
| Исправление | Точечная правка ошибки типовой, которую позже исправит поставщик |
| Адаптация | Подгонка типовой под процессы компании: поля, формы, печать |
| Дополнение | Новый функционал: свои справочники, документы, отчёты, обмены |
Префикс платформа подставляет в имена новых объектов и процедур расширения. Он защищает от конфликта имён, когда в следующем релизе типовой появится объект с таким же названием.
Заимствованные и собственные объекты расширения
В расширении живут объекты двух видов. Понимать разницу нужно сразу — от неё зависит, что можно менять и что сломается при обновлении.
- 📥 Заимствованные — копии-ссылки на объекты основной конфигурации. Их добавляют правым кликом по объекту в дереве основной конфигурации → «Добавить в расширение». У заимствованного объекта менять существующие реквизиты нельзя, но можно добавить к нему свои реквизиты, табличные части, формы, команды и обработчики.
- 🆕 Собственные — объекты, которых в типовой нет: справочник, документ, регистр, отчёт, обработка, общий модуль. Их создают в дереве расширения так же, как в обычной конфигурации.
Контроль свойств заимствованных объектов
У заимствованного объекта есть свойства, которые расширение «запоминает» на момент заимствования. Если после обновления типовой эти свойства изменились, расширение перестаёт быть применимым и платформа не подключит его.
Поэтому заимствуйте только то, что действительно нужно трогать. Чем меньше заимствованных объектов, тем спокойнее проходят обновления.
Чтобы добавить общий модуль или форму, их тоже нужно сначала заимствовать. Платформа сама заимствует родительский объект, если вы заимствуете его форму.
Свои реквизиты в типовых объектах
Частая задача — добавить поле в типовой документ, например «Ответственный за доставку» в реализацию. Порядок такой:
- Заимствуйте документ.
- В дереве расширения откройте его и добавьте реквизит в раздел «Реквизиты». Имя начните с префикса.
- Заимствуйте форму документа и вытащите реквизит на форму.
- Выполните
Конфигурация → Обновить конфигурацию базы данных(F7). Платформа добавит колонку в таблицу документа.
Данные такого реквизита хранятся вместе с документом. Если удалить расширение или реквизит из него, значения поля будут потеряны — платформа предупредит об этом при удалении.
Как доработать форму и код типовой конфигурации
Код в расширении не правит исходный модуль. Он перехватывает вызов процедуры типовой и выполняется до, после или вместо неё. Связь задаёт аннотация над процедурой.
| Аннотация | Что делает | Когда подходит |
|---|---|---|
&Перед("Имя") | Ваш код выполняется до исходной процедуры | Проверки, подготовка данных |
&После("Имя") | Ваш код выполняется после исходной | Дозаполнение, правки формы |
&Вместо("Имя") | Исходная не выполняется, вызвать её можно через ПродолжитьВызов() | Нужно изменить результат функции или условие вызова |
&ИзменениеИКонтроль("Имя") | Копия исходного кода с вставками и удалениями | Правка в середине типовой процедуры |
Пример: дозаполнение при создании формы
Заимствуйте форму, откройте её модуль в расширении и добавьте процедуру:
&НаСервере
&После("ПриСозданииНаСервере")
Процедура ип_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Объект.Ссылка.Пустая() Тогда
Объект.Комментарий = "Создан менеджером отдела продаж";
КонецЕсли;
КонецПроцедуры
Параметры процедуры повторяют параметры исходной. Имя может быть любым, но с префиксом его проще найти.
Пример: правка внутри типовой процедуры
Когда нужно поменять одну строку в середине длинной процедуры, &Перед и &После не помогают. Здесь выручает &ИзменениеИКонтроль: вы копируете тело исходной процедуры и размечаете свои правки.
&ИзменениеИКонтроль("ЗаполнитьПоОснованию")
Процедура ип_ЗаполнитьПоОснованию(Основание)
// ... исходный код процедуры без изменений ...
#Вставка
Объект.ип_ОтветственныйЗаДоставку = Основание.Ответственный;
#КонецВставки
// ... исходный код процедуры без изменений ...
КонецПроцедуры
Удаляемые строки оборачивают в #Удаление и #КонецУдаления. Главный плюс подхода: если в новом релизе типовой поменяли код этой процедуры, платформа сообщит о несоответствии и не применит расширение. Тихо сломанной логики не будет.
Вместо &ИзменениеИКонтроль в старых расширениях часто встречается &Вместо с полной копией процедуры. Такая копия не контролируется: типовую исправили, а ваша процедура выполняет старый код. При ревизии таких мест переводите их на &ИзменениеИКонтроль.
Обработчики событий формы
Для событий элементов формы аннотацию писать руками не обязательно. В палитре свойств заимствованного элемента у события есть выбор способа вызова: перед, после или вместо обработчика типовой. Конфигуратор сам создаст процедуру с нужной аннотацией.
Новые элементы на форму добавляют перетаскиванием реквизитов, как в обычной конфигурации. Удалять типовые элементы нельзя, но можно скрыть их свойством «Видимость».
Подключение, обновление и версии расширения
Готовое расширение переносят в рабочую базу файлом .cfe. В окне списка расширений Конфигуратора выделите расширение и через меню действий выберите «Сохранить в файл». Загрузка в другую базу — команда «Загрузить из файла» в том же окне.
Два способа подключения
| Способ | Где | Особенность |
|---|---|---|
| Конфигуратор | Конфигурация → Расширения конфигурации | Загрузка .cfe, затем обновление конфигурации базы данных |
| Режим 1С:Предприятие | Администрирование → Печатные формы, отчеты и обработки → Расширения (типовые на БСП) | Не нужен Конфигуратор, удобно для администратора базы |
Если в конфигурации нет такого раздела, откройте Все функции → Стандартные → Управление расширениями конфигурации. Пункт «Все функции» включают в настройках интерфейса пользователя.
Загрузка файла и применение — разные шаги. После загрузки в Конфигураторе выполните «Обновить конфигурацию базы данных». Если расширение добавляет реквизиты или свои объекты с данными, на этом шаге платформа меняет структуру таблиц. Тогда в базе не должно быть работающих пользователей.
Свойства, которые проверяют при подключении
- 🔒 Безопасный режим. Включён — код расширения не может работать с файлами, внешними компонентами и COM. Для расширений от проверенного разработчика его снимают осознанно.
- 🛡️ Защита от опасных действий. При включённой защите пользователь получит предупреждение при попытке выполнить опасный код.
- ✅ Активно. Позволяет временно отключить расширение без удаления.
- 🌐 Использовать в распределённой ИБ. Нужно, если база участвует в обмене РИБ и расширение должно приехать в узлы.
Версии и обновление типовой
В свойствах расширения заполните поле «Версия», например 1.0.3. По нему видно, какая сборка стоит в рабочей базе.
Порядок при выходе нового релиза типовой:
- Обновите копию базы для разработки на новый релиз.
- Проверьте применимость расширения: Конфигуратор покажет заимствованные объекты, у которых изменились контролируемые свойства, и процедуры
&ИзменениеИКонтрольс изменённым исходным кодом. - Исправьте несоответствия, поднимите версию, сохраните
.cfe. - В рабочей базе сначала обновите типовую, затем загрузите новое расширение и обновите конфигурацию базы данных.
Права и роли для объектов расширения
Новые объекты расширения по умолчанию никому не доступны. Пользователь откроет базу, а отчёта или справочника из расширения не увидит. Права нужно выдать явно.
Два варианта выдачи прав
- Своя роль в расширении. Создайте роль в дереве расширения (с префиксом), отметьте права на свои объекты. В типовых на БСП роль затем добавляют в профиль групп доступа:
Администрирование → Настройки пользователей и прав → Профили групп доступа. - Заимствованная роль. Заимствуйте типовую роль, например роль бухгалтера, и в ней отметьте права на собственные объекты расширения. Пользователи с этой ролью получат доступ без перенастройки профилей.
Реквизиты, добавленные к заимствованным объектам, наследуют права самого объекта. Отдельно настраивать их не нужно.
Второй вариант удобнее для небольших доработок. Первый лучше, когда доступ к новому функционалу нужно дать не всем, а выбранным сотрудникам.
Ограничение доступа на уровне записей
Если в типовой работает ограничение по организациям или складам, для своих объектов расширения его нужно описать отдельно. Автоматически RLS типовой на новые справочники и документы не распространяется. Проверяйте доступ под обычным пользователем, а не под администратором: у администратора права полные и ошибку настройки не видно.
Ошибки при работе с расширениями и отладка
Как отлаживать код расширения
Модули расширения отлаживаются так же, как модули конфигурации. Ставьте точку останова в процедуре расширения и запускайте отладку из Конфигуратора (F5). Отладчик зайдёт и в вашу процедуру, и в исходную, если вызов идёт через ПродолжитьВызов().
Если точка останова не срабатывает:
- 🔍 убедитесь, что расширение подключено именно к той базе, которую вы отлаживаете;
- 🔍 проверьте, что конфигурация базы данных обновлена после последней правки;
- 🔍 для серверного кода в клиент-серверной базе включите отладку на сервере 1С — без неё сервер не остановится на точке.
Чего лучше не делать
- ❌ Заимствовать «на всякий случай» целые подсистемы и десятки объектов — каждое обновление превращается в разбор несоответствий.
- ❌ Копировать большие процедуры типовой через
&Вместо. Используйте&ИзменениеИКонтроль. - ❌ Держать несколько расширений, перехватывающих одну и ту же процедуру. Порядок их вызова трудно предсказать, а ошибки — найти.
- ❌ Удалять из рабочей базы расширение с собственными данными без выгрузки. Справочники и документы расширения удалятся вместе с ним.