Работа с расширениями в 1С 8.3: создание, перехват методов, отладка и обновления
Содержание
Расширение в 1С — это отдельная мини-конфигурация, которая подключается поверх основной и меняет её поведение, не трогая саму типовую. Создают его в Конфигураторе через Конфигурация → Расширения конфигурации, а в типовых на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) готовый файл .cfe можно подключить и без Конфигуратора: Администрирование → Печатные формы, отчеты и обработки → Расширения.
Главная польза: основная конфигурация остаётся на поддержке поставщика. Обновление типовой ставится как обычно, без объединения и ручного переноса доработок. Механизм появился в платформе 8.3.6 и с тех пор сильно вырос: сейчас в расширении можно добавлять свои справочники и документы, менять формы, перехватывать процедуры модулей и даже править код типовой процедуры построчно.
Что такое расширение конфигурации и какие задачи оно решает
Представьте типовую конфигурацию как закрытую коробку. Раньше, чтобы что-то поменять, коробку вскрывали: снимали с поддержки и правили объекты. После этого каждое обновление превращалось в сравнение и объединение — часы работы программиста на каждый релиз.
Расширение работает иначе. Оно хранится в базе отдельно и при запуске «накладывается» на основную конфигурацию. Если отключить расширение , программа вернётся к типовому поведению.
Типичные задачи, которые закрывают расширениями:
- 🖨️ своя печатная форма или изменённый макет типовой;
- 📝 новый реквизит в документе или справочнике и поле на форме;
- ⚙️ дополнительная проверка при проведении документа;
- 🔧 исправление ошибки типовой до выхода официального релиза;
- 📊 новый отчёт, обработка, регистр или справочник со своими данными;
- 🔌 интеграция с внешней системой: HTTP-сервис, регламентное задание.
У расширения есть свойство Назначение. Оно бывает трёх видов, и от него зависит порядок применения:
| Назначение | Для чего | Пример |
|---|---|---|
| Исправление | Срочная правка ошибки типовой | Поставщик выпустил патч до релиза |
| Адаптация | Доработка под конкретное внедрение | Изменения франчайзи или внутреннего программиста |
| Дополнение | Самостоятельный функционал | Тиражное решение для разных баз |
Расширения применяются в порядке: сначала исправления, потом адаптации, потом дополнения. На практике собственные доработки обычно оформляют как «Адаптацию».
Как создать расширение в Конфигураторе: по шагам
Для работы нужны права администратора и запуск базы в режиме Конфигуратора. Монопольный доступ для создания расширения не требуется, но пользователи увидят изменения только после перезапуска сеанса.
Шаг 1. Создаём пустое расширение
- Откройте Конфигуратор и основную конфигурацию (
Конфигурация → Открыть конфигурацию). - Выберите
Конфигурация → Расширения конфигурации. - В открывшемся списке нажмите
Добавить. - Заполните имя (латиницей или кириллицей, без пробелов), синоним и префикс. Префикс по умолчанию —
Расширение1_, лучше сразу задать короткий и осмысленный, напримермой_. - Укажите назначение — обычно «Адаптация».
Префикс платформа добавляет к именам новых объектов и процедур расширения. Он защищает от конфликта имён: если в следующем релизе типовой появится реквизит с тем же названием, ваш останется отдельным.
Шаг 2. Открываем дерево расширения
В списке расширений выделите новую строку и откройте её двойным щелчком. Откроется второе дерево — уже не основной конфигурации, а расширения. Сначала оно почти пустое.
Шаг 3. Заимствуем объекты
Чтобы изменить объект типовой, его нужно добавить в расширение — «заимствовать». Делается это из дерева основной конфигурации: щелчок правой кнопкой по объекту → Добавить в расширение. Если расширений несколько, платформа спросит, в какое.
Заимствовать можно документы, справочники, формы, общие модули, роли, макеты и другие объекты. При заимствовании формы автоматически подтягивается и объект-владелец.
Шаг 4. Вносим изменения и обновляем базу
После правок выполните Конфигурация → Обновить конфигурацию базы данных в окне расширения (или F7, когда активно дерево расширения). Если расширение добавляет свои объекты с данными, платформа реструктурирует таблицы.
Сохранение расширения и обновление базы — два разных действия. Пока не нажато «Обновить конфигурацию базы данных», пользователи работают со старой версией расширения.
Шаг 5. Сохраняем расширение в файл
В окне Расширения конфигурации выделите расширение и откройте меню Конфигурация на панели окна: там есть команды сохранения в файл и загрузки из файла. Сохранение даст файл .cfe. Его можно передать в другую базу и загрузить там тем же меню. Загрузка .cfe и обновление базы — снова два отдельных шага.
Что можно поменять в расширении, а что нет
Внутри расширения живут объекты двух видов. Свои — созданы с нуля и носят ваш префикс. Заимствованные — ссылки на объекты основной конфигурации, к которым вы что-то добавили.
Что добавлять разрешено
- ➕ новые объекты: справочники, документы, регистры, отчёты, обработки, общие модули, HTTP-сервисы, регламентные задания;
- ➕ новые реквизиты и табличные части в заимствованных справочниках и документах;
- ➕ новые элементы на заимствованных формах, свои команды и обработчики событий;
- ➕ новые макеты, в том числе замена типовых макетов печатных форм;
- ➕ права в заимствованных ролях на свои объекты и новые роли.
Как перехватывают код типовой
Изменение модулей строится на аннотациях. Вы пишете в модуле заимствованного объекта процедуру со своим именем и ставите перед ней аннотацию с именем типовой процедуры:
| Аннотация | Что делает | Когда использовать |
|---|---|---|
&Перед("Имя") | Ваш код выполняется до типового | Подготовка данных, доп. проверка |
&После("Имя") | Ваш код выполняется после типового | Дозаполнение, запись в свой регистр |
&Вместо("Имя") | Типовой код не выполняется, работает ваш | Полная замена логики; вызов типового — через ПродолжитьВызов() |
&ИзменениеИКонтроль("Имя") | Копия типовой процедуры с пометками вставок и удалений | Точечная правка нескольких строк внутри большой процедуры |
Пример: запретить проведение реализации без договора. В модуле объекта заимствованного документа РеализацияТоваровУслуг:
&Перед("ОбработкаПроверкиЗаполнения")
Процедура мой_ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если НЕ ЗначениеЗаполнено(ДоговорКонтрагента) Тогда
ОбщегоНазначения.СообщитьПользователю(
"Укажите договор с контрагентом.", ЭтотОбъект, "ДоговорКонтрагента", , Отказ);
КонецЕсли;
КонецПроцедуры
Аннотация &ИзменениеИКонтроль полезна ещё одним: если в новом релизе поставщик изменит текст исходной процедуры, расширение перестанет применяться и платформа сообщит об этом. Вы не пропустите изменение типовой логики.
Ограничения
- ❌ нельзя удалить объект или реквизит основной конфигурации;
- ❌ нельзя изменить тип реквизита типовой;
- ❌ нельзя заимствовать объект, которого нет в основной конфигурации текущего релиза;
- ❌ режим совместимости расширения не может быть новее, чем у основной конфигурации.
Перечень возможностей растёт от версии к версии платформы. Если нужный объект не заимствуется, проверьте номер платформы: часть возможностей доступна только начиная с определённой версии 8.3.
Как подключать и отключать расширения в рабочей базе
Подключить готовое расширение можно двумя путями.
Через Конфигуратор. В списке Конфигурация → Расширения конфигурации нажмите Добавить, откройте дерево нового расширения и загрузите .cfe из файла. Затем — обновление конфигурации
базы данных.
В пользовательском режиме (конфигурации на БСП):
- Откройте
Администрирование → Печатные формы, отчеты и обработки → Расширения. - Нажмите кнопку добавления из файла и выберите
.cfe. - Проверьте флажки безопасности в карточке расширения.
- Перезапустите программу — расширение применится к новым сеансам.
Безопасный режим и защита от опасных действий
У каждого расширения есть два важных флажка:
- 🔒 Безопасный режим — код расширения не может работать с файлами, внешними компонентами, COM-объектами и запускать программы;
- 🛡️ Защита от опасных действий — пользователь получит предупреждение, если расширение попытается выполнить потенциально опасную операцию.
Снимать безопасный режим можно только для расширений из надёжного источника. Расширение без безопасного режима получает доступ к файловой системе сервера — не подключайте так файлы, присланные «знакомым программистом» без проверки кода.
Как отключить расширение
Если после подключения что-то пошло не так, снимите флажок Активно в списке расширений (в Конфигураторе или пользовательском режиме) и перезапустите сеанс. Объекты расширения перестанут действовать, программа вернётся к типовому поведению.
Отключение и удаление — разные вещи. Если расширение хранит свои данные (справочники, документы, регистры), при удалении эти данные будут потеряны. Перед удалением такого расширения сделайте резервную копию базы.
Отладка расширения и разбор ошибок
Отладка расширения ничем не отличается от отладки основной конфигурации. Точки останова ставят прямо в модулях расширения, запуск — Отладка → Начать отладку (F5) из Конфигуратора. Главное условие: расширение должно быть активно и база обновлена, иначе отладчик будет показывать старый код.
Полезные приёмы при отладке:
- 🔍 ставьте точку и в своей процедуре, и в типовой — так видно, в каком порядке они вызываются;
- 🔍 при
&Вместопроверьте, вызывается лиПродолжитьВызов(), если типовой код всё-таки нужен; - 🔍 если перехват не срабатывает, сверьте имя в аннотации с именем процедуры типовой посимвольно и проверьте директиву компиляции (
&НаСервере,&НаКлиенте) — она должна совпадать.
Расширения и обновление типовой конфигурации
Ради этого расширения и придумали: типовая остаётся на полной поддержке, обновление ставится штатно. Но «поставил и забыл» не получится. После каждого релиза нужно убедиться, что расширение по-прежнему применимо.
Порядок, который работает:
- Сделайте резервную копию базы.
- Обновите основную конфигурацию обычным способом.
- Запустите программу. Если расширение конфликтует с новым релизом, платформа сообщит об этом при запуске, а расширение не применится.
- При ошибке откройте расширение в Конфигураторе, найдите объекты, которые перестали совпадать, и обновите их.
- Обновите конфигурацию базы данных для расширения и проверьте ключевые сценарии.
Чаще всего расширение ломается в трёх случаях:
- 🔄 поставщик переименовал или удалил процедуру, которую вы перехватываете;
- 🔄 изменился текст процедуры, взятой через
&ИзменениеИКонтроль; - 🔄 элемент формы, к которому привязан ваш элемент, переместили или переименовали.
Держите копию тестовой базы и ставьте новый релиз сначала туда. Расширение, которое не применилось в тесте, не остановит работу бухгалтерии в рабочей базе.
У заимствованных объектов есть настройка контроля свойств. Если включить контроль для нужного свойства (например, типа реквизита), платформа сверит его при запуске и не применит расширение, если свойство в основной конфигурации изменилось. Это страхует от тихих ошибок, когда код работает, но с неверными данными.
Как писать расширения, которые переживут обновления
Несколько правил, которые экономят время на каждом релизе:
- ✅ Одна задача — одно расширение. Печатные формы отдельно, проверки проведения отдельно. Так проще найти виновника и отключить его без потери остального.
- ✅ Минимум заимствований. Каждый заимствованный объект — потенциальная точка конфликта. Берите только то, что реально меняете.
- ✅
&Переди&Послевместо&Вместо. Полная замена типовой процедуры ломается при любом её изменении и отключает исправления поставщика. - ✅ Свой код в своих общих модулях. В перехватчике оставьте одну строку вызова, логику вынесите в модуль расширения с префиксом.
- ✅ Осмысленный префикс и версия. Заполняйте свойство версии расширения — так видно, какая сборка стоит в базе.
- ✅ Расширения в хранилище. Расширение можно подключить к хранилищу конфигурации отдельно от основной, это удобно при командной разработке.
Когда расширение — не лучший выбор
Расширение решает многое, но не всё. Иногда проще и надёжнее другой инструмент.
| Задача | Чем решить | Почему не расширение |
|---|---|---|
| Новая печатная форма без изменения логики | Внешняя печатная форма (.epf) | Подключается за минуту, не требует обновления базы |
| Разовый отчёт или обработка | Внешний отчёт или обработка | Не нужно заимствовать объекты |
| Дополнительное поле в карточке без кода | Дополнительные реквизиты и сведения в типовой | Настраивается пользователем, без программиста |
| Глубокая переделка структуры: смена типов, удаление объектов | Изменение основной конфигурации | Расширение этого не умеет |
| Небольшая правка, которую поставщик скоро исправит | Подождать релиз или «Исправление» от поставщика | Своя правка устареет через месяц |
Если доработок так много, что расширение заимствует сотни объектов и перехватывает десятки процедур, стоит честно оценить: возможно, нетиповая конфигурация на поддержке с объединением обойдётся дешевле, чем постоянная починка расширения после каждого релиза.